2 votos

Usar intersect en QGIS Python da error "sin geometría"

Estoy usando la Consola de Python de QGIS para automatizar algún procesamiento por lotes. Quiero crear una capa de polígonos de Voronoi a partir de datos de puntos (resolví esta parte) y luego, a partir de una carpeta de shapefiles, recortar la capa de polígonos de Voronoi con cualquiera de los shapefiles que la intersecten, pero estoy obteniendo el error: AttributeError: 'str' object has no attribute 'geometry'

Estoy acostumbrado a ArcPy y realmente he estado luchando por entender el Python de QGIS. Siento que el libro de recetas y los recursos de la API son un poco abrumadores para mí (un principiante en Python)

¿Alguna sugerencia?

import os
from qgis.gui import *
from qgis.core import *
import processing

#------------------------------------------------------
# Variables del Usuario:

#ruta a la ubicación de los datos
soil_path = "D:\\suelo\\datosuelo"
shp_path = "D:\\suelo\\límites_campo"
print ("Datos de Suelo: " + soil_path)
print ("Límites de Campo: " + shp_path)

#-------------------------------------------------------

def obtener_datos(ruta, terminacion):
    lista_datos = []

    for root, dirs, files in os.walk(ruta):

        for data in sorted(files):
            if data.endswith(terminacion):
                lista_datos.append(os.path.join(root, data))

    return lista_datos
    print (str(len(lista_datos)) + " shapefiles encontrados")

def recortar(vor_poly):
    datos_recortados = []
    datos_shp = obtener_datos(shp_path, ".shp")
    print (str(len(datos_shp)) + " límites de campo encontrados")
    for f in datos_shp:
        print (f)
        print (vor_poly)
        if f.geometry().intersects(vor_poly.geometry()):

            OUTPUT = os.path.splitext(polinomios)[0] + os.path.basename(f) + ".shp"

            processing.runalg('qgis:clip', vor_poly, f, OUTPUT)

            print ("recortado " + OUTPUT)

            datos_recortados.append(OUTPUT)
    return datos_recortados

def procesoqgis(puntosuelo):

    #polígonos de Voronoi con buffer de tamaño 0

    print("Polígonos de Voronoi")

    for f in puntosuelo:
        split_path = os.path.splitext(f)[0]
        capaentrada = f
        capasalida = split_path + "_vor_poly.shp"

        processing.run("qgis:voronoipolygons", { 'INPUT':capaentrada, 'BUFFER': 0, 'OUTPUT': capasalida})

        poligonosrecortados = recortar(capasalida)

def principal():
    #lista de datos
    datos_suelo = obtener_datos(soil_path, ".shp")

    print("ejecutando procesos de QGIS")
    procesoqgis(datos_suelo)

if __name__ == '__console__':
    principal()

2voto

Andy Brandi Puntos 650

Puedes obtener el resultado del procesamiento o crear un qgsvectorlayer a partir de un archivo shp.

puedes:

result = processing.run("qgis:voronoipolygons", { 'INPUT':inlayer, 'BUFFER': 0, 'OUTPUT': outlayer})

clippedpolys = clip(result['OUTPUT'])

o si prefieres hacer esto:

outlayer = split_path + "_vor_poly.shp"

processing.run("qgis:voronoipolygons", { 'INPUT':inlayer, 'BUFFER': 0, 'OUTPUT': outlayer})

layer = QgsVectorLayer(outlayer,"vor_poly")

clippedpolys = clip(layer)

1voto

Mitchell D Puntos 596

Este es mi intento más reciente, todavía obteniendo un error pero ahora al menos está en la función de recorte en lugar de antes

import os
from qgis.gui import *
from qgis.core import *
import processing

#------------------------------------------------------
# Variables de Usuario:

#ruta de ubicación de los datos
soil_path = "D:\\suelo\\datosuelo"
shp_path = "D:\\suelo\\límites_campo"
print ("Datos de Suelo: " + soil_path)
print ("Límites de Campo: " + shp_path)

#-------------------------------------------------------

def obtener_datos(ruta, final):
    lista_datos = []

    for root, dirs, files in os.walk(ruta):

        for data in sorted(files):
            if data.endswith(final):
                lista_datos.append(os.path.join(root, data))

    return lista_datos
    print (str(len(lista_datos)) + " shapefiles encontrados")

def recortar(vor_poly):
    datos_recortados = []

    shp_data = obtener_datos(shp_path, ".shp")

    print (str(len(shp_data)) + " límites de campo encontrados")

    for f in shp_data:

        print (f)
        print (vor_poly)

        layer = QgsVectorLayer(f,"clip_poly")

        #EL ERROR ESTÁ SUCEDIENDO A CONTINUACIÓN (AttributeError: 'QgsVectorLayer' object has no attribute 'geometry')

        if layer.geometry().intersects(vor_poly.geometry()):

            OUTPUT = os.path.splitext(polygons)[0] + os.path.basename(f) + ".shp"

            processing.runalg('qgis:clip', vor_poly, f, OUTPUT)

            print ("recortado " + OUTPUT)

            datos_recortados.append(OUTPUT)

    return datos_recortados

def qgisprocess(soilpts):

    #polígonos de Voronoi con buffer de tamaño 0
    print("Polígonos de Voronoi")
    for f in soilpts:
        split_path = os.path.splitext(f)[0]
        inlayer = f
        outlayer = split_path + "_vor_poly.shp"

        processing.run("qgis:voronoipolygons", { 'INPUT':inlayer, 'BUFFER': 0, 'OUTPUT': outlayer})

        layer = QgsVectorLayer(outlayer,"vor_poly")

        poligonosrecortados = recortar(layer)

def main():
    #lista de datos
    datos_suelo = obtener_datos(soil_path, ".shp")

    print("ejecutando procesos de QGIS")
    qgisprocess(datos_suelo)

if __name__ == '__console__':
    main()

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X