PostGIS पुनरावर्ती क्वेरी लाइन कनेक्टिविटी के आधार पर


9

मुझे एक प्रश्न के साथ कठिनाई हो रही है। मेरे पास linestrings का एक नेटवर्क है, प्रत्येक में n_type कॉलम का मान है। यह मुट्ठी भर विकल्पों में से एक हो सकता है। मैं एक नई तालिका तैयार करना चाहता हूं, जो किसी भी प्रकार के अलंकरण समूह को एक ही प्रकार की हो और जो एक सतत रेखा बनाती हो।

इससे पहले:

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

उपरांत:

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

यहाँ मुझे अब तक क्या मिला है। यह परिणाम देता है, लेकिन उन्हें कोई मतलब नहीं है - प्रकार मेल नहीं खाते हैं और यह बहुत सारी सुविधाएँ देता है।

कृपया यह भी ध्यान दें कि मैंने "निरंतर" को अपने पड़ोसी के 5 फीट के भीतर किसी भी रेखा के रूप में परिभाषित किया है और 30 डिग्री से कम के कोण पर मिल रहा है।

WITH RECURSIVE all_links (i, pk_uid, n_type, geom) AS (
    SELECT  1 AS i,
            pk_uid,
            n_type,
            geom
    FROM    network
    WHERE   n_type != 'none'

    UNION ALL

    SELECT  a.i + 1,
            b.pk_uid,
            b.n_type,
            b.geom
    FROM    network b, all_links a
    WHERE   b.n_type = a.n_type
    AND     b.geom <#> a.geom <= 5  --lines are continuous if within 5 feet of neighbor
    AND     ABS( DEGREES( 3*pi() - st_azimuth(st_startpoint(a.geom),st_endpoint(a.geom)) + st_azimuth(st_startpoint(b.geom),st_endpoint(b.geom)))::int % 360 - 180) <= 30 )  --only take links within 30 degrees of the same angle

SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type

मैंने मान लिया है कि एक पुनरावर्ती क्वेरी जाने का रास्ता है, लेकिन मुझे उस पर गलत साबित होने की खुशी है। Recursives को खुरचना थोड़ा कठिन है।

संपादित करें: मुझे यह भी जोड़ना चाहिए कि मैंने पहले ही ST_Union और ST_Linemerge का उपयोग करके एकत्रीकरण की कोशिश की है, और फिर परिणाम को डंप कर रहा है। यह थोड़े काम करता है, लेकिन> 30 डिग्री चौराहों के लिए खाता नहीं है और कनेक्टिविटी के लिए पांच फुट की सहिष्णुता का सम्मान नहीं कर सकता है।


इस में गहरी खुदाई के बिना, टिप्पणियों का एक जोड़ा। आपको अपने चुनिंदा खंड में a.geom और b.geom को मिलाना होगा। आपको संभवत: यह सुनिश्चित करना चाहिए कि आप कोशिश न करें और साथ ही साथ एक लाइन से जुड़ेंa.pk_uid != b.pk_uid
मिकट

@ मिक्की धन्यवाद। मुझे यह उल्लेख करना चाहिए कि मैं अंतिम चयन खंड में संघ कर सकता हूं, लेकिन अभी कुछ समय के लिए * चयनित किया गया है ताकि मैं सभी परिणाम देख सकूं। मैं अपने कोड स्निपेट को यह दिखाने के लिए संशोधित करूंगा कि यह आखिरकार कैसा दिखना चाहिए।
spencerrecneps

पुनरावर्ती प्रश्नों को टटोलना कठिन है। लोल और +1
जॉन पॉवेल

एक त्वरित रूप से पता चलता है कि आपके पास अपने आधार / एंकर क्वेरी के साथ समस्या हो सकती है। आपको प्रत्येक पंक्ति, ए, बी, सी आदि के लिए शुरुआती बिंदु का चयन करना होगा, जिसे आप फिर से पुनरावर्ती भाग में बनाते हैं। संभवतः आपको एंकर क्वेरी (शायद x या y में, दिशा - डेटा देखे बिना पता करने के लिए कठिन) के लिए किसी प्रकार के आदेश को जोड़ने की आवश्यकता है। मैं इसे नीचे तोड़ दूंगा और सुनिश्चित करूंगा कि पुनरावर्ती भाग के साथ जारी रखने से पहले मुझे समझदार शुरुआत अंक मिल रहा था। मैंने हाल ही में समय श्रृंखला में धारियाँ खोजने के लिए एक पुनरावर्ती क्वेरी का उपयोग किया था, और एक बार जब मैंने एंकर बिंदुओं को सही ढंग से पहचान लिया था, तो आराम से (ईश)
जॉन पॉवेल

@dbaston। अच्छी बात है, लेकिन आप एक पुनरावर्ती क्वेरी के साथ भी ऐसा कर सकते हैं, और हर किसी ने अभी तक स्थापित नहीं किया है।
जॉन पॉवेल

जवाबों:


1

जॉन बारका ने कहा कि आपका समाधान कम से कम लाइन घटकों के पूर्व-आदेश को याद कर रहा है।

पुनरावर्ती प्रश्न बहुत कठिन हैं, बहुत कठिन हैं, मैं कहूंगा।

आपको एक नए डेटाबेस फ़ंक्शन में ST_Linemerge व्यवहार को दोहराने की कोशिश करनी चाहिए। मैं पहले ST_Linemerge कार्यान्वयन के स्रोत को देखने और इसे 30 डिग्री एंगल चिकोटी का उत्पादन करने के लिए बदलकर दोहराने की कोशिश करूंगा।

एकत्रीकरण से खंडों को त्यागने के लिए जो <30 डिग्री के कोण पर नहीं हैं। आपको उनकी तुलना एक एकत्रीकरण लूप से करनी चाहिए।

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