Ce que je suis en train de le faire: la boucle par un point shapefile et sélectionnez chaque point qui tombe dans un polygone.
Le code suivant est inspiré d'un exemple de requête spatiale que j'ai trouvé dans un livre:
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
Cela fonctionne, et il sélectionne des jeux de données, mais le problème est qu'il sélectionne par boîte englobante , donc renvoyant évidemment des points qui ne m'intéressent pas:
Comment pourrais-je ne retourner que des points dans le polygone sans utiliser qgis: selectbylocation ?
J'ai essayé d'utiliser les méthodes within () et intersects () , mais comme je ne les faisais pas fonctionner, j'ai eu recours au code ci-dessus. Mais peut-être qu'ils sont la clé après tout.
la source
Vous pouvez utiliser l' algorithme "Ray Casting" que j'ai légèrement adapté pour l'utiliser avec PyQGIS:
Appliqué à cette situation:
le résultat, sur la console Python, était:
Ça a marché.
Note d'édition:
Code avec la proposition de gène la plus concise :
la source
if geo_pol.contains(geo_point) == True:
car il est implicite dansif geo_pol.contains(geo_point)
(toujours True)Avec quelques conseils d'un collègue de travail, je l'ai finalement fait fonctionner en utilisant ().
Logique générale
Voici le code:
Cela fonctionnerait également avec intersects () au lieu de within () . Lorsque vous utilisez des points, peu importe celui que vous utiliseriez, car ils renverront tous les deux le même résultat. Cependant, lors de la vérification des lignes / polygones, cela peut faire une différence importante: within () renvoie des objets qui sont entièrement à l' intérieur, tandis que intersects () réaccorde les objets qui sont entièrement à l'intérieur et qui sont partiellement à l' intérieur (c'est-à-dire qui se croisent avec l'entité, comme le nom l'indique).
la source