[Gvsig_desarrolladores] vista - exportar - imagen - jython

Juan Lucas Dominguez Rubio jldominguez en prodevelop.es
Vie Oct 8 13:33:12 CEST 2010


Hola, Steffen:
 
Creo que lo que estás intentando hacer no es muy apropiado para un programa como gvSIG. Lo normal es usar un renderizador como Mapnik o un servidor de mapas como Mapserver.
 
Sobre tus dudas:
 
Cuando obtienes una geometría de una capa y su extent, las unidades son las del mapa (casi siempre grados decimales o metros), pero en la pantalla (y cuando creas azulejos o tiles) la unidad es el pixel. Esos métodos de la clase ViewPort te ayudan a pasar de coordenadas del mapa (grados o metros) a coordenadas de la pantalla (pixels). Necesitas saber cuántos pixels ocupa un tile, y qué desplazamiento (en pixels) tiene cada tile respecto a los bordes del mapa, etc.
 
He hecho la siguiente prueba:
 
- Cargo una capa WMS (por ejemplo http://www.gis.nrw.de/wms/DGM50? )
- añado un shapefile 
 
y veo esto:
 
http://www.prodevelop.es/files/fm/public/screenshots/gvsig_desktop/jythonview.jpg
 
A continuación abro una consola de scripting y pego todo este párrafo:
 
 
import time; from java.awt.image import *; from javax.imageio import ImageIO; from java.io import File; from gvsiglib import *; view = gvSIG.getActiveDocument(); mctrl = view.getMapControl(); mcon = mctrl.getMapContext(); vp = mctrl.getViewPort(); lyr=mcon.getLayers().getLayer(1); lyr.getSource().start(); indazu = 0; azu0=lyr.getSource().getShape(indazu); w = vp.fromMapDistance(azu0.getBounds2D().getWidth()); h = vp.fromMapDistance(azu0.getBounds2D().getHeight()); bimg = BufferedImage(w,h, BufferedImage.TYPE_INT_RGB); graf = bimg.createGraphics(); offsetxmap = azu0.getBounds2D().getMinX()-vp.getAdjustedExtent().getMinX(); offsetymap = vp.getAdjustedExtent().getMaxY()-azu0.getBounds2D().getMaxY(); offsetxpix = vp.fromMapDistance(offsetxmap); offsetypix = vp.fromMapDistance(offsetymap); vpwpix = vp.getImageWidth(); vphpix = vp.getImageHeight(); graf.drawImage(mctrl.getImage(), -offsetxpix, -offsetypix, vpwpix, vphpix, None); ImageIO.write(bimg,'png',File('c:/tempo/azulejo.png')); 
 
 
 
Debes tener cuidado con el índice de la capa. Creo que los índices van de abajo hacia arriba, es decir, en este caso la capa 0 es el WMS y la capa 1 es el shapefile, por eso escribo:
 
lyr=mcon.getLayers().getLayer(1);
 
Debe existir una carpeta c:\tempo en tu ordenador, y entonces se crea un archivo c:/tempo/azulejo.png como este:
 
http://www.prodevelop.es/files/fm/public/screenshots/gvsig_desktop/azulejo.png
 
La explicación del párrafo es:
 
===================
// imports
import time;
from java.awt.image import *;
from javax.imageio import ImageIO;
from java.io import File;
from gvsiglib import *;
 
// obtener capa con rectangulos (azulejos o tiles)
view = gvSIG.getActiveDocument();
mctrl = view.getMapControl();
mcon = mctrl.getMapContext();
vp = mctrl.getViewPort();
lyr=mcon.getLayers().getLayer(1);
 
// obtener azulejo 0
lyr.getSource().start();
indazu = 0;
azu0=lyr.getSource().getShape(indazu);
 
// obtener tamaño del azulejo en la pantalla (en pixels)
w = vp.fromMapDistance(azu0.getBounds2D().getWidth());
h = vp.fromMapDistance(azu0.getBounds2D().getHeight());
 
// craer imagen del mismo tamaño (vacia)
bimg = BufferedImage(w,h, BufferedImage.TYPE_INT_RGB);
graf = bimg.createGraphics();
 
// calcular desplazamiento del azulejo con respecto al borde del mapa (en unidades del mapa)
offsetxmap = azu0.getBounds2D().getMinX()-vp.getAdjustedExtent().getMinX();
offsetymap = vp.getAdjustedExtent().getMaxY()-azu0.getBounds2D().getMaxY();
 
// calcular desplazamiento del azulejo con respecto al borde del mapa (en pixels)
offsetxpix = vp.fromMapDistance(offsetxmap);
offsetypix = vp.fromMapDistance(offsetymap);
 
// obtener tamaño del mapa completo (vista) en pixels
vpwpix = vp.getImageWidth();
vphpix = vp.getImageHeight();
 
// dibujar el mapa encima de la imagen que tiene mismo tamaño que azulejo
// se usa el desplazamiento. esto es como un "clipping", es decir, la mayor parte
// de la imagen cae fuera del azulejo
graf.drawImage(mctrl.getImage(), -offsetxpix, -offsetypix, vpwpix, vphpix, None);
 
// escribir imagen
ImageIO.write(bimg,'png',File('c:/tempo/azulejo.png')); 
===================
 
 
Saludos,
Juan Lucas Domínguez Rubio
---
Prodevelop SL, Valencia (España)
Tlf.: 96.351.06.12 -- Fax: 96.351.09.68
http://www.prodevelop.es <http://www.prodevelop.es/> 
---

________________________________

De: gvsig_desarrolladores-bounces en listserv.gva.es en nombre de Steffen Koch
Enviado el: mié 06/10/2010 19:12
Para: gvsig_desarrolladores en listserv.gva.es
Asunto: Re: [Gvsig_desarrolladores] vista - exportar - imagen - jython




Hola Juan Lucas,

muchas gracias por tu ayuda, estoy aprendiendo poco a poco. He hecho alguna
pruebas pero todavia no entiendo bien tu scripting, igual estoy un poco
bloqueado. Por ejemplo la linea:
w = vp.fromMapDistance(azu0.getBounds2D().getWidth());
por que no funcionaria solamente azu0.getBounds2D().getWidth(), la funcion
frommapdistance no entiendo bien en este caso. Luego he cambiado los
desplazamientos, como por ejemplo 0, -80 y plus 80. He anandido los
imagenes, al final creo que el tamano del imagen tiene que ser mas pequeno,
no se....

Saludos, steffen
http://osgeo-org.1803224.n2.nabble.com/file/n5607993/plus80_desplazamiento.png
http://osgeo-org.1803224.n2.nabble.com/file/n5607993/minus80_desplazamiento.png
http://osgeo-org.1803224.n2.nabble.com/file/n5607993/sindesplazamiento.png
http://osgeo-org.1803224.n2.nabble.com/file/n5607993/4azulejos.png
--
View this message in context: http://osgeo-org.1803224.n2.nabble.com/vista-exportar-imagen-jython-tp5490718p5607993.html
Sent from the gvSIG desarrolladores mailing list archive at Nabble.com.
_______________________________________________
gvSIG_desarrolladores mailing list
gvSIG_desarrolladores en listserv.gva.es
http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores


------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20101008/5bf7bff1/attachment.htm 


Más información sobre la lista de distribución gvSIG_desarrolladores