बहुभुज के भीतर प्वाइंट (एक वंश का) ओगर और पायथन का उपयोग करते हुए


10

मैं वर्तमान में एक ऐसी परियोजना पर काम कर रहा हूं जिसमें मुझे आकारविज्ञान में मिलने वाली ज्यामिति सुविधाओं से एक सामयिक नेटवर्क बनाने की आवश्यकता है। अब तक बेन रीली के ओपन सोर्स प्रोजेक्ट का उपयोग करके मैं लाइनस्ट्रेट्स को नेटवर्कएक्स किनारों में बदलने में कामयाब रहा हूं, साथ ही करीबी विशेषताओं (अन्य लाइनस्ट्रेस का कहना है) का पता लगाता हूं और उन्हें निकटतम बिंदु पर जोड़ता हूं ताकि मैं सबसे छोटा पथ एल्गोरिदम चला सकूं।

लेकिन यह एक आकार के लिए ठीक है। हालाँकि, मुझे अब अलग-अलग आकार-प्रकार की विशेषताओं से बड़े नेटवर्कएक्स ग्राफ में जुड़ने की आवश्यकता है। उदाहरण के लिए, यदि कोई बिंदु बहुभुज के भीतर है, तो मैं इसे कनेक्ट करूंगा (इसे कनेक्ट करके मेरा मतलब है कि एक नेटवर्कएक्स एज जोड़ें - 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)

संकेत के लिए पाओलो और क्रिस को धन्यवाद ।

जवाबों:


11

Shapely शांत और सुरुचिपूर्ण है, लेकिन इसके स्थानिक ऑपरेटरों (OGRGeometry वर्ग में) के साथ अभी भी ogr का उपयोग क्यों नहीं किया जाता है?

नमूना कोड:

from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
polyshp = driver.Open('/home/pcorti/data/shapefile/multipoly.shp')
polylyr = polyshp.GetLayer(0)
pointshp = driver.Open('/home/pcorti/data/shapefile/point.shp')
pointlyr = pointshp.GetLayer(0)
point = pointlyr.GetNextFeature()
polygon = polylyr.GetNextFeature()
point_geom = point.GetGeometryRef()
polygon_geom = polygon.GetGeometryRef()
print point_geom.Within(polygon_geom)

ध्यान दें कि आपको GDAL को GEOS समर्थन के साथ संकलित करने की आवश्यकता है।


grzie पाओलो, लेकिन मुझे वास्तव में क्या जरूरत है कि एक बहुभुज में से एक के साथ एक बिंदु के वस्तु संदर्भों की तुलना न करें, बल्कि एक लिनस्ट्रिंग का अंतिम और पहला बिंदु, जिसे मैं वर्तमान में गेटपॉइंट के साथ एक्सेस करता हूं। वहाँ कोई GetPointRef मैंने देखा है। मैं इसे लागू करने के बारे में कैसे जाऊंगा?
user39901230

1
linestring बिंदु (वर्टेक्स) का एक चलने योग्य ज्यामिति संग्रह है, आप आसानी से उनमें से पहले और अंतिम तक पहुंच सकते हैं।
कैपूटी

मैंने बहुभुज वस्तुओं को एक सूची में संग्रहीत करने की कोशिश की है जिसे मैं बाद में एक लिनस्ट्रिंग के पहले और अंतिम बिंदु के खिलाफ जांचने के लिए उपयोग करूंगा। हालांकि, किसी कारण के लिए बहुभुज के भीतर अंकों की सूची में कोई अंक नहीं जोड़े गए हैं: यहाँ एक नज़र डालें: codepad.org/Cm2BV5mp
user39901230

8

मैं नेटवर्कएक्स से परिचित नहीं हूं, लेकिन अगर मैं आपके प्रश्न को सही ढंग से समझ गया हूं, तो आप आकार देने वाले से बहुभुज में बिंदु खोजने के लिए सुडौल और ओजीआर परिवाद का उपयोग कर सकते हैं । यहां एक उदाहरण है कि यह कैसे पता लगाने के लिए काम करता है कि क्या एक बिंदु (2000,1200) एक आकृति से किसी भी बहुभुज के साथ विफल हो जाता है। परिणाम के लिए, यह उस बहुभुज का निर्देशांक प्रिंट करता है।

from shapely.geometry import Point, Polygon
from shapely.wkb import loads
from osgeo import ogr

file1 = ogr.Open("d:\\fileWithData.shp")
layer1 = file1.GetLayerByName("fileWithData")

point1 = Point(2000,1200)

polygon1 = layer1.GetNextFeature()

while polygon1 is not None:
    geomPolygon = loads(polygon1.GetGeometryRef().ExportToWkb())
    if geomPolygon.contains(point1):
        xList,yList = geomPolygon.exterior.xy
        print xList
        print yList
    polygon1 = layer1.GetNextFeature()

मुझे उम्मीद है यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.