Comment transformer un ensemble de segments de rue en blocs de ville, avec PostGIS2?

8

Théoriquement, il est possible d'obtenir les polygones de blocs de ville ( blocs urbains) à partir des rues, lorsque les rues sont représentées par l'axe des rues ( LineStrings ).

Les blocs urbains sont délimités par des rues, de sorte que les segments de rue peuvent être utilisés pour former un polygone qui ne contient qu'un seul bloc à l' intérieur ... Voir les illustrations.

Il existe un script (SQL) PostGIS 2.X pour ce faire? Un plugin?
PS: les géométries approximatives des blocs de villes suffisent.

Illustrant

En commençant le processus à partir d'un "maillage de segments de ligne connectés", il peut s'agir: 1) d'obtenir des polygones associés; 2) isoler les polygones par tampon négatif et soustraction du tampon des lignes.

entrez la description de l'image ici

Exemple: le polygone 262 (représentant un bloc de ville) a été créé par les segments 2496, 2494, 2369, 1513, ... Et le polygone voisin 263 peut utiliser certains segments communs, mais ensuite (par st_buffer négatif ou une autre opération) sera polygones vraiment isolés, donc une faible précision suffit.


(ÉDITER)

Je pense que nous pouvons traduire ce problème spécifique en un problème plus générique: l'ensemble des segments de rue peut être considéré comme une sorte de pavage , c'est-à-dire que les segments séparent l'avion en régions contiguës - les blocs urbains se trouvent à l'intérieur de ceux-ci Régions. Chaque segment est un côté de deux régions.

Le principal problème est de transformer "l'ensemble des segments de la mosaïque" en polygones indépendants .

Peter Krauss
la source
Peut-être, avec le nouveau module de topologie postgis, la limite de la rue, pourrait être regroupée pour former ce polygone (zone fermée).
cavila
Comment proposeriez-vous pour obtenir le bloc? La rue est (conceptuellement) une chaîne de caractères, tandis que chaque bloc est un polygone. Comment localiseriez-vous un seul bloc urbain en fonction d'une ligne de repère, en présence de servitudes, de parcs, de réserves naturelles, de blocs de battleaxe (par exemple anewhouse.com.au/2012/07/battleaxe-block ), de blocs où il y a une rivière / un ruisseau / ligne de crête entre les rues, etc.?
BradHards
Merci @Cavila, je cherchais des exemples, et j'en trouve quelques uns comme celui-ci , ce dont j'ai besoin, mais: tout commence par des polygones, pas par des "segments de tesselation" (voir ma généralisation du problème). Mon entrée est un ensemble de segments.
Peter Krauss
@BradHards, merci pour votre avis (!), J'ai édité pour montrer le centre de mon problème. Oui, il y a beaucoup d'exceptions comme un bloc de hache de bataille; et oui, j'ai besoin d'ajouter des segments fluviaux, des segments ferroviaires, etc. pour une "tesselation complète". Je n'ai besoin que de la "première approximation" des blocs, pas d'une construction complète et automatisée de ceux-ci.
Peter Krauss
Je suppose qu'il est prêt à obtenir le bloc ou le secteur en fonction de la limite de la rue. Pas un seul lot urbain pour une seule propriété. Une solution pourrait être de rééchantillonner un déambulateur qui trace un symbole à un point de départ et commence à marcher en tournant vers sa droite jusqu'à ce qu'il revienne au point de départ où il a tracé le symbole. Vous obtiendrez donc un polygone ou une frontière fermée.
cavila

Réponses:

8

L' ST_Polygonizeagrégat dans PostGIS renverra un geometry_dumpcontenant tous les polygones possibles formés par un ensemble de lignes. Je suppose que les ID de bloc affichés dans votre exemple ne sont pas liés aux ID de dessin au trait d'entrée. Si tel est le cas, vous pouvez obtenir vos polygones et identifiants avec:

SELECT (st_dump).path[1] as poly_id, (st_dump).geom FROM
    (SELECT ST_Dump(ST_Polygonize(geom)) FROM 
        (SELECT ST_Union(geom) as geom FROM lines) mergedlines) polys

La partie lente ici est la ST_Union. Il semble que cela devrait fonctionner sans cet appel, tant que les lignes d'entrée sont correctement inclinées, mais je n'ai pas réussi à le faire.

Un tampon négatif ne donnera pas les résultats exacts indiqués dans votre exemple, car les rues sans issue seront ignorées par le processus de polygonisation. Mais vous pouvez prendre un tampon positif du dessin au trait d'origine et l'utiliser ST_Differencepour supprimer cette zone des polygones de bloc.

dbaston
la source