PostGIS के साथ मल्टीस्ट्रीमिंग को लिनेस्ट्रिंग में बदलना?


16

मेरे पास एक बहुस्तरीय स्ट्रिंग है और इसे कुछ कार्यों का उपयोग करने के लिए इसे एक लिनेस्ट्रिंग में परिवर्तित करना चाहते हैं जो केवल लिनेस्टर के साथ काम करते हैं। मैंने उपयोग किया ST_Dump()और मुझे अपने ज्यामितीय का एक संग्रह मिला। अगर मैं उन्हें वापस एक साथ मर्ज कर देता हूं, तो भी मुझे मल्टीलाइनरिंग मिल जाती है। क्या मुझे एनपीएन प्राप्त करना चाहिए और उन्हें एक साथ या कुछ मिलाकर एक साधारण लिनेस्ट्रिंग के साथ समाप्त करना चाहिए? ST_LineMerge()मेरी मल्टीलाइनरिंग पर भी काम नहीं करता है, यह उसी को लौटाता है।

मेरा उदाहरण,

MULTILINESTRING ((- 3.16420835153456 55.9269166007097, -३.१,६४,२२२ ५५.९,२६,९१८), (- 3.1642070167833 55.9269296196706, -3.16421351659546 55.9268662214904), (- 3.16421351659546 55.9268662214904, -3.16421636372824 55.9268384509897), (- 3.16421636372824 55.9268384509897, -3.16422182573761 55.9267851753802), (- 3.16422182573761 55.9267851753802, -3.16422870102352 ५५.९२६७१८११४८८६ ), (- 3.16422870102352 ५५.९२६७१८११४८८६, -3.16423309121073 ५५.९२६६७५२९३६६७), (- 3.16423309121073 ५५.९२६६७५२९३६६७, -3.16423565148822 55.9266503211093), (- 3.16423565148822 55.9266503211093, -3.16424103159897 55.9265978443265), (- 3.16424103159897 55.9265978443265, -3.16424680776317 55.9265415044985), (- 3.16424680776317 55.9265415044985, -3.16425267254583 55.9264843002995 ), ((3.16425267254583 55.9264843002995, -3.16425541048080 55.9264575949012), (- (3.16425541048045 55.9264575949012, -3.16426111146586 55.9264019883556),(-3.16426111146586 55.9264019883556, -3.1642667032531 55.9263474469124), (- 3.1642667032531 55.9263474469124, -3.16426957768543 55.9263194101362), (- 3.16426957768543 55.9263194101362, -3.16427488261739 55.9262676666359), (- 3.16427488261739 55.9262676666359, -3.16428009893088 55.9262167875066), (- 3.16428009893088 55.9262167875066, -३.१६४२८२७४११०७ 55.9261910161221), (-3.1642875546472 55.9261440655823, -३.१६४२८२७४११०७ 55.9261910161221), (- 3.1642875546472 55.9261440655823, -3.16429466890915 55.9260746741522), (- 3.16429466890915 55.9260746741522, -3.16430092974527 55.9260136069079), (- 3.16430092974527 55.9260136069079, -3.16430822838418 55.9259424170929), (- 3.16430822838418 55.9259424170929, -3.16431547242401 ५५.९२५८७१७५९८२९), (-3.16431547242401 55.925871759829, -3.1643144873250505 55.9258328901507), (- 3.16431770120536 55.9257327801001, -3.164315472424 55 55.925871759829), (- 3)।164339 55.925777, -3.16431770120536 55.9257327846001))


हमें इन मल्टीलाइनरिंग का एक उदाहरण दें जिसे आप परिवर्तित करना चाहते हैं ताकि हम उनका परीक्षण कर सकें।
कैप्ट्रैगन

जवाबों:


6

आप अपने डेटा को ठीक करने के लिए ST_SnapToGrid का उपयोग भी कर सकते हैं , लेकिन आपको इसे सही पाने के लिए मापदंडों के साथ खेलना होगा।

SELECT ST_AsText(
    ST_LineMerge(
        ST_SnapToGrid(
            ST_GeomFromText('MULTILINESTRING((-3.16420835153456 55.9269166007097,-3.164222 55.926918),(-3.1642070167833 55.9269296196706,-3.16421351659546 55.9268662214904),(-3.16421351659546 55.9268662214904,-3.16421636372824 55.9268384509897),(-3.16421636372824 55.9268384509897,-3.16422182573761 55.9267851753802),(-3.16422182573761 55.9267851753802,-3.16422870102352 55.926718114886),(-3.16422870102352 55.926718114886,-3.16423309121073 55.926675293667),(-3.16423309121073 55.926675293667,-3.16423565148822 55.9266503211093),(-3.16423565148822 55.9266503211093,-3.16424103159897 55.9265978443265),(-3.16424103159897 55.9265978443265,-3.16424680776317 55.9265415044985),(-3.16424680776317 55.9265415044985,-3.16425267254583 55.9264843002995),(-3.16425267254583 55.9264843002995,-3.16425541048045 55.9264575949012),(-3.16425541048045 55.9264575949012,-3.16426111146586 55.9264019883556),(-3.16426111146586 55.9264019883556,-3.1642667032531 55.9263474469124),(-3.1642667032531 55.9263474469124,-3.16426957768543 55.9263194101362),(-3.16426957768543 55.9263194101362,-3.16427488261739 55.9262676666359),(-3.16427488261739 55.9262676666359,-3.16428009893088 55.9262167875066),(-3.16428009893088 55.9262167875066,-3.164282741107 55.9261910161221),(-3.1642875546472 55.9261440655823,-3.164282741107 55.9261910161221),(-3.1642875546472 55.9261440655823,-3.16429466890915 55.9260746741522),(-3.16429466890915 55.9260746741522,-3.16430092974527 55.9260136069079),(-3.16430092974527 55.9260136069079,-3.16430822838418 55.9259424170929),(-3.16430822838418 55.9259424170929,-3.16431547242401 55.925871759829),(-3.16431547242401 55.925871759829,-3.16431448732505 55.9258328901507),(-3.16431770120536 55.9257327846001,-3.16431547242401 55.925871759829),(-3.164339 55.925777,-3.16431770120536 55.9257327846001))'),
            0.001)
        )
    );

25

क्या आप वाकई अपने सभी मल्टीलाइन जिसे आप बदलना चाहते हैं, परिवर्तित किया जा सकता है ?

एक सरल ज्यामिति वह है जिसमें कोई विषम ज्यामितीय बिंदु नहीं होते हैं, जैसे कि आत्म चौराहा या आत्म स्पर्शरेखा और मुख्य रूप से 0 या 1-आयामी ज्यामितीयता को संदर्भित करता है

अन्यथा, ST_LineMergeकाम करना चाहिए:

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText('MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45 -33,-46 -32))')));

