QGIS Выберите полигоны, которые пересекают точки с питоном

Я очень новичок в использовании QGIS, у меня есть шейп-файл точек и шейп-файл полигонов. Я хотел бы выбрать все полигоны, в которых есть хотя бы одна точка. Проблема, с которой я сталкиваюсь, заключается в том, сколько времени это займет. У меня 1 миллион точек и около 320000 полигонов, поэтому использование пространственного запроса занимает слишком много времени. Я слышал, что мне нужно написать скрипт на python с пространственной индексацией, чтобы получить практически быстрый результат, но я не знаю, как к этому подойти. Любая помощь будет принята с благодарностью.

То, что я пытался объединить с другими вопросами переполнения стека:

pointProvider = self.pointLayer.dataProvider()
all_point = pointProvider.getFeatures()
delta = 0.1

for point in all_point:

    searchRectangle = QgsRectangle(point.x() - delta, point.y()  - delta, point.x() + delta, point.y() + delta)

    candidateIDs = line_index.intesects(searchRectangle)

    for candidateID in candidateIDs:
        candFeature == rotateProvider.getFeatures(QgsFeatureRequest(candidateID)).next()
        if candFeature.geometry().contains(point):

            break

Это выдает NameError: имя 'self' не определено

1 ответ

Решение

Я нашел ответ на GIS Stack Exchange, который вы можете найти здесь

Код, который я использовал, был:

from qgis.core import *
import processing

layer1 = processing.getObject('MyPointsLayer')
layer2 = processing.getObject('MyPolygonsLayer')

index = QgsSpatialIndex() # Spatial index
for ft in layer1.getFeatures():
    index.insertFeature(ft)

selection = [] # This list stores the features which contains at least one point
for feat in layer2.getFeatures():
    inGeom = feat.geometry()
    idsList = index.intersects(inGeom.boundingBox())
    if idsList:
        selection.append(feat)

# Select all the polygon features which contains at least one point
layer2.setSelectedFeatures([k.id() for k in selection])
Другие вопросы по тегам