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:
- añado un shapefile
y veo esto:
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:
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,