สำหรับการเปรียบเทียบลักษณะที่มีประสิทธิภาพมากขึ้นเชิงพื้นที่เข้าร่วมในหลามโดยไม่ต้อง QGIS, ArcGIS, PostGIS ฯลฯ วิธีการแก้ปัญหาที่นำเสนอการใช้งานโมดูลหลามFiona , หุ่นดีและ RTree (Spatial ดัชนี)
ด้วย 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)]]
ข้อสรุปเช่นเดียวกับในการเข้าร่วมเชิงพื้นที่ที่มีประสิทธิภาพยิ่งขึ้นใน Python โดยไม่มี QGIS, ArcGIS, PostGIS, ฯลฯ :
- หากไม่มีและจัดทำดัชนีคุณต้องวนซ้ำรูปทรงเรขาคณิตทั้งหมด (รูปหลายเหลี่ยมและคะแนน)
- ด้วยดัชนีขอบเขตเชิงพื้นที่ (QgsSpatialIndex ()) คุณทำซ้ำผ่านรูปทรงเรขาคณิตที่มีโอกาสที่จะตัดกันกับรูปทรงเรขาคณิตปัจจุบันของคุณ ('ตัวกรอง' ซึ่งสามารถบันทึกการคำนวณและเวลาจำนวนมาก ... )
- นอกจากนี้คุณยังสามารถใช้อื่น ๆ ดัชนีเชิงพื้นที่หลามโมดูล ( RTree , Pyrtreeหรือควอดทรี ) กับ PyQGIS ในขณะที่การใช้ QGIS ดัชนีเชิงพื้นที่เพื่อเพิ่มความเร็วในรหัสของคุณ (กับ QgsSpatialIndex () และRTree )
- แต่ดัชนีเชิงพื้นที่ไม่ใช่ไม้เท้าวิเศษ เมื่อส่วนใหญ่ของชุดข้อมูลจะต้องถูกดึงดัชนีอวกาศไม่สามารถให้ผลประโยชน์ความเร็วใด ๆ
ตัวอย่างอื่น ๆ ใน GIS se: ค้นหาบรรทัดที่ใกล้ที่สุดถึงจุดหนึ่งใน QGIS ได้อย่างไร [ซ้ำ]