Revision 224

View differences:

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