328 |
328 |
* @return true when a tile has been painted
|
329 |
329 |
*/
|
330 |
330 |
private void drawTile(Graphics2D g, ViewPort vp, SimpleTaskStatus taskStatus, double scale) throws LoadLayerException, ReadException {
|
331 |
|
|
332 |
331 |
// Compute the query geometry
|
333 |
332 |
// 1. Check if it is within borders
|
334 |
|
Envelope envelope = getFullEnvelope();
|
335 |
|
Envelope vpEnv = vp.getAdjustedExtent();
|
336 |
|
if (!vpEnv.intersects(envelope)) {
|
|
333 |
Envelope layerEnv = getFullEnvelope();
|
|
334 |
Envelope vpEnv = vp.getAdjustedEnvelope();
|
|
335 |
if (!vpEnv.intersects(layerEnv)) {
|
337 |
336 |
return;
|
338 |
337 |
}
|
|
338 |
try {
|
|
339 |
Rectangle2D vpRect = getRectable2DFromEnvelope(vpEnv);
|
|
340 |
Rectangle2D layerRect = getRectable2DFromEnvelope(layerEnv);
|
|
341 |
// 2. Intersect layer and viewport extents to get the area of interest
|
|
342 |
Rectangle2D requestedRect = new Rectangle2D.Double();
|
|
343 |
Rectangle2D.intersect(layerRect, vpRect, requestedRect);
|
339 |
344 |
|
340 |
|
// 2. Compute extent to be requested.
|
341 |
|
Rectangle2D bBox = new Rectangle2D.Double();
|
342 |
|
Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
|
343 |
|
getRectable2DFromEnvelope(envelope), bBox);
|
344 |
|
|
345 |
|
// 3. Compute size in pixels
|
346 |
|
double scalex = vp.getAffineTransform().getScaleX();
|
347 |
|
double scaley = vp.getAffineTransform().getScaleY();
|
348 |
|
int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * scalex) + 1);
|
349 |
|
int hImg = (int) Math.ceil(Math.abs(bBox.getHeight() * scaley) + 1);
|
350 |
|
|
351 |
|
Dimension sz = new Dimension(wImg, hImg);
|
352 |
|
|
353 |
|
if ((wImg <= 0) || (hImg <= 0)) {
|
354 |
|
return;
|
355 |
|
}
|
356 |
|
|
357 |
|
//try {
|
|
345 |
// 3. Compute image size in pixels from the requested Extent
|
|
346 |
double scalex = vp.getAffineTransform().getScaleX();
|
|
347 |
double scaley = vp.getAffineTransform().getScaleY();
|
|
348 |
int wImg = (int) Math.ceil(Math.abs(requestedRect.getWidth() * scalex));
|
|
349 |
int hImg = (int) Math.ceil(Math.abs(requestedRect.getHeight() * scaley));
|
|
350 |
if ((wImg <= 0) || (hImg <= 0)) {
|
|
351 |
return;
|
|
352 |
}
|
358 |
353 |
|
359 |
|
Rectangle2D extent = new Rectangle2D.Double();
|
360 |
|
Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
|
361 |
|
Rectangle2D.intersect(vpExtent, bBox, extent);
|
|
354 |
// 4. compute exactly the requested extent (from the rounded image size)
|
|
355 |
// ensuring we are still within the layer extent
|
|
356 |
double worldWidth = Math.abs((double)wImg/scalex);
|
|
357 |
double worldHeigh = Math.abs((double)hImg/scaley);
|
|
358 |
double worldX;
|
|
359 |
if (requestedRect.getX()+worldWidth>layerEnv.getMaximum(0)) {
|
|
360 |
// we've got outside of layer extent due to rounding
|
|
361 |
worldX = layerEnv.getMaximum(0)-worldWidth;
|
|
362 |
}
|
|
363 |
else {
|
|
364 |
worldX = requestedRect.getX();
|
|
365 |
}
|
|
366 |
double worldY;
|
|
367 |
if (requestedRect.getY()+worldHeigh>layerEnv.getMaximum(1)) { // FIXME: test with different CRSs
|
|
368 |
worldY = layerEnv.getMaximum(1)-worldHeigh;
|
|
369 |
}
|
|
370 |
else {
|
|
371 |
worldY = requestedRect.getMinY();
|
|
372 |
}
|
362 |
373 |
|
363 |
|
Extent ex = rManager.getDataStructFactory().createExtent(
|
364 |
|
vp.getAdjustedEnvelope().getMinimum(0),
|
365 |
|
vp.getAdjustedEnvelope().getMaximum(1),
|
366 |
|
vp.getAdjustedEnvelope().getMaximum(0),
|
367 |
|
vp.getAdjustedEnvelope().getMinimum(1));
|
368 |
|
ViewPortData vpData = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), ex, sz );
|
369 |
|
vpData.setMat(vp.getAffineTransform());
|
370 |
|
vpData.setDPI((int)vp.getDPI());
|
|
374 |
requestedRect.setRect(worldX, worldY, worldWidth, worldHeigh);
|
|
375 |
Envelope requestedEnvelope = geomManager.createEnvelope(requestedRect.getMinX(),
|
|
376 |
requestedRect.getMinY(),
|
|
377 |
requestedRect.getMaxX(),
|
|
378 |
requestedRect.getMaxY(),
|
|
379 |
SUBTYPES.GEOM2D);
|
|
380 |
Extent requestedExtent = rManager.getDataStructFactory().createExtent(
|
|
381 |
requestedEnvelope.getMinimum(0),
|
|
382 |
requestedEnvelope.getMaximum(1),
|
|
383 |
requestedEnvelope.getMaximum(0),
|
|
384 |
requestedEnvelope.getMinimum(1));
|
371 |
385 |
|
372 |
|
try {
|
373 |
|
getParameters().setExtent(bBox);
|
374 |
|
if(getParameters().isSizeFixed()) {
|
375 |
|
getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
|
376 |
|
getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
|
377 |
|
} else {
|
378 |
|
getParameters().setWidth(wImg);
|
379 |
|
getParameters().setHeight(hImg);
|
380 |
|
}
|
381 |
|
|
382 |
|
if(getDataStore().getParameters() instanceof WMSDataParameters) {
|
383 |
|
getRender().draw(g, vpData, taskStatus);
|
384 |
|
} else {
|
385 |
|
Envelope adjustedExtent = vp.getAdjustedExtent();
|
386 |
|
Extent e = rManager.getDataStructFactory().createExtent(adjustedExtent.getLowerCorner().getX(),
|
387 |
|
adjustedExtent.getUpperCorner().getY(), adjustedExtent.getUpperCorner().getX(),
|
388 |
|
adjustedExtent.getLowerCorner().getY());
|
389 |
|
ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), e, vp.getImageSize() );
|
390 |
|
vp2.setMat(vp.getAffineTransform());
|
391 |
|
vp2.setDPI((int)vp.getDPI());
|
392 |
|
getParameters().setExtent(ex.toRectangle2D());
|
393 |
|
getRender().drawTiledService(g, vp2, vp.getImageSize(), taskStatus);
|
394 |
|
}
|
395 |
|
//this.updateDrawVersion();
|
|
386 |
// 5. compute the new AffineTransform (ViewPort class can do it for us
|
|
387 |
// if we provide the image size, extent and offset)
|
|
388 |
ViewPort auxVp = (ViewPort) vp.clone();
|
|
389 |
Dimension sz = new Dimension(wImg, hImg);
|
|
390 |
auxVp.setImageSize(sz);
|
|
391 |
auxVp.setEnvelope(requestedEnvelope);
|
|
392 |
|
396 |
393 |
|
397 |
|
} catch (ProcessInterruptedException e) {
|
398 |
|
} catch (QueryException e) {
|
399 |
|
setAvailable(false);
|
400 |
|
JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
|
401 |
|
logger.info("Problems drawing this layer:" + e.getMessage(), e);
|
402 |
|
} finally {
|
403 |
|
taskStatus.terminate();
|
|
394 |
// 6. compute tile offeset. It is the sum of the original viewport offset
|
|
395 |
// plus the offset introduced by intersecting layer and viewport extents
|
|
396 |
double offsetX = vp.getOffset().getX();
|
|
397 |
if (requestedEnvelope.getMinimum(0)-vpEnv.getMinimum(0)>0) {
|
|
398 |
offsetX = offsetX + (requestedEnvelope.getMinimum(0)-vpEnv.getMinimum(0))*auxVp.getAffineTransform().getScaleX();
|
404 |
399 |
}
|
|
400 |
double offsetY = vp.getOffset().getY(); // FIXME: test with different CRSs
|
|
401 |
if (requestedEnvelope.getMaximum(1)-vpEnv.getMaximum(1)<0) {
|
|
402 |
offsetY = offsetY + (requestedEnvelope.getMaximum(1)-vpEnv.getMaximum(1))*auxVp.getAffineTransform().getScaleY();
|
|
403 |
}
|
405 |
404 |
|
406 |
|
/*} catch (RemoteServiceException e) {
|
407 |
|
if (!taskStatus.isCancellationRequested()) {
|
408 |
|
if (callCount < MAX_RETRY_TIMES) {
|
409 |
|
logger.warn("\n[ FLyrWMS.drawFixedSize() ] Failed in trying " + callCount + "/" + MAX_RETRY_TIMES + ")\n"); // mess code
|
410 |
|
drawTile(g, vp, taskStatus, scale);
|
411 |
|
} else {
|
412 |
|
if (!isPrinting) {
|
413 |
|
this.setVisible(false);
|
414 |
|
}
|
415 |
|
logger.error("Server error:" + e.getMessage(), e);
|
416 |
|
}
|
|
405 |
// 7. Compute again the AffineTransform considering also the offset
|
|
406 |
auxVp.setOffset(new Point2D.Double(offsetX, offsetY));
|
|
407 |
auxVp.refreshExtent(); // necessary after updating the offset
|
|
408 |
|
|
409 |
ViewPortData vpData = rManager.getDataStructFactory().createViewPortData(auxVp.getProjection(), requestedExtent, sz);
|
|
410 |
vpData.setMat(auxVp.getAffineTransform());
|
|
411 |
vpData.setDPI((int)auxVp.getDPI());
|
|
412 |
getParameters().setExtent(requestedRect);
|
|
413 |
if(getParameters().isSizeFixed()) {
|
|
414 |
getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
|
|
415 |
getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
|
|
416 |
} else {
|
|
417 |
getParameters().setWidth(wImg);
|
|
418 |
getParameters().setHeight(hImg);
|
417 |
419 |
}
|
418 |
|
}*/
|
419 |
|
return;
|
|
420 |
if(getDataStore().getParameters() instanceof WMSDataParameters) {
|
|
421 |
getRender().draw(g, vpData, taskStatus);
|
|
422 |
} else {
|
|
423 |
Extent vpExtent = rManager.getDataStructFactory().createExtent(
|
|
424 |
vpEnv.getMinimum(0),
|
|
425 |
vpEnv.getMaximum(1),
|
|
426 |
vpEnv.getMaximum(0),
|
|
427 |
vpEnv.getMinimum(1));
|
|
428 |
ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), vpExtent, vp.getImageSize() );
|
|
429 |
vp2.setMat(vp.getAffineTransform());
|
|
430 |
vp2.setDPI((int)vp.getDPI());
|
|
431 |
getParameters().setExtent(vpExtent.toRectangle2D());
|
|
432 |
getRender().drawTiledService(g, vp2, vp.getImageSize(), taskStatus);
|
|
433 |
}
|
|
434 |
} catch (ProcessInterruptedException e) {
|
|
435 |
} catch (CloneNotSupportedException e) {
|
|
436 |
drawingError(e);
|
|
437 |
}
|
|
438 |
catch (QueryException e) {
|
|
439 |
drawingError(e);
|
|
440 |
} catch (CreateEnvelopeException e) {
|
|
441 |
drawingError(e);
|
|
442 |
} finally {
|
|
443 |
taskStatus.terminate();
|
|
444 |
}
|
420 |
445 |
}
|
|
446 |
|
|
447 |
private void drawingError(Exception e) {
|
|
448 |
setAvailable(false);
|
|
449 |
JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
|
|
450 |
logger.info("Problems drawing this layer:" + e.getMessage(), e);
|
|
451 |
}
|
421 |
452 |
|
422 |
453 |
/**
|
423 |
454 |
* @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
|
... | ... | |
643 |
674 |
}
|
644 |
675 |
|
645 |
676 |
private void splitRequestCalculation(int width, int height) {
|
646 |
|
mustSplitRequest = (!getDataStore().isTiled() && (width > 1023 || height > 1023));
|
|
677 |
mustSplitRequest = (!getDataStore().isTiled() && (width > maxTileDrawWidth || height > maxTileDrawHeight));
|
647 |
678 |
}
|
648 |
679 |
|
649 |
680 |
public ComposedLayer newComposedLayer() {
|