[Gvsig_desarrolladores] intersecciones con geometrías conflictivas

Óscar Martínez masquesig en gmail.com
Mie Nov 18 15:18:40 CET 2015


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

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20151118/adff2f41/attachment.htm 


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