तुलना के लिए , क्यूजीआईएस, आर्कजीआईएस, पोस्टजीआईएस, आदि के बिना पायथन में अधिक कुशल स्थानिक जुड़ाव देखें । समाधान प्रस्तुत उपयोग अजगर मॉड्यूल फियोना , सुडौल और 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- ट्री 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, आदि के बिना पायथन में शामिल होते हैं :
- बिना और सूचकांक के, आपको सभी ज्यामितीय (बहुभुज और बिंदुओं) के माध्यम से पुनरावृत्त होना चाहिए।
- एक बाउंडिंग स्पेसियल इंडेक्स (QgsSpatialIndex ()) के साथ, आप केवल उन जिओमेट्री के माध्यम से पुनरावृत्ति करते हैं, जो आपके वर्तमान ज्यामिति ('फ़िल्टर' के साथ प्रतिच्छेद करने का एक मौका है जो गणना और समय की काफी मात्रा बचा सकते हैं ...)।
- आप अपने कोड (QgsSpatialIndex) (और rtree के साथ ) को गति देने के लिए QGIS स्थानिक सूचकांक का उपयोग करने के साथ PyQGIS के साथ अन्य स्थानिक सूचकांक पायथन मॉड्यूल ( rtree , पर्ट्री या क्वाडट्री ) का भी उपयोग कर सकते हैं।
- लेकिन एक स्थानिक सूचकांक एक जादू की छड़ी नहीं है। जब डेटासेट के एक बहुत बड़े हिस्से को पुनः प्राप्त करना होता है, तो एक स्थानिक सूचकांक कोई गति लाभ नहीं दे सकता है।
जीआईएस से में अन्य उदाहरण: क्यूजीआईएस में एक बिंदु के लिए निकटतम रेखा कैसे खोजें? [डुप्लिकेट]