Revision 8281 trunk/libraries/libCq CMS for java.old/src/org/cresques/io/GeoRasterFile.java

View differences:

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