Revision 1936

View differences:

org.gvsig.raster.tools/trunk/org.gvsig.raster.tools/org.gvsig.raster.tools.algorithm/org.gvsig.raster.tools.algorithm.clip/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.raster.tools.algorithm.saveraster.ClipAlgorithmLibrary
org.gvsig.raster.tools/trunk/org.gvsig.raster.tools/org.gvsig.raster.tools.algorithm/org.gvsig.raster.tools.algorithm.clip/src/main/java/org/gvsig/raster/tools/algorithm/clip/ClipAlgorithmLibrary.java
1
/*
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.raster.tools.algorithm.clip;
25

  
26
import org.gvsig.i18n.Messages;
27
import org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary;
28
import org.gvsig.tools.library.AbstractLibrary;
29
import org.gvsig.tools.library.LibraryException;
30

  
31
/**
32
 * Initialization of ClipAlgorithmLibrary library.
33
 * 
34
 * @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a>
35
 */
36
public class ClipAlgorithmLibrary extends AbstractLibrary {
37
	public static final String         PROCESS_LABEL   = "ClipProcess";
38
	
39
    @Override
40
    protected void doInitialize() throws LibraryException {
41
        // Nothing to do
42
    }
43

  
44
    @Override
45
    public void doPostInitialize() throws LibraryException {
46
    	//Registers the process and its parameters
47
    	RasterBaseAlgorithmLibrary.register(PROCESS_LABEL, ClipProcess.class);
48
    	ClipProcess.registerParameters();
49
    	
50
        Messages.addResourceFamily(
51
            "org.gvsig.raster.tools.algorithm.clip", 
52
            ClipAlgorithmLibrary.class.getClassLoader(), 
53
            ClipAlgorithmLibrary.class.getClass().getName());
54
        //registerGeoProcess(new ClipAlgorithmLibrary());
55
    }
56
}
0 57

  
org.gvsig.raster.tools/trunk/org.gvsig.raster.tools/org.gvsig.raster.tools.algorithm/org.gvsig.raster.tools.algorithm.clip/src/main/java/org/gvsig/raster/tools/algorithm/clip/ClipException.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.algorithm.clip;
23

  
24
import org.gvsig.raster.algorithm.process.ProcessException;
25

  
26

  
27
/**
28
 * This exception is thrown if happen problems processing data with this algorithm.
29
 * 
30
 * @author Nacho Brodin (nachobrodin@gmail.com)
31
 *
32
 */
33
public class ClipException extends ProcessException {
34
	private static final long serialVersionUID = -3022090543908771484L;
35
	
36
	public ClipException(String msg){
37
		super(msg);
38
	}
39
	
40
	public ClipException(String msg, Throwable e){
41
		super(msg, e);
42
	}
43
}
0 44

  
org.gvsig.raster.tools/trunk/org.gvsig.raster.tools/org.gvsig.raster.tools.algorithm/org.gvsig.raster.tools.algorithm.clip/src/main/java/org/gvsig/raster/tools/algorithm/clip/ClipProcess.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.algorithm.clip;
23

  
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.Point2D;
26
import java.io.File;
27
import java.io.IOException;
28
import java.util.ArrayList;
29

  
30
import org.gvsig.fmap.dal.DALLocator;
31
import org.gvsig.fmap.dal.DataManager;
32
import org.gvsig.fmap.dal.DataServerExplorer;
33
import org.gvsig.fmap.dal.DataServerExplorerParameters;
34
import org.gvsig.fmap.dal.coverage.RasterLibrary;
35
import org.gvsig.fmap.dal.coverage.RasterLocator;
36
import org.gvsig.fmap.dal.coverage.RasterManager;
37
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
38
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
39
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
40
import org.gvsig.fmap.dal.coverage.datastruct.Params;
41
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
42
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
43
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
44
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
45
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
46
import org.gvsig.fmap.dal.coverage.process.BaseIncrementableTask;
47
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
48
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
49
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
50
import org.gvsig.fmap.dal.coverage.store.parameter.NewRasterStoreParameters;
51
import org.gvsig.fmap.dal.coverage.store.parameter.RemoteStoreParameters;
52
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
53
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
54
import org.gvsig.fmap.dal.coverage.util.RasterUtils;
55
import org.gvsig.fmap.dal.exception.CloseException;
56
import org.gvsig.fmap.dal.exception.DataException;
57
import org.gvsig.fmap.dal.exception.InitializeException;
58
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
59
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
60
import org.gvsig.i18n.Messages;
61
import org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary;
62
import org.gvsig.raster.algorithm.process.RasterProcess;
63
import org.gvsig.raster.fmap.layers.FLyrRaster;
64
import org.gvsig.raster.fmap.roi.VectorialROI;
65

  
66
/**
67
 * <code>ClippingProcess</code> es un proceso que usa un <code>Thread</code>
68
 * para aplicar un recorte a una capa y guardarlo en disco. Muestra una barra
69
 * de incremento informativa.
70
 *
71
 * @version 24/04/2007
72
 * @author BorSanZa - Borja S?nchez Zamorano
73
 */
