[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