Simplifier les polygones adjacents à l'aide de PostGIS?

24

J'ai rencontré un problème de simplification d'un ensemble de polygones adjacents. Si je simplifie chaque polygone séparément avec l'algorithme Douglas-Peucker (qui est utilisé par de nombreux outils open source), les polygones résultants ne sont généralement plus adjacents. Ce problème existe, par exemple, lors de la simplification des frontières des pays / provinces.

Quelqu'un a-t-il une solution pour cela en utilisant PostGIS?

stachu
la source

Réponses:

19

Un modèle vectoriel topologique fournira ce dont vous avez besoin. Dans un stockage non topologique (tel qu'un fichier de formes), un seul bord entre les géométries est stocké deux fois. Dans un vecteur topologique, les zones sont stockées séparément des lignes, de sorte que des ajustements peuvent être effectués sans affecter la topologie. Je n'ai pas pu trouver un bon diagramme, j'ai donc créé cet exemple simple, où les zones A, B et C sont calculées à partir des intersections des lignes (reliant 1-4) qui les séparent. exemple d'un vecteur topologique

Ce modèle est utilisé par ArcInfo comme couvertures, dans GRASS comme modèle vectoriel par défaut , et peut être utilisé dans PostGIS avec l' outil expérimental de topologie PostGIS . Une solution plus simple consiste peut-être à convertir vos données en dessin au trait, à supprimer les segments redondants, puis à recréer vos polygones après simplification.

scw
la source
15

Vous voulez transformer vos polygones en lignes, faire de ces lignes de simples bords de couverture, simplifier ces bords, puis les reconstruire à nouveau en polygones et enfin utiliser le point dans le polygone pour relier les attributs des anciens polygones avec le les nouvelles.

CREATE TABLE rings AS SELECT (ST_DumpRings(polys)).geom AS rings FROM polytable;
CREATE TABLE simplerings AS SELECT ST_Union(rings) AS simplerings FROM rings;
CREATE TABLE newpolycollection AS SELECT ST_Polygonize(ST_Simplify(simplerings, 10.0)) AS geom FROM simplerings;
CREATE TABLE newpolysnoattributes AS SELECT (ST_Dump(geom)).geom FROM newpolycollection;
CREATE TABLE newpolytable AS SELECT new.geom, old.attr FROM newpolysnoattributes new, polytable old WHERE ST_Contains(new.geom, ST_PointOnSurface(old.polys));

Il y a des erreurs dans ce qui précède, mais le concept de base est là. Vous pouvez tout faire en une seule requête si vous le souhaitez.

Paul Ramsey
la source
-1

Vous devez tesseller. Dans l'ancienne théorie ARC / INFO de la création de géométrie, deux géométries adjacentes sont créées par une polyligne et partagent cette polyligne. Par conséquent, lorsque vous généralisez, il généralise les deux bordures car il fait référence à la même polyligne.

CrazyEnigma
la source