Revision 3939

View differences:

org.gvsig.raster/tags/org.gvsig.raster-2.2.20/org.gvsig.raster.algorithm/pom.xml
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3
	<modelVersion>4.0.0</modelVersion>
4
	<artifactId>org.gvsig.raster.algorithm</artifactId>
5
	<packaging>jar</packaging>
6
	<name>org.gvsig.raster.algorithm</name>
7
	<parent>
8
		<groupId>org.gvsig</groupId>
9
		<artifactId>org.gvsig.raster</artifactId>
10
		<version>2.2.20</version>
11
	</parent>
12
	<dependencies>
13
		<dependency>
14
			<groupId>org.gvsig</groupId>
15
			<artifactId>org.gvsig.raster.lib.api</artifactId>
16
            <scope>compile</scope>
17
		</dependency>
18
        <dependency>
19
            <groupId>org.gvsig</groupId>
20
            <artifactId>org.gvsig.raster.lib.impl</artifactId>
21
            <scope>compile</scope>
22
        </dependency>
23
        <dependency>
24
			<groupId>org.gvsig</groupId>
25
			<artifactId>org.gvsig.raster.swing.api</artifactId>
26
            <scope>compile</scope>
27
		</dependency>
28
        <dependency>
29
            <groupId>org.gvsig</groupId>
30
            <artifactId>org.gvsig.raster.swing.impl</artifactId>
31
            <scope>runtime</scope>
32
        </dependency>
33
     	 <dependency>
34
          <groupId>org.gvsig</groupId>
35
          <artifactId>org.gvsig.metadata.lib.basic.impl</artifactId>
36
          <scope>runtime</scope>
37
      	</dependency>
38
      	<dependency>
39
          <groupId>org.gvsig</groupId>
40
          <artifactId>org.gvsig.metadata.swing.basic.impl</artifactId>
41
          <scope>runtime</scope>
42
      	</dependency>
43
        <dependency>
44
			<groupId>org.gvsig</groupId>
45
			<artifactId>org.gvsig.raster.cache.lib.api</artifactId>
46
            <scope>compile</scope>
47
		</dependency>
48
		<dependency>
49
            <groupId>org.gvsig</groupId>
50
            <artifactId>org.gvsig.tools.lib</artifactId>
51
            <scope>compile</scope>
52
        </dependency>
53
        <dependency>
54
            <groupId>org.gvsig</groupId>
55
            <artifactId>org.gvsig.i18n</artifactId>
56
            <scope>compile</scope>
57
        </dependency>
58
        <dependency>
59
            <groupId>org.gvsig</groupId>
60
            <artifactId>org.gvsig.projection.api</artifactId>
61
            <scope>compile</scope>
62
        </dependency>
63
        <dependency>
64
            <groupId>org.gvsig</groupId>
65
            <artifactId>org.gvsig.projection.cresques.impl</artifactId>
66
            <scope>runtime</scope>
67
        </dependency>
68
         <dependency>
69
            <groupId>org.gvsig</groupId>
70
            <artifactId>org.gvsig.compat.api</artifactId>
71
            <scope>compile</scope>
72
        </dependency>
73
        <dependency>
74
            <groupId>org.gvsig</groupId>
75
            <artifactId>org.gvsig.compat.se</artifactId>
76
            <scope>compile</scope>
77
        </dependency>
78
        <dependency>
79
            <groupId>org.gvsig</groupId>
80
            <artifactId>org.gvsig.fmap.dal.api</artifactId>
81
            <scope>compile</scope>
82
        </dependency>
83
        <dependency>
84
            <groupId>org.gvsig</groupId>
85
            <artifactId>org.gvsig.fmap.dal.impl</artifactId>
86
            <scope>compile</scope>
87
        </dependency>
88
        <dependency>
89
            <groupId>org.gvsig</groupId>
90
            <artifactId>org.gvsig.fmap.dal.file.lib</artifactId>
91
            <scope>compile</scope>
92
        </dependency>
93
        <dependency>
94
            <groupId>org.gvsig</groupId>
95
            <artifactId>org.gvsig.fmap.dal.spi</artifactId>
96
            <scope>compile</scope>
97
        </dependency>
98
        <dependency>
99
            <groupId>org.gvsig</groupId>
100
            <artifactId>org.gvsig.fmap.geometry.api</artifactId>
101
            <scope>compile</scope>
102
        </dependency>
103
        <!--
104
        <dependency>
105
            <groupId>org.gvsig</groupId>
106
            <artifactId>org.gvsig.fmap.geometry.generalpath</artifactId>
107
            <scope>runtime</scope>
