Để so sánh, nhìn vào hiệu quả hơn không gian tham gia bằng Python mà không QGIS, ArcGIS, PostGIS, vv . Giải pháp được trình bày sử dụng các mô-đun Python Fiona , Shapely và rtree (Spatial Index).
Với PyQGIS và cùng một ví dụ hai lớp point
và polygon
:
1) Không có chỉ số không gian:
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) Với chỉ số không gian 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
Những chỉ số này có nghĩa là gì?
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)]]
Kết luận tương tự như trong Tham gia không gian hiệu quả hơn trong Python mà không có QGIS, ArcGIS, PostGIS, v.v . :
- Không có và chỉ mục, bạn phải lặp qua tất cả các hình học (đa giác và điểm).
- Với chỉ số không gian giới hạn (QssSpatial Index ()), bạn chỉ lặp qua các hình học có cơ hội giao với hình học hiện tại của bạn ('bộ lọc' có thể tiết kiệm một lượng tính toán và thời gian đáng kể ...).
- Bạn cũng có thể sử dụng chỉ số không gian Python module khác ( rtree , Pyrtree hoặc quadtree ) với PyQGIS như trong Sử dụng một QGIS chỉ số không gian với tốc độ lên mã của bạn (với QgsSpatialIndex () và rtree )
- nhưng Chỉ số không gian không phải là cây đũa thần. Khi một phần rất lớn của bộ dữ liệu phải được truy xuất, Chỉ mục không gian không thể mang lại bất kỳ lợi ích tốc độ nào.
Một ví dụ khác trong GIS se: Làm thế nào để tìm dòng gần nhất đến một điểm trong QGIS? [bản sao]