ओवरलैपिंग सेगमेंट के साथ एक लिनेस्ट्रिंग से सबलाइनस्टृंग कैसे निकालें


15

समस्या कथन: एक बस मार्ग (एक linestring ln.the_geom के रूप में परिभाषित), और बस स्टॉप स्थानों का एक सेट (pt1.the_geom, pt2.the_geom, ... ptn.the_geom) को देखते हुए, बस स्टॉप के बीच बस मार्ग को खंडों में विभाजित करें । मैं दो पोस्टगिस कार्यों का उपयोग कर रहा हूं

    ST_line_substring(ln.the_geom,ST_line_locate_point
    ln.the_geom,pt1.the_geom),ST_line_locate_point(ln.the_geom,pt2.the_geom))

यदि बस मार्ग में कोई अतिव्यापी खंड नहीं है, तो उपरोक्त अच्छी तरह से काम करता है। हालाँकि, यदि ओवरलैपिंग सेक्शन हैं, तो ST_line_locate_point लाइनिंग के दूसरे छोर पर एक बिंदु को स्नैप करेगा। एक उदाहरण के रूप में: बस A से B तक जाती है, एक लूप बनाती है, फिर B से A. "A से B" और "B से A" की यात्रा करती है। सभी मार्गों के समानांतर मार्ग हैं जो ओवरलैप किए गए हैं। बस स्टॉप P1 और P2 के मामले में, P2 को बिंदु P2 'में बदले (विपरीत दिशा में) में मैप किया जाता है। इस मामले में खंड को गलत तरीके से निकाला जाता है (जहां अतिरिक्त खंड शामिल हैं)।

इस तरह की समस्याओं को कैसे हल करें? ओवरलैपिंग बस मार्ग मार्ग के किसी भी हिस्से में हो सकता है ... उदाहरण


क्या आपके पास अपने बस मार्गों के टर्मिनी की पहचान करने और किसी दिशा में एक लाइन में बंद लिनेस्ट्रिंग को विभाजित करने का कोई तरीका है? तब आपके पास अब ओवरलैपिंग सेगमेंट नहीं होंगे। उदाहरण के लिए, आप प्रारंभ से लाइन पर सबसे दूर का बिंदु पा सकते हैं, और उस बिंदु का उपयोग करके अपनी रेखा को दो दिशाओं में अलग कर सकते हैं।
राफेल

3
पुराना प्रश्न लेकिन, लगता है कि आपको आरंभ करने और अनुभागों को लागू करने की आवश्यकता है, बिंदु डेटासेट के साथ जुड़ें और किसी भी खंड को प्रारंभिक बिंदु आदेश के साथ हटा दें जो अंतिम बिंदु से बड़ा है। क्या इससे कोई मतलब है?
जोर्ज सन

1
क्या आप दिए गए बस मार्ग के लिए ज्यामिति WKT प्रदान करेंगे?
kttii

जवाबों:


1

यह मानते हुए कि बस मार्ग किसी भी बिंदु पर 2 बार से अधिक नहीं होता है, तो दूसरी पंक्ति का पता लगाने के लिए लाइन को उल्टा करके हल किया जा सकता है, रेखा के अंत के निकटतम निकटतम बिंदु का पता लगाता है। ST_LineSubstring क्वेरी में उपयोग करने के लिए आपको इसे 1 से घटाना होगा। उदाहरण के लिए

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