¿Convertir MultiLinestring a Linestring con PostGIS?

16

Tengo una cadena multilínea y quiero convertirla en una cadena lineal para usar algunas funciones que solo funcionan con cadenas lineales. Usé ST_Dump()y obtuve una colección de mis geometrías. Si los combino de nuevo, aún obtengo la multilínea. ¿Debo obtener los Npoints y combinarlos o algo para terminar con una cadena lineal simple? ST_LineMerge()tampoco funciona en mi multilínea, devuelve lo mismo.

mi ejemplo

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

Antonio
fuente
Danos un ejemplo de estas multilíneas que quieras convertir para que podamos probarlas.
CaptDragon

Respuestas:

6

También puede usar ST_SnapToGrid para arreglar sus datos, pero tendrá que jugar con los parámetros para hacerlo bien.

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)
        )
    );
CaptDragon
fuente
25

¿Está seguro de que todas las líneas múltiples que desea convertir se pueden convertir ?

Una geometría simple es aquella que no tiene puntos geométricos anómalos, como la auto intersección o la tangencia propia, y se refiere principalmente a geometrías 0 o unidimensionales.

De lo contrario, ST_LineMergedebería funcionar:

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

ACTUALIZAR

Entonces esta es la multilínea que proporcionó. Parece válido desde aquí arriba .:

ingrese la descripción de la imagen aquí

Pero al acercarse para inspección, puede ver claramente que esto no se puede convertir en una cadena lineal válida.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

VÁLIDO:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

INVÁLIDO:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Pero tome un subconjunto VÁLIDO de sus puntos y funcionará bien:

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))')));
CaptDragon
fuente
Esto no es realmente correcto. LineStrings con auto-intersecciones siguen siendo válidos para OGC. La razón por la que MultiLineString original no se puede convertir en una sola LineString es porque contiene 3 conjuntos disjuntos de vértices conectados.
dr_jts
@dr_jts Correcto, así que no es que LineString no sea válido, pero la entrada no es válida. no puedes convertir líneas de intersección. Entonces, una entrada válida de cadenas lineales es una sin intersecciones.
CaptDragon
0

Considere usar ST_SubDivide para dividir geometrías grandes en una más pequeña después de la versión 2.2.0.

He validado y probado esto en MultiLineString para romperlos en LineString.

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

rulhaniam
fuente