[Gvsig_desarrolladores] intersecciones con geometrías conflictivas

Óscar Martínez omartinez en gvsig.com
Mie Nov 18 17:15:41 CET 2015


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 <mailto: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 list
>>>     gvSIG_desarrolladores en listserv.gva.es
>>>     <mailto: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 list
>>     gvSIG_desarrolladores en listserv.gva.es
>>     <mailto: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 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 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/adeaefe0/attachment.htm 


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