Convertir MultiLinestring en Linestring avec PostGIS?


16

J'ai une chaîne multiligne et je veux la convertir en chaîne de lignes afin d'utiliser certaines fonctions qui ne fonctionnent qu'avec des chaînes de lignes. J'ai utilisé ST_Dump()et obtenu une collection de mes géométries. Si je les fusionne à nouveau, j'obtiens toujours la chaîne multiligne. Dois-je obtenir les Npoints et les combiner ensemble ou quelque chose, pour aboutir à une simple chaîne de lignes? ST_LineMerge()ne fonctionne pas non plus sur ma multiligne, elle renvoie la même chose.

mon exemple,

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), (- 3.164339 55,925777, -3,166431770120536 55,9257327846001))


Donnez-nous un exemple de ces chaînes multiples que vous souhaitez convertir afin que nous puissions les tester.
CaptDragon

Réponses:


6

Vous pouvez également utiliser ST_SnapToGrid pour trier vos données, mais vous devrez jouer avec les paramètres pour bien faire les choses.

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

Êtes-vous sûr que tous vos MultiLines que vous souhaitez convertir peuvent être convertis ?

une géométrie simple est celle qui n'a pas de points géométriques anormaux, tels que l'auto-intersection ou l'auto-tangence et se réfère principalement à des géométries à 0 ou 1 dimension

Sinon, ST_LineMergedevrait fonctionner:

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

MISE À JOUR

Voici donc la Multilinestring que vous avez fournie. Semble valide à partir d'ici:

entrez la description de l'image ici

Mais en zoomant de près pour inspection, vous pouvez clairement voir que cela ne peut pas être converti en une chaîne de caractères valide.

entrez la description de l'image ici entrez la description de l'image ici

VALIDE:

entrez la description de l'image ici entrez la description de l'image ici

INVALIDE:

entrez la description de l'image ici entrez la description de l'image ici

Mais prenez un sous-ensemble VALIDE de vos points et cela fonctionne très 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))')));

Ce n'est pas vraiment correct. Les LineStrings avec auto-intersections sont toujours valides OGC. La raison pour laquelle le MultiLineString d'origine ne peut pas être converti en un seul LineString est qu'il contient 3 ensembles disjoints de sommets connectés.
dr_jts

@dr_jts C'est vrai, ce n'est donc pas que le LineString n'est pas valide mais l'entrée est invalide. vous ne pouvez pas convertir les lignes qui se croisent. Ainsi, une entrée valide de chaînes de lignes est une entrée sans intersections.
CaptDragon

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.