Konwertujesz MultiLinestring na Linestring za pomocą PostGIS?


16

Mam ciąg multilinii i chcę przekonwertować go na linię, aby móc korzystać z niektórych funkcji, które działają tylko z liniami. Użyłem ST_Dump()i otrzymałem kolekcję moich geometrii. Jeśli połączę je z powrotem, nadal otrzymam multilinestring. Czy powinienem zdobyć punkty Npoint i połączyć je razem, czy coś, aby uzyskać prosty linestring? ST_LineMerge()też nie działa na moim multilinestringu, zwraca to samo.

mój przykład

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


Podaj nam przykład multilinestingu, który chcesz przekonwertować, abyśmy mogli je przetestować.
CaptDragon,

Odpowiedzi:


6

Możesz także użyć ST_SnapToGrid, aby w pewnym stopniu naprawić swoje dane, ale musisz rozpracować parametry, aby to zrobić poprawnie.

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

Czy jesteś pewien, że wszystkie Twoje linie MultiLine, które chcesz przekonwertować, mogą zostać przekształcone ?

prosta geometria to taka, która nie ma anomalnych punktów geometrycznych, takich jak samo przecięcie lub styczność, i przede wszystkim odnosi się do geometrii 0 lub 1-wymiarowych

W przeciwnym razie ST_LineMergepowinien działać:

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

AKTUALIZACJA

Więc to jest Multilinestring, który podałeś. Wygląda na to, że jest ważny:

wprowadź opis zdjęcia tutaj

Ale po zbliżeniu w celu sprawdzenia możesz wyraźnie zobaczyć, że nie można go przekształcić w prawidłowy znacznik linii.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

WAŻNY:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

NIEWAŻNY:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Ale weź PODSTAWOWY podzbiór swoich punktów i działa dobrze:

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

To nie jest poprawne. LineStrings z samo-skrzyżowaniami są nadal ważne dla OGC. Oryginalnym MultiLineString nie można przekonwertować na pojedynczy LineString, ponieważ zawiera on 3 rozłączne zestawy połączonych wierzchołków.
dr_jts

@dr_jts Tak, więc nie jest tak, że LineString jest nieprawidłowy, ale dane wejściowe są nieprawidłowe. nie można konwertować przecinających się linii. Tak więc poprawnym wprowadzeniem znaków linii jest jeden bez skrzyżowań.
CaptDragon,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.