Revision 8423 trunk/extensions/extWCS/src/com/iver/cit/gvsig/fmap/layers/FLyrWCS.java
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