[Gvsig_desarrolladores] Script para exportar imagenes

Joaquin del Cerro jjdelcerro.gvsig en gmail.com
Mar Jun 4 11:30:43 CEST 2013


El 03/06/13 17:19, Pablo Alfaro escribió:
> Hola, como están? Recurro a los desarrolladores de esta lista en busca de ayuda.
> Necesito hacer un pequeño script para gvSIG que recorra las capas en la vista actual, recortando cada una contra una capa especifica (la primera por ejemplo) y luego exporte cada imagen en una carpeta del disco usando como nombre de cada imagen el nombre de la capa en cuestión.
> Básicamente tengo una capa vectorial del contorno de mi país (Uruguay) y capas vectoriales de polígonos con el valor de varias variables meteorológicas, querría recortarlas todas contra la capa de Uruguay y exportar las imágenes una a una.
> Esto se podría hacer con el lenguaje de scripting de gvSIG? O habría que desarrollar un plugin para ello?Si se puede hacer con scripting alguien me podría dar un ejemplo de como hacerlo?Se podría hacer con gvSIG 1.11? Tengo algunas complicaciones para migrar a gvSIG 2 aún.
> Muchas gracias y saludosPablo 		 	   		  
> 

Holas...
a ver algunas ideas...

Entiendo que tienes varias capas vectoriales cargadas en una vista
y quieres recortarlas a una dada y exportar el resultado como imagen.


Voy a asumir que la capa activa es a la que quiero hacer el recorte.

Podriamos....
Generar una capa con el recorte de todas y luego exportar el resultado.
Para ello, creariamos una capa nueva... (ver por ejemplo el articulo
del blog "Scripting: Generar una poligonal a partir de un rumbo"[1] para ver
como hacerlo) y en ella insertariamos el recorte.

[1] Scripting: Generar una poligonal a partir de un rumbo
    http://blog.gvsig.org/2012/12/06/scripting-generar-una-poligonal-a-partir-de-un-rumbo/

Una vez tengamos la capa creada, recorreriamos la lista de capas de la vista, iriamos calculando
el recorte y escribiendo el resultado en la capa recien creada.

  capa_recorte = currentLayer()

  # Aqui vendria la creacion de la capa
  ...
  schema_capa_resultado = ...
  ...
  shape_resultado = gvsig.createShape(
    schema_capa_resultado,
    "/tmp/capa_resultado_del_recorte.shp",
    CRS=capa_recorte.getProjection(),
    geometryType=geom.POLYGON
  )
  # Y una vez creada la llenamos con el recorte
  bbox = capa_activa.getFullEnvelope().getGeometry()

  vista = currentView()
  for capa in vista.getLayers():
    recortar(capa_resultado, bbox, capa)
  capa_resultado.commit()

Y la funcion recortar podia ser algo como:

  def recortar(capa_resultado, bbox, capa_a_recortar):
      features = layer.features()
      for feature in features:
        geom = feature.geometry().intersection(bbox)
        values = dict()
        values["GEOM"] = geom
        values["OTRO_VALOR1"] = ...
        values["OTRO_VALOR2"] = ...
        capa_resultado.append(values)

Por ultimo podriamos ocultar las capas que haya en la vista, añadir la nueva capa a la vista,
centrar la vista en la capa y exportar la imagen:

  from org.gvsig.andami import PluginsLocator

  # Ocultamos las capas
  for capa in vista.getLayers():
    capa.setVisible(false)

  # Añadimos nuestra capa a la vista
  vista.addLayer(capa_resultado)

  # y la centramos y exportamos
  actions=PluginsLocator.getActionInfoManager()
  a = actions.getAction("view-navigation-zoom-all")
  a.execute()

Oh!... un error... no estan correctamente registradas las acciones de raster...
bueno eso complica un poco la cosa ya que no podemos recuperar la accion de
salvar a rastar tan facilmente pero podriamo rodearlo con algo como....

  def obtenerAccionDeSalvarAraster(actions):
    for a in actions.getActions():
... 	if a.getCommand() == "SaveViewToImageRaster":
... 		return a

Y luego usamos ya nuestra funcion

  a = obtenerAccionDeSalvarAraster(actions)
  a.execute()

Bueno, tomo nota de lo de las acciones de raster para arreglarlo.

He picado las ideas sueltas, faltaria juntarlas en un script y
probar.

Tambien he usado una aproximacion simplona del recorte, ya que estoy
recortando al Envelope/BBOX de la capa, cuando igual te interesa
recortar a la "forma" exacta de la capa. Si quieres hacer eso, seria
algo mas complejo y costoso (en tiempo de ejecucion) pero tambien se
podria hacer... si es eso lo que quieres, lo comentas y vemos como
se podria hacer... basicamente seria cargando la capa de recorte en
memoria o recorriendola "muchisimas veces" cada vez que se ejecute
nuestra funcion de recorte, supongo que si sabes que tamaño puede
tener y no es muy grande lo suyo seria cargarla en memoria y si crees
que puede ser muy grande, pues recorrecla muchas veces.

Tambien he asumido que todas las capas son poligonos... si no son todas
del mismo tipo, igual la capa resultante tendriamos que almacenarla en
un dxf en lugar de un shape....

Bueno, ya vas comentado si te parece interesante....

Por cierto... todo lo que he comentado es para gvSIG 2, no iria en
la 1.X

Oh!, releyendo tu mensaje.... no habia entendido bien lo que pedias....
bueno.... algo parecido se puede hacer a partir de las ideas que
pongo.

un saludo
Joaquin





> 
> 
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en listserv.gva.es
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección: http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores


-- 
--------------------------------------
Joaquin Jose del Cerro
Development and software arquitecture manager.
jjdelcerro en gvsig.com
gvSIG Association
www.gvsig.com
www.gvsig.org


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