비교를 위해 QGIS, ArcGIS, PostGIS 등이없는 Python 에서 보다 효율적인 공간 조인을보십시오 . 제시된 솔루션은 Python 모듈 Fiona , Shapely 및 rtree (공간 인덱스)를 사용합니다.
PyQGIS와 같은 예제에서 두 개의 레이어 point
와 polygon
:
1) 공간 인덱스가없는 경우 :
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) 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
이 지수는 무엇을 의미합니까?
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)]]
QGIS, ArcGIS, PostGIS 등이없는 Python의보다 효율적인 공간 조인 과 같은 결론 :
- 없는 색인과 색인을 사용하면 모든 도형 (다각형 및 점)을 반복해야합니다.
- 경계 공간 인덱스 (QgsSpatialIndex ())를 사용하면 현재 지오메트리 (상당한 양의 계산 및 시간을 절약 할 수있는 '필터')와 교차 할 수있는 지오메트리를 통해서만 반복 할 수 있습니다.
- 당신은 또한 다른 공간 인덱스 파이썬 모듈 (사용할 수 있습니다 RTREE , Pyrtree 또는 쿼드 트리 에로 PyQGIS과)를 , A는 코드의 속도로 공간 인덱스를 QGIS 사용 (QgsSpatialIndex ()와 함께 RTREE )
- 그러나 공간 인덱스는 마술 지팡이가 아닙니다. 데이터 집합의 많은 부분을 검색해야하는 경우 공간 인덱스는 속도 이점을 제공 할 수 없습니다.
GIS se의 다른 예 : QGIS에서 가장 가까운 점을 찾는 방법은 무엇입니까? [복제]