मैं वर्तमान में एक ऐसी परियोजना पर काम कर रहा हूं जिसमें मुझे आकारविज्ञान में मिलने वाली ज्यामिति सुविधाओं से एक सामयिक नेटवर्क बनाने की आवश्यकता है। अब तक बेन रीली के ओपन सोर्स प्रोजेक्ट का उपयोग करके मैं लाइनस्ट्रेट्स को नेटवर्कएक्स किनारों में बदलने में कामयाब रहा हूं, साथ ही करीबी विशेषताओं (अन्य लाइनस्ट्रेस का कहना है) का पता लगाता हूं और उन्हें निकटतम बिंदु पर जोड़ता हूं ताकि मैं सबसे छोटा पथ एल्गोरिदम चला सकूं।
लेकिन यह एक आकार के लिए ठीक है। हालाँकि, मुझे अब अलग-अलग आकार-प्रकार की विशेषताओं से बड़े नेटवर्कएक्स ग्राफ में जुड़ने की आवश्यकता है। उदाहरण के लिए, यदि कोई बिंदु बहुभुज के भीतर है, तो मैं इसे कनेक्ट करूंगा (इसे कनेक्ट करके मेरा मतलब है कि एक नेटवर्कएक्स एज जोड़ें - add_edge (g.GetPoint (1), g.GetPoint (2)) के साथ अगले अगले बिंदु में यह भी एक बहुभुज के भीतर है जो एक समान विशेषता साझा करता है (कहते हैं, आईडी)। ध्यान दें कि अलग-अलग shps में बहुभुज केवल एक ही ID साझा करते हैं और निर्देशांक नहीं होते हैं। बहुभुज के भीतर आने वाले बिंदु भी समान निर्देशांक साझा नहीं करते हैं।
इस समस्या का मेरा समाधान उस बिंदु की पहचान करना था जो एक बहुभुज में रहता है, इसे संग्रहीत करें, अगले आकृति में बिंदु को ढूंढें जो बहुभुज में एक ही आईडी के साथ रहता है और फिर उनके बीच संजाल बढ़त जोड़ें।
कैसे पता लगाएं कि एक बिंदु बहुभुज के भीतर रहता है? खैर, एक प्रसिद्ध एल्गोरिथ्म है: RayCasting एल्गोरिथ्म जो ऐसा करता है। यह वह जगह है जहां मैं वास्तव में फंस गया हूं, क्योंकि एल्गोरिथ्म को लागू करने के लिए मुझे बहुभुज के निर्देशांक की आवश्यकता होती है, और ओजीआर की ज्यामिति के एक दस्तावेज के माध्यम से स्किमिंग के बाद भी उन्हें अभी तक एक्सेस करने का तरीका नहीं पता है । तो, मैं जो सवाल पूछ रहा हूं, वह यह है कि बहुभुज बिंदुओं तक कैसे पहुंचा जाए, या निर्देशांक किया जाए या यह पता लगाने का एक आसान तरीका है कि क्या कोई बिंदु बहुभुज के भीतर है? Osgeo.ogr लाइब्रेरी के साथ अजगर का उपयोग करके मैंने निम्नलिखित को कोडित किया:
if g.GetGeometryType() == 3: #polygon
c = g.GetDimension()
x = g.GetPointCount()
y = g.GetY()
z = g.GetZ()
मेरे मुद्दे की बेहतर समझ के लिए छवि देखें।
[संपादित करें] अब तक मैंने सभी बहुभुज वस्तुओं को एक सूची में संग्रहीत करने की कोशिश की है जिसके साथ मैं पहले और अंतिम बिंदु की तुलना करना चाहूंगा । लेकिन पाओलो का उदाहरण प्वाइंट ऑब्जेक्ट संदर्भ और बहुभुज वस्तु संदर्भ का उपयोग करने से संबंधित है, जो एक लाइन ऑब्जेक्ट संदर्भ के साथ काम नहीं करेगा क्योंकि पूरी लाइन बहुभुज के भीतर नहीं है, बल्कि इसके अलंकरण का पहला या अंतिम बिंदु है।
[EDIT3] लिनेस्ट्रिंग के पहले और आखिरी बिंदु के निर्देशांक से एक नई ज्यामिति बिंदु वस्तु बनाना और फिर एक सूची में सहेजी गई बहुभुज ज्यामिति वस्तुओं के खिलाफ तुलना करने के लिए उपयोग करना ठीक काम लगता है:
for findex in xrange(lyr.GetFeatureCount()):
f = lyr.GetFeature(findex)
flddata = getfieldinfo(lyr,f,fields)
g = f.geometry()
if g.GetGeometryType() == 2:
for j in xrange(g.GetPointCount()):
if j == 0 or j == g.GetPointCount():
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(g.Getx(j),g.GetY(j))
if point.Within(Network.polygons[x][0].GetGeometryRef()):
print g.GetPoint(j)