Revision 8423 trunk/extensions/extWCS/src/com/iver/cit/gvsig/fmap/layers/FLyrWCS.java

View differences:

FLyrWCS.java
40 40
 */
41 41
package com.iver.cit.gvsig.fmap.layers;
42 42

  
43
import java.awt.Component;
44 43
import java.awt.Dimension;
45 44
import java.awt.Graphics2D;
46 45
import java.awt.Point;
......
61 60
import java.util.Hashtable;
62 61
import java.util.Map;
63 62

  
64
import javax.swing.JOptionPane;
65

  
66 63
import org.cresques.filter.RasterFilterStack;
67 64
import org.cresques.filter.RasterFilterStackManager;
68 65
import org.cresques.geo.ViewPortData;
......
89 86
import com.iver.cit.gvsig.fmap.layers.layerOperations.InfoByPoint;
90 87
import com.iver.cit.gvsig.fmap.layers.layerOperations.StringXMLItem;
91 88
import com.iver.cit.gvsig.fmap.layers.layerOperations.XMLItem;
89
import com.iver.utiles.DoubleUtilities;
92 90
import com.iver.utiles.StringUtilities;
93 91
import com.iver.utiles.XMLEntity;
94 92
import com.iver.utiles.swing.threads.Cancellable;
......
134 132
	private int							maxTileDrawHeight = 1023;
135 133
	private int 						maxTilePrintWidth  = 250;
136 134
	private int							maxTilePrintHeight = 250;
137

  
135
	
138 136
	private FMapWCSDriver driver;
139 137

  
140 138
	private class MyCancellable implements ICancellable
......
201 199
	}
202 200

  
203 201
	/**
204
	 * Clase que contiene los datos de visualizaci?n de WMS.
202
	 * Clase que contiene los datos de visualizaci?n de WCS. Tiene datos que representan al
203
	 * raster en la vista. Este raster puede estar compuesto por tiles por lo que valores 
204
	 * como el ancho total o el m?nimo o m?ximo deben ser calculados a partir de todos los
205
	 * tiles visualizados.
205 206
	 * @author Nacho Brodin (brodin_ign@gva.es)
206 207
	 */
207 208
	private class VisualStatus {
......
213 214
		private double						minX = 0D, minY = 0D, maxX = 0D, maxY = 0D;
214 215
		private int 						bandCount = 0;
215 216
		private int							dataType = DataBuffer.TYPE_UNDEFINED;
217
		
218
		/**
219
		 * Ancho y alto total del raster que ser? la suma de todos los tiles.
220
		 */
221
		private	int							rasterWidth = 0, rasterHeight = 0;
222
		private	double						rasterMinX = Double.MAX_VALUE, rasterMinY = Double.MAX_VALUE;
223
		private	double						rasterMaxX = 0, rasterMaxY = 0;
224
		/**
225
		 * Lista de nombre de fichero que componen toda la visualizaci?n.
226
		 */
227
		private String[]					fileNames = null;
216 228
	}
217 229

  
218 230
	/*
......
446 458
	 */
