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: [email protected] en nombre de Steffen Koch
Enviado el: mié 06/10/2010 19:12
Para: [email protected]
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
[email protected]
http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores


_______________________________________________
gvSIG_desarrolladores mailing list
[email protected]
http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores

Responder a