2 votos

Cómo utilizar la bandera ExactIntersect para el objeto QgsFeatureRequest()

Tengo dos capas, una polygon_lyr y un line_lyr . Quiero usar un QgsFeatureRequest() para el line_lyr.getFeatures() pero en lugar de devolver las líneas que intersecan el cuadro delimitador de un polígono, sólo quiero las líneas que intersecan la geometría real del polígono. Supongo que esto es lo que ExactIntersect la bandera lo hace. Pero no sé cómo utilizarla realmente.

for i, poly in enumerate(polygon_lyr.getFeatures()):
    poly_geom = poly.geometry()

    for line in line_lyr.getFeatures(QgsFeatureRequest(poly_geom.boundingBox())):
        #processing operations

1voto

Mue Puntos 2469

No creo que esto sea posible ya que el QgsFeatureRequest() debe utilizar un cuadro delimitador especificado si desea añadir un filtro espacial. Un método de ejemplo es QgsFeatureRequest().setFilterRect(boundingBox) . El ExactIntersect utiliza la geometría real de la característica para la intersección, pero se utilizará contra el cuadro delimitador.

El siguiente es un ejemplo de uso de QgsFeatureRequest() donde la geometría de cada línea se cruza con la caja delimitadora de cada polígono:

polygon_lyr = QgsProject.instance().mapLayersByName('polygon example')[0]
line_lyr = QgsProject.instance().mapLayersByName('line example')[0]
ids = []

for i, poly in enumerate(polygon_lyr.getFeatures()):
    poly_geom = poly.geometry()
    request = QgsFeatureRequest().setFilterRect(poly_geom.boundingBox()).setFlags(QgsFeatureRequest.ExactIntersect)
    for line in line_lyr.getFeatures(request):
        ids.append(line.id())

line_lyr.selectByIds(ids)

Si quieres hacer una intersección usando las geometrías de las líneas contra las geometrías de los polígonos, podrías hacerlo más directamente usando:

polygon_lyr = QgsProject.instance().mapLayersByName('polygon example')[0]
line_lyr = QgsProject.instance().mapLayersByName('line example')[0]
ids = []

for i, poly in enumerate(polygon_lyr.getFeatures()):
    poly_geom = poly.geometry()
    for line in line_lyr.getFeatures():
        if line.geometry().intersects(poly_geom):
            ids.append(line.id())

line_lyr.selectByIds(ids)

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