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