108
        </dependency>
109
        <dependency>
110
            <groupId>org.gvsig</groupId>
111
            <artifactId>org.gvsig.fmap.geometry.operation</artifactId>
112
            <scope>runtime</scope>
113
        </dependency>
114
        -->
115
	</dependencies>
116
    <properties>
117
        <build-dir>${basedir}/../../build</build-dir>
118
    </properties>
119
</project>
0 120

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.20/org.gvsig.raster.algorithm/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary
org.gvsig.raster/tags/org.gvsig.raster-2.2.20/org.gvsig.raster.algorithm/src/main/resources/org/gvsig/raster/algorithm/i18n/text.properties
1
The_process_cant_be_cancelled=No se puede cancelar el proceso
2
Failed_pausing_the_process=No se puede pausar el proceso
3
msg_cancel_incrementable=?Est? seguro de que desea cancelar este proceso?
4
title_cancel_incrementable=Confirmaci?n
5
Failed_resuming_the_process=Fall\u00f3 reanudando el proceso.
6
The_process_cant_be_paused=No se puede pausar el proceso
7
espere=Espere
8
tiempo_transcurrido=Tiempo transcurrido
9
error_processing=Error en el procesado
10
cargar_toc=\u00bfDesea cargar la capa en el TOC?
11
confirmacion=Confirmaci?n
12
stats=Estad?sticas
13
compress=Compresi?n
14
file=Fichero
15
path=Ruta
16
size=Tama?o
17
time=Tiempo
0 18

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.20/org.gvsig.raster.algorithm/src/main/resources/org/gvsig/raster/algorithm/i18n/text_en.properties
1
The_process_cant_be_cancelled=Operation cannot be cancelled.
2
Failed_pausing_the_process=Failed to pause processing.
3
msg_cancel_incrementable=Cancel the computation?
4
title_cancel_incrementable=Confirmation
5
Failed_resuming_the_process=Failed to resume processing.
6
The_process_cant_be_paused=Operation cannot be paused.
7
espere=Wait
8
tiempo_transcurrido=Elapsed time
9
error_processing=Error in the process
10
cargar_toc=Would you like to load layer?
11
confirmacion=Confirmation
12
stats=Statistics
13
compress=Compression
14
file=File
15
path=Path
16
size=Size
17
time=Time
0 18

  
org.gvsig.raster/tags/org.gvsig.raster-2.2.20/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.fmap.dal.coverage.RasterManager;
25
import org.gvsig.raster.algorithm.process.ProcessException;
26
import org.gvsig.raster.algorithm.process.DataProcess;
27
import org.gvsig.tools.ToolsLocator;
28
import org.gvsig.tools.extensionpoint.ExtensionPoint;
29
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
30

  
31
/**
32
 * Default {@link RasterManager} implementation.
33
 * 
34
 * @author Nacho Brodin (nachobrodin@gmail.com)
35
 * @version $Id$
36
 */
