[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