Revision 20957

View differences:

org.gvsig.raster/tags/org.gvsig.raster-2.2.248/org.gvsig.raster.algorithm/src/main/java/org/gvsig/raster/algorithm/RasterBaseAlgorithmManager.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.algorithm;
23

  
24
import org.gvsig.raster.algorithm.process.DataProcess;
25
import org.gvsig.raster.algorithm.process.ProcessException;
26
import org.gvsig.tools.ToolsLocator;
27
import org.gvsig.tools.extensionpoint.ExtensionPoint;
28
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
29

  
30
/**
31
 * Default {@link RasterBaseAlgorithmManager} implementation.
32
 *
33
 * @author Nacho Brodin (nachobrodin@gmail.com)
34
 * @version $Id$
35
 */
36
public class RasterBaseAlgorithmManager {
37
	private static RasterBaseAlgorithmManager internalInstance  = new RasterBaseAlgorithmManager();
38

  
39
	/**
40
	 * Gets an instance of this object for internal use.
41
	 * @return RasterBaseAlgorithmManager
42
	 */
43
	public static RasterBaseAlgorithmManager getInstance() {
44
		return internalInstance;
45
	}
46

  
47
	/**
48
	 * Returns a new instance of a process.
49
	 * @param processLabel
50
	 *        Label to identify the process
51
	 * @return DataProcess
52
	 * @throws ProcessException
53
	 */
54
	public DataProcess createRasterTask(String processLabel) throws ProcessException {
55
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
56
		ExtensionPoint point = extensionPoints.add(RasterBaseAlgorithmLibrary.REGISTER_PROCESS_LABEL);
57
		try {
58
			DataProcess process = (DataProcess)point.create(processLabel);
59
			process.setName(processLabel);
60
			return process;
61
		} catch (InstantiationException e) {
62
			throw new ProcessException("", e);
63
		} catch (IllegalAccessException e) {
64
			throw new ProcessException("", e);
65
		}
66
	}
67

  
68
}
0 69

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.248/org.gvsig.raster.algorithm/src/main/java/org/gvsig/raster/algorithm/util/Operation.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.algorithm.util;
23

  
24
/**
25
 * Interface for operations
26
 * @author Nacho Brodin nachobrodin@gmail.com
27
 */
28
public interface Operation {
29
	public boolean compare(double a, double b);
30
	
31
	public void invoke();
32
}
0 33

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.248/org.gvsig.raster.algorithm/src/main/java/org/gvsig/raster/algorithm/util/AbstractOperation.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.algorithm.util;
23

  
24
/**
25
 * Interface for operations
26
 * @author Nacho Brodin nachobrodin@gmail.com
27
 */
28
public abstract class AbstractOperation implements Operation {
29
	public boolean compare(double a, double b) {
30
		return false;
31
	}
32
	
33
	public void invoke() {
34
		//do nothing
35
	}
36
}
0 37

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.248/org.gvsig.raster.algorithm/src/main/java/org/gvsig/raster/algorithm/util/Interpolation.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.algorithm.util;
23

  
24
import org.gvsig.fmap.dal.coverage.RasterLocator;
25
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
26
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
27

  
28
/**
29
 * Calculates a pixel value using a interpolation method
30
 * @author Nacho Brodin nachobrodin@gmail.com
31
 * @author Victor Olaya
32
 */
