[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