[Gvsig_desarrolladores] intersecciones con geometrías conflictivas

Ana Calle nico200307 en gmail.com
Mie Nov 18 17:26:56 CET 2015


Oscar muchísimas gracias por tu esfuerzo!  Mañana me pongo con ello.
Gracias de verdad.  Un saludo
El 18/11/2015 17:15, "Óscar Martínez" <omartinez en gvsig.com> escribió:

> Buenas Ana,
>
> Script completo, con este estoy ejecutando correctamente el geoproceso
> intersección:
> - Hay que cambiar siempre los path de las capas de salida (líneas 103)
> - Nombres de las capas de entrada (líneas 78-79)
>
> A ver si con este de base de puedes aclarar mejor al convertirlo a java.
>
> Un saludo!
>
> from gvsig import *
>
> from org.gvsig.app import ApplicationLocator
> from org.gvsig.fmap.dal import DALLocator
> from org.gvsig.andami import PluginsLocator
> from org.gvsig.fmap.mapcontext import MapContextLocator
> from org.gvsig.fmap.mapcontext.layers.vectorial import FLyrVect
> from es.unex.sextante.outputs import FileOutputChannel
>
> def addDependencyWithPlugin(pluginCode):
>     pluginsManager = PluginsLocator.getManager()
>     scriptingPlugin =
> pluginsManager.getPlugin("org.gvsig.scripting.app.extension")
>
> scriptingPlugin.addDependencyWithPlugin(pluginsManager.getPlugin(pluginCode))
>
> addDependencyWithPlugin("org.gvsig.geoprocess.app.mainplugin")
>
> from es.unex.sextante.core import Sextante, OutputFactory, AnalysisExtent
> from es.unex.sextante.gui.core import SextanteGUI
> from org.gvsig.geoprocess.lib.sextante.dataObjects import
> FlyrVectIVectorLayer
>
> def loadShapeFileNew(shpFile, CRS='CRS:84', tocName=False, active=False,
> view=currentView()):
>     try:
>         CRS = currentView().getProjectionCode()
>     except:
>         pass
>     layer = loadLayerNew('Shape', shpFile=shpFile, CRS=CRS,
> tocName=tocName, )
>     if isinstance(view,str):
>         view = gvsig.currentProject().getView(view)
>     else:
>         view= currentView()
>     view.addLayer(layer)
>     layer.setActive(active)
>     return Layer(layer)
>
> def loadLayerNew(layerType, tocName=False, **parameters): #
>         try:
>             application = ApplicationLocator.getManager()
>             datamanager =  application.getDataManager()
>             mapcontextmanager = application.getMapContextManager()
>             store_parameters = datamanager.createStoreParameters(layerType)
>             copyToDynObject(parameters, store_parameters)
>             store = datamanager.openStore(layerType,
> store_parameters)
>             if tocName!=False:
>                 nameStore = tocName
>             else:
>                 nameStore = store.getName()
>             layer = mapcontextmanager.createLayer(nameStore, store)
>         except Throwable, ex:
>             raise RuntimeException("Can't load layer, "+ str(ex))
>
>         return layer
>
> def gv2s(layer):
>       #convertir capa gvsig -> sextante
>       slayer = FlyrVectIVectorLayer()
>       slayer.create(layer)
>       return slayer
>
> def main(*args):
>     #Geoproceso  interseccion
>
>     #Buscamos el algoritmo
>     #Todos los algoritmos a un diccionario
>     keySetIterator = Sextante.getAlgorithms().keySet().iterator()
>     algorithms = {}
>     while(keySetIterator.hasNext()):
>       key = keySetIterator.next()
>       algorithms = Sextante.getAlgorithms().get(str(key))
>       for name in algorithms.keySet():
>         algorithms[str(name)] = algorithms.get(name)
>
>     algorithmId= "gvSIG-intersection"
>     algorithm = algorithms[algorithmId]
>     print algorithm
>
>     #Definimos parametros
>     params = algorithm.getParameters()
>     layer1 = gv2s(currentView().getLayer("uno")())
>     layer2 = gv2s(currentView().getLayer("dos")())
>
>     #Parametros del geoproceso
>     #en orden
>     paramValues = {0:layer1, 1:layer2, 2:False, 3:False}
>
>     for i in xrange(0, params.getNumberOfParameters()):
>         param = params.getParameter(i)
>         param.setParameterValue(paramValues[i])
>
>     #Definomos la extension
>     #Sera la suma de las extensiones de ambas capas
>     defaultAE = AnalysisExtent(paramValues[0])
>     defaultAE.addExtent(AnalysisExtent(paramValues[1]))
>
>     #Definimos los objetos de salida
>
>     #if algorithm.getOutputObjects().getOutput(0).getOutputChannel():
>     #    output0 = algorithm.getOutputObjects().getOutput(0)
>     #    out0 = output0.getOutputChannel()
>     #    out0.setFilename(None)
>
>     #Los geoprocesos de gvsig siempre tenemos que establecerles un nombre
>     path = ["C://temp//11.shp", "C://temp//21.shp", "C://temp//31.shp"]
>
>     #Definomos los parametros uno a uno con el path
>     #Geoproceso de gvsig siempre devuelve 3 capas
>     outputSet = algorithm.getOutputObjects()
>     if outputSet.getOutputDataObjectsCount() > 1 and isinstance(path,
> list):
>         for n in xrange(0, outputSet.getOutputDataObjectsCount()):
>             out1 = outputSet.getOutput(n)
>             out1.setOutputChannel(FileOutputChannel("New_name"))
>             out1channel = out1.getOutputChannel()
>             out1channel.setFilename(path[n])
>
>
>     correctValues = algorithm.hasCorrectParameterValues()
>     print "Corrent Values?: ", correctValues
>
>     #Ejecutamos el algoritmo
>     outputFactory = SextanteGUI.getOutputFactory()
>     algorithm.execute( None, outputFactory)
>     print "| Algorithm:", list(algorithm.algorithmAsCommandLineSentences)
>
>     #Recogemos los objetos de salida en un diccionario
>     oos = algorithm.getOutputObjects()
>     ret = dict()
>     for i in xrange(0,oos.getOutputObjectsCount()):
>       oo = oos.getOutput(i)
>       value = oo.getOutputObject()
>       if isinstance(value, FlyrVectIVectorLayer):
>           store = value.getFeatureStore()
>           layer =
> MapContextLocator.getMapContextManager().createLayer(value.getName(),store)
>           store.dispose()
>           ret[value.getName()] = layer
>           layer.dispose()
>
>     #Recorremos el diccionario para cargar en la vista las capas que
> contiene
>     r = ret
>     for value in r.values():
>         if isinstance(value, FLyrVect):
>             print "|\t Value:", value.getName().encode("UTF-8")
>             path = value.getDataStore().getFullName()
>             print "|\t\tPath: ", path
>             value = loadShapeFileNew(str(path))
>
> On 18/11/2015 15:18, Óscar Martínez wrote:
>
> Buenas,
>
> Te comento los avances que he hecho para que no vayamos haciendo lo mismo
> a la vez, con esto parece que estoy consiguiendo ejecutar ya el geoproceso,
> falta acabar para capturar los resultados, tendré que terminarlo más tarde.
> También falla a la segunda vez que lo ejecutas, tengo que ver como resolvía
> esto con la librería.
>
> Cualquier cosa me comentas.
>
> Un saludo!
>
> Por ahora lo puedes ejecutar en el módulo de scripting, copias este código
> y debería funcionar. Solo necesitas tener dos capas cargadas y configurar
> su nombre en las líneas 46 y 47:
>
>
> from gvsig import *
>
> from org.gvsig.app import ApplicationLocator
> from org.gvsig.fmap.dal import DALLocator
> from org.gvsig.andami import PluginsLocator
> from org.gvsig.fmap.mapcontext import MapContextLocator
>
> def addDependencyWithPlugin(pluginCode):
>     pluginsManager = PluginsLocator.getManager()
>     scriptingPlugin =
> pluginsManager.getPlugin("org.gvsig.scripting.app.extension")
>
> scriptingPlugin.addDependencyWithPlugin(pluginsManager.getPlugin(pluginCode))
>
> addDependencyWithPlugin("org.gvsig.geoprocess.app.mainplugin")
>
> from es.unex.sextante.core import Sextante, OutputFactory, AnalysisExtent
> from es.unex.sextante.gui.core import SextanteGUI
> from org.gvsig.geoprocess.lib.sextante.dataObjects import
> FlyrVectIVectorLayer
>
> def gv2s(layer):
>       slayer = FlyrVectIVectorLayer()
>       slayer.create(layer)
>       return slayer
> def main(*args):
>     #Remove this lines and add here your code
>
>     print "hola mundo"
>     pass
>     keySetIterator = Sextante.getAlgorithms().keySet().iterator()
>     algorithms = {}
>     while(keySetIterator.hasNext()):
>       key = keySetIterator.next()
>       algorithms = Sextante.getAlgorithms().get(str(key))
>       for name in algorithms.keySet():
>         algorithms[str(name)] = algorithms.get(name)
>
>     algorithmId= "gvSIG-intersection"
>     algorithm = algorithms[algorithmId]
>
>
>     print algorithm
>
>
>     params = algorithm.getParameters()
>     print currentLayer()
>     layer1 = gv2s(currentView().getLayer("uno")())
>     layer2 = gv2s(currentView().getLayer("dos")())
>     paramValues = {0:layer1, 1:layer2, 2:False, 3:False}
>
>     for i in xrange(0, params.getNumberOfParameters()):
>         param = params.getParameter(i)
>         param.setParameterValue(paramValues[i])
>
>
>
>     defaultAE = AnalysisExtent(paramValues[0])
>     defaultAE.addExtent(AnalysisExtent(paramValues[1]))
>
>
>     #print algorithm.getOutputObjects().getOutput(0).getOutputChannel()
>     #output0 = algorithm.getOutputObjects().getOutput(0)
>     #out0 = output0.getOutputChannel()
>     #out0.setFilename(None)
>
>
>     correctValues = algorithm.hasCorrectParameterValues()
>
>     outputFactory = SextanteGUI.getOutputFactory()
>
>     algorithm.execute( None, outputFactory)
>
>     oos = algorithm.getOutputObjects()
>     ret = dict()
>     for i in xrange(0,oos.getOutputObjectsCount()):
>       oo = oos.getOutput(i)
>       value = oo.getOutputObject()
>       if isinstance(value, FlyrVectIVectorLayer):
>           store = value.getFeatureStore()
>           layer =
> MapContextLocator.getMapContextManager().createLayer(value.getName(),store)
>           store.dispose()
>           ret[value.getName()] = layer
>           layer.dispose()
>
> On 18/11/2015 13:54, Ana Calle wrote:
>
> Muchas gracias por tu aporte Oscar,
> voy a intentar adaptarlo a mi entorno java, a ver si lo consigo...
>
> Gracias, un saludo
>
>
>
>
> El 18 de noviembre de 2015, 12:54, Óscar Martínez <omartinez en gvsig.com>
> escribió:
>
>> Buenas,
>>
>> A falta de que te comenten algo mejor..
>>
>> Creo que esto es lo que estarías pidiendo y puedo ayudarte algo con la
>> parte de ejecutar el geoproceso desde java. Desconozco si hay mejor forma
>> de hacerlo que la que te comento. Tengo algo que te podría servir, aunque
>> está en Jython y la librería esta algo desastrada pero algo es algo (como
>> ejemplo).. El problema va a ser extraer solo la parte que necesites.
>>
>> La utilizo para lanzar geoprocesos ya existentes en gvSIG desde scripting
>> con una línea de código.
>> Proyecto: https://github.com/oscar9/gvpy
>> Código: https://github.com/oscar9/gvpy/blob/master/src/gvpy.py
>>
>> Lo imports que necesites están en el código. Los principales que
>> necesitarás creo que son:
>> from es.unex.sextante.core import Sextante, OutputFactory, AnalysisExtent
>> from es.unex.sextante.gui.core import SextanteGUI
>> from org.gvsig.geoprocess.lib.sextante.dataObjects import
>> FlyrVectIVectorLayer
>>
>>
>> Por encima te comento las partes de código que te pueden interesar..
>> primero tienes que localizar el algoritmo, el tuyo tiene el nombre de:
>> "gvSIG-intersection"
>> (lineas 57-62)
>>     keySetIterator = Sextante.getAlgorithms().keySet().iterator()
>>     while(keySetIterator.hasNext()):
>>       key = keySetIterator.next()
>>       algorithms = Sextante.getAlgorithms().get(str(key))
>>       for name in algorithms.keySet():
>>         self.__algorithms[str(name)] = algorithms.get(name)
>>
>> Esto genera un diccionario con todos los algoritmos, al cual llamo luego
>> en la línea 545:
>>
>>     algorithm = self.getAlgorithms()[algorithmId]
>>
>> Ahora hay que seguir la función execute línea 543, con el algoritmo
>> cogido:
>> Definir parámetros de intersección:
>>
>> Necesitas los siguientes parámetros:
>> >>> gvpy.algHelp("gvSIG-intersection")
>> * Algorithm help:
>>
>> Intersección
>> *
>>
>> Usage: runalg( "gvSIG-intersection",
>>                                      LAYER[Vector Layer],
>>                                      INTER[Vector Layer],
>>                                      SELECTGEOM_INPUT[Boolean],
>>                                      SELECTGEOM_OVERLAY[Boolean],
>>                                      RESULT_POL[output vector layer],
>>                                      RESULT_LINE[output vector layer],
>>                                      RESULT_POINT[output vector layer],
>>                                      );
>> >>>
>>
>> - Accedes a los parámetros del algoritmo con (línea 261):
>>       params = algorithm.getParameters()
>>
>>       for i in xrange(0, params.getNumberOfParameters()):
>>           param = params.getParameter(i)
>>
>> - Preparas los valores:
>> Como este geoproceso solo necesita dos capas vectoriales es más sencillo.
>> Tienes que transformar las capas de gvSIG a una que soporte Sextante (línea
>> 64):
>>       """ gvsig layer -> SEXTANTE """
>>       slayer = FlyrVectIVectorLayer()
>>       slayer.create(layer)
>>       return slayer
>>
>> - Estableces el valor en el parámetro:
>> param.setParameterValue(paramValue)
>>
>> Para los de tipo booleano no creo que tengas problema.
>>
>>
>> Siguiente... la extensión de análisis:
>> En tu caso como es solo la intersección entre dos capas, supongo que la
>> región de análisis es la suma de las dos capas. así que.. (línea 142)
>>
>>                   self.__defaultAE = AnalysisExtent(paramValue)
>>                   self.__defaultAE.addExtent(AnalysisExtent(paramValue))
>>
>> con esto crearías una región de análisis basado en una capa, y luego
>> añadirías la de la otra capa. Siendo paramValue una capa sextante como la
>> que has creado en los parámetros.
>>
>>
>> Ahora definir los ficheros de salida: defineOutput (línea 413)
>> Si no quieres establecer ningún path especifico de salida, creo que lo
>> básico sería esta parte (línea 429):
>>
>>         output0 = algorithm.getOutputObjects().getOutput(0)
>>         out0 = output0.getOutputChannel()
>>         out0.setFilename(None)
>>
>>
>>
>>
>> Con esto puedes comprobar si todo está correcto:
>> correctValues = algorithm.hasCorrectParameterValues()
>>
>> Siendo:
>> self.__outputFactory = SextanteGUI.getOutputFactory()
>>
>> Ejecutas el algoritmo (línea 456)
>> algorithm.execute( None, self.__outputFactory)
>>
>>
>>
>> Ahora solo quedaría recoger los resultados:
>> Lo mismo, como solo son capas vectoriales de salida, también se
>> simplifica, creo que lo único que necesitarías sería:
>>
>>     oos = algorithm.getOutputObjects()
>>     ret = dict()
>>     for i in xrange(0,oos.getOutputObjectsCount()):
>>       oo = oos.getOutput(i)
>>       value = oo.getOutputObject()
>>       if isinstance(value, FlyrVectIVectorLayer):
>>           store = value.getFeatureStore()
>>           layer =
>> MapContextLocator.getMapContextManager().createLayer(value.getName(),store)
>>           store.dispose()
>>           ret[value.getName()] = layer
>>           layer.dispose()
>>
>>
>> Esto lo vuelve a convertir a una capa en gvSIG.
>>
>> Y creo que eso es todo lo básico...
>>
>> Puedes darle un intento y si ves que te sigue fallando algo me comentas.
>> Si te sigue sin funcionar cuando vaya sacando ratos iré intentando hacer un
>> script que use solo el de intersección, reducido al mínimo, y de ahí seguro
>> que consigues pasarlo a java (básicamente sería juntar todo lo que te he
>> comentado).
>>
>> Un saludo,
>> Óscar
>>
>>
>>
>>
>>
>> On 17/11/2015 11:53, Ana Calle wrote:
>>
>> Buenos días,
>> Estoy generando intersecciones entre capas. Estas capas pueden tener
>> entidades con geometrías que presenten errores del tipo
>> 'Self-intersection'.
>> He comprobado que no obtengo el mismo resultado intersectando cada
>> geometría entre sí (desde mi desarrollo en java), que mediante el
>> geoproceso de intersección de gvsig (de manera automática desde gvsig),
>> intersectando las capas entre sí. Las diferencias son grandes.
>>
>> A ver si alguien me puede ayudar, aportando un ejemplo de cómo poder
>> invocar al geoproceso de intersección que tiene gvsig, desde mi desarrollo
>> en java; o si existe alguna manera de realizar
>> las intersecciones de esas geometrías que pueden ser un tanto
>> conflictivas.
>>
>> Muchas gracias de antemano, un saludo
>> Ana
>>
>>
>> _______________________________________________
>> gvSIG_desarrolladores mailing listgvSIG_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
>>
>>
>>
>> _______________________________________________
>> 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
>>
>>
>
>
> _______________________________________________
> gvSIG_desarrolladores mailing listgvSIG_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
>
>
>
>
> _______________________________________________
> gvSIG_desarrolladores mailing listgvSIG_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
>
>
>
> _______________________________________________
> 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
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20151118/462016fd/attachment.htm 


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