33
public class Interpolation {
34
	private Buffer        buffer    = null;
35
	private double        nodata    = 0;
36
	
37
	public Interpolation(Buffer buf) {
38
		this.buffer = buf;
39
		NoData nodata = RasterLocator.getManager().getDataStructFactory().createDefaultNoData(
40
				1, Buffer.TYPE_DOUBLE);
41
		this.nodata = nodata.getValue().doubleValue();
42
	}
43
	
44
	private double[] getKernel(int x, int y, int band) {
45
		if(buffer.getDataType() == Buffer.TYPE_BYTE) {
46
			return getKernelByte(x, y, band);
47
		}
48
		if(buffer.getDataType() == Buffer.TYPE_DOUBLE) {
49
			return getKernelByte(x, y, band);
50
		}
51
		if(buffer.getDataType() == Buffer.TYPE_FLOAT) {
52
			return getKernelByte(x, y, band);
53
		}
54
		if(buffer.getDataType() == Buffer.TYPE_SHORT) {
55
			return getKernelByte(x, y, band);
56
		}
57
		if(buffer.getDataType() == Buffer.TYPE_INT) {
58
			return getKernelByte(x, y, band);
59
		}
60
		return null;
61
	}
62

  
63
	public double getNearestNeighbour(double x, double y, int band) {
64
		int dy = (int)Math.round(y);
65
		int dx = (int)Math.round(x);
66
		dy = dy < buffer.getHeight() ? dy : buffer.getHeight() - 1;
67
		dx = dx < buffer.getWidth() ? dx : buffer.getWidth() - 1;
68
		if(buffer.getDataType() == Buffer.TYPE_BYTE) {
69
			return (double)buffer.getElemByte(dy, dx, band);
70
		}
71
		if(buffer.getDataType() == Buffer.TYPE_DOUBLE) {
72
			return (double)buffer.getElemDouble(dy, dx, band);
73
		}
74
		if(buffer.getDataType() == Buffer.TYPE_FLOAT) {
75
			return (double)buffer.getElemFloat(dy, dx, band);
76
		}
77
		if(buffer.getDataType() == Buffer.TYPE_SHORT) {
78
			return (double)buffer.getElemShort(dy, dx, band);
79
		}
80
		if(buffer.getDataType() == Buffer.TYPE_INT) {
81
			return (double)buffer.getElemInt(dy, dx, band);
82
		}
83
		return nodata;
84
	}
85

  
86
	/**
87
	 * Calcula los valores N y Z para el m?todo bilinear y obtiene el valor del pixel como
88
	 * Z / N
89
	 * @param dx distancia en X desde el centro del pixel hasta el punto. Es un valor entre 0 y 1
90
	 * @param dy distancia en Y desde el centro del pixel hasta el punto. Es un valor entre 0 y 1
91
	 * @param kernel valor del pixel y alrededor 
92
	 * @return valor del pixel
93
	 */
94
	public double getBilinearValue(double x, double y, int band) {
95
		double[] kernel = getKernel((int)x, (int)y, band);
96
		double dx = x - ((int) x);
97
		double dy = y - ((int) y);
98
		
99
		double z = 0.0, n = 0.0, d;
100
		d = (1.0 - dx) * (1.0 - dy);
101
		z += d * kernel[0];
102
		n += d;
103

  
104
		d = dx * (1.0 - dy);
105
		z += d * kernel[1]; 
106
		n += d;
107

  
108
		d = (1.0 - dx) * dy;
109
		z += d * kernel[2]; 
110
		n += d;
111

  
112
		d = dx * dy;
113
		z += d * kernel[3]; 
114
		n += d;
115

  
116
		double b = 0;
117
		if(n > 0.0)
118
			b = (z / n);
119
		return b;
120
	}
121
	
122
	/**
123
	 * Calcula los valores N y Z para el m?todo de distancia inversa y calcula el valor del
124
	 * pixel como Z / N.
125
	 * @param dx distancia en X desde el centro del pixel hasta el punto. Es un valor entre 0 y 1
126
	 * @param dy distancia en Y desde el centro del pixel hasta el punto. Es un valor entre 0 y 1
127
	 * @param kernel valor del pixel y alrededor 
128
	 * @return valor del pixel
129
	 */
130
	public double getInverseDistance(double x, double y, int band) {
131
		double[] kernel = getKernel((int)x, (int)y, band);
132
		double dx = x - ((int) x);
133
		double dy = y - ((int) y);
134
		
135
		double z = 0.0, n = 0.0, d;
136
		d = 1.0 / Math.sqrt(dx * dx + dy * dy);
137
		z += d * kernel[0];
138
		n += d;
139

  
140
		d = 1.0 / Math.sqrt((1.0 - dx) * ( 1.0 - dx) + dy * dy);
141
		z += d * kernel[1]; 
142
		n += d;
143

  
144
		d = 1.0 / Math.sqrt(dx*dx + (1.0-dy)*(1.0-dy));
145
		z += d * kernel[2]; 
146
		n += d;
147

  
148
		d = 1.0 / Math.sqrt((1.0 - dx) *( 1.0 - dx) + (1.0 - dy) * (1.0 - dy));
149
		z += d * kernel[3]; 
150
		n += d;
151

  
152
		double b = 0;
153
		if(n > 0.0)
154
			b = (z / n);
155
		return b;
156
	}
157
	
158
	/**
159
	 * Obtiene un kernel de cuatro elemento que corresponden a los pixeles (x, y), (x + 1, y),
160
	 * (x, y + 1), (x + 1, y + 1). Si los pixeles x + 1 o y + 1 se salen del raster de origen
161
	 * se tomar? x e y. 
162
	 * @param x Coordenada X del pixel inicial
163
	 * @param y Coordenada Y del pixel inicial
164
	 * @param band N?mero de banda.
165
	 * @return Kernel solicitado en forma de array.
166
	 */
167
	private double[] getKernelByte(int x, int y, int band) {
168
		double[] d = new double[4];
169
		d[0] = (buffer.getElemByte(y, x, band) & 0xff);
170
		int nextX = ((x + 1) >= buffer.getWidth()) ? x : (x + 1);
171
		int nextY = ((y + 1) >= buffer.getHeight()) ? y : (y + 1);
172
		d[1] = (buffer.getElemByte(y, nextX, band) & 0xff);
173
		d[2] = (buffer.getElemByte(nextY, x, band) & 0xff);
174
		d[3] = (buffer.getElemByte(nextY, nextX, band) & 0xff);
175
		return d;
176
	}
177

  
178
	/**
179
	 * Obtiene un kernel de cuatro elemento que corresponden a los pixeles (x, y), (x + 1, y),
180
	 * (x, y + 1), (x + 1, y + 1). Si los pixeles x + 1 o y + 1 se salen del raster de origen
181
	 * se tomar? x e y. 
182
	 * @param x Coordenada X del pixel inicial
183
	 * @param y Coordenada Y del pixel inicial
184
	 * @param band N?mero de banda.
185
	 * @return Kernel solicitado en forma de array.
186
	 */
187
	@SuppressWarnings("unused")
188
	private double[] getKernelShort(int x, int y, int band) {
189
		double[] d = new double[4];
190
		d[0] = (buffer.getElemShort(y, x, band) & 0xffff);
191
		int nextX = ((x + 1) >= buffer.getWidth()) ? x : (x + 1);
192
		int nextY = ((y + 1) >= buffer.getHeight()) ? y : (y + 1);
193
		d[1] = (buffer.getElemShort(y, nextX, band) & 0xffff);
194
		d[2] = (buffer.getElemShort(nextY, x, band) & 0xffff);
195
		d[3] = (buffer.getElemShort(nextY, nextX, band) & 0xffff);
196
		return d;
197
	}
198

  
199
	/**
200
	 * Obtiene un kernel de cuatro elemento que corresponden a los pixeles (x, y), (x + 1, y),
201
	 * (x, y + 1), (x + 1, y + 1). Si los pixeles x + 1 o y + 1 se salen del raster de origen
202
	 * se tomar? x e y. 
203
	 * @param x Coordenada X del pixel inicial
204
	 * @param y Coordenada Y del pixel inicial
205
	 * @param band N?mero de banda.
206
	 * @return Kernel solicitado en forma de array.
207
	 */
208
	@SuppressWarnings("unused")
209
	private double[] getKernelInt(int x, int y, int band) {
210
		double[] d = new double[4];
211
		d[0] = (buffer.getElemInt(y, x, band) & 0xffffffff);
212
		int nextX = ((x + 1) >= buffer.getWidth()) ? x : (x + 1);
213
		int nextY = ((y + 1) >= buffer.getHeight()) ? y : (y + 1);
214
		d[1] = (buffer.getElemInt(y, nextX, band) & 0xffffffff);
215
		d[2] = (buffer.getElemInt(nextY, x, band) & 0xffffffff);
216
		d[3] = (buffer.getElemInt(nextY, nextX, band) & 0xffffffff);
217
		return d;
218
	}
219

  
220
	/**
221
	 * Obtiene un kernel de cuatro elemento que corresponden a los pixeles (x, y), (x + 1, y),
222
	 * (x, y + 1), (x + 1, y + 1). Si los pixeles x + 1 o y + 1 se salen del raster de origen
223
	 * se tomar? x e y. 
224
	 * @param x Coordenada X del pixel inicial
225
	 * @param y Coordenada Y del pixel inicial
226
	 * @param band N?mero de banda.
227
	 * @return Kernel solicitado en forma de array.
228
	 */
229
	@SuppressWarnings("unused")
230
	private double[] getKernelFloat(int x, int y, int band) {
231
		double[] d = new double[4];
232
		d[0] = buffer.getElemFloat(y, x, band);
233
		int nextX = ((x + 1) >= buffer.getWidth()) ? x : (x + 1);
234
		int nextY = ((y + 1) >= buffer.getHeight()) ? y : (y + 1);
235
		d[1] = buffer.getElemFloat(y, nextX, band);
236
		d[2] = buffer.getElemFloat(nextY, x, band);
237
		d[3] = buffer.getElemFloat(nextY, nextX, band);
238
		return d;
239
	}
240

  
241
	/**
242
	 * Obtiene un kernel de cuatro elemento que corresponden a los pixeles (x, y), (x + 1, y),
243
	 * (x, y + 1), (x + 1, y + 1). Si los pixeles x + 1 o y + 1 se salen del raster de origen
244
	 * se tomar? x e y. 
245
	 * @param x Coordenada X del pixel inicial
246
	 * @param y Coordenada Y del pixel inicial
247
	 * @param band N?mero de banda.
248
	 * @return Kernel solicitado en forma de array.
249
	 */
250
	@SuppressWarnings("unused")
251
	private double[] getKernelDouble(int x, int y, int band) {
252
		double[] d = new double[4];
253
		d[0] = buffer.getElemDouble(y, x, band);
254
		int nextX = ((x + 1) >= buffer.getWidth()) ? x : (x + 1);
255
		int nextY = ((y + 1) >= buffer.getHeight()) ? y : (y + 1);
256
		d[1] = buffer.getElemDouble(y, nextX, band);
257
		d[2] = buffer.getElemDouble(nextY, x, band);
258
		d[3] = buffer.getElemDouble(nextY, nextX, band);
259
		return d;
260
	}
261
}
0 262

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.248/org.gvsig.raster.algorithm/src/main/java/org/gvsig/raster/algorithm/process/ProcessException.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.algorithm.process;
23
/**
24
 * This exception is thrown when a problem inside a raster process
25
 * is detected. 
26
 * 
27
 * @author Nacho Brodin (nachobrodin@gmail.com)
28
 */
