Revision 18673 trunk/extensions/extGeoreferencing/src/org/gvsig/georeferencing/process/geotransform/GeoTransformProcess.java
GeoTransformProcess.java | ||
---|---|---|
39 | 39 |
*/ |
40 | 40 |
|
41 | 41 |
package org.gvsig.georeferencing.process.geotransform; |
42 |
|
|
42 | 43 |
import org.gvsig.raster.RasterProcess; |
43 | 44 |
import org.gvsig.raster.datastruct.GeoPoint; |
44 | 45 |
import org.gvsig.raster.util.RasterToolsUtil; |
... | ... | |
67 | 68 |
// numero minimo de puntos |
68 | 69 |
protected int minGPC=0; |
69 | 70 |
|
70 |
//coeficientes del polinomio de transformacion para las coordenadas en X |
|
71 |
private double []coefX=null; |
|
72 |
|
|
73 |
//coeficientes del polinomio de transformacion para las coordenadas en Y |
|
74 |
private double []coefY=null; |
|
75 |
|
|
76 | 71 |
// Lista con los valores de las potencias de x e y |
77 | 72 |
private int exp[][] = null; |
78 | 73 |
|
... | ... | |
87 | 82 |
|
88 | 83 |
GeoTransformDataResult resultData= null; |
89 | 84 |
|
85 |
//coeficientes polinomios conversion coordenadas reales a coordenadas pixel |
|
86 |
private double mapToPixelCoefX[]= null; |
|
87 |
private double mapToPixelCoefY[]=null; |
|
88 |
|
|
89 |
|
|
90 |
//coeficientes polinomio conversion coordenadas pixel a coordenadas reales |
|
91 |
private double pixelToMapCoefX[]= null; |
|
92 |
private double pixelToMapCoefY[]=null; |
|
93 |
|
|
90 | 94 |
/** |
91 | 95 |
* Metodo que recoge los parametros del proceso de transformaci?n |
92 | 96 |
* <LI>gpcs: lista de puntos de control</LI>> |
... | ... | |
143 | 147 |
calculateRMSerror(); |
144 | 148 |
// Se almacenan los resultados en dataResult |
145 | 149 |
resultData.setGpcs(gpcs); |
146 |
resultData.setPolxCoef(coefX); |
|
147 |
resultData.setPolyCoef(coefY); |
|
150 |
resultData.setPixelToMapCoefX(pixelToMapCoefX); |
|
151 |
resultData.setPixelToMapCoefY(pixelToMapCoefY); |
|
152 |
resultData.setMapToPixelCoefX(mapToPixelCoefX); |
|
153 |
resultData.setMapToPixelCoefY(mapToPixelCoefY); |
|
148 | 154 |
resultData.setRmsXTotal(rmsXTotal); |
149 | 155 |
resultData.setRmsYTotal(rmsYTotal); |
150 | 156 |
resultData.setRmsXTotal(rmsXTotal); |
... | ... | |
166 | 172 |
* |
167 | 173 |
* */ |
168 | 174 |
public void calculatePolinomialCoefX(){ |
175 |
|
|
169 | 176 |
double matrixDx[][]= new double [minGPC][minGPC]; |
177 |
double matrixDx2[][]= new double [minGPC][minGPC]; |
|
170 | 178 |
double result[]= new double[minGPC]; |
179 |
double result2[]= new double[minGPC]; |
|
171 | 180 |
int k=-1; |
172 | 181 |
// Obtencion de la primera fila de la matriz |
173 | 182 |
for (int filas=0; filas<minGPC;filas++) |
... | ... | |
175 | 184 |
for (int i=0; i<=orden; i++) |
176 | 185 |
for(int j=0; j<=i; j++){ |
177 | 186 |
k++; |
178 |
for(int v=0; v<gpcs.length;v++) |
|
187 |
for(int v=0; v<gpcs.length;v++){
|
|
179 | 188 |
matrixDx[filas][k]+=(Math.pow(gpcs[v].pixelPoint.getX(),i-j)* Math.pow(gpcs[v].pixelPoint.getX(),exp[filas][0])) |
180 |
* (Math.pow(gpcs[v].pixelPoint.getY(),j)* Math.pow(gpcs[v].pixelPoint.getY(),exp[filas][1])); |
|
189 |
* (Math.pow(gpcs[v].pixelPoint.getY(),j)* Math.pow(gpcs[v].pixelPoint.getY(),exp[filas][1])); |
|
190 |
|
|
191 |
matrixDx2[filas][k]+=(Math.pow(gpcs[v].mapPoint.getX(),i-j)* Math.pow(gpcs[v].mapPoint.getX(),exp[filas][0])) |
|
192 |
* (Math.pow(gpcs[v].mapPoint.getY(),j)* Math.pow(gpcs[v].mapPoint.getY(),exp[filas][1])); |
|
193 |
} |
|
181 | 194 |
// Para la fila 0 se guardan los exponentes |
182 | 195 |
if(filas==0){ |
183 | 196 |
exp[k][0]=i-j; |
184 | 197 |
exp[k][1]=j; |
185 | 198 |
|
186 | 199 |
// Se calcula el resultado de !!!!! |
187 |
for(int v=0; v<gpcs.length;v++) |
|
200 |
for(int v=0; v<gpcs.length;v++){
|
|
188 | 201 |
result[k]+=(Math.pow(gpcs[v].pixelPoint.getX(),i-j)* Math.pow(gpcs[v].pixelPoint.getX(),exp[filas][0])) |
189 |
* (Math.pow(gpcs[v].pixelPoint.getY(),j)* Math.pow(gpcs[v].pixelPoint.getY(),exp[filas][1]))*gpcs[v].mapPoint.getX(); |
|
202 |
* (Math.pow(gpcs[v].pixelPoint.getY(),j)* Math.pow(gpcs[v].pixelPoint.getY(),exp[filas][1]))*gpcs[v].mapPoint.getX(); |
|
203 |
|
|
204 |
result2[k]+=(Math.pow(gpcs[v].mapPoint.getX(),i-j)* Math.pow(gpcs[v].mapPoint.getX(),exp[filas][0])) |
|
205 |
* (Math.pow(gpcs[v].mapPoint.getY(),j)* Math.pow(gpcs[v].mapPoint.getY(),exp[filas][1]))*gpcs[v].pixelPoint.getX(); |
|
206 |
} |
|
190 | 207 |
} |
191 | 208 |
} |
192 | 209 |
} |
193 | 210 |
Matrix matrixResult= new Matrix(matrixDx); |
194 |
coefX=solveSistem(matrixResult,result); |
|
211 |
Matrix matrixResult2= new Matrix(matrixDx2); |
|
212 |
pixelToMapCoefX=solveSistem(matrixResult,result); |
|
213 |
mapToPixelCoefX=solveSistem(matrixResult2,result2); |
|
195 | 214 |
} |
196 | 215 |
|
197 | 216 |
|
... | ... | |
204 | 223 |
* */ |
205 | 224 |
public void calculatePolinomialCoefY(){ |
206 | 225 |
double matrixDy[][]= new double [minGPC][minGPC]; |
226 |
double matrixDy2[][]= new double [minGPC][minGPC]; |
|
207 | 227 |
double result[]= new double[minGPC]; |
228 |
double result2[]= new double[minGPC]; |
|
208 | 229 |
int k=-1; |
209 | 230 |
// Obtencion de la primera fila de la matriz |
210 | 231 |
for (int filas=0; filas<minGPC;filas++) |
... | ... | |
212 | 233 |
for (int i=0; i<=orden; i++) |
213 | 234 |
for(int j=0; j<=i; j++){ |
214 | 235 |
k++; |
215 |
for(int v=0; v<gpcs.length;v++) |
|
236 |
for(int v=0; v<gpcs.length;v++){
|
|
216 | 237 |
matrixDy[filas][k]+=(Math.pow(gpcs[v].pixelPoint.getX(),i-j)* Math.pow(gpcs[v].pixelPoint.getX(),exp[filas][0])) |
217 | 238 |
* (Math.pow(gpcs[v].pixelPoint.getY(),j)* Math.pow(gpcs[v].pixelPoint.getY(),exp[filas][1])); |
239 |
matrixDy2[filas][k]+=(Math.pow(gpcs[v].mapPoint.getX(),i-j)* Math.pow(gpcs[v].mapPoint.getX(),exp[filas][0])) |
|
240 |
* (Math.pow(gpcs[v].mapPoint.getY(),j)* Math.pow(gpcs[v].mapPoint.getY(),exp[filas][1])); |
|
241 |
|
|
242 |
|
|
243 |
} |
|
218 | 244 |
// Para la fila 0 se guardan los exponentes |
219 | 245 |
if(filas==0){ |
220 | 246 |
exp[k][0]=i-j; |
221 | 247 |
exp[k][1]=j; |
222 | 248 |
|
223 | 249 |
// Se calcula el resultado de !!!!! |
224 |
for(int v=0; v<gpcs.length;v++) |
|
250 |
for(int v=0; v<gpcs.length;v++){
|
|
225 | 251 |
result[k]+=(Math.pow(gpcs[v].pixelPoint.getX(),i-j)* Math.pow(gpcs[v].pixelPoint.getX(),exp[filas][0])) |
226 |
* (Math.pow(gpcs[v].pixelPoint.getY(),j)* Math.pow(gpcs[v].pixelPoint.getY(),exp[filas][1]))*gpcs[v].mapPoint.getY(); |
|
252 |
* (Math.pow(gpcs[v].pixelPoint.getY(),j)* Math.pow(gpcs[v].pixelPoint.getY(),exp[filas][1]))*gpcs[v].mapPoint.getY(); |
|
253 |
|
|
254 |
result2[k]+=(Math.pow(gpcs[v].mapPoint.getX(),i-j)* Math.pow(gpcs[v].mapPoint.getX(),exp[filas][0])) |
|
255 |
* (Math.pow(gpcs[v].mapPoint.getY(),j)* Math.pow(gpcs[v].mapPoint.getY(),exp[filas][1]))*gpcs[v].pixelPoint.getY(); |
|
256 |
} |
|
227 | 257 |
} |
228 | 258 |
} |
229 | 259 |
} |
230 | 260 |
Matrix matrixResult= new Matrix(matrixDy); |
231 |
coefY=solveSistem(matrixResult,result); |
|
261 |
Matrix matrixResult2= new Matrix(matrixDy2); |
|
262 |
pixelToMapCoefY=solveSistem(matrixResult,result); |
|
263 |
mapToPixelCoefY= solveSistem(matrixResult2,result2); |
|
232 | 264 |
} |
233 |
|
|
265 |
|
|
266 |
|
|
267 |
|
|
234 | 268 |
/** |
235 | 269 |
* @return array con la solucion al sistema de ecuadiones. |
236 | 270 |
* */ |
... | ... | |
259 | 293 |
|
260 | 294 |
for(int i = 0; i < minGPC; i++) { |
261 | 295 |
|
262 |
gpcs[im_point].setEvaluateX(gpcs[im_point].getEvaluateX() + coefX[i] * Math.pow(gpcs[im_point].pixelPoint.getX(), exp[i][0]) * Math.pow(gpcs[im_point].pixelPoint.getY(), exp[i][1]));
|
|
263 |
gpcs[im_point].setEvaluateY(gpcs[im_point].getEvaluateY() + coefY[i] * Math.pow(gpcs[im_point].pixelPoint.getX(), exp[i][0]) * Math.pow(gpcs[im_point].pixelPoint.getY(), exp[i][1]));
|
|
296 |
gpcs[im_point].setEvaluateX(gpcs[im_point].getEvaluateX() + pixelToMapCoefX[i] * Math.pow(gpcs[im_point].pixelPoint.getX(), exp[i][0]) * Math.pow(gpcs[im_point].pixelPoint.getY(), exp[i][1]));
|
|
297 |
gpcs[im_point].setEvaluateY(gpcs[im_point].getEvaluateY() + pixelToMapCoefY[i] * Math.pow(gpcs[im_point].pixelPoint.getX(), exp[i][0]) * Math.pow(gpcs[im_point].pixelPoint.getY(), exp[i][1]));
|
|
264 | 298 |
} |
265 | 299 |
|
266 | 300 |
gpcs[im_point].setErrorX(Math.pow(gpcs[im_point].getEvaluateX() - gpcs[im_point].mapPoint.getX(), 2)); |
... | ... | |
278 | 312 |
this.rmsXTotal = rmsxTotal / numgpcs; |
279 | 313 |
this.rmsYTotal = rmsyTotal / numgpcs; |
280 | 314 |
|
281 |
/*System.out.print("Base X\t\t");
|
|
282 |
System.out.print("Base Y\t\t");
|
|
283 |
System.out.print("WarpX\t\t");
|
|
284 |
System.out.print("WarpY\t\t");
|
|
315 |
/*System.out.print("Map X\t\t");
|
|
316 |
System.out.print("Map Y\t\t");
|
|
317 |
System.out.print("Pix X\t\t");
|
|
318 |
System.out.print("Pix Y\t\t");
|
|
285 | 319 |
System.out.print("PredicX\t\t\t\t"); |
286 | 320 |
System.out.print("PredicY\t\t\t\t"); |
287 | 321 |
System.out.print("ErrorX\t\t\t\t"); |
... | ... | |
300 | 334 |
System.out.print((new Double(gpcs[i].getErrorX()).toString()+"\t\t")); |
301 | 335 |
System.out.print((new Double(gpcs[i].getErrorY()).toString()+"\t\t")); |
302 | 336 |
System.out.print((new Double(gpcs[i].getRms()).toString()+"\t\t")); |
303 |
|
|
304 |
}*/ |
|
305 |
|
|
337 |
} */ |
|
306 | 338 |
} |
307 | 339 |
|
308 | 340 |
/** |
Also available in: Unified diff