99 |
99 |
|
100 |
100 |
|
101 |
101 |
private IBuffer lastRenderBuffer = null;
|
102 |
|
|
|
102 |
|
103 |
103 |
/**
|
104 |
104 |
* Ancho y alto del objeto Image en una petici?n de dibujado a un raster raster
|
105 |
105 |
*/
|
106 |
106 |
private double widthImage, heightImage;
|
107 |
|
|
|
107 |
|
108 |
108 |
private Point2D ulPxRequest, lrPxRequest;
|
109 |
109 |
|
110 |
110 |
/**
|
... | ... | |
197 |
197 |
geoImage = null;
|
198 |
198 |
MultiRasterDataset dataset = bufferFactory.getMultiRasterDataset();
|
199 |
199 |
AffineTransform transf = dataset.getAffineTransform();
|
200 |
|
|
|
200 |
|
201 |
201 |
if(RasterUtilities.isOutside(vp.getExtent(), dataset.getExtent()))
|
202 |
202 |
return;
|
203 |
|
|
|
203 |
|
204 |
204 |
Extent adjustedRotedRequest = request(vp, dataset);
|
205 |
205 |
|
206 |
206 |
if ((widthImage <= 0) || (heightImage <= 0))
|
207 |
207 |
return;
|
208 |
|
|
|
208 |
|
209 |
209 |
int[] step = null;
|
210 |
210 |
|
211 |
211 |
if (bufferFactory != null) {
|
... | ... | |
241 |
241 |
grid.applyFilters();
|
242 |
242 |
} catch (InterruptedException e1) {
|
243 |
243 |
}
|
244 |
|
|
|
244 |
|
245 |
245 |
// Objeto con la info de paleta
|
246 |
246 |
lastRenderBuffer = grid.getRasterBuf();
|
247 |
247 |
drawer.setBuffer(lastRenderBuffer); // Buffer de datos a renderizar
|
... | ... | |
251 |
251 |
drawer.setBufferSize((int)Math.round(widthImage), (int)Math.round(heightImage)); // Ancho y alto del buffer
|
252 |
252 |
drawer.setPixelsToDrawSize(bufferFactory.getNWidth(), bufferFactory.getNHeight()); // Ancho y alto del buffer
|
253 |
253 |
geoImage = drawer.drawBufferOverImageObject(replicateBand, getRenderBands()); // Acci?n de renderizado
|
254 |
|
|
255 |
|
//En el caso de no tenga rotaci?n y el tama?o de pixel sea positivo en X y negativo en Y no aplicamos ninguna
|
256 |
|
//transformaci?n. Esto no es necesario hacerlo, sin ello se visualiza igual. Unicamente se hace porque de esta
|
|
254 |
|
|
255 |
//En el caso de no tenga rotaci?n y el tama?o de pixel sea positivo en X y negativo en Y no aplicamos ninguna
|
|
256 |
//transformaci?n. Esto no es necesario hacerlo, sin ello se visualiza igual. Unicamente se hace porque de esta
|
257 |
257 |
//forma el raster resultante mejora un poco en calidad en ciertos niveles de zoom ya que al aplicar transformaciones
|
258 |
258 |
//sobre el Graphics parece que pierde algo de calidad.
|
259 |
259 |
if(transf.getScaleX() > 0 && transf.getScaleY() < 0 && transf.getShearX() == 0 && transf.getShearY() == 0) {
|
... | ... | |
262 |
262 |
g.drawImage(geoImage, (int) Math.round(pt.getX()), (int) Math.round(pt.getY()), null);
|
263 |
263 |
return;
|
264 |
264 |
}
|
265 |
|
|
|
265 |
|
266 |
266 |
/*
|
267 |
267 |
* Tenemos una matriz con la transformaci?n de la coordenadas de la vista a coordenadas reales vp.mat, adem?s tenemos
|
268 |
268 |
* la transformaci?n de coordenadas reales a coordenadas pixel (transf). Con ambas podemos obtener una matriz de trasformacion
|
269 |
269 |
* entre coordenadas de la vista a coordenadas pixel (transf X vp.mat). As? obtenemos la transformaci?n entre coordenadas
|
270 |
270 |
* de la vista y coordenadas pixel del raster. El problemas es que cada zoom la escala de la petici?n del raster varia
|
271 |
|
* por lo que habr? que calcular una matriz con la escala (escale). escale X transf X vp.mat
|
|
271 |
* por lo que habr? que calcular una matriz con la escala (escale). escale X transf X vp.mat
|
272 |
272 |
*/
|
273 |
273 |
double sX = Math.abs(ulPxRequest.getX() - lrPxRequest.getX()) / widthImage;
|
274 |
274 |
double sY = Math.abs(ulPxRequest.getY() - lrPxRequest.getY()) / heightImage;
|
275 |
275 |
AffineTransform escale = new AffineTransform(sX, 0, 0, sY, 0, 0);
|
276 |
|
|
|
276 |
|
277 |
277 |
try {
|
278 |
278 |
AffineTransform at = (AffineTransform)escale.clone();
|
279 |
279 |
at.preConcatenate(transf);
|
... | ... | |
281 |
281 |
g.transform(at);
|
282 |
282 |
Point2D.Double pt = null;
|
283 |
283 |
//El punto sobre el que rota la imagen depende del signo de los tama?os del pixel
|
284 |
|
if(transf.getScaleX() < 0 && transf.getScaleY() < 0)
|
|
284 |
if(transf.getScaleX() < 0 && transf.getScaleY() < 0)
|
285 |
285 |
pt = new Point2D.Double(adjustedRotedRequest.maxX(), adjustedRotedRequest.maxY());
|
286 |
|
else if(transf.getScaleX() > 0 && transf.getScaleY() > 0)
|
|
286 |
else if(transf.getScaleX() > 0 && transf.getScaleY() > 0)
|
287 |
287 |
pt = new Point2D.Double(adjustedRotedRequest.minX(), adjustedRotedRequest.minY());
|
288 |
|
else if(transf.getScaleX() < 0 && transf.getScaleY() > 0)
|
|
288 |
else if(transf.getScaleX() < 0 && transf.getScaleY() > 0)
|
289 |
289 |
pt = new Point2D.Double(adjustedRotedRequest.maxX(), adjustedRotedRequest.minY());
|
290 |
290 |
else
|
291 |
291 |
pt = new Point2D.Double(adjustedRotedRequest.getULX(), adjustedRotedRequest.getULY());
|
292 |
292 |
vp.getMat().transform(pt, pt);
|
293 |
|
at.inverseTransform(pt, pt);
|
|
293 |
at.inverseTransform(pt, pt);
|
294 |
294 |
g.drawImage(geoImage, (int) Math.round(pt.getX()), (int) Math.round(pt.getY()), null);
|
295 |
295 |
g.transform(at.createInverse());
|
296 |
296 |
} catch (NoninvertibleTransformException e) {
|
297 |
297 |
e.printStackTrace();
|
298 |
298 |
}
|
299 |
|
|
|
299 |
|
300 |
300 |
// long t2 = new Date().getTime();
|
301 |
301 |
// System.out.println("Renderizando Raster: " + ((t2 - t1) / 1000D) + ", secs.");
|
302 |
302 |
}
|
303 |
|
|
|
303 |
|
304 |
304 |
/**
|
305 |
305 |
* Calculamos la petici?n en coordenadas del mundo real con la transformaci?n del raster. Esto
|
306 |
306 |
* permite obtener las coordenadas de la petici?n con la rotaci?n, si la tiene.
|
... | ... | |
310 |
310 |
*/
|
311 |
311 |
private Extent request(ViewPortData vp, MultiRasterDataset dataset) {
|
312 |
312 |
if (dataset.isRotated()) {
|
313 |
|
//Obtenemos las cuatro esquinas de la selecci?n que hemos hecho en la vista
|
|
313 |
//Obtenemos las cuatro esquinas de la selecci?n que hemos hecho en la vista
|
314 |
314 |
Point2D ul = new Point2D.Double(vp.getExtent().minX(), vp.getExtent().maxY());
|
315 |
315 |
Point2D ur = new Point2D.Double(vp.getExtent().maxX(), vp.getExtent().maxY());
|
316 |
316 |
Point2D ll = new Point2D.Double(vp.getExtent().minX(), vp.getExtent().minY());
|
... | ... | |
327 |
327 |
double pxMaxY = Math.max(Math.max(ul.getY(), ur.getY()), Math.max(ll.getY(), lr.getY()));
|
328 |
328 |
double pxMinX = Math.min(Math.min(ul.getX(), ur.getX()), Math.min(ll.getX(), lr.getX()));
|
329 |
329 |
double pxMinY = Math.min(Math.min(ul.getY(), ur.getY()), Math.min(ll.getY(), lr.getY()));
|
330 |
|
|
|
330 |
|
331 |
331 |
//Ajustamos las coordenadas pixel al ?rea m?xima del raster
|
332 |
332 |
pxMinX = Math.max(pxMinX, 0);
|
333 |
333 |
pxMinY = Math.max(pxMinY, 0);
|
334 |
334 |
pxMaxX = Math.min(pxMaxX, dataset.getWidth()[0]);
|
335 |
335 |
pxMaxY = Math.min(pxMaxY, dataset.getHeight()[0]);
|
336 |
|
|
|
336 |
|
337 |
337 |
//Petici?n en coordenadas pixel
|
338 |
338 |
ulPxRequest = new Point2D.Double(pxMinX, pxMinY);
|
339 |
339 |
lrPxRequest = new Point2D.Double(pxMaxX, pxMaxY);
|
340 |
|
|
|
340 |
|
341 |
341 |
//Calculamos el ancho y alto del buffer sobre el que se escribe la petici?n
|
342 |
342 |
widthImage = ((Math.abs(lrPxRequest.getX() - ulPxRequest.getX()) * vp.getWidth()) / Math.abs(ul.getX() - ur.getX()));
|
343 |
343 |
heightImage = ((Math.abs(lrPxRequest.getY() - ulPxRequest.getY()) * vp.getHeight()) / Math.abs(ur.getY() - lr.getY()));
|
... | ... | |
360 |
360 |
lrPxRequest = new Point2D.Double(lr.getX(), lr.getY());
|
361 |
361 |
return adjustedRotedExtent;
|
362 |
362 |
}
|
363 |
|
|
|
363 |
|
364 |
364 |
/**
|
365 |
365 |
* Obtiene el n?mero de bandas y el orden de renderizado. Cada posici?n del
|
366 |
366 |
* vector es una banda del buffer y el contenido de esa posici?n es la banda
|
... | ... | |
475 |
475 |
* @return true si tiene tabla de color y false si no la tiene.
|
476 |
476 |
*/
|
477 |
477 |
public boolean existColorTable() {
|
478 |
|
return (grid.getPalettes() != null && grid.getPalettes()[0] != null);
|
|
478 |
return (grid != null && grid.getPalettes() != null && grid.getPalettes()[0] != null);
|
479 |
479 |
}
|
|
480 |
|
|
481 |
public Grid getGrid() {
|
|
482 |
return grid;
|
|
483 |
}
|
480 |
484 |
}
|