29
public class ProcessException extends Exception {
30
	private static final long serialVersionUID = 666908550965442025L;
31

  
32
	public ProcessException(String msg, Throwable e) {
33
		super(msg, e);
34
	}
35
	
36
	public ProcessException(String msg){
37
		super(msg);
38
	}
39
}
0 40

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.248/org.gvsig.raster.algorithm/src/main/java/org/gvsig/raster/algorithm/process/ProcessParamsManagement.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.algorithm.process;
23

  
24
import java.util.ArrayList;
25
import java.util.HashMap;
26
import java.util.Hashtable;
27
import java.util.Iterator;
28
import java.util.List;
29

  
30
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
31
import org.gvsig.raster.algorithm.gui.IIncrementable;
32
import org.gvsig.raster.algorithm.gui.IncrementableListener;
33
import org.gvsig.tools.ToolsLocator;
34
import org.gvsig.tools.dispose.Disposable;
35
import org.gvsig.tools.extensionpoint.ExtensionPoint;
36
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
37

  
38
/**
39
 * Base class for all geoprocesses. This class contains all utilities to register
40
 * and get parameters in a geoprocess instance
41
 * 
42
 * @author Nacho Brodin nachobrodin@gmail.com
43
 */
44
public abstract class ProcessParamsManagement extends ProcessUtils implements IIncrementable, IncrementableListener, Runnable, Disposable {
45
	//***********************
46
	//Global input parameters
47
	//***********************
48
	
49
	/**
50
	 * Input parameter: If is defined then the ROIs will be used
51
	 */
52
	public static String                ROI_EPSG                           = "ROI_EPSG";
53
	/**
54
	 * Input parameter: Force to this bounding box. If is defined, then ROI_EPSG is not taken into account
55
	 */
56
	public static String                WINDOW                             = "WINDOW";
57
	/**
58
	 * Input parameter: Force to this width in pixels in the output buffer
59
	 */
60
	public static String                OUTPUT_WIDTH                       = "OUTPUT_WIDTH";
61
	/**
62
	 * Input parameter: Force to this height in pixels in the output buffer
63
	 */
64
	public static String                OUTPUT_HEIGHT                      = "OUTPUT_HEIGHT";
65
	/**
66
	 * Input parameter: The output of this algorithm is for previews. It usually implies that the buffer will be
67
	 * send as output parameter, the buffer will be RGB and the input buffer will be to read and write
68
	 */
69
	public static String                PREVIEW                            = "PREVIEW";
70
	
71
	//************************
72
	//Global output parameters
73
	//***********************
74
	
75
	/**
76
	 * Output parameter: The getResult sets the correct value in the output.
77
	 */
78
	public static String                TIME                               = "TIME";
79
	/**
80
	 * Output parameter: The getResult sets the correct value in the output.
81
	 */
82
	public static String                PROCESS                            = "PROCESS";
83
	/**
84
	 * Output parameter: The getResult sets the correct value in the output.
85
	 */
86
	public static String                PROCESS_NAME                       = "PROCESS_NAME";
87

  
88
	public static final String          REGISTER_INPUT_PARAMETERS_LABEL    = "RasterProcessInputParam";
89
	public static final String          REGISTER_OUTPUT_PARAMETERS_LABEL   = "RasterProcessOutputParam";
90
	
91
	private Extent                      outputWindow                       = null;
92
	private int                         outputWidth                        = 0;
93
	private int                         outputHeight                       = 0;
94
	private String                      roiEPSG                            = null;
95
	private boolean                     preview                            = false;
96
	private boolean                     globalParametersLoaded             = false;
97

  
98
	protected Hashtable<String, Object> inputParameters                    = new Hashtable<String, Object>();
99
	protected HashMap<String, Object>   outputParameters                   = new HashMap<String, Object>();
100

  
101
	/**
102
	 *  Registers input parameters of a raster process
103
	 */
104
	public static void registerInputParameter(String parameterLabel, Class<?> parameterClass, String processLabel) {
105
		registerParameter(processLabel, parameterLabel, parameterClass, REGISTER_INPUT_PARAMETERS_LABEL);
106
	}
107
	
108
	/**
109
	 *  Registers output parameters of a raster process
110
	 */
111
	public static void registerOutputParameter(String parameterLabel, Class<?> parameterClass, String processLabel) {
112
		registerParameter(processLabel, parameterLabel, parameterClass, REGISTER_OUTPUT_PARAMETERS_LABEL);
113
	}
114
	
115
	/**
116
	 * Registers a parameter for a raster process
117
	 */
118
	private static void registerParameter(String processLabel, String parameterLabel, Class<?> parameterClass, String type) {
119
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
120
		ExtensionPoint point = extensionPoints.add(type + "_" + processLabel);
121
		point.append(parameterLabel, "", parameterClass);
122
		registerGlobalInputParameters(parameterLabel, parameterClass, processLabel);
123
		registerGlobalOutputParameters(parameterLabel, parameterClass, processLabel);
124
	}
125
	
126
	public static void registerGlobalInputParameters(String parameterLabel, Class<?> parameterClass, String processLabel) {
127
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
128
		ExtensionPoint point = extensionPoints.add(REGISTER_INPUT_PARAMETERS_LABEL + "_" + processLabel);
129
		if(!point.has(ROI_EPSG))
130
			point.append(ROI_EPSG, "", String.class);
131
		if(!point.has(WINDOW))
132
			point.append(WINDOW, "", Extent.class);
133
		if(!point.has(OUTPUT_HEIGHT))
134
			point.append(OUTPUT_HEIGHT, "", Integer.class);
135
		if(!point.has(OUTPUT_WIDTH))
136
			point.append(OUTPUT_WIDTH, "", Integer.class);
137
		if(!point.has(PREVIEW))
138
			point.append(PREVIEW, "", Boolean.class);
139
	}
140
	
141
	public static void registerGlobalOutputParameters(String parameterLabel, Class<?> parameterClass, String processLabel) {
142
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
143
		ExtensionPoint point = extensionPoints.add(REGISTER_OUTPUT_PARAMETERS_LABEL + "_" + processLabel);
144
		if(!point.has(TIME))
145
			point.append(TIME, "", Long.class);
146
		if(!point.has(PROCESS))
147
			point.append(PROCESS, "", DataProcess.class);
148
		if(!point.has(PROCESS_NAME))
149
			point.append(PROCESS_NAME, "", String.class);
150
	}
151
	
152
	/**
153
	 * Gets the key list of the input parameters
154
	 * @param processLabel
155
	 * @return
156
	 */
157
	@SuppressWarnings("unchecked")
158
	public List<String> getRasterTaskInputParameters(String processLabel) {
159
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
160
		ExtensionPoint point = extensionPoints.add(REGISTER_INPUT_PARAMETERS_LABEL + "_" + processLabel);
161
		return point.getNames();
162
	}
163
	
164
	/**
165
	 * Gets the key list of the output parameters
166
	 * @param processLabel
167
	 * @return
168
	 */
169
	@SuppressWarnings("unchecked")
170
	public List<String> getRasterTaskOutputParameters(String processLabel) {
171
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
172
		ExtensionPoint point = extensionPoints.add(REGISTER_OUTPUT_PARAMETERS_LABEL + "_" + processLabel);
173
		return point.getNames();
174
	}
175
	
176
	/**
177
	 * Gets the class of a parameter in a process.
178
	 * @param processLabel
179
	 * @param parameterName
180
	 * @return
181
	 */
182
	public Class<?> getParameterTypeByProcess(String processLabel, String parameterName) {
183
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
184
		ExtensionPoint point = extensionPoints.get(REGISTER_INPUT_PARAMETERS_LABEL + "_" + processLabel);
185
		return point.get(parameterName).getExtension();
186
	}
187
	
188
	/**
189
	 * Gets a list with the class of all parameters. 
190
	 * @param processLabel
191
	 * @param parameterName
192
	 * @return
193
	 */
194
	public List<Class<?>> getParameterClassList(String processLabel, String parameterName) {
195
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
196
		ExtensionPoint point = extensionPoints.get(REGISTER_INPUT_PARAMETERS_LABEL + "_" + processLabel);
197
		List<Class<?>> classList = new ArrayList<Class<?>>();
198
		Iterator<?> it = point.iterator();
199
		while(it.hasNext()) {
200
			Object obj = it.next();
201
			classList.add((Class<?>)obj);
202
		}
203
		return classList;
204
	}
205
	
206
	@Override
207
	protected void finalize() throws Throwable {
208
		if(inputParameters != null) {
209
			inputParameters.clear();
210
			inputParameters = null;
211
		}
212
		super.finalize();
213
	}
214
	
215
	/**
216
	 * Add a parameter to this task at runtime. The 
217
	 * parameter should have been registered before add
218
	 * @param name key
219
	 * @param param object to this task
220
	 */
221
	public void addParam(String key, Object param) {
222
		if (param != null)
223
			inputParameters.put(key, param);
224
		else
225
			inputParameters.remove(key);
226
	}
227

  
228
	/**
229
	 * Remove a parameter to this task at runtime.
230
	 * @param name key
231
	 */
232
	public void removeParam(String key) {
233
		inputParameters.remove(key);
234
	}
235

  
236
	/**
237
	 * Gets a parameter from its key
238
	 * @param name key
239
	 * @return parameter
240
	 */
241
	public Object getParam(String key) {
242
		loadGlobalParameters();
243
		return inputParameters.get(key);
244
	}
245
	
246
	/**
247
	 * Gets a <code>String</code> parameter from its key
248
	 * @param key
249
	 * @return parameter
250
	 */
251
	public String getStringParam(String key) {
252
		loadGlobalParameters();
253
		Object value = inputParameters.get(key);
254
		return (value != null && value instanceof String) ? (String)value : null;
255
	}
256
	
257
	/**
258
	 * Gets a <code>Byte</code> parameter from its key
259
	 * @param key
260
	 * @return parameter
261
	 */
262
	public byte getByteParam(String name) {
263
		loadGlobalParameters();
264
		Object value = inputParameters.get(name);
265
		return (value != null && value instanceof Byte) ? ((Byte)value).byteValue() : 0;
266
	}
267
	
268
	/**
269
	 * Gets a <code>Float</code> parameter from its key
270
	 * @param key
271
	 * @return parameter
272
	 */
273
	public float getFloatParam(String name) {
274
		loadGlobalParameters();
275
		Object value = inputParameters.get(name);
276
		return (value != null && value instanceof Float) ? ((Float)value).floatValue() : 0F;
277
	}
278
	
279
	/**
280
	 * Gets a <code>double</code> parameter from its key
281
	 * @param key
282
	 * @return parameter
283
	 */
284
	public double getDoubleParam(String name) {
285
		loadGlobalParameters();
286
		Object value = inputParameters.get(name);
287
		return (value != null && value instanceof Double) ? ((Double)value).doubleValue() : 0D;
288
	}
289
	
290
	/**
291
	 * Gets a <code>int</code> parameter from its key
292
	 * @param key
293
	 * @return parameter
294
	 */
295
	public int getIntParam(String name) {
296
		loadGlobalParameters();
297
		Object value = inputParameters.get(name);
298
		return (value != null && value instanceof Integer) ? ((Integer)value).intValue() : 0;
299
	}
300
	
301
	/**
302
	 * Gets a <code>Boolean</code> parameter from its key
303
	 * @param key
304
	 * @return parameter
305
	 */
306
	public boolean getBooleanParam(String name) {
307
		loadGlobalParameters();
308
		Object value = inputParameters.get(name);
309
		return (value != null && value instanceof Boolean) ? ((Boolean)value).booleanValue() : false;
310
	}
311
	
312
	/**
313
	 * Gets a <code>int[]</code> parameter from its key
314
	 * @param key
315
	 * @return parameter
316
	 */
317
	public int[] getIntArrayParam(String name) {
318
		loadGlobalParameters();
319
		Object value = inputParameters.get(name);
320
		return (value != null && value instanceof int[]) ? ((int[])value) : null;
321
	}
322
	
323
	/**
324
	 * Gets a <code>double[]</code> parameter from its key
325
	 * @param key
326
	 * @return parameter
327
	 */
328
	public double[] getDoubleArrayParam(String name) {
329
		loadGlobalParameters();
330
		Object value = inputParameters.get(name);
331
		return (value != null && value instanceof double[]) ? ((double[])value) : null;
332
	}
333
	
334
	/**
335
	 * Gets a <code>Extent</code> parameter from its key
336
	 * @param key
337
	 * @return parameter
338
	 */
339
	public Extent getExtentParam(String name) {
340
		loadGlobalParameters();
341
		Object value = inputParameters.get(name);
342
		return (value != null && value instanceof Extent) ? ((Extent)value) : null;
343
	}
344
	
345
	/**
346
	 * Gets the default EPSG for the regions of interest. If this parameter is null
347
	 * @return
348
	 */
349
	protected String getROIEPSG() {
350
		return roiEPSG;
351
	}
352
	
353
	/**
354
	 * Gets the bounding box defined by the user to the process
355
	 * @return
356
	 */
357
	protected Extent getOutputWindow() {
358
		return outputWindow;
359
	}
360
	
361
	/**
362
	 * Gets the width in pixels of the output
363
	 * @return
364
	 */
365
	protected int getOutputWidth() {
366
		return outputWidth;
367
	}
368
	
369
	/**
370
	 * Gets the height in pixels of the output
371
	 * @return
372
	 */
373
	protected int getOutputHeight() {
374
		return outputHeight;
375
	}
376
	
377
	/**
378
	 * Returns true if the output will be rescaled
379
	 * @return
380
	 */
381
	protected boolean isOutputRescaled() {
382
		return (outputWidth != 0 || outputHeight != 0);
383
	}
384
	
385
	/**
386
	 * Returns true if the output of this algorithm is for previews. It usually implies that the buffer will be
387
	 * send as output parameter, the buffer will be RGB and the input buffer will be to read and write.
388
	 * @return
389
	 */
390
	protected boolean isForPreviews() {
391
		return preview;
392
	}
393
	
394
	/**
395
	 * Loads global parameters defined in this class
396
	 */
397
	protected void loadGlobalParameters() {
398
		if(globalParametersLoaded)
399
			return;
400
		globalParametersLoaded = true;
401
		roiEPSG = getStringParam(ROI_EPSG);
402
		outputWindow = getParam(WINDOW) != null ? (Extent)getParam(WINDOW) : null;
403
		outputWidth = getIntParam(OUTPUT_WIDTH);
404
		outputHeight = getIntParam(OUTPUT_HEIGHT);
405
		preview = getBooleanParam(PREVIEW);
406
	}
407
}
0 408

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.248/org.gvsig.raster.algorithm/src/main/java/org/gvsig/raster/algorithm/process/ProcessUtils.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.algorithm.process;
23

  
24
import java.awt.Component;
25
import java.awt.Rectangle;
26
import java.awt.geom.AffineTransform;
27
import java.awt.geom.Point2D;
28
import java.awt.geom.Rectangle2D;
29
import java.util.ArrayList;
30
import java.util.List;
31

  
32
import javax.swing.JOptionPane;
33

  
34
import org.cresques.cts.IProjection;
35
import org.gvsig.fmap.dal.DALLocator;
36
import org.gvsig.fmap.dal.DataManager;
37
import org.gvsig.fmap.dal.DataServerExplorer;
38
import org.gvsig.fmap.dal.DataServerExplorerParameters;
39
import org.gvsig.fmap.dal.coverage.RasterLocator;
40
import org.gvsig.fmap.dal.coverage.RasterManager;
41
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
42
import org.gvsig.fmap.dal.coverage.dataset.BufferParam;
43
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
44
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
45
import org.gvsig.fmap.dal.coverage.datastruct.Params;
46
import org.gvsig.fmap.dal.coverage.exception.BufferCreationException;
47
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
48
import org.gvsig.fmap.dal.coverage.exception.QueryException;
49
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
50
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
51
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
52
import org.gvsig.fmap.dal.coverage.store.RasterWriter;
53
import org.gvsig.fmap.dal.coverage.store.parameter.NewRasterStoreParameters;
54
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
55
import org.gvsig.fmap.dal.exception.DataException;
56
import org.gvsig.fmap.dal.exception.InitializeException;
57
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
58
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
59
import org.gvsig.i18n.Messages;
60
import org.gvsig.raster.roi.ROI;
61
import org.slf4j.Logger;
62
import org.slf4j.LoggerFactory;
63
/**
64
 * Clase base de todos los procesos raster. En ella se genstionan todas las
65
 * funciones comunes como incremento de la tarea, gesti?n de eventos a la tarea, 
66
 * par?metros de la tarea, etc ...
67
 * 
68
 * @author Nacho Brodin nachobrodin@gmail.com
69
 */
