PostGIS के साथ अन्तर्विभाजक लाइनों में शामिल हों


15

यह कुछ ऐसा है जिसे मैं पूछने में लगभग शर्मिंदा हूं, लेकिन मैं इसे मेरे जीवन के लिए काम करने के लिए प्राप्त नहीं कर सकता।

मेरे पास सेगमेंट के साथ एक सड़क की परत है, प्रत्येक खंड में एक Road IDऔर एक खंड है type

मैं सभी वर्गों Road IDको एक साथ जोड़ना चाहता हूं , प्रत्येक के लिए एक लिनेस्ट्रिंग में, लेकिन केवल जब वे समान typeहोते हैं और छू रहे होते हैं (सभी लाइनें एक साथ स्नैप होती हैं)।

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

Road ID - Type
   1       L
   1       L
   1       T
   1       L

जवाबों:


11

मेरा मानना ​​है कि नीचे दिए गए कोड कुछ कारणों से चयनित उत्तर की तुलना में थोड़ा क्लीनर समाधान है। पहले कोई टेबल ज्वाइन करना आवश्यक नहीं है और इस प्रकार सड़क के प्रत्येक गुण के लिए 'ON' क्लॉज के परिशिष्ट की आवश्यकता नहीं है, और दूसरा उपरोक्त कार्यप्रणाली संभावित रूप से मल्टी-लिनस्ट्रेस का उत्पादन कर सकती है यदि गलियों के कई, गैर-सन्निहित क्लस्टर हैं जो हैं सभी समान गुण मान, जबकि ST_Dump इस समाधान में उस समस्या का ध्यान रखता है।

SELECT (ST_Dump(geom)).geom AS geom, "road_id", "road_type"
FROM (
    SELECT ST_LineMerge(ST_Union(geom)) AS geom, "road_id", "road_type"
    FROM "RoadCentreLines"
    GROUP BY "road_id", "road_type"
) AS street_union

मेरा ज्यामिति या तो क्वेरी के साथ विलय नहीं करता है
Luffydude

@ Luffydude देखभाल किसी भी अधिक जानकारी प्रदान करने के लिए? यह संभव है कि आप जिस ज्यामिति के साथ काम कर रहे हैं, वह इस तरह संरेखित न हो कि उसका विलय संभव हो
ग्रांट हम्फ्रीज

इसने सड़क आईडी के आधार पर सड़क डेटासेट को मर्ज करने के लिए खूबसूरती से काम किया। इसने सड़कों को खूबसूरती से संभाला (गैप वर्गों में कोई रेखा नहीं)। मैं ओपी नहीं हूं, लेकिन यह एक शानदार जवाब है। यह स्वीकृत उत्तर होना चाहिए। धन्यवाद।
जलकल

यह सबसे अच्छा जवाब है!
aborruso

6

यह काम करता है

SELECT a."Road_ID",a."Road_Type", ST_LineMerge(ST_Collect(a.the_geom))
FROM "RoadCentreLines" as a 
LEFT JOIN "RoadCentreLines" as b ON 
ST_Touches(a.the_geom,b.the_geom) 
    AND a."Road_Type" = b."Road_Type" 
    AND a."Road_ID" = b."Road_ID"
GROUP BY ST_Touches(a.the_geom,b.the_geom), a."Road_Type", a."Road_ID"

0

सिर्फ थूकने-बजाने के लिए लेकिन मैं कुछ अन्य समाधानों के बारे में सोच सकता हूं। मुझे नहीं पता कि वे बेहतर या बदतर हैं, बस वे अन्य हैं।

सबसे पहले, यदि केवल कुछ सड़क प्रकार हैं, तो आप टाइप-बाय-टाइप कुछ के साथ कर सकते हैं:

WITH type As (SELECT "Road_ID" As id WHERE "Road_Type" = 'type')
SELECT ST_LineMerge (ST_Collect(the_geom))
FROM "RoadCentreLines"
WHERE ST_StartPoint(the_geom) && ST_EndPoint(the_geom) IS TRUE
AND "Road_ID" IN (SELECT id FROM type);

यदि आप प्रकारों का एक गुच्छा हैं, तो आप एक फ़ोर लूप में चर के रूप में Road_Type के साथ अधिकांश का उपयोग कर सकते हैं।

मेरे अंतिम विचार में सभी जियोमेट्री को मर्ज करना शामिल था, फिर ST_Line_Substring फ़ंक्शन ( लिंक-लिंक ) के साथ सड़क प्रकारों को कॉल करना लेकिन यह बिल्कुल भी काम नहीं करेगा।

इसके साथ शुभकामनाएँ, रोब

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