2017-01-18 8 views
0

Я очень новичок в использовании QGIS, у меня есть файл формы точек и файл формы полигона. Я хотел бы выбрать все полигоны, которые имеют по крайней мере одну точку в них. Проблема, с которой я сталкиваюсь, - это то, как долго это происходит. У меня 1 миллион точек и около 320 000 полигонов, поэтому использование пространственного запроса занимает слишком много времени. Я слышал, что мне нужно написать скрипт python с пространственной индексацией, чтобы получить практически быстрый результат, но я понятия не имею, как подойти к этому. Любая помощь будет принята с благодарностью.QGIS Выберите полигоны, которые пересекают точки с помощью 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: имя «я» не определен

ответ

0

Я нашел ответ через ГИС Стек Обмен, который вы можете найти here

код я использовал:

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])