70
public abstract class ProcessUtils {
71
	private Logger          log          = LoggerFactory.getLogger(ProcessUtils.class);
72
	protected NoData        doubleNODATA = RasterLocator.getManager().getDataStructFactory().createDefaultNoData(1, Buffer.TYPE_DOUBLE);
73
	
74
	/**
75
	 * Registra un mensaje de error en el log de gvSIG
76
	 * @param msg Mensaje a guardar en el log
77
	 * @param parent Objeto que hizo disparar el mensaje
78
	 * @param exception Excepcion que ha sido recogida
79
	 */
80
	public void debug(String msg, Object parent, Exception exception) {
81
		if(parent != null)
82
		    LoggerFactory
83
            .getLogger(parent.getClass()).debug(Messages.getText(msg), exception);
84
	}
85
	
86
	/**
87
	 * Shows a error dialog with a text and a accept button 
88
	 * @param msg Message to show in the dialog
89
	 * @param parentWindow Parent window
90
	 */
91
	public void messageBoxError(String msg, Object parentWindow){
92
		String string = Messages.getText("accept");
93
		Object[] options = {string};
94
		JOptionPane.showOptionDialog((Component)parentWindow,
95
					"<html>" + Messages.getText(msg).replaceAll("\n", "<br>") + "</html>",
96
					Messages.getText("confirmacion"),
97
					JOptionPane.OK_OPTION,
98
					JOptionPane.ERROR_MESSAGE,
99
					null,
100
					options,
101
					string);
102
	}
103
	
104
	/**
105
	 * Muestra un dialogo de error con un texto y un bot?n de aceptar. El error es
106
	 * registrado en el log de gvSIG con la excepcion que se le pase por parametro
107
	 * @param msg Mensaje a mostrar en el dialogo.
108
	 * @param parentWindow Ventana desde la que se lanza el dialogo
109
	 * @param exception Excepcion que ha sido recogida
110
	 */
111
	public void messageBoxError(String msg, Object parentWindow, Exception exception) {
112
		debug(msg, parentWindow, exception);
113
		messageBoxError(msg, parentWindow);
114
	}
115
	
116
	/**
117
	 * Muestra un dialogo de error con un texto y un bot?n de aceptar. Se le pasa como ?ltimo par?metros
118
	 * una lista de excepciones que ser?n guardadas en el log
119
	 * @param msg Mensaje a mostrar en el dialogo.
120
	 * @param parentWindow Ventana desde la que se lanza el dialogo
121
	 * @param exception Excepcion que ha sido recogida
122
	 */
123
	public void messageBoxError(String msg, Object parentWindow, ArrayList<Exception> exception) {
124
		for (int i = 0; i < exception.size(); i++) 
125
			debug(msg, parentWindow, exception.get(i));
126
		messageBoxError(msg, parentWindow);
127
	}
128
	
129
	/**
130
	 * Exports a raster buffer to disk
131
	 * @param sFilename
132
	 * @param buf
133
	 * @param cellsize
134
	 * @param minX
135
	 * @param minY
136
	 * @return
137
	 * @throws ProviderNotRegisteredException 
138
	 * @throws InitializeException 
139
	 */
140
	public void exportRaster(final String sFilename, 
141
			Buffer buf, 
142
			ColorInterpretation ci,
143
			Extent windowExtent,
144
			NoData nodata,
145
			IProjection proj) {
146
		nodata.setFileName(sFilename);
147
		nodata.save();
148
		
149
		buf.setDataExtent(windowExtent.toRectangle2D());
150
		
151
		DataManager manager = DALLocator.getDataManager();
152
		String provider = "Gdal Store";
153
		try {
154
			DataServerExplorerParameters eparams = manager.createServerExplorerParameters("FilesystemExplorer");
155
			DataServerExplorer serverExplorer = manager.openServerExplorer(eparams.getExplorerName(), eparams);
156

  
157
			NewRasterStoreParameters sparams = (NewRasterStoreParameters)serverExplorer.getAddParameters(provider);
158
			sparams.setBuffer(buf);
159
			sparams.setColorInterpretation(ci.getValues());
160
			sparams.setProjection(proj);
161
			sparams.setDestination(sFilename);
162
			
163
			serverExplorer.add("Gdal Store", sparams, true);
164
		} catch (InitializeException e) {
165
			log.debug("Error saving the file of the process", e);
166
		} catch (ProviderNotRegisteredException e) {
167
			log.debug("Error saving the file of the process", e);
168
		} catch (ValidateDataParametersException e) {
169
			log.debug("Error saving the file of the process", e);
170
		} catch (DataException e) {
171
			log.debug("Error saving the file of the process", e);
172
		}
173
	}
174
	
175
	/**
176
	 * Exports a raster buffer to disk
177
	 * @param sFilename
178
	 * @param buf
179
	 * @param cellsize
180
	 * @param minX
181
	 * @param minY
182
	 * @return
183
	 * @throws ProviderNotRegisteredException 
184
	 * @throws InitializeException 
185
	 */
186
    public boolean exportRaster(final String sFilename, Buffer buf, double cellsize, double minX,
187
        double minY, NoData nodata) {
188
        return exportRaster(sFilename, buf, cellsize, minX, minY);
189
    }
190
	
191
    /**
192
     * Exports buffer to disk
193
     * 
194
     * @param sFilename
195
     *            Name of file to write data buffer
196
     * @param buf
197
     *            data buffer
198
     * @param cellsize
199
     *            Cell size of new raster
200
     * @param minX
201
     * @param minY
202
     * @param nodata
203
     *            No data value of new raster
204
     * @param proj
205
     *            Projection of new raster
206
     * @return
207
     */
208
    public boolean exportRaster(final String sFilename, Buffer buf, double cellsize, double minX,
209
        double minY, NoData nodata, IProjection proj) {
210
        boolean result = exportRaster(sFilename, buf, cellsize, minX, minY, proj);
211
        nodata.setFileName(sFilename);
212
        nodata.save();
213
        return result;
214
    }
215
	
216
    /**
217
     * Export buffer to disk
218
     * 
219
     * @param sFilename
220
     *            Name of raster file
221
     * @param buf
222
     *            Buffer data with new data
223
     * @param alphaBuffer
224
     *            Buffer with alpha data
225
     * @param cellsize
226
     *            Cell size of new raster
227
     * @param ulx
228
     *            X coordinate of upper left corner
229
     * @param uly
230
     *            Y coordinate of upper left corner
231
     * @param proj
232
     *            Projection of new raster
233
     * @return
234
     */
235
    @SuppressWarnings("deprecation")
236
    public boolean exportRaster(final String sFilename, Buffer buf, Buffer alphaBuffer,
237
        double cellsize, double ulx, double uly, IProjection proj) {
238
		try {
239
			RasterManager manager = RasterLocator.getManager();
240
			final DataServerWriter writerBufferServer = manager.createDataServerWriter();
241
			writerBufferServer.setBuffer(buf, -1);
242
			int nBands = buf.getBandCount();
243
			ColorInterpretation colorInterpretation = null;
244
			if(alphaBuffer != null) {
245
				colorInterpretation = RasterLocator.getManager().getDataStructFactory().createColorInterpretation(
246
						new String[] { 
247
								ColorInterpretation.RED_BAND, 
248
								ColorInterpretation.GREEN_BAND, 
249
								ColorInterpretation.BLUE_BAND,
250
								ColorInterpretation.ALPHA_BAND});
251
			} else {
252
				if(nBands == 1)
253
					colorInterpretation = RasterLocator.getManager().getDataStructFactory().createColorInterpretation(
254
							new String[] { ColorInterpretation.GRAY_BAND });
255
			}
256
			final Params params = manager.createWriterParams(sFilename);
257
			final AffineTransform affineTransform =
258
				new AffineTransform(cellsize, 0, 0,
259
						-cellsize, ulx, uly);
260

  
261
			final RasterWriter writer = manager.createWriter(
262
						writerBufferServer, 
263
						sFilename,
264
						nBands, 
265
						affineTransform, 
266
						buf.getWidth(),
267
						buf.getHeight(), 
268
						buf.getDataType(), 
269
						params, 
270
						proj);
271
			if(colorInterpretation != null)
272
				writer.setColorBandsInterpretation(colorInterpretation.getValues());
273
			writer.dataWrite();
274
			writer.writeClose();
275
		} catch (final Exception e) {
276
			e.printStackTrace();
277
			return false;
278
		}
279
		return true;
280
	}
281
	
282
    /**
283
     * Export buffer to disk
284
     * 
285
     * @param sFilename
286
     *            Name of raster file
287
     * @param buf
288
     *            Buffer data with new data
289
     * @param alphaBuffer
290
     *            Buffer with alpha data
291
     * @param cellsize
292
     *            Cell size of new raster
293
     * @param ulx
294
     *            X coordinate of upper left corner
295
     * @param uly
296
     *            Y coordinate of upper left corner
297
     * @return
298
     */
299
    public boolean exportRaster(final String sFilename, Buffer buf, Buffer alphaBuffer,
300
        double cellsize, double ulx, double uly) {
301
        return exportRaster(sFilename, buf, alphaBuffer, cellsize, ulx, uly, null);
302
    }
303
	
304
    /**
305
     * Exports raster buffer to disk
306
     * 
307
     * @param sFilename
308
     *            Name of raster file
309
     * @param buf
310
     *            Buffer data with new data
311
     * @param cellsize
312
     *            Cell size of new raster
313
     * @param ulx
314
     *            X coordinate of upper left corner
315
     * @param uly
316
     *            Y coordinate of upper left corner
317
     * @return
318
     */
319
    public boolean exportRaster(final String sFilename, Buffer buf, double cellsize, double ulx,
320
        double uly) {
321
        return exportRaster(sFilename, buf, null, cellsize, ulx, uly);
322
    }
323
	
324
    /**
325
     * Exports raster buffer to disk
326
     * 
327
     * @param sFilename
328
     *            Name of raster file
329
     * @param buf
330
     *            Buffer data with new data
331
     * @param cellsize
332
     *            Cell size of new raster
333
     * @param ulx
334
     *            X coordinate of upper left corner
335
     * @param uly
336
     *            Y coordinate of upper left corner
337
     * @param proj
338
     *            Projection of new raster
339
     * @return
340
     */
341
    public boolean exportRaster(final String sFilename, Buffer buf, double cellsize, double ulx,
342
        double uly, IProjection proj) {
343
        return exportRaster(sFilename, buf, null, cellsize, ulx, uly, proj);
344
    }
345
	
346
	/**
347
	 * Gets a list of rectangles which represents the pixel coordinates of each DataStore.
348
	 * This rectangle is the area that intersects with the other DataStores in the 	list.
349
	 * @param dataStoreList
350
	 * @return
351
	 */
352
	protected Rectangle2D[] getIntersectionInPxCoords(RasterDataStore[] dataStoreList) {
353
		Extent extentIntersect = null;
354
		int nRectangles = 0;
355
		for (int i = 0; i < dataStoreList.length; i++) {
356
			if(dataStoreList[i] != null) {
357
				if(extentIntersect == null)
358
					extentIntersect = dataStoreList[i].getExtent();
359
				else
360
					extentIntersect = extentIntersect.intersection(dataStoreList[i].getExtent());
361
				nRectangles ++;
362
			}
363
		}
364
		Rectangle2D[] result = new Rectangle2D[nRectangles];
365
		
366
		Point2D p1 = new Point2D.Double(extentIntersect.getULX(), extentIntersect.getULY());
367
		Point2D p2 = new Point2D.Double(extentIntersect.getLRX(), extentIntersect.getLRY());
368
		
369
		int cont = 0;
370
		for (int i = 0; i < dataStoreList.length; i++) {
371
			if(dataStoreList[i] != null) {
372
				Point2D init = dataStoreList[i].worldToRaster(p1);
373
				Point2D end = dataStoreList[i].worldToRaster(p2);
374
				result[cont] = new Rectangle2D.Double(
375
						init.getX(), 
376
						init.getY(), 
377
						Math.abs(end.getX() - init.getX()), 
378
						Math.abs(end.getY() - init.getY()));
379
				cont++;
380
			}
381
		}
382
		return result;
383
	}
384
	
385
	/**
386
	 * Checks if the point in pixel coordinates is inside the region of 
387
	 * interest or not. The point will be
388
	 * @param x 
389
	 * @param y
390
	 * @param rois
391
	 * @param extentResult
392
	 *       Bounding box of the area to which belongs the point defined in pixel coordinates (x, y)
393
	 * @return
394
	 */
395
	public boolean isInsideOfROI(int x, int y, List<ROI> rois, Extent extentResult) {
396
		if(rois == null || rois.size() == 0)
397
			return true;
398
		
399
		ROI roi = rois.get(0);
400
		int[] shift = getROIAnalysisShift(extentResult, roi.getStore().getExtent(), roi.getStore().getCellSize());
401
		
402
		for (int i = 0; i < rois.size(); i++) {
403
			if(rois.get(i).isInsideOfPolygon(x + shift[0], y + shift[1]))
404
				return true;
405
		}
406
		return false;
407
	}
408
	
409
	/**
410
	 * Gets the shift in pixels between the source bounding box and the result bounding box.
411
	 * This is useful to get if a pixel is inside a region of interest because the ROI has 
412
	 * associate the source. 
413
	 * @param extentResult
414
	 * @param sourceExtent
415
	 * @return
416
	 */
417
	private int[] getROIAnalysisShift(Extent extentResult, Extent sourceExtent, double cellsize) {
418
		double xDistance = Math.abs(extentResult.getULX() - sourceExtent.getULX());
419
		double yDistance = Math.abs(extentResult.getULY() - sourceExtent.getULY());
420
		return new int[]{(int)(xDistance / cellsize), (int)(yDistance / cellsize)};
421
	}
422
	
423
	/**
424
	 * Gets the bounding box taking into account whether there are ROIs or not
425
	 * @return
426
	 */
427
	public Extent getExtentResult(Extent window, List<ROI> rois, RasterDataStore store) {
428
		if(window != null)
429
			return window.intersection(store.getExtent());
430
		if(rois == null)
431
			return store.getExtent();
432
		else {
433
			Extent maxExtent = null;
434
			for (int i = 0; i < rois.size(); i++) {
435
				if(i == 0)
436
					maxExtent = rois.get(i).getROIExtent();
437
				else
438
					maxExtent = maxExtent.encloseBoundinBoxes(rois.get(i).getROIExtent());
439
			}
440
			return maxExtent.intersection(store.getExtent());
441
		}
442
	}
443
	
444
	/**
445
	 * Returns true if the algorithm is applied to the entire layer
446
	 * @param extent
447
	 * @param rois
448
	 * @param store
449
	 * @return
450
	 */
451
	public boolean isAnalizedEntireLayer(Extent window, List<ROI> rois, RasterDataStore store) {
452
		if(window == null) {
453
			if(rois == null || rois.size() == 0)
454
				return true;
455
		}
456
		return false;
457
	}
458
	
459
	/**
460
	 * Gets the bounding box of the source in pixel coordinates
461
	 * @param resultExtent
462
	 * @return
463
	 */
464
	public Rectangle2D getSourcePxBox(Extent resultExtent, RasterDataStore store) {
465
		if(resultExtent == null || resultExtent.equals(store.getExtent()))
466
			return new Rectangle2D.Double(0, 0, store.getWidth(), store.getHeight());
467
		Point2D p1 = store.worldToRaster(new Point2D.Double(resultExtent.getULX(), resultExtent.getULY()));
468
		Point2D p2 = store.worldToRaster(new Point2D.Double(resultExtent.getLRX(), resultExtent.getLRY()));
469
		return new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p2.getX() - p1.getX()), Math.abs(p2.getY() - p1.getY()));
