PyQGIS – Calling All Elements in a Polygon Layer

pyqgis

layers =  QgsProject.instance().mapLayers().values()

for layer in layers:

    if layer.name() == "Polygon":
        polygon_layer = layer
        
    if layer.name() == "point":
        point_layer = layer

layer = polygon_layer

layer.selectByExpression('"Type"=\'Natural\'', QgsVectorLayer.SetSelection)

Natural = layer.selectedFeatures()

for polygons in polygon_layer.getFeatures():

    for points in point_layer.getFeatures():

        if Natural[0].geometry().intersects(points.geometry()):
        
            with open(path_c, "a", newline= '') as file:
                writer = csv.writer(file)
                writer.writerow([points ["ID"], points ["Land Use"], points ["Land Cover"], points["x"], points ["y"]])
          

In the current piece of code above, I am using "Natural[0]" but this is only calling the first element in the list which is only one polygon.

What do I need to do to call all the elements and loop through those?

Best Answer

what you want is the following:

# Get layers from legend (in a cleaner way)
polygon_layer = next(QgsProject.instance().mapLayersByName("Polygon"), None)
point_layer = next(QgsProject.instance().mapLayersByName("point"), None)

# expression = QgsFeatureRequest(QgsExpression("Type = 'Natural'"))
# for polygons in polygon_layer.getFeatures(expression)
# or
for polygon in polygon_layer.getFeatures("Type = 'Natural'"):
    for point in point_layer.getFeatures():
        if polygon.geometry().intersects(point.geometry()):
            with open(path_c, "a", newline= '') as file:
              writer = csv.writer(file)
              writer.writerow([point["ID"], point["Land Use"], point["Land Cover"], point["x"], point["y"]])

PS : I don't know what you are trying to do but if you want to see if the points are inside of a polygon, you should use : polygon.geometry().contains(point.geometry()) instead of intersects

Related Question