[Gvsig_desarrolladores] intersecciones con geometrías conflictivas

Ana Calle nico200307 en gmail.com
Mie Nov 18 13:54:16 CET 2015


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
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20151118/dc263389/attachment.htm 


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