विभिन्न लंबाई के मिलान वाले खंड


13

मैं छोटे खंडों को एक बड़े खंड के साथ मिलाने की कोशिश कर रहा हूं जो वे संभवतः सबसे अधिक संबंधित हैं: अपेक्षाकृत करीब, समान असर, और एक दूसरे का सामना करना।

यहां मेरे पास मौजूद डेटा का एक विशिष्ट उदाहरण है:

खंडों

यहाँ मुझे ६५२ से १ ९, ९ ६ ९ के मैच सेगमेंट की जरूरत है, जबकि 70११ और matching० matching में कुछ भी मेल नहीं खा रहा है।

मैंने अलग-अलग तरीकों की तलाश की है, विशेष रूप से हॉसडॉर्फ दूरी ( यहां के उत्तरों के आधार पर )। मैंने PostGIS का उपयोग करके इसकी गणना की, लेकिन मुझे अजीब परिणाम मिल रहे हैं: मुझे मिलने वाली सबसे छोटी दूरी 707 और 198985 के बीच है, और 652 में 198969 की तुलना में 198969 तक अधिक दूरी है (उदाहरण के लिए यदि आवश्यक हो तो मैं क्वेरी और परिणाम जोड़ सकता हूं)।

क्या हॉसडॉर्फ वास्तव में इसे हल करने का सही तरीका है? क्या अन्य दृष्टिकोण हैं? मैंने बस उन मापदंडों पर जाँच का एक सेट बनाने के बारे में सोचा था, जिनका मैंने उल्लेख किया है (दूरी, असर, आदि) एक - दूसरे का सामना करना पड़ा।

अद्यतन: मुझे एक ऐसा तरीका मिला, जो स्वीकार्य समझौता जैसा लगता है:

  • मैं पहली बार नीले रंग के 10 निकटतम काले खंडों को खोजता हूं जिन्हें मैं मैच करने की कोशिश कर रहा हूं (पोस्टजीआईएस <->ऑपरेटर का उपयोग करके ) जो 10 मीटर से कम दूरी पर हैं।
  • मैं तब काले खंडों में से प्रत्येक पर नीले खंड के अंतिम बिंदुओं को खोजकर एक नया खंड बनाता हूं (उपयोग करते हुए ST_ClosestPoint) और उन परिणामों को फ़िल्टर करता हूं जिनकी लंबाई नीले रंग के 90% से कम है (जिसका अर्थ खंड नहीं हैं सामना करना पड़ रहा है, या कि असर अंतर ~ 20 ° से अधिक है)
  • फिर मुझे दूरी और हौसडॉर्फ दूरी के अनुसार पहला परिणाम मिलता है, यदि कोई हो।

ऐसा करने के लिए कुछ बढ़िया ट्यूनिंग हो सकती है लेकिन यह अभी के लिए एक स्वीकार्य काम करने लगता है। अभी भी किसी भी अन्य तरीकों या अतिरिक्त जांच की तलाश में अगर मैं कुछ किनारे के मामलों को याद करता हूं।


1
लक्ष्य (काले) खंडों में संभावित मिलानों की पहचान करने के लिए सिर्फ (नीले) खंडों के समापन बिंदुओं का उपयोग क्यों नहीं किया जाता है? जब आप दोनों एंडपॉइंट्स एक सामान्य लक्ष्य के करीब होते हैं, तो आप जिस खंड की तलाश कर रहे हैं, वह निष्पादित करने के लिए एक सरल क्वेरी है। यह विधि उन विसंगतियों को संभालती है जो खंड के समापन बिंदुओं के स्थानों में त्रुटियों के कारण होती हैं, जो अन्यथा सामना करने के लिए चुनौतीपूर्ण हो सकती हैं: ध्यान दें कि एक बहुत ही कम (नीला) खंड में एक लंबे खंड की तुलना में बहुत कम सटीक असर होता है।
whuber

1
हां, मैं वास्तव में इन पंक्तियों के साथ कुछ कोशिश कर रहा हूं, मैं प्रश्न को विवरण के साथ अपडेट करूंगा।
जुकरपा

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

1
हाय सिरिल, मैं अब इस समस्या पर काम नहीं कर रहा हूं, लेकिन मुद्दा यह भी था कि उनके उन्मुखीकरण के आधार पर नीले खंडों का मिलान किया जाए, और वे काले खंडों का "सामना" कर रहे हैं। इस मामले में इसका मतलब यह है कि 711 को किसी भी चीज के साथ मेल नहीं खाना चाहिए, भले ही वह काले खंडों के बहुत करीब हो
Jukurrpa

जवाबों:


1

यहाँ एक दो कार्य हैं जो मैंने लिखा है कि आपको वह करने देना चाहिए जो आपको करने की आवश्यकता है। चेक करें और देखें कि क्या लाइन पॉलीलाइन या सेगमेंट है यदि पॉलीलाइन लाइन में विस्फोट होता है, तो लाइनों पर पहले बिंदु और अंतिम बिंदु के एज़िमथ और व्युत्क्रम की तुलना करें, आपके लिए निर्णय लेने के लिए कोड के लिए स्वीकार्य मानदंड निर्धारित करें। ये आर्कषक तरीके हैं लेकिन इन्हें संशोधित किया जा सकता है।

लाइन खंड ESRI @shape से अज़ीमुथ लौटें

def returnAzimuth(shape):
    point1 = shape.firstPoint
    point2 = shape.lastPoint
    dX = point2.X-point1.X
    dY = point2.Y-point1.Y
    az = math.atan2(dX,dY)*180/math.pi
    if az<0:
        az = az+360
        return az
    return az

ESRI बिंदुओं से प्रतिलोम लौटाएं

def returnInverse(point1,point2):
    dX = point2.X-point1.X
    dY = point2.Y-point1.Y
    dis = sqrt(dX**2+dY**2)
    az = math.atan2(dX,dY)*180/math.pi
    if az<0:
        az = az+360
        return az,dis
    return az,dis

लाइन खंड में पॉलीलाइन विस्फोट

def explodePolyline(shape):
    sr = "insert your spatial reference"
    lines=[]
    pnts = shape.getPart(0)
    for x in range(len(pnts)-1):
        array = arcpy.Array()
        point1 = arcpy.Point(pnts.getObject(x).X,pnts.getObject(x).Y,pnts.getObject(x).Z)
        point2 = arcpy.Point(pnts.getObject(x+1).X,pnts.getObject(x+1).Y,pnts.getObject(x+1).Z)
        array.add(point1)
        array.add(point2)
        line = arcpy.Polyline(array,sr,True,True)
        print(line)
        lines.append(line)
    return lines

अपनी टेबल पर इस तरह दौड़ें

for shape in Table:
    for shape2 in Table:
         check if shape is polyline:
            if yes, explode and compare returned line segments with shape2
                for seg in returnedlinesegments
                    if seg.firstpoint=shape2.lastpoint and shape.az=shape2.az
                        do stuff.....
            if no, compare shape and shape2
                if shape.firstpoint=shape2.lastpoint and shape.az=shape2.az
                   do stuff.....

इन गुणों को पोस्टगिस में उपलब्ध होना चाहिए - फ़र्स्टपॉइंट, लास्ट पॉइंट, पॉइंटअरे मैं उपरोक्त एग्री गुण मानता हूं क्योंकि यह वही है जो मैं सबसे अच्छा जानता हूं, लेकिन पोस्टगिस के साथ काम करने के लिए उपरोक्त आसानी से बदला जा सकता है।

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