470
	}
471
	
472
	/**
473
	 * Builds the output buffer
474
	 * @param sourcePxBBox
475
	 * @param bandCount
476
	 * @return
477
	 */
478
	public Buffer createOutputBuffer(int w, int h, int bandCount) {
479
		return createOutputBuffer(w, h, bandCount, Buffer.TYPE_DOUBLE);
480
	}
481
	
482
	public Buffer createOutputBuffer(int w, int h, int bandCount, int datatype) {
483
		RasterManager rManager = RasterLocator.getManager();
484
		BufferParam bParams = rManager.getBufferFactory().createBufferParams(
485
				w, 
486
				h, 
487
				bandCount, 
488
				datatype, 
489
				true);
490
		Buffer resultBuffer = null;
491
		try {
492
			resultBuffer = rManager.getBufferFactory().createBuffer(bParams);
493
		} catch (BufferCreationException e) {
494
			new ProcessException("Error creating the output buffer", e);
495
		}
496
		return resultBuffer;
497
	}
498
	
499
	/**
500
	 * Gets a data buffer from a <code>RasterDataStore</code> 
501
     */
502
    public Buffer createSourceBuffer(RasterDataStore store, Rectangle2D sourcePxBBox, boolean[] bands) throws ProcessException {
503
        RasterManager rManager = RasterLocator.getManager();
504
        RasterQuery query = rManager.createQuery();
505
        query.setReadOnly(true);
506
        
507
        int nBands = getNumberOfSelectedBands(bands);
508
        int count = 0;
509
        int[] drawableBands = new int[nBands];
510
        for (int i = 0; i < bands.length; i++) {
511
			if(bands[i]) {
512
				drawableBands[count] = i;
513
				count ++;
514
			}
515
		}
516
        
517
        query.setDrawableBands(drawableBands);
518
        query.setAreaOfInterest(
519
        		new Rectangle(
520
        		(int)sourcePxBBox.getX(), 
521
        		(int)sourcePxBBox.getY(), 
522
        		(int)sourcePxBBox.getWidth(), 
523
        		(int)sourcePxBBox.getHeight()));
524

  
525
        try {
526
        	Buffer buffer = null;
527
        	try {
528
        		buffer = store.query(query);
529
        	} catch (QueryException e) {
530
        		new ProcessException("Error creating the input buffer", e);
531
        	}  
532
        	return buffer;
533
        } catch (ProcessInterruptedException e) {
534
        }
535
        return null;
536
    } 