74
public class ClipProcess extends RasterProcess {
75
	public static String                  LAYER             = "Layer";
76
	public static String                  PATH              = "Path";
77
	public static String                  FILENAME          = "filename";
78
	public static String                  TIME              = "Time";
79
	
80
	public static String                  SUFFIX            = "suffix";
81
	public static String                  PX_COORDS         = "pixelcoordinates";
82
	public static String                  WORLD_COORDS      = "realcoordinates";
83
	public static String                  DRAW_BANDS        = "drawablebands";
84
	public static String                  ONE_BY_BAND       = "onelayerperband";
85
	public static String                  INTERP_METHOD     = "interpolationmethod";
86
	public static String                  AT                = "affinetransform";
87
	public static String                  COLOR_INTERP      = "colorInterpretation";
88
	public static String                  SELECTED_ROIS     = "selectedrois";
89
	public static String                  RESOLUTION        = "resolution";
90
	public static String                  DRIVER_PARAMS     = "driverparams";
91
	
92
	private String                        fileName            = "";
93
	private String                        suffix              = ".tif";
94
	private FLyrRaster                    rasterSE            = null;
95
	private boolean                       oneLayerPerBand     = false;
96
	private int[]                         drawableBands       = { 0, 1, 2 };
97
	private double[]                      pValues             = null;
98
	private int                           interpolationMethod = Buffer.INTERPOLATION_Undefined;
99
	private Params                        params              = null;
100
	private ColorInterpretation           colorInterp         = null;
101
	private ArrayList<VectorialROI>       selectedRois        = null;
102
	private AffineTransform               affineTransform     = null;
103
	private double[]                      wcValues            = null;
104
	private RasterManager                 rManager            = RasterLocator.getManager();
105
	private BaseIncrementableTask         processIncrement    = null; 
106
	
107
	/**
108
	 * Variables de la resoluci?n de salida
109
	 */
110
	private int                           resolutionWidth     = 0;
111
	private int                           resolutionHeight    = 0;
112
	
113
	private Buffer                        buffer              = null;
114
	
115
	/**
116
	 * Par?metros obligatorios al proceso:
117
	 * <UL>
118
	 * <LI>filename: Nombre del fichero de salida</LI>
119
	 * <LI>datawriter: Escritor de datos</LI>
120
	 * <LI>viewname: Nombre de la vista sobre la que se carga la capa al acabar el proceso</LI>
121
	 * <LI>pixelcoordinates: Coordenadas pixel del recorte (ulx, uly, lrx, lry)</LI>
122
	 * <LI>layer: Capa de entrada para el recorte</LI>
123
	 * <LI>drawablebands: Bandas de entrada</LI>
124
	 * <LI>onelayerperband: booleano que informa de si escribimos una banda por fichero de salida o todas en un fichero</LI>
125
	 * <LI>interpolationmethod: M?todo de interpolaci?n.</LI>
126
	 * <LI>affinetransform: Transformaci?n que informa al dataset de salida de su referencia geografica</LI>
127
	 * <LI>resolution: Ancho y alto de la capa de salida</LI>
128
	 * </UL> 
129
	 */
130
	@SuppressWarnings("unchecked")
131
	public void init() {
132
		fileName = getStringParam(FILENAME);
133
		suffix = getStringParam(SUFFIX);
134
		pValues = getDoubleArrayParam(PX_COORDS);
135
		wcValues = getDoubleArrayParam(WORLD_COORDS);
136
		rasterSE = getParam(LAYER) != null ? (FLyrRaster) getParam(LAYER) : null;
137
		drawableBands = getIntArrayParam(DRAW_BANDS);
138
		oneLayerPerBand = getBooleanParam(ONE_BY_BAND);
139
		interpolationMethod = getIntParam(INTERP_METHOD);
140
		affineTransform = (AffineTransform)getParam(AT);
141
		colorInterp = (ColorInterpretation)getParam(COLOR_INTERP);
142
		selectedRois = (ArrayList<VectorialROI>)getParam(SELECTED_ROIS);
143
		if(getIntArrayParam(RESOLUTION) != null) {
144
			resolutionWidth = getIntArrayParam(RESOLUTION)[0];
145
			resolutionHeight = getIntArrayParam(RESOLUTION)[1];
146
		}
147
		params = (Params) getParam(DRIVER_PARAMS);
148
	}
149
	
150
	public static void registerParameters() {
151
		LAYER = RasterBaseAlgorithmLibrary.registerInputParameter(LAYER, FLyrRaster.class);
152
		SUFFIX = RasterBaseAlgorithmLibrary.registerInputParameter(SUFFIX, String.class);
153
		PX_COORDS = RasterBaseAlgorithmLibrary.registerInputParameter(PX_COORDS, double[].class);
154
		WORLD_COORDS = RasterBaseAlgorithmLibrary.registerInputParameter(WORLD_COORDS, double[].class);
155
		DRAW_BANDS = RasterBaseAlgorithmLibrary.registerInputParameter(DRAW_BANDS, int[].class);
156
		ONE_BY_BAND = RasterBaseAlgorithmLibrary.registerInputParameter(ONE_BY_BAND, Boolean.class);
157
		INTERP_METHOD = RasterBaseAlgorithmLibrary.registerInputParameter(INTERP_METHOD, Integer.class);
158
		AT = RasterBaseAlgorithmLibrary.registerInputParameter(AT, AffineTransform.class);
159
		COLOR_INTERP = RasterBaseAlgorithmLibrary.registerInputParameter(COLOR_INTERP, ColorInterpretation.class);
160
		SELECTED_ROIS = RasterBaseAlgorithmLibrary.registerInputParameter(SELECTED_ROIS, ArrayList.class);
161
		RESOLUTION = RasterBaseAlgorithmLibrary.registerInputParameter(RESOLUTION, int[].class);
162
		DRIVER_PARAMS = RasterBaseAlgorithmLibrary.registerOutputParameter(DRIVER_PARAMS, Params.class);
163
		
164
		PATH = RasterBaseAlgorithmLibrary.registerInputParameter(PATH, String.class);
165
		FILENAME = RasterBaseAlgorithmLibrary.registerOutputParameter(FILENAME, String.class);
166
		TIME = RasterBaseAlgorithmLibrary.registerOutputParameter(TIME, Long.class);
167
	}
168

  
169
	/**
170
	 * Salva la tabla de color al fichero rmf.
171
	 * @param fName
172
	 * @throws ClipException 
173
	 * @throws IOException
174
	 */
175
	private void saveToRmf(String fileName) throws ClipException {
176
		RasterDataStore rds = null;
177
		int limitNumberOfRequests = 20;
178
		while (rds == null && limitNumberOfRequests > 0) {
179
			try {
180
				rds = rasterSE.getDataStore();
181
			} catch (IndexOutOfBoundsException e) {
182
				//En ocasiones, sobre todo con servicios remotos al pedir un datasource da una excepci?n de este tipo
183
				//se supone que es porque hay un refresco en el mismo momento de la petici?n por lo que como es m?s lento de
184
				//gestionar pilla a la capa sin datasources asociados ya que est? reasignandolo. Si volvemos a pedirlo debe
185
				//haberlo cargado ya.
186
				try {
187
					Thread.sleep(200);
188
				} catch (InterruptedException e1) {
189
				}
190
			}
191
			limitNumberOfRequests--;
192
		}
193
		
194
		if (rds == null) {
195
			//RasterToolsUtil.messageBoxError("error_load_layer", this, new Exception("Error writing RMF. limitNumberOfRequests=" + limitNumberOfRequests));
196
			return;
197
		}
198

  
199
		// Guardamos en el RMF el valor NoData
200
		if(rasterSE.getNoDataValue() != null) {
201
			NoData nodata = (NoData)rasterSE.getNoDataValue();
202
			nodata.setFileName(fileName);
203
			nodata.save();
204
		}
205

  
206
		// Guardamos en el RMF la tabla de color
207
		ColorTable colorTable = rasterSE.getRender().getColorTable();
208
		try {
209
			rManager.getProviderServices().saveObjectToRmfFile(fileName, ColorTable.class, colorTable);
210
		} catch (RmfSerializerException e) {
211
			throw new ClipException("error_salvando_rmf", e);
212
		}
213
	}
214

  
215
	/**
216
	 * Tarea de recorte
217
	 * @throws ClipException 
218
	 */
219
	@SuppressWarnings("deprecation")
220
	public void process() throws ProcessInterruptedException, ClipException {
221
		RasterDataStore dstoreCopy = null;
222
		RasterUtils util = RasterLocator.getManager().getRasterUtils();
223
		
224
		try {
225
			long t2;
226
			long t1 = new java.util.Date().getTime();
227

  
228
			try {
229
				Thread.sleep(1000);
230
			} catch (InterruptedException e1) {
231
				e1.printStackTrace();
232
			}
233
			
234
			insertLineLog(Messages.getText("leyendo_raster"));
235
			
236
			dstoreCopy = rasterSE.getDataStore().newDataStore();
237
			RasterQuery query = rManager.createQuery();
238
			query.setDrawableBands(drawableBands);
239

  
240
			if(dstoreCopy.getParameters() instanceof RemoteStoreParameters &&
241
				!((RemoteStoreParameters)dstoreCopy.getParameters()).isSizeFixed()) {
242
				insertLineLog(Messages.getText("downloading_image"));
243
				((RemoteStoreParameters)dstoreCopy.getParameters()).setWidth(resolutionWidth);
244
				((RemoteStoreParameters)dstoreCopy.getParameters()).setHeight(resolutionHeight);
245
				Extent bbox = RasterLocator.getManager().getDataStructFactory().createExtent(wcValues[0], wcValues[1], wcValues[2], wcValues[3]);
246
				query.setAreaOfInterest(bbox, resolutionWidth, resolutionHeight);
247
				try {
248
					buffer = dstoreCopy.query(query);
249
				} catch (InvalidSetViewException e) {
250
					throw new ClipException("No se ha podido asignar la vista al inicial el proceso de recorte.", e);
251
				}
252
			} else {
253
				if(interpolationMethod != Buffer.INTERPOLATION_Undefined) {
254
					try {
255
						if(pValues != null) {
256
							if (util.isBufferTooBig(new double[] { pValues[0], pValues[3], pValues[2], pValues[1] }, drawableBands.length))
257
								query.setReadOnly(true);
258
							query.setAreaOfInterest((int)pValues[0], (int)pValues[1], (int)Math.abs(pValues[2] - pValues[0]) + 1, (int)Math.abs(pValues[3] - pValues[1]) + 1);
259
						} else if(wcValues != null) {
260
							query.setReadOnly(true);
261
							query.setAreaOfInterest(wcValues[0], wcValues[1], Math.abs(wcValues[0] - wcValues[2]), Math.abs(wcValues[1] - wcValues[3]));
262
						}
263
						buffer = dstoreCopy.query(query);
264
					} catch (InvalidSetViewException e) {
265
						throw new ClipException("No se ha podido asignar la vista al inicial el proceso de recorte.", e);
266
					}
267

  
268
					insertLineLog(Messages.getText("interpolando"));
269
					
270
					Buffer bufTmp = buffer;
271
					processIncrement = bufTmp.getIncrementableTask(Buffer.INCREMENTABLE_INTERPOLATION);
272
					buffer = bufTmp.getAdjustedWindow(resolutionWidth, resolutionHeight, interpolationMethod);
273
					if(bufTmp != buffer)
274
						bufTmp.dispose();
275
				} else {
276
					try {
277
						if (util.isBufferTooBig(new double[] { 0, 0, resolutionWidth, resolutionHeight }, drawableBands.length))
278
							query.setReadOnly(true);
279
						if(pValues != null) 
280
							query.setAreaOfInterest((int)pValues[0], (int)pValues[3], (int)Math.abs(pValues[2] - pValues[0]) + 1, (int)Math.abs(pValues[1] - pValues[3]) + 1, resolutionWidth, resolutionHeight);
281
						else if(wcValues != null) {
282
							Extent bbox = RasterLocator.getManager().getDataStructFactory().createExtent(wcValues[0], wcValues[1], wcValues[2], wcValues[3]);
283
							query.setAreaOfInterest(bbox, resolutionWidth, resolutionHeight);
284
						}
285
						buffer = dstoreCopy.query(query);
286
					} catch (InvalidSetViewException e) {
287
						throw new ClipException("No se ha podido asignar la vista al inicial el proceso de recorte.", e);
288
					}
289
				}
290
			}
291
			
292
			//TODO: FUNCIONALIDAD: Poner los getWriter con la proyecci?n del fichero fuente
293

  
294
			if ((selectedRois != null) && (!query.isReadOnly())){
295
				if (selectedRois.size() > 0){
296
					int despX = 0;
297
					int despY = 0;
298
					if (pValues != null){
299
						despX = (int)pValues[0];
300
						despY = (int)pValues[1];
301
					} else if (wcValues != null){
302
						despX = (int)dstoreCopy.worldToRaster(new Point2D.Double(wcValues[0], wcValues[1])).getX();
303
						despY = (int)dstoreCopy.worldToRaster(new Point2D.Double(wcValues[0], wcValues[1])).getY();
304
					}
305
					drawOnlyROIs(buffer, selectedRois, despX, despY);
306
				}
307
			}
308
			
309
			
310
			insertLineLog(Messages.getText("salvando_imagen"));
311
			
312
			DataManager manager = DALLocator.getDataManager();
313
			String provider = "Gdal Store";
314
			DataServerExplorerParameters eparams = manager.createServerExplorerParameters("FilesystemExplorer");
315
			
316
			String finalFileName = "";
317
			NewRasterStoreParameters sparams = null;
318
			processIncrement = RasterLocator.getManager().createDataServerWriter();
319
			if (oneLayerPerBand) {
320
				long[] milis = new long[drawableBands.length];
321
				String[] fileNames = new String[drawableBands.length];
322
				for (int i = 0; i < drawableBands.length; i++) {
323
					fileNames[i] = fileName + "_B" + drawableBands[i] + suffix;
324
					
325
					int index = fileNames[i].lastIndexOf(File.separator);
326
					if(index < 0)
327
						index = fileNames[i].length();
328
					String path = fileNames[i].substring(0, index);
329
					String file = fileNames[i].substring(index + 1, fileNames[i].length());
330
					
331
					eparams.setDynValue("initialpath", path);
332
					DataServerExplorer serverExplorer = manager.openServerExplorer(eparams.getExplorerName(), eparams);
333

  
334
					sparams = (NewRasterStoreParameters)serverExplorer.getAddParameters(provider);
335
					sparams.setDataServer((DataServerWriter)processIncrement);
336
					sparams.setDestination(path, file);
337
					sparams.setBuffer(buffer);
338
					sparams.setColorInterpretation(new String[]{ColorInterpretation.GRAY_BAND});
339
					sparams.setWktProjection(dstoreCopy.getWktProjection());
340
					sparams.setBand(i);
341
					sparams.setAffineTransform(affineTransform);
342
					sparams.setDriverParams(params);
343
					
344
					serverExplorer.add(provider, sparams, true);
345
					
346
					saveToRmf(fileNames[i]);
347
					t2 = new java.util.Date().getTime();
348
					milis[i] = (t2 - t1);
349
					t1 = new java.util.Date().getTime();
350
				}
351
				if (incrementableTask != null) {
352
					incrementableTask.processFinalize();
353
					incrementableTask = null;
354
				}
355
				for (int i = 0; i < drawableBands.length; i++) {
356
					if (externalActions != null)
357
						externalActions.end(new Object[] { fileName + "_B" + drawableBands[i] + suffix, new Long(milis[i]) });
358
				}
359
			} else {
360
				File f = new File(fileName);
361
				if (f.exists()) {
362
					f.delete();
363
				}
364
				f = null;
365
				
366
				if(suffix != null)
367
					finalFileName = fileName.endsWith(suffix) ? fileName : fileName + suffix;
368
				else
369
					finalFileName = fileName;
370
				
371
				int index = finalFileName.lastIndexOf(File.separator);
372
				if(index < 0)
373
					index = finalFileName.length();
374
				String path = finalFileName.substring(0, index);
375
				String file = finalFileName.substring(index + 1, finalFileName.length());
376
				
377
				eparams.setDynValue("initialpath", path);
378
				DataServerExplorer serverExplorer = manager.openServerExplorer(eparams.getExplorerName(), eparams);
379

  
380
				try {
381
					provider = rManager.createWriter(finalFileName).getProviderName();
382
				} catch (NotSupportedExtensionException e1) {
383
					throw new ClipException(Messages.getText("no_driver_escritura"));
384
				} catch (RasterDriverException e1) {
385
					throw new ClipException(Messages.getText("no_driver_escritura"));
386
				}
387
				
388
				sparams = (NewRasterStoreParameters)serverExplorer.getAddParameters(provider);
389
				sparams.setDataServer((DataServerWriter)processIncrement);
390
				sparams.setDestination(path, file);
391
				sparams.setBuffer(buffer);
392
				if(colorInterp != null)
393
					sparams.setColorInterpretation(colorInterp.getValues());
394
				sparams.setWktProjection(dstoreCopy.getWktProjection());
395
				sparams.setAffineTransform(affineTransform);
396
				sparams.setDriverParams(params);
397
				sparams.setBand(-1);
398
				
399
				serverExplorer.add(provider, sparams, true);
400
				
401
				saveToRmf(finalFileName);
402
				
403
				
404
				t2 = new java.util.Date().getTime();
405
				if (incrementableTask != null) {
406
					incrementableTask.processFinalize();
407
					incrementableTask = null;
408
				}
409
				//Damos tiempo a parar el Thread del incrementable para que no se cuelgue la ventana
410
				//El tiempo es como m?nimo el de un bucle del run de la tarea incrementable
411
				try {
412
					Thread.sleep(600);
413
				} catch (InterruptedException e) {
414
					throw new ProcessInterruptedException(e);
415
				}
416
				if (externalActions != null)
417
					externalActions.end(new Object[]{fileName, new Long((t2 - t1))});
418
			}
419

  
420
		} catch (RasterDriverException e) {
421
			throw new ClipException(Messages.getText("error_writer"));
422
		} catch (ValidateDataParametersException e) {
423
			throw new ClipException(Messages.getText("error_georasterwriter"));
424
		} catch (ProviderNotRegisteredException e) {
425
			throw new ClipException(Messages.getText("error_georasterwriter"));
426
		} catch (InitializeException e) {
427
			throw new ClipException(Messages.getText("error_georasterwriter"));
428
		} catch (DataException e) {
429
			throw new ClipException(Messages.getText("error_georasterwriter"));
430
		} catch (Exception e) {
431
			e.printStackTrace();
432
		} finally {
433
			if (dstoreCopy != null)
434
				try {
435
					dstoreCopy.close();
436
				} catch (CloseException e) {
437
					throw new ClipException(Messages.getText("error_writer"));
438
				}
439
			buffer = null;
440
		}
441
	}
442
	
443
	
444
	/**
445
	 * Acciones para poner a NoData los pixels que est?n fuera de las
446
	 * regiones de inter?s seleccionadas.
447
	 * @param buffer
448
	 */
449
	private void drawOnlyROIs(Buffer buffer, ArrayList<VectorialROI> rois, int despX, int despY){
450
		for (int i = 0 ; i < buffer.getWidth() ; i++){
451
			for (int j = 0 ; j < buffer.getHeight() ; j++){
452
				boolean  inside = false;
453
				for (int k = 0 ; k < rois.size() ; k++){
454
					VectorialROI roi = (VectorialROI)rois.get(k);
455
					//TODO: Hacer la comprobacion por coordenadas del mundo en lugar de coordenadas pixel.
456
					if (roi.isInGrid(i + despX, j + despY)){
457
						inside = true;
458
					}
459
				}
460
				if (!inside){
461
					for (int l = 0 ; l < buffer.getBandCount() ; l++){
462
						if (buffer.getDataType() == Buffer.TYPE_BYTE){
463
							buffer.setElem(j, i, l, 
464
									buffer.getNoDataValue().isDefined() ? buffer.getNoDataValue().getValue().byteValue() : RasterLibrary.defaultByteNoDataValue);
465
						} else if (buffer.getDataType() == Buffer.TYPE_SHORT){
466
							buffer.setElem(j, i, l, 
467
									buffer.getNoDataValue().isDefined() ? buffer.getNoDataValue().getValue().shortValue() : RasterLibrary.defaultShortNoDataValue);
468
						} else if (buffer.getDataType() == Buffer.TYPE_INT){
469
							buffer.setElem(j, i, l, 
470
									buffer.getNoDataValue().isDefined() ? buffer.getNoDataValue().getValue().intValue() : RasterLibrary.defaultIntegerNoDataValue);
471
						} else if (buffer.getDataType() == Buffer.TYPE_FLOAT){
472
							buffer.setElem(j, i, l, 
473
									buffer.getNoDataValue().isDefined() ? buffer.getNoDataValue().getValue().floatValue() : RasterLibrary.defaultFloatNoDataValue);
474
						} else if (buffer.getDataType() == Buffer.TYPE_DOUBLE){
475
							buffer.setElem(j, i, l, 
476
									buffer.getNoDataValue().isDefined() ? buffer.getNoDataValue().getValue().doubleValue() : RasterLibrary.defaultDoubleNoDataValue);
477
						}
478
					}
479
				}
480
			}
481
		}
482
	}
483
	
484

  
485
	/*
486
	 * (non-Javadoc)
487
	 * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getPercent()
488
	 */
489
	public int getPercent() {
490
		return (processIncrement != null) ? processIncrement.getPercent() : 0;
491
	}
492

  
493
	/*
494
	 * (non-Javadoc)
495
	 * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getTitle()
496
	 */
497
	public String getTitle() {
498
		return Messages.getText("incremento_recorte");
499
	}
500
	
501
	/*
502
	 * (non-Javadoc)
503
	 * @see java.lang.Object#finalize()
504
	 */
505
	protected void finalize() throws Throwable {
506
		fileName            = null;
507
		suffix              = null;
508
		rasterSE            = null;
509
		drawableBands       = null;
510
		pValues             = null;
511
		params              = null;
512
		colorInterp         = null;
513
		affineTransform     = null;
514
		wcValues            = null;
515
		buffer              = null;
516
		processIncrement    = null;
517
		if(selectedRois != null) {
518
			selectedRois.clear();
519
			selectedRois = null;
520
		}
521
		super.finalize();
522
	}
523
}
0 524

  
org.gvsig.raster.tools/trunk/org.gvsig.raster.tools/org.gvsig.raster.tools.algorithm/org.gvsig.raster.tools.algorithm.clip/.settings/org.eclipse.jdt.core.prefs
1
#Fri Jun 14 14:13:30 CEST 2013
2
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
3
eclipse.preferences.version=1
4
org.eclipse.jdt.core.compiler.source=1.5
5
org.eclipse.jdt.core.compiler.compliance=1.5
0 6

  

Also available in: Unified diff