Перетворення MultiLinestring в Linestring за допомогою PostGIS?


16

У мене є рядок з багаторядковим рядком і хочу перетворити його на рядок рядків, щоб використовувати деякі функції, які працюють лише з рядками рядків. Я використав ST_Dump()і отримав колекцію своїх геометрій. Якщо я з’єднаю їх назад разом, я все одно отримаю багаторядковий рядок. Чи потрібно мені отримати Npoints і об'єднати їх разом чи щось, щоб закінчитися простим рядком? ST_LineMerge()також не працює на моєму багаторядковому рядку, він повертає те саме.

мій приклад,

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


Наведіть нам приклад цих багаторядкових рядків, які ви хочете перетворити, щоб ми могли їх перевірити.
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))')));

ОНОВЛЕННЯ

Отже, це багаторядковий рядок, який ви надали. Тут виглядає дійсно:

введіть тут опис зображення

Але при збільшенні масштабу для огляду ви зможете чітко побачити, що це не може бути перетворене у дійсну лінію рядка.

введіть тут опис зображення введіть тут опис зображення

VALID:

введіть тут опис зображення введіть тут опис зображення

ІНВАЛІД:

введіть тут опис зображення введіть тут опис зображення

Але візьміть валідну підмножину своїх балів, і вона працює чудово:

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 недійсний, але введення недійсне. ви не можете перетворити пересічні лінії. Отже, допустимий вхід рядків рядків - один без перетинів.
CaptDragon

0

Подумайте про використання ST_SubDivide для розбиття великих геометрій на менші після випуску 2.2.0.

Я підтвердив і протестував це на MultiLineString, щоб зламати їх у LineString.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.