[Gvsig_usuarios] Libreria gvpy

Oscar Martinez omartinez en gvsig.com
Jue Mar 30 14:04:57 CEST 2017


Buenas,


Parece que falla a la hora de identificar el crs del fichero prj, 
desconozco el motivo. Que se me ocurran o que sea  un crs muy raro o 
personalizado(que no creo), o que el programa que ha creado esa capa no 
sea luego gdal capaz de leer el fichero prj que genera y identificar la 
proyección (que creo que será esto),  y posiblemente se me escape alguna 
posibilidad


Ahora mismo no se me ocurre mucho más.. prueba a..

- Al abrir la capa en gvSIG, te identifica correctamente la proyección 
que debería ser de esas capas?

- Creando una capa con gvSIG en esa misma proyección, y cogiendo el 
fichero prj y sustituirlo por el de las capas que  te han dado, a ver si 
así funciona.


Por ir probando


Saludos


El 30/03/2017 a las 8:53, Ovidio Ribeira escribió:
>
> Buenos dias Oscar, utilicé tu script (modificado de la siguiente forma 
> ) y me da el error que te indico
>
> Saludos
>
>
> MI SCRIP:
>
> from gvsig import *
> from gvsig import geom
> from gvsig.libs.formpanel import FormPanel
> from gvsig.libs.formpanel import *
> import sys
> from gvsig import commonsdialog
> from gvsig.commonsdialog import *
> from java.io import File
> from org.jopendocument.dom.template import JavaScriptFileTemplate
> from org.jdom import Namespace
> from com.sun.jimi.core import Jimi
> from org.jopendocument.dom import OOUtils
> from gvsig.libs import gvpy
> reload(gvpy)
>
> def main(*args):
>
>       option = "Abrir Arquivo"
>       fc = commonsdialog.filechooser(option, title="", 
> initialPath=None,  multiselection=False, filter = None, 
> fileHidingEnabled=True, root=None)
>       print "Arquivo elixido:", fc
>       crs = esriprj2epsg(fc)
>       print crs
>
>
> def esriprj2epsg(fc):
>       import os
>       from org.gdal import osr
>       from java.util import Vector
>       if os.path.isdir(fc):
>          raise("Should be a file path")
>       else:
>          pre, ext = os.path.splitext(fc)
>          new_extension = ".prj"
>          shapeprj_path = pre + new_extension
>       print shapeprj_path
>       prj_file = open(shapeprj_path, 'r')
>       prj_txt = prj_file.read()
>       srs = osr.SpatialReference()
>       prj_vector = Vector()
>       prj_vector.add(prj_txt)
>       srs.ImportFromESRI(prj_vector)
>       srs.AutoIdentifyEPSG()
>       epsg = "EPSG:"+srs.GetAuthorityCode(None)
>       return epsg
>
>
> EL ERROR:
>
> Running script Probagvpy0.
> Arquivo elixido: C:\Users\ovelmon\Dropbox\ribadavia\AnaVeloso\Area.shp
> C:\Users\ovelmon\Dropbox\ribadavia\AnaVeloso\Area.prj
> Stript Probagvpy0 aborted.
> java.lang.RuntimeException: java.lang.RuntimeException: OGR Error: 
> Unsupported SRS in <script> at line number 24t 
> org.python.core.PyFunction.__call__(PyFunction.java:413)
>  at org.python.pycode._pyx78.main$1(<script>:29)
>  at org.python.pycode._pyx78.call_function(<script>)
>  at org.python.core.PyTableCode.call(PyTableCode.java:167)
>  at org.python.core.PyBaseCode.call(PyBaseCode.java:308)
>  at org.python.core.PyFunction.function___call__(PyFunction.java:471)
>  at org.python.core.PyFunction.__call__(PyFunction.java:466)
>  at org.python.core.PyFunction.__call__(PyFunction.java:456)
>  at 
> org.python.jsr223.MyPyScriptEngine.invokeFunction(MyPyScriptEngine.java:132)
>  ... 3 more
> org.gvsig.scripting.ExecuteErrorException: java.lang.RuntimeException: 
> java.lang.RuntimeException: OGR Error: Unsupported SRS in <script> at 
> line number 24
>  at 
> org.gvsig.scripting.impl.DefaultScriptingScript.invokeFunction(DefaultScriptingScript.java:561)
>  at 
> org.gvsig.scripting.impl.DefaultScriptingScript.run(DefaultScriptingScript.java:531)
>  at 
> org.gvsig.scripting.impl.DefaultScriptingScript$ScriptTask.run(DefaultScriptingScript.java:675)
> Caused by: javax.script.ScriptException: java.lang.RuntimeException: 
> java.lang.RuntimeException: OGR Error: Unsupported SRS in <script> at 
> line number 24
>  at 
> org.python.jsr223.MyPyScriptEngine.scriptException(MyPyScriptEngine.java:209)
>  at 
> org.python.jsr223.MyPyScriptEngine.invokeFunction(MyPyScriptEngine.java:138)
>  at 
> org.gvsig.scripting.impl.DefaultScriptingScript.invokeFunction(DefaultScriptingScript.java:543)
>  ... 2 more
> Caused by: Traceback (most recent call last):
>   File "<script>", line 24, in main
>   File "<script>", line 61, in esriprj2epsg
>  at org.gdal.osr.osrJNI.SpatialReference_AutoIdentifyEPSG(Native Method)
>
>  at 
> org.gdal.osr.SpatialReference.AutoIdentifyEPSG(SpatialReference.java:247)
>
>  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>
>  at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>
>  at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>
>  at java.lang.reflect.Method.invoke(Method.java:497)
>
>
> java.lang.RuntimeException: java.lang.RuntimeException: OGR Error: 
> Unsupported SRS
>
>  at org.python.core.Py.JavaError(Py.java:548)
>  at org.python.core.Py.JavaError(Py.java:539)
>  at 
> org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:188)
>  at 
> org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:204)
>  at org.python.core.PyObject.__call__(PyObject.java:480)
>  at org.python.core.PyObject.__call__(PyObject.java:484)
>  at org.python.core.PyMethod.__call__(PyMethod.java:126)
>  at org.python.pycode._pyx86.esriprj2epsg$2(<script>:63)
>  at org.python.pycode._pyx86.call_function(<script>)
>  at org.python.core.PyTableCode.call(PyTableCode.java:167)
>  at org.python.core.PyBaseCode.call(PyBaseCode.java:139)
>  at org.python.core.PyFunction.__call__(PyFunction.java:413)
>  at org.python.pycode._pyx86.main$1(<script>:29)
>  at org.python.pycode._pyx86.call_function(<script>)
>  at org.python.core.PyTableCode.call(PyTableCode.java:167)
>  at org.python.core.PyBaseCode.call(PyBaseCode.java:308)
>  at or
>
>
>
>
>
>
> ------------------------------------------------------------------------
> *De:* gvsig_usuarios-bounces en listserv.gva.es 
> <gvsig_usuarios-bounces en listserv.gva.es> en nombre de Oscar Martinez 
> <omartinez en gvsig.com>
> *Enviado:* miércoles, 29 de marzo de 2017 15:30
> *Para:* gvsig_usuarios en listserv.gva.es
> *Asunto:* Re: [Gvsig_usuarios] Libreria gvpy
>
> Buenas,
>
>
> Pues ahora mismo creo que la librería de scripting no está preparada 
> para leer los prj, ya que esto vino en una versión más reciente de 
> gvSIG. Lo comentaré y veremos los cambios que tenemos que hacer para 
> que cuando no se le asigne  un prj lea el del fichero con el que viene..
>
>
> Mientras tanto (un trozo de código que tal vez no sea muy correcto en 
> la forma de hacerlo...), te he preparado una función que lee el prj 
> que esté al lado del fichero shp y saca la proyección a la que hace 
> referencia. El parámetro de entrada es la ruta al fichero .shp en 
> string. Como salida devuelve el crs en formato "EPSG:...." string, el 
> cual lo puedes usar ya directamente para asociarle un crs a la capa 
> cuando la cargues.
>
>
> En tu caso algo así como..
>
>     crs = esriprj2epsg(fc)
>
>     s1 = loadShapeFile(fc,CRS=crs)
>
>
> Me la apunto para preguntar lo que tendríamos que cambiar en las 
> librerías.
>
> Saludos
>
>
> https://gist.github.com/oscar9/a92ca47eaaa9ce8904a6722db3cd76b6
> <https://gist.github.com/oscar9/a92ca47eaaa9ce8904a6722db3cd76b6>
> 	
> Find crs from a prj file #gvsig 
> <https://gist.github.com/oscar9/a92ca47eaaa9ce8904a6722db3cd76b6>
> gist.github.com
> Find crs from a prj file #gvsig
>
>
>
>
> # encoding: utf-8
>
> import gvsig
>
> def main():
>     crs = esriprj2epsg("D:/Working/test/Huimilpan_Circles_copia.shp")
>     print crs
>
> def esriprj2epsg(shapeprj_path):
>    import os
>    from org.gdal import osr
>    from java.util import Vector
>    if os.path.isdir(shapeprj_path):
>       raise("Should be a file path")
>    else:
>       pre, ext = os.path.splitext(shapeprj_path)
>       new_extension = ".prj"
>       shapeprj_path = pre + new_extension
>    #print shapeprj_path
>    prj_file = open(shapeprj_path, 'r')
>    prj_txt = prj_file.read()
>    srs = osr.SpatialReference()
>    prj_vector = Vector()
>    prj_vector.add(prj_txt)
>    srs.ImportFromESRI(prj_vector)
>    srs.AutoIdentifyEPSG()
>    epsg = "EPSG:"+srs.GetAuthorityCode(None)
>    return epsg
>
>
> El 29/03/2017 a las 8:44, Ovidio Ribeira escribió:
>>
>> Buenos días y muchas gracias, Oscar.
>>
>> Tu ayuda me fue muy util, pero solo una cosa mas:
>>
>> Es script que hice carga un fichero “Area.shp” que es el resultado de 
>> unha medición de GPS, este fichero es creado por el programa de 
>> gestión del GPS, y también crea el fichero “Area.prj” de información 
>> de la proyección, yo utilizo la proyección WSG84 pero otros 
>> compañeros utilizan otra ( ED50, ETRS, hay de todo) la pregunta: ¿Es 
>> posible indicar en el escript que cargue la capa con el mismo CRS 
>> que se indicada en “Area.prj” ( este fichero esta en la misma carpeta 
>> que el Area .shp). El codigo de mi escript es el siguiente:
>>
>>
>> Un saludo
>>
>>
>> def AbreArquivo_click(self,*args):
>>
>> option = "Abrir Arquivo"
>>
>> fc = commonsdialog.filechooser(option, title="", initialPath=None, 
>> multiselection=False, filter = None, fileHidingEnabled=True, root=None)
>>
>> print "Arquivo elixido:", fc
>>
>> s1 = loadShapeFile(fc,CRS="EPSG:4326")
>>
>> currentView().getLayer("Area").setVisible(False)
>>
>> vista = currentView()
>>
>> layer =currentView().getLayer("Area")
>>
>> vmap = vista.getMap()
>>
>> vmap.zoomToEnvelope(layer.getFullEnvelope())
>>
>> #eliminar a capa Area da Vista
>>
>> self.shp2 = gvpy.runalg("gvSIG-reproject", "Area", "false", 
>> "EPSG:25829", PATH=[getTempFile("new1", ".shp"),getTempFile("new2", 
>> ".shp"),getTempFile("new3", ".shp")],ADDLAYER=False)
>>
>> #Cambiarlle o nome a shp2
>>
>> self.shp2[0].setName("Medicion")
>>
>> self.Medicion = self.shp2[0]
>>
>> #print "capa", shp2
>>
>> currentView().addLayer(self.shp2[0])
>>
>> self.layers = currentView().getLayers()
>>
>> self.layers.removeLayer("Area")
>>
>> self.planta = currentView().getLayer("RV_Actualizado")
>>
>> self.planta2 = currentView().getLayer("Arrinques")
>>
>> self.Leyenda2 = self.planta2.getLegend()
>>
>> self.Leyenda = self.planta.getLegend()
>>
>> self.shp2[0].setLegend(self.Leyenda)
>>
>>
>> def Interseccion_click(self,*args):
>>
>> Concello = self.ConSixpac.getText()
>>
>> if Concello == "00":
>>
>> msgbox("Hai que indicar o concello SIXPAC para facer a 
>> intersección","AVISO" , 1)
>>
>> return
>>
>> else:
>>
>> CapaInter0 = self.CapaSixpac = Concello+"_SIXPAC"
>>
>> CapaInter = currentView().getLayer(CapaInter0)
>>
>> print CapaInter
>>
>> print self.Medicion
>>
>> #Interse = gvpy.runalg("intersection", self.Medicion, CapaInter, "#")
>>
>> #Interse = gvpy.runalg("gvSIG-intersection", self.Medicion, 
>> CapaInter, #, #, #)
>>
>> Interse = gvpy.runalg("gvSIG-intersection", self.Medicion, CapaInter, 
>> "false", "false", PATH=[getTempFile("new4", 
>> ".shp"),getTempFile("new5", ".shp"),getTempFile("new6", 
>> ".shp")],ADDLAYER=False)
>>
>> Interse[0].setName("INTER-SIXPAC")
>>
>> currentView().addLayer(Interse[0])
>>
>> Interse[0].setLegend(self.Leyenda2)
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>> *De:* gvsig_usuarios-bounces en listserv.gva.es 
>> <gvsig_usuarios-bounces en listserv.gva.es> en nombre de Oscar Martinez 
>> <omartinez en gvsig.com>
>> *Enviado:* lunes, 27 de marzo de 2017 9:37
>> *Para:* gvsig_usuarios en listserv.gva.es
>> *Asunto:* Re: [Gvsig_usuarios] Libreria gvpy
>>
>> Buenas!
>>
>>
>> Por partes..
>>
>>
>> Para eliminar una capa:
>>
>>
>>     # Eliminar layer de una Vista
>>     # 
>> http://downloads.gvsig.org/download/gvsig-desktop-testing/dists/2.3.0/javadocs/html/org/gvsig/fmap/mapcontext/layers/FLayers.html
>>     layers = currentView().getLayers()
>>     layers.removeLayer("nuevacapa") # se puede eliminar por nombre, 
>> por indice, etc..
>>
>>
>> Si lo que quieres hacer es cambiar el nombre del TOC se haría con:
>>
>> (Añadiendo al final del código del otro día)
>>
>>
>>     shp2[0].setName("nueva0")
>>     shp2[1].setName("nueva1")
>>     shp2[2].setName("nueva2")
>>
>>
>> Si es otra cosa la que quieres cambiar comentamelo.
>>
>> Para añadir una simbologia por intervalos por ejemplo está este 
>> script que es sencillo de entender me parece, es para crear una 
>> simbologia por intervalos a partir de un campo:
>>
>>
>> # encoding: utf-8
>>
>> from gvsig import *
>> from gvsig import geom
>> from java.awt import Color
>> from org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl import 
>> VectorialIntervalLegend
>>
>> def main(*args):
>>         """ Create interval legend """
>>         # 
>> http://downloads.gvsig.org/download/web/html/es/html/scripting_devel_guide/2.3/leyendas.html
>>
>>         # Seleccionar el Tipo de geometria
>>         # 
>> http://downloads.gvsig.org/download/web/html/es/html/scripting_devel_guide/2.3/modulo_geom.html
>>         vil = VectorialIntervalLegend(geom.POLYGON)
>>
>>         vil.setStartColor(Color.red) # color inicio
>>         vil.setEndColor(Color.blue) # color final
>>         vil.setIntervalType(1) # Rango
>>         store = currentLayer().getFeatureStore() # store de los datos 
>> a  aplicar la simbologia
>>         ii = vil.calculateIntervals(store, "ID", 5, geom.POLYGON) # 
>> Calculo de la simbologia para ese store e intervalos. (store, Campo, 
>> numero intervalos, tipo)
>>
>>         vil.setIntervals(ii) # aplicamos los intervalos a la simbologia
>>
>>         currentLayer().setLegend(vil) # aplicamos la simbologia a la capa
>>
>> Puedes encontrar otro tipo de leyendas e ir probando: 
>> http://downloads.gvsig.org/download/gvsig-desktop-testing/dists/2.3.0/javadocs/html/org/gvsig/symbology/fmap/mapcontext/rendering/legend/impl/AbstractIntervalLegend.html
>>
>> Nunca he etiquetado desde scripting.. Tendría que preguntar primero 
>> para echarte una mano.
>>
>> Para saber si hay una capa activa hay varias formas, depende para lo 
>> que necesites, por lo general esta:
>>
>>     layers = currentView().getLayers()
>>     print "numero capas activas", len(layers.getActives())
>>     print currentLayer()==None
>>
>>     if currentLayer()==None:
>>         print "no hay capa activa"
>>         return
>>
>>     currentLayer.setActive(False)
>>
>> Respecto al geoproceso intersección, si cambia el nombre de los 
>> campos es porque necesita hacerlo. Si no me equivoco es cuando se 
>> duplican el mismo nombre de los campos en las capas entrantes. No hay 
>> forma de configurar esto desde fuera. Lo que si que puedes hacer es 
>> hacer un script que te extraiga lo que desees de esa capa o editarla.
>>
>> Creo que no me dejo nada. Espero que te sea de ayuda.
>>
>> Saludos,
>> Óscar
>>
>> El 27/03/2017 a las 8:29, Ovidio Ribeira escribió:
>>>
>>> Buenos días Oscar, gracias por tu ayuda y tu tiempo, con tus 
>>> explicaciones conseguí lo que quería, pero para mejorar el script so 
>>> lo me faltaría,: poder eliminar de la TOC una capa que ya no me 
>>> interesa, lo que hice fue ponerla como no visible,. Tampoco consigo 
>>> renombrar la capa de salida del geoproceso reproyectar, aquí lo que 
>>> hago es no añadir ninguna con el geoproceso y despues anadir a la 
>>> TOC la n.º 0. Me seria bueno poder añadir una simbología y un 
>>> etiquetado por selección a la nueva capa desde el script. Para 
>>> seleccionar una capa uso:   currentLayer().setActive(False)  y 
>>> s1.setActive(True)  pero si al principio no hay ninguna capa activa 
>>> me da un error, como se puede saber si hay alguna capa activa. Y por 
>>> último la capa de salida en el geoproceso intersección cambia el 
>>> nombre de los campos, hay alguna manera de que no lo haga.
>>>
>>> Saludos y si puedes la ayudar será muy bien venida .
>>>
>>>
>>>
>>>
>>>
>>> ------------------------------------------------------------------------
>>> *De:* gvsig_usuarios-bounces en listserv.gva.es 
>>> <gvsig_usuarios-bounces en listserv.gva.es> en nombre de Oscar Martinez 
>>> <omartinez en gvsig.com>
>>> *Enviado:* viernes, 24 de marzo de 2017 14:30
>>> *Para:* gvsig_usuarios en listserv.gva.es
>>> *Asunto:* Re: [Gvsig_usuarios] Libreria gvpy
>>>
>>> Buenas,
>>>
>>>
>>> Los algortimos gvSIG-* funcionan de manera algo diferente. Por 
>>> ahora, siempre que ejecutes uno de estos algoritmos tienes que 
>>> especificar el path que quieres usar. En gvpy se especifica 
>>> añadiendo un parámetro PATH. Para esto ya teníamos una función 
>>> preparada en gvSIG llamada getTempFile("nombre", "extension", 
>>> "carpeta destino"), siendo el último parámetro opcional. Esto imita 
>>> el funcionamiento que tienen el resto de geoprocesos.
>>>
>>>
>>> También ten en cuenta que este geoproceso reproject especifica y 
>>> crea tres capas de salida, aunque luego solo vayas a usar una, hay 
>>> que indicar los paths.
>>>
>>>
>>> Te adjunto un ejemplo de todo esto.
>>>
>>>
>>> Espero te sirva de ayuda, cualquier cosa nos comentas.
>>>
>>>
>>> Saludos
>>>
>>>
>>> https://gist.github.com/oscar9/43523df6c76056cbde97f4a23f967ffe
>>>
>>>
>>> # encoding: utf-8
>>> import gvsig
>>> from gvsig import *
>>> from gvsig.libs import gvpy
>>> reload(gvpy)
>>> import os
>>> def main(*args):
>>>      
>>>      gvpy.algHelp("gvSIG-reproject")
>>>      """
>>>      * Algorithm help:  Reproyección
>>>      * Usage: runalg( "gvSIG-reproject",
>>>                                    LAYER[Vector Layer],
>>>                                    SELECTED_GEOM[Boolean],
>>>                                    DST_PROJECTION[String],
>>>                                    RESULT_POL[output vector layer],
>>>                                    RESULT_LINE[output vector layer],
>>>                                    RESULT_POINT[output vector layer],
>>>                                    );
>>>      """
>>>      #Funtion tempfile
>>>      n1 = getTempFile("new", ".shp")
>>>      print n1
>>>      #C:\Users\Versus\AppData\Local\Temp\/tmp-andami\new-58d51c6267b.shp
>>>      
>>>      n2 = getTempFile("new", ".shp", r"C:\resultados")
>>>      print n2
>>>      #C:\resultados\new-58d51c62686.shp
>>>      
>>>      # Ejemplo
>>>      shp1 = gvpy.runalg("randomvector",10,0)
>>>      shp2 = gvpy.runalg("gvSIG-reproject", shp1, "false", "EPSG:25829", PATH=[getTempFile("new1", ".shp"),getTempFile("new2", ".shp"),getTempFile("new3", ".shp")])
>>>      print shp2
>>>      
>>>      # Salida multiple en forma de lista: [new1-58d51c7f20ed, new2-58d51c7f20ed, new3-58d51c7f20ed]
>>>      print shp2[0].getGeometryType().getName()
>>>      print shp2[1].getGeometryType().getName()
>>>      print shp2[2].getGeometryType().getName()
>>>      pass
>>>
>>>
>>> El 24/03/2017 a las 13:00, Ovidio Ribeira escribió:
>>>>
>>>> Hola, usando la libreria gvpy en un script y al ejecutarlo la 
>>>> segunda vez me da el error de que el fichero de salida existe, 
>>>> utilizando el siguente comando:
>>>>
>>>> gvpy.runalg("gvSIG-reproject", "Area", "false", "EPSG:25829", "#", 
>>>> "#", "#",)
>>>>
>>>> Con esta outra linea funciona sin problemas creando varios ficheros 
>>>> temporales: gvpy.runalg("randomvector",10,0),
>>>>
>>>> Tambien necesito ayuda para capturar solo la capa de polígonos del 
>>>> geoproceso gvsig-reproject.
>>>>
>>>> Gracias y saludos.
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> gvSIG_usuarios mailing list
>>>> gvSIG_usuarios 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:
>>>>
>>>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios
>>>
>>>
>>>
>>> _______________________________________________
>>> gvSIG_usuarios mailing list
>>> gvSIG_usuarios 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:
>>>
>>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios
>>
>>
>>
>> _______________________________________________
>> gvSIG_usuarios mailing list
>> gvSIG_usuarios 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:
>>
>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios
>
>
>
> _______________________________________________
> gvSIG_usuarios mailing list
> gvSIG_usuarios 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:
>
> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_usuarios

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listserv.gva.es/pipermail/gvsig_usuarios/attachments/20170330/deef07f3/attachment.html>


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