अपडेट करें

तो यह आपके द्वारा प्रदान की गई बहुपरत है। यहाँ से मान्य दिखता है:

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

लेकिन निरीक्षण के लिए पास में ज़ूम करने पर आप स्पष्ट रूप से यह देख सकते हैं कि इसे एक वैध लिनेस्ट्रिंग में परिवर्तित नहीं किया जा सकता है।

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

वैध:

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

अवैध:

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

लेकिन अपने अंकों का एक वैलिड सब्मिट लें और यह ठीक काम करता है:

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText('MULTILINESTRING((-3.16422182573761 55.9267851753802,-3.16422870102352 55.926718114886),(-3.16422870102352 55.926718114886,-3.16423309121073 55.926675293667),(-3.16423309121073 55.926675293667,-3.16423565148822 55.9266503211093),(-3.16423565148822 55.9266503211093,-3.16424103159897 55.9265978443265),(-3.16424103159897 55.9265978443265,-3.16424680776317 55.9265415044985),(-3.16424680776317 55.9265415044985,-3.16425267254583 55.9264843002995),(-3.16425267254583 55.9264843002995,-3.16425541048045 55.9264575949012),(-3.16425541048045 55.9264575949012,-3.16426111146586 55.9264019883556),(-3.16426111146586 55.9264019883556,-3.1642667032531 55.9263474469124),(-3.1642667032531 55.9263474469124,-3.16426957768543 55.9263194101362),(-3.16426957768543 55.9263194101362,-3.16427488261739 55.9262676666359),(-3.16427488261739 55.9262676666359,-3.16428009893088 55.9262167875066))')));

यह वास्तव में सही नहीं है। स्वयं-चौराहों के साथ लाइनस्ट्रेस अभी भी ओजीसी-वैध हैं। मूल MultiLineString को एक एकल LineString में परिवर्तित नहीं किया जा सकता है इसका कारण यह है कि इसमें जुड़े हुए कोने के 3 disjoint सेट हैं।
dr_jts

@dr_jts राइट, तो ऐसा नहीं है कि LineString अमान्य है लेकिन इनपुट अमान्य है। आप अन्तर्विभाजक लाइनों को परिवर्तित नहीं कर सकते हैं। अतः चौराहों के बिना लाइनस्ट्रेस का एक वैध इनपुट एक है।
कैप्टनड्रैगन

0

2.2.0 रिलीज होने के बाद बड़े जियोमेट्री को छोटे में तोड़ने के लिए ST_SubDivide का उपयोग करने पर विचार करें।

मैंने उन्हें सत्यापित किया है और उन्हें लाइनस्ट्रीमिंग में तोड़ने के लिए MultiLineString पर परीक्षण किया है।

https://postgis.net/docs/ST_Subdivide.html

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