Für Vergleiche, Blick auf Effizientere Spatial Join in Python ohne QGIS, ArcGIS, PostGIS, etc . Die vorgestellte Lösung verwendet die Python-Module Fiona , Shapely und rtree (Spatial Index).
Mit PyQGIS und demselben Beispiel zwei Ebenen point
und polygon
:
1) Ohne räumlichen Index:
polygons = [feature for feature in polygon.getFeatures()]
points = [feature for feature in point.getFeatures()]
for pt in points:
point = pt.geometry()
for pl in polygons:
poly = pl.geometry()
if poly.contains(point):
print point.asPoint(), poly.asPolygon()
(184127,122472) [[(183372,123361), (184078,123130), (184516,122631), (184516,122265), (183676,122144), (183067,122570), (183128,123105), (183372,123361)]]
(183457,122850) [[(183372,123361), (184078,123130), (184516,122631), (184516,122265), (183676,122144), (183067,122570), (183128,123105), (183372,123361)]]
(184723,124043) [[(184200,124737), (185368,124372), (185466,124055), (185515,123714), (184955,123580), (184675,123471), (184139,123787), (184200,124737)]]
(182179,124067) [[(182520,125175), (183348,124286), (182605,123714), (182252,123544), (181753,123799), (181740,124627), (182520,125175)]]
2) Mit dem räumlichen Index R-Tree PyQGIS:
# build the spatial index with all the polygons and not only a bounding box
index = QgsSpatialIndex()
for poly in polygons:
index.insertFeature(poly)
# intersections with the index
# indices of the index for the intersections
for pt in points:
point = pt.geometry()
for id in index.intersects(point.boundingBox()):
print id
0
0
1
2
Was bedeuten diese Indizes?
for i, pt in enumerate(points):
point = pt.geometry()
for id in index.intersects(point.boundingBox()):
print "Point ", i, points[i].geometry().asPoint(), "is in Polygon ", id, polygons[id].geometry().asPolygon()
Point 1 (184127,122472) is in Polygon 0 [[(182520,125175), (183348,124286), (182605,123714), (182252,123544), (181753,123799), (181740,124627), (182520,125175)]]
Point 2 (183457,122850) is in Polygon 0 [[(182520,125175), (183348,124286), (182605,123714), (182252,123544), (181753,123799), (181740,124627), (182520,125175)]]
Point 4 (184723,124043) is in Polygon 1 [[(182520,125175), (183348,124286), (182605,123714), (182252,123544), (181753,123799), (181740,124627), (182520,125175)]]
Point 6 (182179,124067) is in Polygon 2 [[(182520,125175), (183348,124286), (182605,123714), (182252,123544), (181753,123799), (181740,124627), (182520,125175)]]
Gleiche Schlussfolgerungen wie bei Effizienterer räumlicher Join in Python ohne QGIS, ArcGIS, PostGIS usw . :
- Ohne und Index müssen Sie alle Geometrien (Polygone und Punkte) durchlaufen.
- Mit einem begrenzten räumlichen Index (QgsSpatialIndex ()) iterieren Sie nur durch die Geometrien, die sich mit Ihrer aktuellen Geometrie überschneiden können ('Filter', der eine beträchtliche Menge an Berechnungen und Zeit sparen kann ...).
- Sie können mit PyQGIS auch andere Python-Module mit räumlichem Index ( rtree , Pyrtree oder Quadtree ) verwenden, wie unter Verwenden eines räumlichen QGIS-Index, um Ihren Code zu beschleunigen (mit QgsSpatialIndex () und rtree ).
- Ein räumlicher Index ist jedoch kein Zauberstab. Wenn ein sehr großer Teil des Datensatzes abgerufen werden muss, kann ein räumlicher Index keinen Geschwindigkeitsvorteil bieten.
Anderes Beispiel in GIS se: Wie finde ich die nächstgelegene Linie zu einem Punkt in QGIS? [Duplikat]