37
public class RasterBaseAlgorithmManager {
38
	private static RasterBaseAlgorithmManager internalInstance  = new RasterBaseAlgorithmManager();
39
	   
40
	/**
41
	 * Gets an instance of this object for internal use.
42
	 * @return DefaultRasterManager
43
	 */
44
	public static RasterBaseAlgorithmManager getInstance() {
45
		return internalInstance;
46
	}
47
	
48
	/**
49
	 * Returns a new instance of a process.
50
	 * @param processLabel
51
	 *        Label to identify the process
52
	 * @return
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.20/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.20/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.20/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.20/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.20/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, 
187
			Buffer buf, 
188
			double cellsize, 
189
			double minX, 
190
			double minY,
191
			NoData nodata) {
192
		boolean result = exportRaster(sFilename, buf, cellsize, minX, minY);
193
		nodata.setFileName(sFilename);
194
		nodata.save();
195
		return result;
196
	}
197
	
198
	/**
199
	 * Exports a raster buffer to disk
200
	 * @param sFilename
201
	 * @param buf
202
	 * @param cellsize
203
	 * @param minX
204
	 * @param minY
205
	 * @return
206
	 */
207
	@SuppressWarnings("deprecation")
208
	public boolean exportRaster(final String sFilename, 
209
			Buffer buf, 
210
			Buffer alphaBuffer, 
211
			double cellsize, 
212
			double ulx, 
213
			double uly) {
214
		try {
215
			RasterManager manager = RasterLocator.getManager();
216
			final DataServerWriter writerBufferServer = manager.createDataServerWriter();
217
			writerBufferServer.setBuffer(buf, -1);
218
			int nBands = buf.getBandCount();
219
			ColorInterpretation colorInterpretation = null;
220
			if(alphaBuffer != null) {
221
				colorInterpretation = RasterLocator.getManager().getDataStructFactory().createColorInterpretation(
222
						new String[] { 
223
								ColorInterpretation.RED_BAND, 
224
								ColorInterpretation.GREEN_BAND, 
225
								ColorInterpretation.BLUE_BAND,
226
								ColorInterpretation.ALPHA_BAND});
227
			} else {
228
				if(nBands == 1)
229
					colorInterpretation = RasterLocator.getManager().getDataStructFactory().createColorInterpretation(
230
							new String[] { ColorInterpretation.GRAY_BAND });
231
			}
232
			final Params params = manager.createWriterParams(sFilename);
233
			final AffineTransform affineTransform =
234
				new AffineTransform(cellsize, 0, 0,
235
						-cellsize, ulx, uly);
236

  
237
			final RasterWriter writer = manager.createWriter(
238
						writerBufferServer, 
239
						sFilename,
240
						nBands, 
241
						affineTransform, 
242
						buf.getWidth(),
243
						buf.getHeight(), 
244
						buf.getDataType(), 
245
						params, 
246
						null);
247
			if(colorInterpretation != null)
248
				writer.setColorBandsInterpretation(colorInterpretation.getValues());
249
			writer.dataWrite();
250
			writer.writeClose();
251
		} catch (final Exception e) {
252
			e.printStackTrace();
253
			return false;
254
		}
255
		return true;
256
	}
257
	
258
	/**
259
	 * Exports a raster buffer to disk
260
	 * @param sFilename
261
	 * @param buf
262
	 * @param cellsize
263
	 * @param minX
264
	 * @param minY
265
	 * @return
266
	 */
267
	public boolean exportRaster(final String sFilename, 
268
			Buffer buf, 
269
			double cellsize, 
270
			double ulx, 
271
			double uly) {
272
        return exportRaster(sFilename, buf, null, cellsize, ulx, uly);
273
    }
274
	
275
	/**
276
	 * Gets a list of rectangles which represents the pixel coordinates of each DataStore.
277
	 * This rectangle is the area that intersects with the other DataStores in the 	list.
278
	 * @param dataStoreList
279
	 * @return
280
	 */
281
	protected Rectangle2D[] getIntersectionInPxCoords(RasterDataStore[] dataStoreList) {
282
		Extent extentIntersect = null;
283
		int nRectangles = 0;
284
		for (int i = 0; i < dataStoreList.length; i++) {
285
			if(dataStoreList[i] != null) {
286
				if(extentIntersect == null)
287
					extentIntersect = dataStoreList[i].getExtent();
288
				else
289
					extentIntersect = extentIntersect.intersection(dataStoreList[i].getExtent());
290
				nRectangles ++;
291
			}
292
		}
293
		Rectangle2D[] result = new Rectangle2D[nRectangles];
294
		
295
		Point2D p1 = new Point2D.Double(extentIntersect.getULX(), extentIntersect.getULY());
296
		Point2D p2 = new Point2D.Double(extentIntersect.getLRX(), extentIntersect.getLRY());
297
		
298
		int cont = 0;
299
		for (int i = 0; i < dataStoreList.length; i++) {
300
			if(dataStoreList[i] != null) {
301
				Point2D init = dataStoreList[i].worldToRaster(p1);
302
				Point2D end = dataStoreList[i].worldToRaster(p2);
303
				result[cont] = new Rectangle2D.Double(
304
						init.getX(), 
305
						init.getY(), 
306
						Math.abs(end.getX() - init.getX()), 
307
						Math.abs(end.getY() - init.getY()));
308
				cont++;
309
			}
310
		}
311
		return result;
312
	}
313
	
314
	/**
315
	 * Checks if the point in pixel coordinates is inside the region of 
316
	 * interest or not. The point will be
317
	 * @param x 
318
	 * @param y
319
	 * @param rois
320
	 * @param extentResult
321
	 *       Bounding box of the area to which belongs the point defined in pixel coordinates (x, y)
322
	 * @return
323
	 */
324
	public boolean isInsideOfROI(int x, int y, List<ROI> rois, Extent extentResult) {
325
		if(rois == null || rois.size() == 0)
326
			return true;
327
		
328
		ROI roi = rois.get(0);
329
		int[] shift = getROIAnalysisShift(extentResult, roi.getStore().getExtent(), roi.getStore().getCellSize());
330
		
331
		for (int i = 0; i < rois.size(); i++) {
332
			if(rois.get(i).isInsideOfPolygon(x + shift[0], y + shift[1]))
333
				return true;
334
		}
335
		return false;
336
	}
337
	
338
	/**
339
	 * Gets the shift in pixels between the source bounding box and the result bounding box.
340
	 * This is useful to get if a pixel is inside a region of interest because the ROI has 
341
	 * associate the source. 
342
	 * @param extentResult
343
	 * @param sourceExtent
344
	 * @return
345
	 */
346
	private int[] getROIAnalysisShift(Extent extentResult, Extent sourceExtent, double cellsize) {
347
		double xDistance = Math.abs(extentResult.getULX() - sourceExtent.getULX());
348
		double yDistance = Math.abs(extentResult.getULY() - sourceExtent.getULY());
349
		return new int[]{(int)(xDistance / cellsize), (int)(yDistance / cellsize)};
350
	}
351
	
352
	/**
353
	 * Gets the bounding box taking into account whether there are ROIs or not
354
	 * @return
355
	 */
356
	public Extent getExtentResult(Extent window, List<ROI> rois, RasterDataStore store) {
357
		if(window != null)
358
			return window.intersection(store.getExtent());
359
		if(rois == null)
360
			return store.getExtent();
361
		else {
362
			Extent maxExtent = null;
363
			for (int i = 0; i < rois.size(); i++) {
364
				if(i == 0)
365
					maxExtent = rois.get(i).getROIExtent();
366
				else
367
					maxExtent = maxExtent.encloseBoundinBoxes(rois.get(i).getROIExtent());
368
			}
369
			return maxExtent.intersection(store.getExtent());
370
		}
371
	}
372
	
373
	/**
374
	 * Returns true if the algorithm is applied to the entire layer
375
	 * @param extent
376
	 * @param rois
377
	 * @param store
378
	 * @return
379
	 */
380
	public boolean isAnalizedEntireLayer(Extent window, List<ROI> rois, RasterDataStore store) {
381
		if(window == null) {
382
			if(rois == null || rois.size() == 0)
383
				return true;
384
		}
385
		return false;
386
	}
387
	
388
	/**
389
	 * Gets the bounding box of the source in pixel coordinates
390
	 * @param resultExtent
391
	 * @return
392
	 */
393
	public Rectangle2D getSourcePxBox(Extent resultExtent, RasterDataStore store) {
394
		if(resultExtent == null || resultExtent.equals(store.getExtent()))
395
			return new Rectangle2D.Double(0, 0, store.getWidth(), store.getHeight());
396
		Point2D p1 = store.worldToRaster(new Point2D.Double(resultExtent.getULX(), resultExtent.getULY()));
397
		Point2D p2 = store.worldToRaster(new Point2D.Double(resultExtent.getLRX(), resultExtent.getLRY()));
398
		return new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p2.getX() - p1.getX()), Math.abs(p2.getY() - p1.getY()));
