Revision 8281 trunk/libraries/libCq CMS for java.old/src/org/cresques/io/GeoRasterFile.java
GeoRasterFile.java | ||
---|---|---|
120 | 120 |
*/ |
121 | 121 |
protected int bandCount = 1; |
122 | 122 |
private int dataType = DataBuffer.TYPE_BYTE; |
123 |
/** |
|
124 |
* Par?metros de transformaci?n del fichero .rmf. Estas variables tendr?n valores distinto |
|
125 |
* de 0 si la funci?n rmfExists() devuelve true. |
|
126 |
*/ |
|
127 |
protected double originX = 0D, originY = 0D, w = 0D, h = 0D; |
|
128 |
protected double pixelSizeX = 0D, pixelSizeY = 0D; |
|
129 |
protected double imageWidth = 0D, imageHeight = 0D; |
|
130 |
protected double shearX = 0D, shearY = 0D; |
|
123 | 131 |
|
124 | 132 |
static { |
125 | 133 |
supportedExtensions = new TreeMap(); |
... | ... | |
260 | 268 |
private double[] parserExtent(KXmlParser parser) throws XmlPullParserException, IOException { |
261 | 269 |
double originX = 0D, originY = 0D, w = 0D, h = 0D; |
262 | 270 |
double pixelSizeX = 0D, pixelSizeY = 0D; |
271 |
double shearX = 0D, shearY = 0D; |
|
263 | 272 |
|
264 | 273 |
boolean end = false; |
265 | 274 |
int tag = parser.next(); |
... | ... | |
275 | 284 |
pixelSizeX = Double.parseDouble(parser.nextText()); |
276 | 285 |
}else if (parser.getName().equals(RasterMetaFileTags.PX_SIZE_Y)){ |
277 | 286 |
pixelSizeY = Double.parseDouble(parser.nextText()); |
287 |
}else if (parser.getName().equals(RasterMetaFileTags.ROTX)){ |
|
288 |
shearX = Double.parseDouble(parser.nextText()); |
|
289 |
}else if (parser.getName().equals(RasterMetaFileTags.ROTY)){ |
|
290 |
shearY = Double.parseDouble(parser.nextText()); |
|
278 | 291 |
}else if (parser.getName().equals(RasterMetaFileTags.WIDTH)){ |
279 | 292 |
w = Double.parseDouble(parser.nextText()); |
280 | 293 |
}else if (parser.getName().equals(RasterMetaFileTags.HEIGHT)){ |
... | ... | |
292 | 305 |
tag = parser.next(); |
293 | 306 |
} |
294 | 307 |
|
295 |
double[] values = {originX, originY, w, h, pixelSizeX, pixelSizeY}; |
|
308 |
double[] values = {originX, originY, w, h, pixelSizeX, pixelSizeY, shearX, shearY};
|
|
296 | 309 |
return values; |
297 | 310 |
} |
298 | 311 |
|
... | ... | |
309 | 322 |
return; |
310 | 323 |
|
311 | 324 |
boolean georefOk = false; |
312 |
double originX = 0D, originY = 0D, w = 0D, h = 0D; |
|
313 |
double pixelSizeX = 0D, pixelSizeY = 0D; |
|
314 |
double imageWidth = 0D, imageHeight = 0D; |
|
315 | 325 |
|
316 | 326 |
FileReader fr = null; |
317 | 327 |
String v = null; |
... | ... | |
340 | 350 |
h = values[3]; |
341 | 351 |
pixelSizeX = values[4]; |
342 | 352 |
pixelSizeY = values[5]; |
353 |
shearX = values[6]; |
|
354 |
shearY = values[7]; |
|
343 | 355 |
georefOk = true; |
344 | 356 |
} else if (parser.getName().equals(RasterMetaFileTags.DIM)){ |
345 | 357 |
boolean DimEnd = false; |
... | ... | |
373 | 385 |
|
374 | 386 |
if(georefOk){ |
375 | 387 |
rmfExists = true; |
388 |
|
|
376 | 389 |
setExtentTransform(originX, originY, w, h, pixelSizeX, pixelSizeY); |
377 |
extent = new Extent(originX, originY, originX + (pixelSizeX * imageWidth), originY + (pixelSizeY * imageHeight)); |
|
390 |
createExtentsFromRMF( originX, originY, pixelSizeX, pixelSizeY, |
|
391 |
imageWidth, imageHeight, shearX, shearY); |
|
378 | 392 |
} |
379 | 393 |
|
380 | 394 |
} catch (FileNotFoundException fnfEx) { |
... | ... | |
391 | 405 |
} |
392 | 406 |
|
393 | 407 |
/** |
408 |
* <P> |
|
409 |
* Calcula el extent de la imagen a partir del fichero rmf con y sin rotaci?n. El extent con rotaci?n corresponde |
|
410 |
* a la variable extent que contiene el extent verdadero marcado por el fichero de georreferenciaci?n .rmf. El extent |
|
411 |
* sin rotaci?n requestExtent es utilizado para realizar la petici?n ya que la petici?n al driver no se puede |
|
412 |
* hacer con coordenadas rotadas. |
|
413 |
* |
|
414 |
* El calculo de la bounding box rotada lo hace con los valores de transformaci?n leidos desde el fichero .rmf. |
|
415 |
* </p> |
|
416 |
* <P> |
|
417 |
* Para el calculo de una esquina aplicamos la formula siguiente:<BR> |
|
418 |
* PtoX = originX + pixelSizeX * x + shearX * y;<BR> |
|
419 |
* PtoY = originY + shearY * x + pixelSizeY * y;<BR> |
|
420 |
* Aplicandolo a las cuatro esquinas sustituimos en cada una de ellas por. |
|
421 |
* </P> |
|
422 |
* <UL> |
|
423 |
* <LI>Esquina superior izquierda: x = 0; y = 0;</LI> |
|
424 |
* <LI>Esquina superior derecha: x = MaxX; y = 0;</LI> |
|
425 |
* <LI>Esquina inferior izquierda: x = 0; y = MaxY;</LI> |
|
426 |
* <LI>Esquina inferior derecha: x = MaxX; y = MaxY;</LI> |
|
427 |
* </UL> |
|
428 |
* <P> |
|
429 |
* quedandonos en los cuatro casos: |
|
430 |
* </P> |
|
431 |
* <UL> |
|
432 |
* <LI>Esquina superior izquierda: originX; originY;</LI> |
|
433 |
* <LI>Esquina superior derecha: PtoX = originX + pixelSizeX * x; PtoY = originY + shearY * x;</LI> |
|
434 |
* <LI>Esquina inferior izquierda: PtoX = originX + shearX * y; PtoY = originY + pixelSizeY * y;</LI> |
|
435 |
* <LI>Esquina inferior derecha: PtoX = originX + pixelSizeX * x + shearX * y; PtoY = originY + shearY * x + pixelSizeY * y;</LI> |
|
436 |
* </UL> |
|
437 |
* |
|
438 |
* <P> |
|
439 |
* El calculo de la bounding box se realizar? de la misma forma pero anulando los parametros de shearing. |
|
440 |
* </P> |
|
441 |
* |
|
442 |
* @param originX Coordenada X de origen del raster |
|
443 |
* @param originY Coordenada Y de origen del raster |
|
444 |
* @param pixelSizeX Tama?o de pixel en X |
|
445 |
* @param pixelSizeY Tama?o de pixel en Y |
|
446 |
* @param imageWidth Ancho del raster en pixels |
|
447 |
* @param imageHeight Alto del raster en pixels |
|
448 |
* @param shearX Shearing en X |
|
449 |
* @param shearY Shearing en Y |
|
450 |
*/ |
|
451 |
private void createExtentsFromRMF( double originX, double originY, double pixelSizeX, double pixelSizeY, |
|
452 |
double imageWidth, double imageHeight, double shearX, double shearY){ |
|
453 |
|
|
454 |
Point2D p1 = new Point2D.Double(originX, originY); |
|
455 |
Point2D p2 = new Point2D.Double(originX + shearX * imageHeight, originY + pixelSizeY * imageHeight); |
|
456 |
Point2D p3 = new Point2D.Double(originX + pixelSizeX * imageWidth, originY + shearY * imageWidth); |
|
457 |
Point2D p4 = new Point2D.Double(originX + pixelSizeX * imageWidth + shearX * imageHeight, originY + pixelSizeY * imageHeight + shearY * imageWidth); |
|
458 |
|
|
459 |
double minX = Math.min(Math.min(p1.getX(), p2.getX()), Math.min(p3.getX(), p4.getX())); |
|
460 |
double minY = Math.min(Math.min(p1.getY(), p2.getY()), Math.min(p3.getY(), p4.getY())); |
|
461 |
double maxX = Math.max(Math.max(p1.getX(), p2.getX()), Math.max(p3.getX(), p4.getX())); |
|
462 |
double maxY = Math.max(Math.max(p1.getY(), p2.getY()), Math.max(p3.getY(), p4.getY())); |
|
463 |
extent = new Extent(minX, minY, maxX, maxY); |
|
464 |
requestExtent = new Extent(originX, originY, originX + (pixelSizeX * imageWidth), originY + (pixelSizeY * imageHeight)); |
|
465 |
} |
|
466 |
|
|
467 |
/** |
|
394 | 468 |
* Calcula la transformaci?n que se produce sobre la vista cuando la imagen tiene un fichero .rmf |
395 | 469 |
* asociado. Esta transformaci?n tiene diferencias entre los distintos formatos por lo que debe calcularla |
396 | 470 |
* el driver correspondiente. |
... | ... | |
655 | 729 |
public boolean isGeoreferenced(){ |
656 | 730 |
return true; |
657 | 731 |
} |
732 |
|
|
733 |
/** |
|
734 |
* M?todo que indica si existe un fichero .rmf asociado al GeoRasterFile. |
|
735 |
* @return |
|
736 |
*/ |
|
737 |
public boolean rmfExists(){ |
|
738 |
return this.rmfExists; |
|
739 |
} |
|
740 |
|
|
741 |
/** |
|
742 |
* Obtiene los par?metros de la transformaci?n af?n que corresponde con los elementos de |
|
743 |
* un fichero tfw. |
|
744 |
* <UL> |
|
745 |
* <LI>[1]tama?o de pixel en X</LI> |
|
746 |
* <LI>[2]rotaci?n en X</LI> |
|
747 |
* <LI>[4]rotaci?n en Y</LI> |
|
748 |
* <LI>[5]tama?o de pixel en Y</LI> |
|
749 |
* <LI>[0]origen en X</LI> |
|
750 |
* <LI>[3]origen en Y</LI> |
|
751 |
* </UL> |
|
752 |
* Este m?todo debe ser reimplementado por el driver si tiene esta informaci?n. En principio |
|
753 |
* Gdal es capaz de proporcionarla de esta forma. |
|
754 |
* @return vector de double con los elementos de la transformaci?n af?n. |
|
755 |
*/ |
|
756 |
public double[] getTransform(){return null;} |
|
658 | 757 |
} |
Also available in: Unified diff