Revision 224
org.gvsig.raster.app/trunk/org.gvsig.raster.app/org.gvsig.raster.app.wmtsclient/src/main/java/org/gvsig/raster/app/extension/wmtsclient/layer/FLyrWMTS.java | ||
---|---|---|
50 | 50 |
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException; |
51 | 51 |
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException; |
52 | 52 |
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException; |
53 |
import org.gvsig.fmap.dal.coverage.exception.WMSException; |
|
54 | 53 |
import org.gvsig.fmap.dal.coverage.explorer.WMTSServerExplorer; |
55 | 54 |
import org.gvsig.fmap.dal.coverage.explorer.WMTSServerExplorerParameters; |
56 | 55 |
import org.gvsig.fmap.dal.coverage.store.RasterDataStore; |
... | ... | |
213 | 212 |
return; |
214 | 213 |
|
215 | 214 |
// 2. Compute extent to be requested. |
216 |
Rectangle2D bBox = new Rectangle2D.Double(); |
|
215 |
/*Rectangle2D bBox = new Rectangle2D.Double();
|
|
217 | 216 |
Rectangle2D.intersect(getRectable2DFromEnvelope(viewPort.getAdjustedExtent()), |
218 | 217 |
getRectable2DFromEnvelope(getFullEnvelope()), bBox); |
219 | 218 |
int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * viewPort.getAffineTransform().getScaleX()) + 1); |
... | ... | |
225 | 224 |
viewPort.getAdjustedEnvelope().getMaximum(0), |
226 | 225 |
viewPort.getAdjustedEnvelope().getMinimum(1)); |
227 | 226 |
ViewPortData vpData = rManager.createViewPortData(viewPort.getProjection(), ex, sz ); |
228 |
vpData.setMat(viewPort.getAffineTransform()); |
|
227 |
vpData.setMat(viewPort.getAffineTransform());*/ |
|
228 |
Envelope adjustedExtent = viewPort.getAdjustedEnvelope(); |
|
229 |
Extent ext = rManager.getDataStructFactory().createExtent( |
|
230 |
adjustedExtent.getLowerCorner().getX(), |
|
231 |
adjustedExtent.getUpperCorner().getY(), |
|
232 |
adjustedExtent.getUpperCorner().getX(), |
|
233 |
adjustedExtent.getLowerCorner().getY()); |
|
234 |
Dimension imgSz = viewPort.getImageSize(); |
|
235 |
ViewPortData vp2 = rManager.createViewPortData(viewPort.getProjection(), ext, imgSz ); |
|
236 |
vp2.setMat(viewPort.getAffineTransform()); |
|
237 |
|
|
229 | 238 |
try { |
230 |
getParameters().setExtent(bBox);
|
|
231 |
getParameters().setWidth(wImg);
|
|
232 |
getParameters().setHeight(hImg);
|
|
233 |
getRender().draw(g, vpData);
|
|
239 |
getParameters().setExtent(ext.toRectangle2D());
|
|
240 |
getParameters().setWidth((int)viewPort.getImageSize().getWidth());
|
|
241 |
getParameters().setHeight((int)viewPort.getImageSize().getHeight());
|
|
242 |
getRender().drawTiledService(g, vp2);
|
|
234 | 243 |
} catch (RasterDriverException e) { |
235 | 244 |
throw new ReadException("Problems drawing this layer: " + e.getMessage(), e); |
236 | 245 |
} catch (InvalidSetViewException e) { |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/grid/render/DefaultRender.java | ||
---|---|---|
306 | 306 |
* (non-Javadoc) |
307 | 307 |
* @see org.gvsig.fmap.dal.coverage.grid.render.Render#draw(java.awt.Graphics2D, org.cresques.geo.ViewPortData) |
308 | 308 |
*/ |
309 |
public synchronized void drawTiledService(Graphics2D g, ViewPortData vp) |
|
310 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException { |
|
311 |
lastGraphics = g; |
|
312 |
lastViewPortData = vp; |
|
313 |
|
|
314 |
if(util.isOutside(vp.getExtent(), dataStore.getExtent())) { |
|
315 |
endReading(); |
|
316 |
return; |
|
317 |
} |
|
318 |
|
|
319 |
if (dataStore != null) { |
|
320 |
if (lastTransparency == null) { |
|
321 |
lastTransparency = new GridTransparencyImpl(dataStore.getTransparency()); |
|
322 |
lastTransparency.addPropertyListener(this); |
|
323 |
} |
|
324 |
// Asignamos la banda de transparencia si existe esta |
|
325 |
RasterQuery query = DefaultRasterManager.getInstance().createQuery(); |
|
326 |
if (dataStore.getTransparency().getAlphaBandNumber() != -1) { |
|
327 |
query.setSupersamplingLoadingBuffer(false); // Desactivamos el supersampleo en la carga del buffer. |
|
328 |
query.setDrawableBands(new int[] { lastTransparency.getAlphaBandNumber(), -1, -1 }); |
|
329 |
query.setAreaOfInterest(vp.getExtent().getULX(), |
|
330 |
vp.getExtent().getULY(), |
|
331 |
vp.getExtent().getLRX(), |
|
332 |
vp.getExtent().getLRY(), |
|
333 |
(int)Math.round(vp.getWidth()), |
|
334 |
(int)Math.round(vp.getHeight()), this, 0); |
|
335 |
query.setSupersamplingLoadingBuffer(true); |
|
336 |
lastTransparency.setAlphaBand(dataStore.query(query)); |
|
337 |
} |
|
338 |
query.setSupersamplingLoadingBuffer(false); // Desactivamos el supersampleo en la carga del buffer. |
|
339 |
// En el renderizado ser? ImageDrawer el que se encargue de esta funci?n |
|
340 |
query.setDrawableBands(getRenderBands()); |
|
341 |
query.setAreaOfInterest(vp.getExtent().getULX(), |
|
342 |
vp.getExtent().getULY(), |
|
343 |
vp.getExtent().getLRX(), |
|
344 |
vp.getExtent().getLRY(), |
|
345 |
(int)Math.round(vp.getWidth()), |
|
346 |
(int)Math.round(vp.getHeight()), this, 0); |
|
347 |
dataStore.query(query); |
|
348 |
query.setSupersamplingLoadingBuffer(true); |
|
349 |
} else |
|
350 |
return; |
|
351 |
} |
|
352 |
|
|
353 |
/* |
|
354 |
* (non-Javadoc) |
|
355 |
* @see org.gvsig.fmap.dal.coverage.grid.render.Render#draw(java.awt.Graphics2D, org.cresques.geo.ViewPortData) |
|
356 |
*/ |
|
309 | 357 |
public synchronized void draw(Graphics2D g, ViewPortData vp) |
310 | 358 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException { |
311 | 359 |
lastGraphics = g; |
... | ... | |
406 | 454 |
* Tenemos una matriz con la transformaci?n de la coordenadas de la vista a coordenadas reales vp.mat, adem?s tenemos |
407 | 455 |
* la transformaci?n de coordenadas reales a coordenadas pixel (transf). Con ambas podemos obtener una matriz de trasformacion |
408 | 456 |
* entre coordenadas de la vista a coordenadas pixel (transf X vp.mat). As? obtenemos la transformaci?n entre coordenadas |
409 |
* de la vista y coordenadas pixel del raster. El problemas es que cada zoom la escala de la petici?n del raster varia
|
|
457 |
* de la vista y coordenadas pixel del raster. El problema es que a cada zoom la escala de la petici?n del raster varia
|
|
410 | 458 |
* por lo que habr? que calcular una matriz con la escala (escale). escale X transf X vp.mat |
411 | 459 |
*/ |
412 | 460 |
double sX = Math.abs(ulPxRequest.getX() - lrPxRequest.getX()) / widthImage; |
413 | 461 |
double sY = Math.abs(ulPxRequest.getY() - lrPxRequest.getY()) / heightImage; |
414 |
AffineTransform escale = new AffineTransform(sX, 0, 0, sY, 0, 0);
|
|
462 |
AffineTransform scale = new AffineTransform(sX, 0, 0, sY, 0, 0); |
|
415 | 463 |
|
416 | 464 |
try { |
417 |
AffineTransform at = (AffineTransform)escale.clone();
|
|
465 |
AffineTransform at = (AffineTransform)scale.clone(); |
|
418 | 466 |
at.preConcatenate(transf); |
419 | 467 |
at.preConcatenate(vp.getMat()); |
420 | 468 |
g.transform(at); |
... | ... | |
454 | 502 |
LoggerFactory.getLogger(getClass()).debug("Invalid view", e); |
455 | 503 |
} |
456 | 504 |
} else { |
505 |
double viewScaleW = lastViewPortData.getExtent().width() / lastViewPortData.getWidth(); |
|
506 |
double tileScaleW = e.width() / (double)buf.getWidth(); |
|
507 |
double scaleW = viewScaleW / tileScaleW; |
|
508 |
double viewScaleH = lastViewPortData.getExtent().height() / lastViewPortData.getHeight(); |
|
509 |
double tileScaleH = e.height() / (double)buf.getHeight(); |
|
510 |
double scaleH = viewScaleH / tileScaleH; |
|
511 |
|
|
457 | 512 |
ImageDrawer d = new ImageDrawer(this); |
458 | 513 |
d.setBuffer(buf); |
459 | 514 |
d.setStep(null); |
460 | 515 |
d.setBufferSize(buf.getWidth(), buf.getHeight()); |
461 | 516 |
Image geoImage = d.drawBufferOverImageObject(replicateBand, getRenderBands()); |
462 |
lastGraphics.drawImage(geoImage, 0, 0, null); |
|
463 |
/*Point2D lastGraphicOffset = new Point2D.Double(e.getULX(), e.getULY());
|
|
464 |
((DefaultViewPortData)lastViewPortData).mat.transform(lastGraphicOffset, lastGraphicOffset);
|
|
517 |
|
|
518 |
AffineTransform at = new AffineTransform();
|
|
519 |
at.scale(1/scaleW, 1/scaleH);
|
|
465 | 520 |
|
466 |
AffineTransform at = new AffineTransform(buf.getWidth() / , 0, 0, sY, 0, 0); |
|
467 |
lastGraphics.transform(at); |
|
468 |
lastGraphics.drawImage(geoImage, (int) Math.round(lastGraphicOffset.getX()), (int) Math.round(lastGraphicOffset.getY()), null); |
|
469 |
lastGraphics.transform(at.createInverse());*/ |
|
521 |
try { |
|
522 |
Point2D pt = new Point2D.Double(e.getULX(), e.getULY()); |
|
523 |
((DefaultViewPortData)lastViewPortData).mat.transform(pt, pt); |
|
524 |
at.inverseTransform(pt, pt); |
|
525 |
|
|
526 |
lastGraphics.transform(at); |
|
527 |
lastGraphics.drawImage(geoImage, (int) Math.round(pt.getX()), (int) Math.round(pt.getY()), null); |
|
528 |
lastGraphics.transform(at.createInverse()); |
|
529 |
|
|
530 |
} catch (NoninvertibleTransformException e1) { |
|
531 |
e1.printStackTrace(); |
|
532 |
} |
|
470 | 533 |
} |
471 | 534 |
} |
472 | 535 |
|
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/store/AbstractRasterDataStore.java | ||
---|---|---|
252 | 252 |
public void setAreaOfInterest(double ulx, double uly, double lrx, double lry, |
253 | 253 |
int bufWidth, int bufHeight, TileListener listener, int frameWidthPx) throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException { |
254 | 254 |
dataExtent = new ExtentImpl(ulx, uly, lrx, lry); |
255 |
Extent adjustedDataExtent = util.calculateAdjustedView(dataExtent, getAffineTransform(), new Dimension((int)getWidth(), (int)getHeight())); |
|
256 |
getWindowRaster(adjustedDataExtent.getULX(), adjustedDataExtent.getULY(), adjustedDataExtent.getLRX(), adjustedDataExtent.getLRY(), bufWidth, bufHeight, listener, frameWidthPx); |
|
255 |
//Extent adjustedDataExtent = util.calculateAdjustedView(dataExtent, getAffineTransform(), new Dimension((int)getWidth(), (int)getHeight())); |
|
256 |
//getWindowRaster(adjustedDataExtent.getULX(), adjustedDataExtent.getULY(), adjustedDataExtent.getLRX(), adjustedDataExtent.getLRY(), bufWidth, bufHeight, listener, frameWidthPx); |
|
257 |
getWindowRaster(ulx, uly, lrx, lry, bufWidth, bufHeight, listener, frameWidthPx); |
|
257 | 258 |
} |
258 | 259 |
|
259 | 260 |
/** |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.api/src/main/java/org/gvsig/fmap/dal/coverage/grid/render/Render.java | ||
---|---|---|
193 | 193 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException; |
194 | 194 |
|
195 | 195 |
/** |
196 |
* Este m?todo dibuja sobre el Graphics a partir de un Viewport sin ajustar. Los tiles que van llegando |
|
197 |
* no est?n en el tama?o ajustado sino que llegan en su tama?o origina, tipicamente 256x256 p?xeles. Estos |
|
198 |
* son reescalados al ir a dibujarlos sobre el Graphics. |
|
199 |
* @param g |
|
200 |
* @param vp |
|
201 |
* @throws RasterDriverException |
|
202 |
* @throws InvalidSetViewException |
|
203 |
* @throws ProcessInterruptedException |
|
204 |
*/ |
|
205 |
public void drawTiledService(Graphics2D g, ViewPortData vp) |
|
206 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException; |
|
207 |
|
|
208 |
/** |
|
196 | 209 |
* <p> |
197 | 210 |
* This method throws the draw call in a Thread. This is useful to draw tiles. |
198 | 211 |
* </p> |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.io/org.gvsig.raster.io.base/src/main/java/org/gvsig/fmap/dal/coverage/dataset/io/wmts/WMTSProvider.java | ||
---|---|---|
433 | 433 |
if(tileMatrixSet == null) |
434 | 434 |
return; |
435 | 435 |
|
436 |
Rectangle2D r = new Rectangle2D.Double(minX, maxY, Math.abs(maxX - minX), Math.abs(maxY - minY));
|
|
436 |
Rectangle2D r = new Rectangle2D.Double(Math.min(minX, maxX), Math.min(minY, maxY), Math.abs(maxX - minX), Math.abs(maxY - minY));
|
|
437 | 437 |
double scale = 0; |
438 | 438 |
|
439 | 439 |
//Calculo de la escala en geogr?ficas |
... | ... | |
461 | 461 |
} |
462 | 462 |
|
463 | 463 |
//3-Selecci?n de fila y columna |
464 |
ArrayList<Tile> tiles = tileMatrix.intersects(tileMatrixLimits, p.getSRS().isProjected(), minX, minY, maxX, maxY);
|
|
464 |
ArrayList<Tile> tiles = tileMatrix.intersects(tileMatrixLimits, r, getExtent().toRectangle2D());
|
|
465 | 465 |
|
466 | 466 |
WMTSConnector connector = null; |
467 | 467 |
try { |
... | ... | |
503 | 503 |
bandList.getBand(j).setFileName(serverName); |
504 | 504 |
} |
505 | 505 |
|
506 |
buf.setDataExtent(new Rectangle2D.Double(tile.ulx, tile.uly, Math.abs(tile.ulx - tile.lrx), Math.abs(tile.uly - tile.lry)));
|
|
506 |
buf.setDataExtent(new Rectangle2D.Double(Math.min(tile.ulx, tile.lrx), Math.min(tile.uly, tile.lry), Math.abs(tile.ulx - tile.lrx), Math.abs(tile.uly - tile.lry)));
|
|
507 | 507 |
listener.nextBuffer(buf, new ExtentImpl(tile.ulx, tile.uly, tile.lrx, tile.lry), getAffineTransform(), null, true); |
508 | 508 |
driver.close(); |
509 | 509 |
} catch (WMTSException e) { |
Also available in: Unified diff