Revision 3200

View differences:

org.gvsig.raster.wms/trunk/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/src/main/java/org/gvsig/raster/wms/app/wmsclient/layer/FLyrWMS.java
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() {
org.gvsig.raster.wms/trunk/org.gvsig.raster.wms/org.gvsig.raster.wms.io/src/main/java/org/gvsig/raster/wms/io/WMSProvider.java
56 56
import org.gvsig.fmap.dal.coverage.exception.QueryException;
57 57
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
58 58
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
59
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
60 59
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
61 60
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
62 61
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
......
110 109
	//Only for fixed size. Complete extent and FIXED_SIZE in long side
111 110
	private File                        fileLayerPixelSize       = null;
112 111
	private File                        lastRequest              = null;
113
	private AbstractRasterProvider       lastRequestProvider      = null; 
112
	private AbstractRasterProvider       lastRequestProvider      = null;
114 113
	
115 114
	public static void register() {
116 115
		DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
......
292 291
	
293 292
	public AffineTransform getAffineTransform() {
294 293
		WMSDataParameters p = (WMSDataParameters)parameters;
295
		Extent e = getExtent();
296 294
		if(p.isSizeFixed()) {
295
			Extent e = getExtent(); // FIXME: it should also be taken from parameters instead of from the full layer extent
297 296
			double psX = e.width() / (p.getWidth() - 1);
298 297
			double psY = -(e.height() / (p.getHeight() - 1));
299 298
			ownTransformation = new AffineTransform(
......
304 303
					e.getULX() - (psX / 2),
305 304
					e.getULY() - (psY / 2));
306 305
		} else {
307
			double psX = e.width() / (lastWidthRequest <= 0 ? p.getWidth() : lastWidthRequest);
308
			double psY = -(e.height() / (lastHeightRequest <= 0 ? p.getHeight() : lastHeightRequest));
306
			Rectangle2D bbox = p.getExtent();
307
			double psX = bbox.getWidth() / p.getWidth();
308
			double psY = -(bbox.getHeight() / p.getHeight());
309 309
			ownTransformation = new AffineTransform(
310 310
					psX, 
311 311
					0, 
312 312
					0, 
313
					psY, 
314
					e.getULX() - (psX / 2),
315
					e.getULY() - (psY / 2));
316
			/*ownTransformation = new AffineTransform(
317
					p.getExtent().getWidth() / (lastWidthRequest <= 0 ? p.getWidth() : lastWidthRequest) , 
318
					0, 
319
					0, 
320
					-(p.getExtent().getHeight() / (lastHeightRequest <= 0 ? p.getHeight() : lastHeightRequest)), 
321
					p.getExtent().getMinX(),
322
					p.getExtent().getMinY());*/
313
					psY,
314
					bbox.getX(),
315
					(bbox.getY()+bbox.getHeight())); // FIXME: check for other CRSs such as 4326
323 316
		}
324 317
		externalTransformation = (AffineTransform) ownTransformation.clone();
325 318
		return ownTransformation;
......
398 391
	
399 392
	public double getWidth() {
400 393
		WMSDataParameters p = (WMSDataParameters)parameters;
401
		if(p.isSizeFixed()) {
402
			return p.getWidth();
403
		}
404
		if (lastWidthRequest <= 0) 
405
			return p.getWidth();
406
		if (lastWidthRequest < minTilePrintWidth) 
407
			return minTilePrintWidth;
408
		return lastWidthRequest;
394
		return p.getWidth();
409 395
	}
410 396

  
411 397
	public double getHeight() {
412 398
		WMSDataParameters p = (WMSDataParameters)parameters;
413
		if(p.isSizeFixed()) {
414
			return p.getHeight();
415
		}
416
		if (lastHeightRequest <= 0) 
417
			return p.getHeight();
418
		if (lastHeightRequest < minTilePrintHeight) 
419
			return minTilePrintHeight;
420
		return lastHeightRequest;
399
		return p.getHeight();
421 400
	}
422 401
	
423 402
	/**
org.gvsig.raster.wms/trunk/org.gvsig.raster.wms/org.gvsig.raster.wms.io/src/main/java/org/gvsig/raster/wms/io/WMSDataParameters.java
122 122

  
123 123
	public Dimension getFixedSize();
124 124

  
125
	/**
126
	 * Sets the bounding box of the request
127
	 */
125 128
	public void setExtent(Rectangle2D bBox);
129
	
130
	/**
131
	 * Gets the bounding box of the request
132
	 * @return
133
	 */
134
	public Rectangle2D getExtent();
126 135

  
127 136
	public void setCancellable(ICancellable cancel);
128 137

  

Also available in: Unified diff