Что я пытаюсь сделать: перебрать точечный шейп-файл и выбрать каждую точку, которая попадает в многоугольник.
Следующий код основан на примере пространственного запроса, который я нашел в книге:
mitte_path = r"D:\PythonTesting\SelectByLocation\mitte.shp"
punkte_path = r"D:\PythonTesting\SelectByLocation\punkte.shp"
polygon = QgsVectorLayer(mitte_path, 'Mitte', 'ogr')
points = QgsVectorLayer(punkte_path, 'Berlin Punkte', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(polygon)
QgsMapLayerRegistry.instance().addMapLayer(points)
polyFeatures = polygon.getFeatures()
pointsCount = 0
for poly_feat in polyFeatures:
polyGeom = poly_feat.geometry()
pointFeatures = points.getFeatures(QgsFeatureRequest().setFilterRect(polyGeom.boundingBox()))
for point_feat in pointFeatures:
points.select(point_feat.id())
pointsCount += 1
print 'Total:',pointsCount
Это работает, и он выбирает наборы данных, но проблема в том, что он выбирает ограничивающий прямоугольник , поэтому, очевидно, возвращает точки, которые меня не интересуют:
Как можно было бы возвращать только точки внутри многоугольника без использования qgis: selectbylocation ?
Я пытался использовать методы inside () и intersects () , но так как я не заставлял их работать, я прибегнул к приведенному выше коду. Но, возможно, они все-таки ключ.
источник
Вы можете использовать алгоритм «Ray Casting» , который я немного адаптировал для использования с PyQGIS:
Применительно к этой ситуации:
результат, на консоли Python, был:
Это сработало.
Редактирование Примечание:
Код с более кратким предложением гена :
источник
if geo_pol.contains(geo_point) == True:
потому что это неявно вif geo_pol.contains(geo_point)
(всегда True)С некоторыми советами от напарника я наконец получил его для работы с помощью inside ().
Общая логика
Вот код:
Это также будет работать с intersects () вместо inside () . При использовании очков не имеет значения, какой из них вы бы использовали, поскольку они оба будут возвращать один и тот же результат. Однако при проверке линий / полигонов это может иметь важное значение: в пределах () возвращаются объекты, которые полностью находятся внутри, тогда как intersects () возвращает объекты, которые полностью находятся внутри и которые частично находятся внутри (то есть пересекаются с объектом, как имя указывает)
источник