Créer un polygone à partir de lignes dans PostGIS

13

J'essaie de diviser un polygone en petits polygones à partir d'une ligne, mais je pense que je ne peux pas utiliser la fonction st_split. Ce dont j'ai besoin, c'est de créer de petits polygones à l'intérieur d'un grand, en utilisant une grille de lignes linéaires.

J'ai essayé plusieurs façons, mais je n'arrive pas à obtenir le résultat. Ce que j'ai essayé:

Divisez un polygone d'une ligne de chaîne à l'aide de st_split ()

À partir d'un polygone limite.

entrez la description de l'image ici

Et table Linestring:

entrez la description de l'image ici

J'aurais besoin des polygones suivants:

entrez la description de l'image ici

Problème : je ne peux pas séparer un polygone de plusieurs lignes, ni un polygone d'une chaîne multiligne.

L'autre méthode que j'essaie est de créer un polygone à partir des lignes avec st_polygonize () Le SQL que j'essayais est:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Extrait de la création de polygones à partir de segments de ligne à l'aide de PostgreSQL et PostGIS

Problème : je ne peux obtenir qu'un seul polygone (la frontière).

Quelqu'un peut-il me dire quelle serait la meilleure façon d'obtenir les polygones de la chaîne de caractères, ou si je manque quelque chose?

Remarque: les tables sont dans le même SRID et les géométries sont alignées dans une grille. Dans QGIS, je peux parfaitement exécuter le processus de polygonisation des lignes au polygone.

Comme la demande de John, voici la table de ligne de ligne. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing

Pablo Pardo
la source
1
Pouvez-vous publier les géométries de ligne de ligne quelque part? ST_Polygonize avec ST_Dump devrait fonctionner.
John Powell
Sûr. J'ai édité le message avec le lien vers le tableau.
Pablo Pardo
@ JohnPowellakaBarça pouvez-vous regarder cela. Cette question est géniale. ST_Polygonize sur son jeu d'échantillons renvoie un seul polygone. Nous devons essentiellement décomposer son désordre de LINESTRINGS ouverts et trouver tous ceux qui peuvent faire des rectangles?
Evan Carroll
1
@EvanCarroll. Sûr. Je suis follement occupé, donc probablement pas avant quelques jours.
John Powell
1
@ppardoz. Espero que esto te ayude. J'ai remarqué que vos réglages de table étaient tous en espagnol :-)
John Powell

Réponses:

4

J'ai obtenu ce travail en utilisant d' abord ST_Node , en conjonction avec ST_Collect , pour convertir les lignes en un ensemble de chaînes de lignes inclinées dans une chaîne MultiLinestring .

Comme il est dit dans les documents pour ST_Node :

Nœudez entièrement un ensemble de chaînes de lignes en utilisant le moins de nœuds possible tout en préservant toutes celles en entrée.

Cela signifie que toutes les chaînes de lignes sont combinées dans toutes les combinaisons possibles, de manière à constituer l'équivalent de l'anneau extérieur d'un polygone. Alors que si vous essayez de ST_Polygoniser un ensemble de LineStrings, dont aucun ne décrit à lui seul un polygone, vous récupérez simplement les LineStrings. Donc, cela fonctionne:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Si vous exécutez simplement la première partie de cela, c'est-à-dire le multi CTE, la sortie ressemble à:

MULTILINESTRING ((204,5 69,9000000000004,204,5 69,9000000000004), (204,5 68,9,205,4 68,9), (204,5 68,9,204,5 69,204,5 69,1,204,5 69,2,204,5 69,3,204,5 69,4,204,5 69,5,204,5 69,6,204,5 69,7,204,5 69,820,5 204,5 69,9000000000004), (209,5 68,9,209,5 68,8,209,5 68,7,209,5 68,6,209,5 68,5,209,5 68,4,209,5 68,3,209,5 68,2,209,5 68,1,209,5 68,209,5 67,9209,5 67,8,209,5 67,7,209,5 67,6,209,5 67,6 , 209,5 .......

Maintenant, lorsque vous alimentez maintenant cette MultiLinestring à ST_Polygonize, cela fonctionne comme prévu, par exemple,

POLYGONE ((205.4 68.9.204,5 68,9.204,5 69.204,5 69,1.204,5 69,2.204,5 69,3.204,5 69,4204,5 69,5204,5 69,6204,5 69,7204,5 69,8204,5 69,9204,5 69,9000000000004205,4 69,9205,4 69,3)

POLYGONE ((204,5 69,9000000000004,204,5 70,204,5 70,1,204,5 70,2,204,5 70,3,204,5 70,4,206,8 70,4,209,5 70,4,209,5 70,3,209,5 70,2,209,5 70,1,209,5 70,209,5 69,9,205,4 69,9,204,5 69,9)

POLYGONE ((206,8 70,4 204,5 70,4 204,5 70,5 204,5 70,6 204,5 70,7 204,5 70,8 204,5 70,9 204,5 71 204,5 71,1 204,5 71,2 204,5 71,3 204,4,5 71,4206,8 71,4206,8 70,4))

Évidemment, le ST_AsText est juste à titre d'illustration, et vous devrez l'ajuster si vous voulez aussi l'ID du chemin.

Le point clé à retenir est que ST_Polygonize attend des chaînes de lignes qui décrivent déjà le contour d'un polygone , ce que fait ST_Node (ST_Collect (.... dans ce qui précède).

John Powell
la source
C'est vraiment cool, je peux confirmer que cette solution fonctionne! D'un autre côté, je me demande pourquoi ST_Polygonize()dit qu'il faut des chaînes de ligne, ou quel est le cas d'utilisation pour cela sans appeler d' ST_Node()abord
Evan Carroll
1
@EvanCarroll. Je pense que la réponse est que ST_Polygonize prend des Linestrings qui sont déjà dans un ensemble représentant un polygone, alors que les linestrings de cette question constituaient plusieurs polygones possibles. Ma compréhension est que c'est ce que fait ST_Node. J'essaierai d'enquêter davantage et de mettre à jour la réponse.
John Powell,