399
	}
400
	
401
	/**
402
	 * Builds the output buffer
403
	 * @param sourcePxBBox
404
	 * @param bandCount
405
	 * @return
406
	 */
407
	public Buffer createOutputBuffer(int w, int h, int bandCount) {
408
		return createOutputBuffer(w, h, bandCount, Buffer.TYPE_DOUBLE);
409
	}
410
	
411
	public Buffer createOutputBuffer(int w, int h, int bandCount, int datatype) {
412
		RasterManager rManager = RasterLocator.getManager();
413
		BufferParam bParams = rManager.getBufferFactory().createBufferParams(
414
				w, 
415
				h, 
416
				bandCount, 
417
				datatype, 
418
				true);
419
		Buffer resultBuffer = null;
420
		try {
421
			resultBuffer = rManager.getBufferFactory().createBuffer(bParams);
422
		} catch (BufferCreationException e) {
423
			new ProcessException("Error creating the output buffer", e);
424
		}
425
		return resultBuffer;
426
	}
427
	
428
	/**
429
	 * Gets a data buffer from a <code>RasterDataStore</code> 
430
     */
431
    public Buffer createSourceBuffer(RasterDataStore store, Rectangle2D sourcePxBBox, boolean[] bands) throws ProcessException {
432
        RasterManager rManager = RasterLocator.getManager();
433
        RasterQuery query = rManager.createQuery();
434
        query.setReadOnly(true);
435
        
436
        int nBands = getNumberOfSelectedBands(bands);
437
        int count = 0;
438
        int[] drawableBands = new int[nBands];
439
        for (int i = 0; i < bands.length; i++) {
440
			if(bands[i]) {
441
				drawableBands[count] = i;
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff