Was ich versuche: Durchlaufen Sie ein Punkt-Shapefile und wählen Sie jeden Punkt aus, der in ein Polygon fällt .
Der folgende Code ist von einem Beispiel für räumliche Abfragen inspiriert, das ich in einem Buch gefunden habe:
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
Dies funktioniert und es werden Datensätze ausgewählt, aber das Problem ist, dass es durch einen Begrenzungsrahmen ausgewählt wird , wodurch offensichtlich Punkte zurückgegeben werden, an denen ich nicht interessiert bin:
Wie kann ich nur Punkte innerhalb des Polygons zurückgeben, ohne qgis: selectbylocation zu verwenden ?
Ich habe versucht, die Methoden inside () und intersects () zu verwenden, aber da ich sie nicht zum Laufen gebracht habe, habe ich auf den obigen Code zurückgegriffen. Aber vielleicht sind sie doch der Schlüssel.
quelle
Sie können den "Ray Casting" -Algorithmus verwenden , den ich für die Verwendung mit PyQGIS leicht angepasst habe:
Auf diese Situation angewendet:
Das Ergebnis an der Python-Konsole war:
Es funktionierte.
Bearbeitungshinweis:
Code mit dem prägnanteren Vorschlag des Gens :
quelle
if geo_pol.contains(geo_point) == True:
da es inif geo_pol.contains(geo_point)
(immer True)Mit einigen Ratschlägen eines Arbeitskollegen habe ich es endlich geschafft, mit inside () zu arbeiten.
Allgemeine Logik
Hier ist der Code:
Dies würde auch mit intersects () anstelle von inside () funktionieren . Bei der Verwendung von Punkten spielt es keine Rolle, welche Sie verwenden würden, da beide das gleiche Ergebnis zurückgeben. Wenn für die Zeilen / Polygonen Überprüfung kann es jedoch einen wichtigen Unterschied: innerhalb von Objekten () zurückkehrt, die vollständig innerhalb, während intersects () Objekte Retuns die innerhalb vollständig sind und , die teilweise innerhalb (dh , dass sich schneiden mit dem Merkmal, als der Name gibt an).
quelle