Ola, Oscar,

Investigando lo que parece  es que las proyecciones fueron modificadas 
personalmente, la solución mas fácil que encontre es abrir la mediciones del 
GPS, con su programa , y volver a exportarlas con la proyección por defecto que 
es la WGS84. Lo que si seria interesante es que en el caso de que se de el 
error poder mostrar un mensaje de tipo "Tienes que volver a exportar la 
medición"

Saludos

________________________________
De: [email protected] 
<[email protected]> en nombre de Oscar Martinez 
<[email protected]>
Enviado: jueves, 30 de marzo de 2017 14:04
Para: [email protected]
Asunto: Re: [Gvsig_usuarios] Libreria gvpy


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: 
[email protected]<mailto:[email protected]>
 
<[email protected]><mailto:[email protected]>
 en nombre de Oscar Martinez <[email protected]><mailto:[email protected]>
Enviado: miércoles, 29 de marzo de 2017 15:30
Para: [email protected]<mailto:[email protected]>
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://avatars0.githubusercontent.com/u/4819782?v=3&s=400]<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: 
[email protected]<mailto:[email protected]>
 
<[email protected]><mailto:[email protected]>
 en nombre de Oscar Martinez <[email protected]><mailto:[email protected]>
Enviado: lunes, 27 de marzo de 2017 9:37
Para: [email protected]<mailto:[email protected]>
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: 
[email protected]<mailto:[email protected]>
 
<[email protected]><mailto:[email protected]>
 en nombre de Oscar Martinez <[email protected]><mailto:[email protected]>
Enviado: viernes, 24 de marzo de 2017 14:30
Para: [email protected]<mailto:[email protected]>
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
[email protected]<mailto:[email protected]>

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
[email protected]<mailto:[email protected]>

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
[email protected]<mailto:[email protected]>

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
[email protected]<mailto:[email protected]>

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
[email protected]

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

Responder a