447 459
	public XMLItem[] getInfo(Point point, double tolerance ) throws DriverException {
448 460
		String data = "<file:"+getName().replaceAll("[^a-zA-Z0-9]","")+">\n";
449
		ArrayList attr = this.getAttributes();
461
		
462
		Point2D pReal = getMapContext().getViewPort().toMapPoint(point);
463
		Point2D px = null;
464
		if(	pReal.getX() > this.getMinX() && 
465
			pReal.getX() < this.getMaxX() && 
466
			pReal.getY() > this.getMinY() && 
467
			pReal.getY() < this.getMaxY()){
468
			
469
			px = new Point2D.Double();
470
			double w = (visualStatus.rasterMaxX - visualStatus.rasterMinX);
471
			double h = (visualStatus.rasterMaxY - visualStatus.rasterMinY);
472
			px.setLocation(((pReal.getX() - visualStatus.rasterMinX) * visualStatus.rasterWidth) / w, 
473
							((visualStatus.rasterMaxY - pReal.getY()) * visualStatus.rasterHeight) / h);
474
		}
475
		
476
		int[] rgb = this.getPixel(pReal.getX(), pReal.getY());
477
		
478
		StringXMLItem[] item = new StringXMLItem[1]; 
479

  
450 480
		data += "  <raster\n";
451
		data += "    File=\""+getName()+"\"\n";
452
		for (int i=0; i<attr.size(); i++) {
453
			Object [] a = (Object []) attr.get(i);
481
		data += "    View_Point=\""+point.getX()+" , "+point.getY()+"\"\n";
482
		data += "    World_Point=\""+DoubleUtilities.format(pReal.getX(), 3)+" , "+ DoubleUtilities.format(pReal.getY(), 3)+"\"\n";
483
		if(	px == null || px.getX() > visualStatus.rasterWidth || px.getX() < 0 || 
484
			px.getY() > visualStatus.rasterHeight || px.getY() < 0)
485
			data += "    Pixel_Point=\"Out\"\n";
486
		else
487
			data += "    Pixel_Point=\""+(int)px.getX()+" , "+(int)px.getY()+"\"\n";
488
		if(rgb != null)
489
			data += "    RGB=\""+rgb[1]+"  "+rgb[2]+"  "+rgb[3]+"\"\n";
490
		data += "    Band_Value=\"";
454 491

  
455
			data += "    "+a[0].toString()+"=";
456
			if (a[1].toString() instanceof String)
457
				data += "\""+a[1].toString()+"\"\n";
458
			else
459
				data += a[1].toString()+"\n";
492
		for(int file = 0; file < visualStatus.fileNames.length; file++ ){
493
			GdalFile rf = new GdalFile(getMapContext().getViewPort().getProjection(), visualStatus.fileNames[file]);
494
			Extent ex = rf.getExtent();
495
			if(pReal.getX() >= ex.minX() && pReal.getX() <= ex.maxX() && pReal.getY() >= ex.minY() && pReal.getY() <= ex.maxY()){
496
				if(visualStatus.dataType >= 0 && visualStatus.dataType <= 3){
497
					for(int i = 0; i < visualStatus.bandCount; i++){
498
						Integer value = (Integer)rf.getData((int)px.getX(), (int)px.getY(), i);
499
						if(value != null)
500
							data += value.intValue()+"  ";
501
					}
502
				}
503
				if(visualStatus.dataType >= 4){
504
					for(int i = 0; i < visualStatus.bandCount; i++){
505
						Float value = (Float)rf.getData((int)px.getX(), (int)px.getY(), i);
506
						if(value != null)
507
							data += value.floatValue()+"  ";
508
					}
509
				}
510
				if(visualStatus.dataType >= 5){
511
					for(int i = 0; i < visualStatus.bandCount; i++){
512
						Double value = (Double)rf.getData((int)px.getX(), (int)px.getY(), i);
513
						if(value != null)
514
							data += value.doubleValue()+"  ";
515
					}
516
				}
517
			}
518
			rf.close();
460 519
		}
461
		data += "    Point=\""+posX+" , "+posY+"\"\n";
462
		data += "    Point_WC=\""+posXWC+" , "+posYWC+"\"\n";
463
		data += "    RGB=\""+r+", "+g+", "+b+"\"\n";
520
		
521
		data += "\"\n";
464 522
		data += "  />\n";
465

  
466 523
		data += "</file:"+getName().replaceAll("[^a-zA-Z0-9]","")+">\n";
467
		System.out.println(data);
468

  
469
		//return data;
470
		XMLItem[] item =  new XMLItem[1];
471
		item[0]= new StringXMLItem(data, this);
524
		
525
		item[0] = new StringXMLItem(data, this); 
472 526
		return item;
473 527
	}
474

  
528
    
475 529
	/*
476 530
	 *  (non-Javadoc)
477 531
	 * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
......
496 550
			visualStatus.minY = viewPort.getAdjustedExtent().getMinY();
497 551
			visualStatus.maxX = viewPort.getAdjustedExtent().getMaxX();
498 552
			visualStatus.maxY = viewPort.getAdjustedExtent().getMaxY();
553
			visualStatus.rasterWidth = 0;
554
			visualStatus.rasterHeight = 0;
555
			visualStatus.rasterMinX = Double.MAX_VALUE;
556
			visualStatus.rasterMinY = Double.MAX_VALUE;
557
			visualStatus.rasterMaxX = 0;
558
			visualStatus.rasterMaxY = 0;
559
			visualStatus.fileNames = new String[1];
499 560

  
500 561
			if(mustTileDraw){
501 562
				if(viewPort.getImageWidth()<= maxTileDrawWidth && viewPort.getImageHeight()<=maxTileDrawHeight)
502
					drawTile(g, viewPort, cancel);
563
					drawTile(g, viewPort, cancel, 0);
503 564
				else{
504 565
					Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
505 566
					Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
506 567
					tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
568
					visualStatus.fileNames = new String[tiles.getNumTiles()];
507 569
					for (int tileNr=0; tileNr < tiles.getNumTiles(); tileNr++) {
508 570
						// drawing part
509 571
						try {
510 572
							ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
511
							drawTile(g, vp, cancel);
573
							drawTile(g, vp, cancel, tileNr);
512 574
						} catch (NoninvertibleTransformException e) {
513 575
							e.printStackTrace();
514 576
						}
515 577
					}
516 578
				}
517 579
			}else
518
				drawTile(g, viewPort, cancel);
580
				drawTile(g, viewPort, cancel, 0);
519 581
		}
520 582
		Runtime r = Runtime.getRuntime();
521 583
		long mem = r.totalMemory() - r.freeMemory();
......
524 586

  
525 587
	/**
526 588
	 * This is the method used to draw a tile in a WMS mosaic layer.
589
	 * @param tile Tile number to draw
527 590
	 */
528
	private void drawTile(Graphics2D g, ViewPort vp, Cancellable cancel) throws DriverException {
591
	private void drawTile(Graphics2D g, ViewPort vp, Cancellable cancel, int tile) throws DriverException {
529 592

  
530 593
		// Compute the query geometry
531 594
		// 1. Check if it is within borders
......
577 640
				vp.getProjection(), new Extent(bBox), sz );
578 641
			vpData.setMat(vp.getAffineTransform());
579 642

  
643
			visualStatus.fileNames[tile] = f.getAbsolutePath();
580 644
			rasterProcess(g, vpData, f);
581 645

  
582 646
		} catch (ValidationException e) {
......
680 744
		//Creamos el PxRaster
681 745
		rasterFile = new GdalFile(vpData.getProjection(), file.getAbsolutePath());
682 746
		raster = new PxRaster(rasterFile, null, rasterFile.getExtent());
683

  
747
		
748
		visualStatus.rasterWidth += rasterFile.getWidth();
749
		visualStatus.rasterHeight += rasterFile.getHeight();
750
		if(raster.getExtent().getMin().getX() < visualStatus.rasterMinX)
751
			visualStatus.rasterMinX = raster.getExtent().getMin().getX();
752
		if(raster.getExtent().getMin().getY() < visualStatus.rasterMinY)
753
			visualStatus.rasterMinY = raster.getExtent().getMin().getY();
754
		if(raster.getExtent().getMax().getX() > visualStatus.rasterMaxX)
755
			visualStatus.rasterMaxX = raster.getExtent().getMax().getX();
756
		if(raster.getExtent().getMax().getY() > visualStatus.rasterMaxY)
757
			visualStatus.rasterMaxY = raster.getExtent().getMax().getY();
758
		
684 759
		//Recuperamos la pila de filtros si ya hubiese sido cargado antes
685 760
		if (this.filterStack!=null)
686 761
			raster.filterStack = this.filterStack;

Also available in: Unified diff