[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