537
    
538
	/**
539
	 * Gets the number of the selected bands from a list of boolean values.
540
	 * Each element in this list represents a band and true or false if the band
541
	 * will be used in the task.
542
	 * @param bandsPCs
543
	 * @return
544
	 */
545
	private int getNumberOfSelectedBands(boolean[] b) {
546
		int bandCount = 0;
547
        for (int i = 0; i < b.length; i++) {
548
			if(b[i])
549
				bandCount++;
550
		}
551
        return bandCount;
552
	}
553
	
554
	/**
555
	 * Gets a value of the buffer in double format
556
	 * @param b
557
	 * @param row
558
	 * @param col
559
	 * @param band
560
	 * @return
561
	 */
562
	protected double getData(Buffer b, int row, int col, int band) {
563
		if(b.getDataType() == Buffer.TYPE_BYTE) {
564
			return (double)b.getElemByte(row, col, band);
565
		}
566
		if(b.getDataType() == Buffer.TYPE_DOUBLE) {
567
			return b.getElemDouble(row, col, band);
568
		}
569
		if(b.getDataType() == Buffer.TYPE_FLOAT) {
570
			return (double)b.getElemFloat(row, col, band);
571
		}
572
		if(b.getDataType() == Buffer.TYPE_INT) {
573
			return (double)b.getElemInt(row, col, band);
574
		}
575
		if(b.getDataType() == Buffer.TYPE_SHORT) {
576
			return (double)b.getElemShort(row, col, band);
577
		}
578
		
579
		return doubleNODATA.getValue().doubleValue();
580
	}
581
}
0 582

  
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff