एक बिंदु को घेरने वाली सभी लाइनें प्राप्त करें


12

मैं क्यूजीआईएस का उपयोग करता हूं और मेरे पास एक बिंदु और सड़क नेटवर्क है। मुझे स्वचालित रूप से सड़क के नाम निकालने की ज़रूरत है जो विशिष्ट बिंदु को घेरते हैं। यहाँ छवि विवरण दर्ज करें निकटतम पड़ोसी विश्लेषण और बफ़र जोन काम नहीं कर सकते, क्योंकि कई मामलों में बिंदु करीब है, मापा दूरी के मामले के रूप में, पड़ोसी सड़कों पर और न कि लोगों को घेरने के लिए। क्या कोई विचार है कि केवल संलग्न सड़कों को कैसे निकाला जा सकता है?


6
हो सकता है, संलग्न क्षेत्र (लाइनों की एक श्रृंखला से मिलकर) को बहुभुज में परिवर्तित करें, बहुभुज की दीवारों को बनाने वाली सड़कों की विशेषताओं के साथ - फिर आप स्थान को ओवरलैप करके एक साधारण चयन कर सकते हैं। इस उदाहरण में, बिंदु "145699" बहुभुज के भीतर आता है "roada_roadb_roadc_roadd।"
मैप मैन

जवाबों:


3

मेरे परीक्षण डेटा के बारे में:

  1. OSM रोड डेटा की तरह हर एक रोड ज्यामिति एक चौराहे पर समाप्त होती है।
  2. हर सड़क की एक यूनिक आईडी होती है।

समाधान मैं

यदि दो धारणाएं हैं:

  1. सड़कें क्वार्टर बन रही हैं।

  2. आप एक मीट्रिक प्रणाली में काम कर रहे हैं।

बिंदु के X और Y निर्देशांक को बढ़ाने / घटाने का विचार है। यदि आप एक मीट्रिक प्रणाली के भीतर काम करते हैं तो आप अपने बिंदु के पूर्व में 1 मी जा सकते हैं, एक नया बिंदु बना सकते हैं और मूल बिंदु के साथ एक रेखा बना सकते हैं। जब तक लाइन एक सड़क को काट रही है, तब तक आप पूर्व की ओर जा रहे हैं। पश्चिम में एक चौराहे की तलाश करने के लिए आप मूल एक्स समन्वय से 1 मीटर घटाते हैं। Y समन्वय के लिए समान है। यदि उत्तर / पूर्व / दक्षिण / पश्चिम में कोई सड़क नहीं है, तो काउंटर 1000 (मीटर) पर बंद हो जाता है। जब आप जानते हैं कि अधिक दूरी के भीतर एक सड़क हो सकती है तो 1000 मी आपको इस मूल्य को बदलना होगा।

आप निम्न कोड के साथ कार्य को हल कर सकते हैं:

संपादित

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "point":
        startpoint = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "roads":
        roads = lyr

startpoint_iter = startpoint.getFeatures()
for feature in startpoint_iter:
    geom = feature.geometry()
    if geom.type() == QGis.Point:
        xy = geom.asPoint()
        x,y = xy[0], xy[1]

line_start = QgsPoint(x,y)      

def reached(direction, count_m):
    road_reached = None
    road = None
    count=1
    while road_reached < 1 and count <=count_m:
        count += 1
        if direction == 'N':
            line_end = QgsPoint(x, y+count)
        if direction == 'E':
            line_end = QgsPoint(x+count,y)
        if direction == 'S':
            line_end = QgsPoint(x,y-count)
        if direction == 'W':
            line_end = QgsPoint(x-count,y)
        line = QgsGeometry.fromPolyline([line_start,line_end])
        for f in roads.getFeatures():
            if line.intersects(f.geometry()):
                road_reached = 1
                road = f['name']
                print road

reached('N', 1000)
reached('E', 1000)
reached('S', 1000)
reached('W', 1000)

यह दिखाने के लिए कि पूर्व में सड़क ई को बिंदु के पास की सड़क के रूप में मान्यता नहीं दी गई है।

यहाँ छवि विवरण दर्ज करें

फ़ंक्शन और आउटपुट को कैसे कॉल करें:

>>>>reached('N', 1000)
road a
>>>>reached('E', 1000)
road b
>>>>reached('S', 1000)
road c
>>>>reached('W', 1000)
road d

यदि 4 से अधिक सड़कें हैं, तो आपको अधिक दिशाओं में देखना होगा (एक्स और वाई दोनों को बदलें)। या आप अपनी रेखा के अज़ीमुथ को बदल सकते हैं, इसका मतलब है कि आप इसे 0-360 डिग्री के भीतर एक डिग्री तक घुमा सकते हैं।

समाधान II

टिप्पणी से प्रेरित होकर आप Polygonizeपहले अपनी सड़कें भी बना सकते हैं । वजह आप QGIS से एक उपकरण का उपयोग कर सकते हैं: Processing > Toolbox > QGIS geoalgorithms > Vector geometry tools > Polygonize। अस्थायी परत का नाम बदलें polygon। यह मानते हुए कि आप केवल उस बिंदु के लिए सड़क का नाम रखना चाहते हैं जो पूरी तरह से सड़कों से घिरा हुआ है। अन्यथा आपको SOLUTION I का उपयोग करना होगा । यह केवल तभी काम करता है जब सभी सड़कें जुड़ी हुई हों (तड़क)!

यहाँ छवि विवरण दर्ज करें

पहले बिंदु को बहुभुज के साथ प्रतिच्छेदन करना पड़ता है। विचार अब यह है कि दोनों, ANDएक एन्कोडिंग लाइन के प्रारंभ बिंदु को बहुभुज के साथ काटना है।

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "point":
        startpoint = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "polygon":
        poly = lyr

for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "roads":
        roads = lyr

for h in startpoint.getFeatures():
    for g in poly.getFeatures():
        if h.geometry().intersects(g.geometry()):
            poly_geom = g.geometry()
            for f in roads.getFeatures():
                geom = f.geometry().asPolyline()
                start_point = QgsGeometry.fromPoint(QgsPoint(geom[0]))
                end_point = QgsGeometry.fromPoint(QgsPoint(geom[-1]))
                if poly_geom.intersects(start_point) and poly_geom.intersects(end_point):
                    print f['name']

उत्पादन:

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