Revision 1711 org.gvsig.raster.georeferencing/trunk/org.gvsig.raster.georeferencing/org.gvsig.raster.georeferencing.app/org.gvsig.raster.georeferencing.app.georeferencingclient/src/main/java/org/gvsig/raster/georeferencing/app/georeferencingclient/listener/ViewRasterRequestManager.java
ViewRasterRequestManager.java | ||
---|---|---|
24 | 24 |
import java.awt.Color; |
25 | 25 |
import java.awt.Dimension; |
26 | 26 |
import java.awt.Graphics2D; |
27 |
import java.awt.geom.AffineTransform; |
|
28 | 27 |
import java.awt.geom.Point2D; |
29 | 28 |
import java.awt.geom.Rectangle2D; |
30 | 29 |
import java.awt.image.BufferedImage; |
31 | 30 |
|
32 | 31 |
import org.gvsig.fmap.dal.coverage.RasterLocator; |
33 | 32 |
import org.gvsig.fmap.dal.coverage.datastruct.Extent; |
34 |
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData; |
|
35 |
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException; |
|
36 |
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException; |
|
37 |
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException; |
|
38 | 33 |
import org.gvsig.fmap.dal.coverage.store.RasterDataStore; |
39 |
import org.gvsig.fmap.dal.coverage.util.RasterUtils; |
|
34 |
import org.gvsig.fmap.dal.exception.ReadException; |
|
35 |
import org.gvsig.fmap.geom.GeometryLocator; |
|
36 |
import org.gvsig.fmap.geom.GeometryManager; |
|
37 |
import org.gvsig.fmap.geom.Geometry.SUBTYPES; |
|
38 |
import org.gvsig.fmap.geom.exception.CreateEnvelopeException; |
|
39 |
import org.gvsig.fmap.geom.primitive.Envelope; |
|
40 |
import org.gvsig.fmap.mapcontext.ViewPort; |
|
41 |
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException; |
|
42 |
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster; |
|
43 |
import org.gvsig.raster.fmap.layers.FLyrRaster; |
|
40 | 44 |
import org.gvsig.raster.georeferencing.swing.exception.InvalidRequestException; |
41 | 45 |
import org.gvsig.raster.georeferencing.swing.impl.GeoreferencingSwingImplLibrary; |
42 | 46 |
import org.gvsig.raster.georeferencing.swing.impl.layer.GCPsGraphicLayer; |
... | ... | |
48 | 52 |
* @author Nacho Brodin (nachobrodin@gmail.com) |
49 | 53 |
*/ |
50 | 54 |
public class ViewRasterRequestManager implements IExtensionRequest { |
55 |
private GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
|
51 | 56 |
private GeoreferencingView view = null; |
52 | 57 |
private RasterDataStore store = null; |
53 | 58 |
private IGraphicLayer graphicLayer = null; |
54 | 59 |
private Color backGroundColor = null; |
60 |
private FLyrRaster lyr = null; |
|
55 | 61 |
|
56 | 62 |
/** |
57 | 63 |
* Asigna la capa a georreferenciar de donde se obtienen los datos. |
... | ... | |
60 | 66 |
public ViewRasterRequestManager(GeoreferencingView view, RasterDataStore store) { |
61 | 67 |
this.store = store; |
62 | 68 |
this.view = view; |
69 |
lyr = new DefaultFLyrRaster(); |
|
70 |
try { |
|
71 |
((DefaultFLyrRaster)lyr).setDataStore(store); |
|
72 |
} catch (LoadLayerException e) { |
|
73 |
GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", null, e); |
|
74 |
} |
|
63 | 75 |
} |
64 | 76 |
|
65 | 77 |
/** |
... | ... | |
86 | 98 |
if(extent.getWidth() < extent.getHeight()) { |
87 | 99 |
if(((double)view.getCanvasWidth() / (double)view.getCanvasHeight()) <= (extent.getWidth() / extent.getHeight())) { |
88 | 100 |
h = (view.getCanvasHeight() * w) / view.getCanvasWidth(); |
89 |
y = extent.getCenterY() - (h / 2);
|
|
101 |
y = extent.getCenterY() + (h / 2);
|
|
90 | 102 |
} else { //p1 < p2 |
91 | 103 |
w = (view.getCanvasWidth() * h) / view.getCanvasHeight(); |
92 | 104 |
x = extent.getCenterX() - (w / 2); |
... | ... | |
97 | 109 |
x = extent.getCenterX() - (w / 2); |
98 | 110 |
} else { //p1 < p2 |
99 | 111 |
h = (view.getCanvasHeight() * w) / view.getCanvasWidth(); |
100 |
y = extent.getCenterY() - (h / 2);
|
|
112 |
y = extent.getCenterY() + (h / 2);
|
|
101 | 113 |
} |
102 | 114 |
} |
103 | 115 |
Rectangle2D r = new Rectangle2D.Double(x, y, w, h); |
... | ... | |
121 | 133 |
} |
122 | 134 |
|
123 | 135 |
/** |
124 |
* Ajusta la extensi?n del primer par?metro a los l?mites de la segunda |
|
125 |
* @param extToAdj |
|
126 |
* @param imgExt |
|
127 |
* @return |
|
128 |
*/ |
|
129 |
private Extent calculateAdjustedView(Extent extToAdj, Extent imgExt) { |
|
130 |
double vx = extToAdj.minX(); |
|
131 |
double vy = extToAdj.minY(); |
|
132 |
double vx2 = extToAdj.maxX(); |
|
133 |
double vy2 = extToAdj.maxY(); |
|
134 |
|
|
135 |
if (extToAdj.minX() < imgExt.minX()) |
|
136 |
vx = imgExt.minX(); |
|
137 |
if (extToAdj.minY() < imgExt.minY()) |
|
138 |
vy = imgExt.minY(); |
|
139 |
if (extToAdj.maxX() > imgExt.maxX()) |
|
140 |
vx2 = imgExt.maxX(); |
|
141 |
if (extToAdj.maxY() > imgExt.maxY()) |
|
142 |
vy2 = imgExt.maxY(); |
|
143 |
|
|
144 |
return RasterLocator.getManager().getDataStructFactory().createExtent(vx, vy2, vx2, vy); |
|
145 |
} |
|
146 |
|
|
147 |
/** |
|
148 | 136 |
* Obtiene el color de fondo |
149 | 137 |
* @return |
150 | 138 |
*/ |
... | ... | |
174 | 162 |
} |
175 | 163 |
|
176 | 164 |
//Ajustamos el extent al del raster |
177 |
Extent ext = null; |
|
178 |
Extent extSelection = null; |
|
179 |
if(view.getCanvas().getMinxMaxyUL()) { |
|
165 |
Extent ext = RasterLocator.getManager().getDataStructFactory().createExtent(extent.getMinX(), extent.getMaxY(), extent.getMaxX(), extent.getMinY()); |
|
166 |
/*if(view.getCanvas().getMinxMaxyUL()) { |
|
180 | 167 |
ext = RasterLocator.getManager().getDataStructFactory().createExtent(extent); |
181 |
extSelection = calculateAdjustedView(ext, store.getExtent()); |
|
182 | 168 |
} else { |
183 | 169 |
ext = RasterLocator.getManager().getDataStructFactory().createExtent(extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY()); |
184 |
RasterUtils rasterUtil = RasterLocator.getManager().getRasterUtils(); |
|
185 |
extSelection = rasterUtil.calculateAdjustedView(ext, store.getExtent()); |
|
186 |
} |
|
170 |
}*/ |
|
187 | 171 |
|
188 |
//Obtenemos el viewport y calculamos la matriz de transformaci?n |
|
189 |
ViewPortData vp = RasterLocator.getManager().createViewPortData(); |
|
190 |
vp.setExtent(ext); |
|
191 |
vp.setSize(new Dimension(view.getCanvasWidth(), view.getCanvasHeight())); |
|
192 |
vp.calculateAffineTransform(); |
|
193 |
|
|
194 |
//Calculamos el punto del canvas de la vista donde se empieza a dibujar el buffer de la imagen |
|
195 |
Point2D pt = new Point2D.Double(extSelection.getULX(), extSelection.getULY()); |
|
196 |
AffineTransform at = vp.getMat(); |
|
197 |
if(!view.getCanvas().getMinxMaxyUL()) { |
|
198 |
at = new AffineTransform(1, 0, 0, -1, 0, 0); |
|
199 |
at.concatenate(vp.getMat()); |
|
200 |
} |
|
201 |
at.transform(pt, pt); |
|
202 |
|
|
203 | 172 |
try { |
173 |
ViewPort vp = new ViewPort(); |
|
174 |
vp.setImageSize(new Dimension(view.getCanvasWidth(), view.getCanvasHeight())); |
|
175 |
Envelope env = geomManager.createEnvelope(ext.getMin().getX(), ext.getMin().getY(), ext.getMax().getX(), ext.getMax().getY(), SUBTYPES.GEOM2D); |
|
176 |
vp.setEnvelope(env); |
|
177 |
|
|
204 | 178 |
//Dibujamos a trav?s del render de la capa en un graphics como el de la vista |
205 |
BufferedImage initImg = new BufferedImage(view.getCanvasWidth(), view.getCanvasHeight(), BufferedImage.TYPE_INT_RGB); |
|
179 |
BufferedImage initImg = new BufferedImage(view.getCanvasWidth(), view.getCanvasHeight(), BufferedImage.TYPE_INT_ARGB);
|
|
206 | 180 |
Graphics2D g2d = ((Graphics2D)initImg.getGraphics()); |
207 | 181 |
if(backGroundColor != null && backGroundColor != Color.BLACK) { |
208 | 182 |
g2d.setColor(backGroundColor); |
209 | 183 |
g2d.fillRect(0, 0, view.getCanvasWidth(), view.getCanvasHeight()); |
210 | 184 |
} |
211 |
BufferedImage drawedImg = (BufferedImage)store.getRender().draw(g2d, vp, null); |
|
212 |
g2d.drawImage(drawedImg, (int) Math.round(pt.getX()), (int) Math.round(pt.getY()), null); |
|
185 |
lyr.draw(initImg, g2d, vp, null, 1); |
|
213 | 186 |
|
214 | 187 |
setDrawParams(initImg, extent); |
215 | 188 |
|
216 | 189 |
if(graphicLayer != null) |
217 | 190 |
graphicLayer.recalcPixelDrawCoordinates(); |
218 | 191 |
|
219 |
} catch (RasterDriverException e) {
|
|
192 |
} catch (ReadException e) {
|
|
220 | 193 |
throw new InvalidRequestException("Error en al acceso al fichero", e); |
221 |
} catch (InvalidSetViewException e) {
|
|
194 |
} catch (CreateEnvelopeException e) {
|
|
222 | 195 |
throw new InvalidRequestException("Error asignando el ?rea de la petici?n", e); |
223 |
} catch (ProcessInterruptedException e) { |
|
224 | 196 |
} |
225 | 197 |
return extent; |
226 | 198 |
} |
Also available in: Unified diff