Как выбрать точки внутри областей векторного слоя с несколькими полигонами?

#python #qgis

#питон #qgis

Вопрос:

Я написал этот код для выбора точек внутри полигонов с помощью pyqgis.

 polygonFile = '/home/polygon.shp'
pointFile = '/home/points.shp'

polygonLayer = QgsVectorLayer(polygonFile, 'poligoni', 'ogr')
pointLayer = QgsVectorLayer(pointFile, 'punti', 'ogr')

polygonFeatureList = [plfeat for plfeat in polygonLayer.getFeatures()]
pointFeatureList =  [ptfeat for ptfeat in pointLayer.getFeatures()]

polygonFeatureNumber = polygonLayer.featureCount()
pointFeatureNumber = pointLayer.featureCount()

QgsMapLayerRegistry.instance().addMapLayer(polygonLayer)
QgsMapLayerRegistry.instance().addMapLayer(pointLayer)

for ptfeat in pointFeatureList:
    ptGeometry = ptfeat.geometry()
    for plfeat in polygonFeatureList:
        plGeometry = plfeat.geometry()
        if plGeometry.contains(ptGeometry):
            pointLayer.select(ptfeat.id)
 

Это работает только тогда, когда мой шейп-файл полигона состоит только из одного объекта, в противном случае я получаю эту ошибку

 TypeError: arguments did not match any overloaded call:
  QgsVectorLayer.select(QgsRectangle, bool): argument 1 has unexpected type 'builtin_function_or_method'
  QgsVectorLayer.select(int): argument 1 has unexpected type 'builtin_function_or_method'
  QgsVectorLayer.select(unknown-type): argument 1 has unexpected type 'builtin_function_or_method'
 

Я попытался изменить последнюю часть с помощью этого:

 for pt in (range(0, pointLayer.featureCount()):
    ptFeat = pointFeatureList[pt] 
    ptGeometry = ptFeat.geometry()
    for pl in (range(0, polygonLayer.featureCount()):
        plFeat = polygonFeatureList[pl]
        plGeometry = plFeat.geometry()
        if plGeometry.contains(ptGeometry):
            pointLayer.select(ptFeat, id)
 

но на этот раз я получаю такую ошибку

 TypeError: arguments did not match any overloaded call:
  QgsVectorLayer.select(QgsRectangle, bool): argument 1 has unexpected type 'QgsFeature'
  QgsVectorLayer.select(int): argument 1 has unexpected type 'QgsFeature'
  QgsVectorLayer.select(unknown-type): argument 1 has unexpected type 'QgsFeature'
 

До сих пор я не нашел способа правильно использовать функцию «выбрать» в пространственном запросе.

Комментарии:

1. Вы хотите выбрать все точки, которые находятся во всех полигонах?

2. Да, я делаю. Вы знаете, как? Yhanks

3. Вы можете посмотреть на это , это может быть полезно.

Ответ №1:

Я нашел два решения

Это первый

 polygonFile = '/path/poligoni.shp'
pointFile = '/path/punti.shp'

polygonLayer = QgsVectorLayer(polygonFile, 'poligoni', 'ogr')
pointLayer = QgsVectorLayer(pointFile, 'punti', 'ogr')

polygonFeatureList = [plFeat for plFeat in polygonLayer.getFeatures()]
pointFeatureList = [ptFeat for ptFeat in pointLayer.getFeatures()]

QgsMapLayerRegistry.instance().addMapLayer(polygonLayer)
QgsMapLayerRegistry.instance().addMapLayer(pointLayer)

for ptFeat in pointFeatureList:
    ptGeom = ptFeat.geometry()
    for plFeat in polygonFeatureList:
        plGeom = plFeat.geometry()
        if plGeom.contains(ptGeom):
            pointLayer.select(ptFeat.id())
 

Это второе решение

 import processing

polygonFile = '/path/poligoni.shp'
pointFile = '/path/punti.shp'

polygonLayer = QgsVectorLayer(polygonFile, 'poligoni', 'ogr')
pointLayer = QgsVectorLayer(pointFile, 'punti', 'ogr')

polygonFeatureList = [plFeat for plFeat in polygonLayer.getFeatures()]
pointFeatureList = [ptFeat for ptFeat in pointLayer.getFeatures()]

QgsMapLayerRegistry.instance().addMapLayer(polygonLayer)
QgsMapLayerRegistry.instance().addMapLayer(pointLayer)

processing.runalg('qgis:selectbylocation', pointLayer, polygonLayer, u'contains', 0, 0)