svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.library / org.gvsig.raster.tools / org.gvsig.raster.tools.lib / org.gvsig.raster.tools.lib.impl / src / main / java / org / gvsig / raster / tools / lib / impl / DefaultRasterClip.java @ 43876
History | View | Annotate | Download (13.8 KB)
1 |
package org.gvsig.raster.tools.lib.impl; |
---|---|
2 |
|
3 |
import java.io.File; |
4 |
import java.io.IOException; |
5 |
import java.util.List; |
6 |
|
7 |
import org.apache.commons.io.FileUtils; |
8 |
import org.cresques.cts.ICoordTrans; |
9 |
import org.cresques.cts.IProjection; |
10 |
|
11 |
import org.gvsig.fmap.dal.DALLocator; |
12 |
import org.gvsig.fmap.dal.DataManager; |
13 |
import org.gvsig.fmap.dal.DataServerExplorer; |
14 |
import org.gvsig.fmap.dal.DataServerExplorerParameters; |
15 |
import org.gvsig.fmap.dal.exception.DataException; |
16 |
import org.gvsig.fmap.dal.exception.InitializeException; |
17 |
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException; |
18 |
import org.gvsig.fmap.dal.exception.ValidateDataParametersException; |
19 |
import org.gvsig.fmap.dal.raster.NewRasterStoreParameters; |
20 |
import org.gvsig.fmap.dal.raster.RasterQuery; |
21 |
import org.gvsig.fmap.dal.raster.RasterStore; |
22 |
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer; |
23 |
import org.gvsig.fmap.dal.spi.DALSPILocator; |
24 |
import org.gvsig.fmap.dal.spi.DataManagerProviderServices; |
25 |
import org.gvsig.fmap.geom.primitive.Envelope; |
26 |
import org.gvsig.fmap.mapcontext.MapContext; |
27 |
import org.gvsig.fmap.mapcontext.MapContextLocator; |
28 |
import org.gvsig.fmap.mapcontext.MapContextManager; |
29 |
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException; |
30 |
import org.gvsig.fmap.mapcontext.layers.FLayer; |
31 |
import org.gvsig.fmap.mapcontext.raster.api.RasterLayer; |
32 |
import org.gvsig.raster.lib.buffer.api.BandInfo; |
33 |
import org.gvsig.raster.lib.buffer.api.Buffer; |
34 |
import org.gvsig.raster.lib.buffer.api.BufferLocator; |
35 |
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException; |
36 |
import org.gvsig.raster.tools.lib.api.RasterClip; |
37 |
import org.gvsig.raster.tools.lib.api.exceptions.ClipException; |
38 |
import org.gvsig.tools.dispose.DisposeUtils; |
39 |
import org.gvsig.tools.dynobject.DynObject; |
40 |
import org.gvsig.tools.locator.LocatorException; |
41 |
import org.gvsig.tools.task.SimpleTaskStatus; |
42 |
|
43 |
|
44 |
/**
|
45 |
* @author fdiaz
|
46 |
*
|
47 |
*/
|
48 |
public class DefaultRasterClip implements RasterClip { |
49 |
|
50 |
private RasterLayer layer;
|
51 |
private Envelope envelope;
|
52 |
private double pixelSizeX; |
53 |
private double pixelSizeY; |
54 |
private int interpolationMethod; |
55 |
private List<Integer> bands; |
56 |
private String layerNamePrefix; |
57 |
private boolean createOneLayerPerBand; |
58 |
private boolean saveToNewRasterFile; |
59 |
private File folder; |
60 |
private int columns; |
61 |
private int rows; |
62 |
|
63 |
/**
|
64 |
*
|
65 |
*/
|
66 |
public DefaultRasterClip() {
|
67 |
} |
68 |
|
69 |
@Override
|
70 |
public RasterLayer getLayer() {
|
71 |
return layer;
|
72 |
} |
73 |
|
74 |
@Override
|
75 |
public void setLayer(RasterLayer layer) { |
76 |
this.layer = layer;
|
77 |
} |
78 |
|
79 |
@Override
|
80 |
public void execute(SimpleTaskStatus taskStatus) throws ClipException { |
81 |
MapContext mapContext = this.layer.getMapContext();
|
82 |
ICoordTrans ct = layer.getCoordTrans(); |
83 |
|
84 |
Envelope envelopeInLayerProj = this.getEnvelope();
|
85 |
Envelope envelopeInRasterProj = envelopeInLayerProj; |
86 |
double pixelSizeX = this.getPixelSizeX(); |
87 |
double pixelSizeY = this.getPixelSizeY(); |
88 |
if (ct != null) { |
89 |
envelopeInRasterProj = envelopeInLayerProj.convert(ct.getInverted()); |
90 |
pixelSizeX = this.getPixelSizeX() * envelopeInRasterProj.getLength(0) / envelopeInLayerProj.getLength(0); |
91 |
pixelSizeY = this.getPixelSizeY() * envelopeInRasterProj.getLength(1) / envelopeInLayerProj.getLength(1); |
92 |
} |
93 |
|
94 |
|
95 |
RasterQuery rasterQuery = layer.createRasterQuery(); |
96 |
rasterQuery.setPixelSize(pixelSizeX); |
97 |
rasterQuery.setClip(envelopeInRasterProj); |
98 |
|
99 |
RasterStore rasterStore = layer.getRasterStore(); |
100 |
for (Integer bandNumber : bands) { |
101 |
rasterStore.createBandQuery(bandNumber); |
102 |
rasterQuery.addBand(rasterStore.createBandQuery(bandNumber)); |
103 |
} |
104 |
|
105 |
Buffer clipped = null; |
106 |
Buffer firstInterpolated = null; |
107 |
Buffer converted = null; |
108 |
Buffer interpolated = null; |
109 |
try {
|
110 |
|
111 |
try {
|
112 |
clipped = rasterStore.getRasterSet(rasterQuery); |
113 |
} catch (DataException e) {
|
114 |
throw new ClipException("Can't create the raster clip.", e); |
115 |
} |
116 |
|
117 |
firstInterpolated = clipped; |
118 |
//FIXME: Creo que no es necesaria esta primera interpolaci?n, la dejo comentarizada, de momento por si cambiamos de idea.
|
119 |
|
120 |
// if(ct != null && Math.abs(envelopeInLayerProj.getLength(0)/clipped.getColumns()-pixelSizeX)>0.01){
|
121 |
// if (converted.getColumns() != this.getColumns() || converted.getRows() != this.getRows()) {
|
122 |
// try {
|
123 |
// firstInterpolated =
|
124 |
// clipped.createInterpolated(
|
125 |
// (int)Math.floor(envelopeInLayerProj.getLength(1)/pixelSizeY),
|
126 |
// (int)Math.floor(envelopeInLayerProj.getLength(0)/pixelSizeX),
|
127 |
// interpolationMethod,
|
128 |
// taskStatus);
|
129 |
// } catch (LocatorException | BufferException e) {
|
130 |
// throw new ClipException("Can't interpolate buffer.", e);
|
131 |
// }
|
132 |
// }
|
133 |
|
134 |
// }
|
135 |
|
136 |
converted = firstInterpolated; |
137 |
|
138 |
if (ct != null) { |
139 |
try {
|
140 |
converted = firstInterpolated.convert(ct, taskStatus); |
141 |
} catch (BufferException e) {
|
142 |
throw new ClipException("Can't convert buffer from '" + ct.getPDest().getAbrev() + "' to '" |
143 |
+ ct.getPOrig().getAbrev() + "'.", e);
|
144 |
} |
145 |
} |
146 |
|
147 |
interpolated = converted; |
148 |
if (converted.getColumns() != this.getColumns() || converted.getRows() != this.getRows()) { |
149 |
try {
|
150 |
interpolated = |
151 |
converted.createInterpolated(this.getRows(), this.getColumns(), interpolationMethod, taskStatus); |
152 |
} catch (LocatorException | BufferException e) {
|
153 |
throw new ClipException("Can't interpolate buffer.", e); |
154 |
} |
155 |
} |
156 |
|
157 |
String layerName = layerNamePrefix;
|
158 |
|
159 |
if(this.createOneLayerPerBand){ |
160 |
List<Buffer> buffers = BufferLocator.getBufferManager().createOneBufferPerBand(interpolated, true); |
161 |
int counter = 0; |
162 |
for (Buffer buffer : buffers) { |
163 |
BandInfo bandInfo = buffer.getBands()[0].getBandInfo();
|
164 |
String bandLayerName = layerName+" - B"+counter; //bandInfo.getBand()+" - "+bandInfo.getName(); |
165 |
bandLayerName = getFreeLayerName(mapContext, bandLayerName); |
166 |
File file = exportBuffer(buffer, bandLayerName);
|
167 |
mapContext.getLayers().add(createLayer(interpolated.getProjection(), bandLayerName, file)); |
168 |
counter++; |
169 |
} |
170 |
|
171 |
} else {
|
172 |
layerName = getFreeLayerName(mapContext, layerName); |
173 |
File file = exportBuffer(interpolated, layerName);
|
174 |
mapContext.getLayers().add(createLayer(interpolated.getProjection(), layerName, file)); |
175 |
} |
176 |
|
177 |
} catch (IOException | ValidateDataParametersException | DataException | LocatorException | BufferException | LoadLayerException e) { |
178 |
// TODO Auto-generated catch block
|
179 |
e.printStackTrace(); |
180 |
} finally {
|
181 |
DisposeUtils.dispose(clipped); |
182 |
DisposeUtils.dispose(converted); |
183 |
DisposeUtils.dispose(interpolated); |
184 |
} |
185 |
} |
186 |
|
187 |
/**
|
188 |
* @param interpolated
|
189 |
* @param layerName
|
190 |
* @param file
|
191 |
* @throws InitializeException
|
192 |
* @throws ProviderNotRegisteredException
|
193 |
* @throws ValidateDataParametersException
|
194 |
* @throws ClipException
|
195 |
* @throws LoadLayerException
|
196 |
*/
|
197 |
private FLayer createLayer(IProjection proj, String layerName, File file) throws InitializeException, |
198 |
ProviderNotRegisteredException, ValidateDataParametersException, ClipException, LoadLayerException { |
199 |
DataManager manager = DALLocator.getDataManager(); |
200 |
DataServerExplorerParameters explorerParams = |
201 |
manager.createServerExplorerParameters(FilesystemServerExplorer.NAME); |
202 |
FilesystemServerExplorer explorer = |
203 |
(FilesystemServerExplorer) manager |
204 |
.openServerExplorer(FilesystemServerExplorer.NAME, explorerParams); |
205 |
String type = explorer.getProviderName(file);
|
206 |
|
207 |
DynObject params = manager.createStoreParameters(type); |
208 |
|
209 |
if (params.getDynClass().getDynField("file") != null) { |
210 |
params.setDynValue("file", file);
|
211 |
} |
212 |
if (params.getDynClass().getDynField("crs") != null) { |
213 |
params.setDynValue("crs", proj);
|
214 |
} |
215 |
|
216 |
RasterStore store = null;
|
217 |
try {
|
218 |
store = (RasterStore) manager.openStore(type, params); |
219 |
// store = (RasterStore) manager.openStore("PNG", params);
|
220 |
} catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
|
221 |
throw new ClipException("Can't open store.", e); |
222 |
} |
223 |
MapContextManager mapContextManager = MapContextLocator.getMapContextManager(); |
224 |
FLayer newLayer = mapContextManager.createLayer(layerName, store); |
225 |
return newLayer;
|
226 |
} |
227 |
|
228 |
/**
|
229 |
* @param mapContext
|
230 |
* @param layerName
|
231 |
* @return
|
232 |
*/
|
233 |
private String getFreeLayerName(MapContext mapContext, String layerName) { |
234 |
int counter = 1; |
235 |
FLayer newLayer = mapContext.getLayers().getLayer(layerName); |
236 |
while (newLayer != null) { |
237 |
layerName = layerName + "_" + counter;
|
238 |
newLayer = mapContext.getLayers().getLayer(layerName); |
239 |
} |
240 |
return layerName;
|
241 |
} |
242 |
|
243 |
|
244 |
/**
|
245 |
* @param buffer
|
246 |
* @param layerName
|
247 |
* @throws InitializeException
|
248 |
* @throws ProviderNotRegisteredException
|
249 |
* @throws IOException
|
250 |
* @throws ValidateDataParametersException
|
251 |
* @throws DataException
|
252 |
*/
|
253 |
private File exportBuffer(Buffer buffer, String layerName) throws InitializeException, |
254 |
ProviderNotRegisteredException, IOException, ValidateDataParametersException, DataException {
|
255 |
/* As? se crea un archivo raster tiff*/
|
256 |
|
257 |
String providerName = "GTiff"; |
258 |
String extension = "tif"; |
259 |
|
260 |
DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices(); |
261 |
DataServerExplorerParameters eparams; |
262 |
eparams = manager.createServerExplorerParameters("FilesystemExplorer");
|
263 |
|
264 |
File destFile = null; |
265 |
if (saveToNewRasterFile && this.folder != null) { |
266 |
destFile = FileUtils.getFile(folder, layerName + "." + extension);
|
267 |
} else {
|
268 |
destFile = File.createTempFile(layerName, "." + extension); |
269 |
} |
270 |
|
271 |
File parent = destFile.getParentFile();
|
272 |
if (!parent.exists()) {
|
273 |
parent.mkdirs(); |
274 |
} |
275 |
|
276 |
eparams.setDynValue("initialpath", destFile);
|
277 |
DataServerExplorer serverExplorer = manager.openServerExplorer(eparams.getExplorerName(), eparams); |
278 |
|
279 |
NewRasterStoreParameters params = (NewRasterStoreParameters) serverExplorer.getAddParameters(providerName); |
280 |
params.setDynValue("file", destFile);
|
281 |
|
282 |
params.setDynValue("compress", "NONE"); |
283 |
params.setDynValue("tfw", false); |
284 |
|
285 |
int bands = this.bands.size(); |
286 |
switch (bands) {
|
287 |
case 3: |
288 |
params.setDynValue("photometric", "RGB"); |
289 |
break;
|
290 |
case 4: |
291 |
params.setDynValue("photometric", "RGB"); |
292 |
params.setDynValue("alpha", "NON-PREMULTIPLIED"); |
293 |
break;
|
294 |
default:
|
295 |
params.setDynValue("photometric", "MINISBLACK"); |
296 |
break;
|
297 |
} |
298 |
|
299 |
params.setBuffer(buffer); |
300 |
serverExplorer.add(providerName, params, true);
|
301 |
return destFile;
|
302 |
} |
303 |
|
304 |
@Override
|
305 |
public void setEnvelope(Envelope envelope) { |
306 |
this.envelope = envelope;
|
307 |
} |
308 |
|
309 |
@Override
|
310 |
public Envelope getEnvelope() {
|
311 |
return this.envelope; |
312 |
} |
313 |
|
314 |
@Override
|
315 |
public void setPixelSizeX(double pixelSizeX) { |
316 |
this.pixelSizeX = pixelSizeX;
|
317 |
} |
318 |
|
319 |
@Override
|
320 |
public double getPixelSizeX() { |
321 |
return this.pixelSizeX; |
322 |
} |
323 |
|
324 |
@Override
|
325 |
public void setPixelSizeY(double pixelSizeY) { |
326 |
this.pixelSizeY = pixelSizeY;
|
327 |
} |
328 |
|
329 |
@Override
|
330 |
public double getPixelSizeY() { |
331 |
return this.pixelSizeY; |
332 |
} |
333 |
|
334 |
@Override
|
335 |
public void setInterpolationMethod(int interpolationMethod) { |
336 |
this.interpolationMethod = interpolationMethod;
|
337 |
} |
338 |
|
339 |
@Override
|
340 |
public int getInterpolationMethod() { |
341 |
return this.interpolationMethod; |
342 |
} |
343 |
|
344 |
@Override
|
345 |
public void setBands(List<Integer> bands) { |
346 |
this.bands = bands;
|
347 |
} |
348 |
|
349 |
@Override
|
350 |
public List<Integer> getBands() { |
351 |
return this.bands; |
352 |
} |
353 |
|
354 |
@Override
|
355 |
public void setLayerNamePrefix(String layerNamePrefix) { |
356 |
this.layerNamePrefix = layerNamePrefix;
|
357 |
} |
358 |
|
359 |
@Override
|
360 |
public String getLayerNamePrefix() { |
361 |
return this.layerNamePrefix; |
362 |
} |
363 |
|
364 |
@Override
|
365 |
public void setCreateOneLayerPerBand(boolean createOneLayerPerBand) { |
366 |
this.createOneLayerPerBand = createOneLayerPerBand;
|
367 |
} |
368 |
|
369 |
@Override
|
370 |
public boolean isCreateOneLayerPerBand() { |
371 |
return this.createOneLayerPerBand; |
372 |
} |
373 |
|
374 |
@Override
|
375 |
public void setFolder(File folder) { |
376 |
this.folder = folder;
|
377 |
} |
378 |
|
379 |
@Override
|
380 |
public File getFolder() { |
381 |
return this.folder; |
382 |
} |
383 |
|
384 |
@Override
|
385 |
public void setSaveToNewRasterFile(boolean saveToNewRasterFile) { |
386 |
this.saveToNewRasterFile = saveToNewRasterFile;
|
387 |
} |
388 |
|
389 |
@Override
|
390 |
public boolean isSaveToNewRasterFile() { |
391 |
return this.saveToNewRasterFile; |
392 |
} |
393 |
|
394 |
@Override
|
395 |
public int getRows() { |
396 |
return rows;
|
397 |
} |
398 |
|
399 |
@Override
|
400 |
public void setRows(int rows) { |
401 |
this.rows = rows;
|
402 |
} |
403 |
|
404 |
@Override
|
405 |
public int getColumns() { |
406 |
return columns;
|
407 |
} |
408 |
|
409 |
@Override
|
410 |
public void setColumns(int columns) { |
411 |
this.columns = columns;
|
412 |
} |
413 |
|
414 |
} |