แปลง MultiLinestring เป็น Linestring ด้วย PostGIS หรือไม่


16

ฉันมีสตริงหลายบรรทัดและต้องการแปลงเป็น linestring เพื่อใช้ฟังก์ชันบางอย่างที่ทำงานกับ linestrings เท่านั้น ฉันใช้ST_Dump()และได้รับรูปทรงเรขาคณิตของฉัน ถ้าฉันรวมพวกมันกลับมารวมกันฉันก็ยังได้ multilinestring ฉันควรหาจุดรวมและรวมเข้าด้วยกันหรือบางสิ่งเพื่อที่จะจบลงด้วยการใช้พลังงานแบบง่ายหรือไม่? ST_LineMerge()ยังใช้งานไม่ได้กับ multilinestring ของฉันมันกลับมาเหมือนเดิม

ตัวอย่างของฉัน

MULTILINESTRING ((- 3.16420835153456 55.9269166007097, -3.164222 55.926918), (- 55.9269296196706 3.1642070167833, -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), (- 55.9263474469124 3.1642667032531, -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), (- 55.9261440655823 3.1642875546472, -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), (- 3164339 55.925777, -3.16431770120536 55.9257327846001))


ให้ตัวอย่างของ multilinestring เหล่านี้ที่คุณต้องการแปลงเพื่อให้เราทดสอบได้
CaptDragon

คำตอบ:


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

คุณแน่ใจหรือว่าทั้งหมด MultiLines ของคุณที่คุณต้องการแปลงสามารถแปลง ?

รูปทรงเรขาคณิตที่เรียบง่ายคือสิ่งที่ไม่มีจุดผิดปกติทางเรขาคณิตเช่นจุดตัดด้วยตนเองหรือการสัมผัสกันของตัวเองและโดยพื้นฐานแล้วหมายถึงรูปทรงเรขาคณิต 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))')));

UPDATE

นี่คือ Multilinestring ที่คุณให้ไว้ ดูเหมือนใช้ได้จากที่นี่:

ป้อนคำอธิบายรูปภาพที่นี่

แต่เมื่อซูมเข้าใกล้สำหรับการตรวจสอบคุณสามารถเห็นได้ชัดเจนนี้ไม่สามารถถูกแปลงเป็น LineString ที่ถูกต้อง

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

ถูกต้อง:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

ไม่ถูกต้อง:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

แต่ใช้เวลาที่ถูกต้องเซตของจุดของคุณและมันทำงานได้ดี:

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))')));

มันไม่ถูกต้องจริงๆ LineStrings ที่มีทางแยกด้วยตนเองยังคงเป็น OGC ที่ถูกต้อง เหตุผลที่ MultiLineString ดั้งเดิมไม่สามารถแปลงเป็น LineString เดียวก็คือมันมีจุดยอดที่เชื่อมต่อกัน 3 ชุด
dr_jts

@dr_jts ถูกต้องดังนั้น LineString ไม่ถูกต้อง แต่การป้อนข้อมูลไม่ถูกต้อง คุณไม่สามารถแปลงเส้นตัดกัน ดังนั้นอินพุตที่ถูกต้องของ linestrings จึงไม่มีทางแยก
CaptDragon

0

ลองใช้ ST_SubDivide เพื่อแยกรูปเรขาคณิตขนาดใหญ่ออกให้เล็กลงหลังจากปล่อย 2.2.0

ฉันตรวจสอบแล้วและทดสอบสิ่งนี้ใน MultiLineString เพื่อทำลายพวกเขาใน LineString

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.