Suite

Créer un polygone à partir de lignes dans PostGIS

Créer un polygone à partir de lignes dans PostGIS


J'essaie de diviser un polygone en polygones plus petits à 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.

J'ai essayé quelques méthodes, mais je n'arrive pas à obtenir le résultat. Ce que j'ai essayé :

Divisez un polygone d'un LineString en utilisant st_split()

A partir d'un polygone limite.

Et table de chaîne de ligne :

J'aurais besoin des polygones suivants :

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

Quelqu'un peut-il me dire quelle serait la meilleure façon d'obtenir les polygones de la chaîne de lignes, ou si j'ai raté 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 de lignes en polygones.

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


J'ai fait fonctionner cela en utilisant d'abord ST_Node, en conjonction avec ST_Collect, pour convertir les lignes en un ensemble de chaînes de lignes à nœuds dans un Chaîne multiligne.

Comme il est dit dans la doc pour ST_Noeud:

Noeud entièrement un ensemble de chaînes de lignes en utilisant le moins de nœuds possible tout en préservant tous ceux d'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 ça marche :

AVEC 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 ceci, c'est-à-dire le multi CTE, la sortie ressemble à :

CHAÎNE MULTILIGNE((204,5 69,90000000000004,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,8 204,5 69,9, 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,9 209,5 67,8 209,5 67,7 209,5 67,6 209,5 67,5 209,5 67,4 ,209,5…

Maintenant, lorsque vous alimentez maintenant cette chaîne multiligne à 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,4 204,5 69,5 204,5 69,6 204,5 69,7 204,5 69,8 204,5 69,9 204,5 69,9000000000004 205,4 69,9 205,4 69,3 205,4 68,9))

POLYGONE((204,5 69,90000000000004,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,9000000000004))

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,5 71,4 206,8 71,4 206,8 70,4))

Évidemment, le ST_AsText est juste à titre d'illustration, et vous devrez le modifier si vous voulez également l'ID de chemin.

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


Voir la vidéo: Pentagone inscrit dans un cercle