51 votes

Comment dégrader ou lisser intelligemment les données SIG (simplification des polygones) ?

J'ai des cartes détaillées des comtés américains, du LIGNE TIGRE ensembles de données. Comment puis-je échantillonner, lisser ou dégrader les données de manière à obtenir des formes plus droites, plus carrées et moins "bruyantes" pour représenter les caractéristiques géographiques - dans ce cas, uniquement les frontières des comtés et des États, mais peut-être aussi dans le cas général ?

L'échantillonnage pourrait se faire au moment du rendu si cela peut être fait efficacement, ou un ensemble de données parallèles pourrait être généré et stocké. J'utilise PostGIS et les lignes sont des multi-polylines générées par shp2pgsql -- mais toute solution permettant de prendre une ligne sinueuse et de la réduire à une ligne plus lisse ayant à peu près la même signification pour un interprète humain serait très utile.

63voto

unmounted Points 10968

Douglas-Peucker est certainement la bonne approche. Il existe des moyens simples d'accéder à ses implémentations dans PostGIS et QGIS que j'ai pensé ajouter ici pour ceux qui tomberaient sur ce post avec une question similaire. L'objectif est de commencer avec quelque chose comme ceci :

alt text

et on se retrouve avec quelque chose comme ça :

alt text

Dans PostGIS, Douglas-Peucker est implémenté en tant que simplify la syntaxe, les détails ici à bostongis.org est une variante de :

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

Cela a très bien fonctionné, même sur l'ensemble des données nationales, avec quelques erreurs qui semblent dues à de mauvaises données sous-jacentes. Il s'avère également que dans QGIS, l'élément de menu Tools > Geometry Tools > Simplify Geometries exportera un fichier de forme simplifié de n'importe quelle géométrie et l'ajoutera comme couche à votre projet actuel.

Il s'agit d'un ensemble d'outils assez fondamentaux et j'ai posé la question à un niveau trop bas, bien qu'il ait été agréable d'apprendre les mathématiques sous-jacentes, il existe une bonne explication à ce sujet. ici : http://www.mappinghacks.com/code/PolyLineReduction/ ainsi qu'un exemple de code qui s'avère ne pas être trop nécessaire !

5 votes

Sympa. Y a-t-il un moyen de faire cela tout en conservant des bords communs avec d'autres polygones ? Par exemple, des pays simplifiés en Europe, avec des frontières communes.

0 votes

Autres options de généralisation des polygones avec QGIS à l'adresse suivante Comment lisser/généraliser un polygone dans qgis ? sur le site soeur de GIS-SE.

2 votes

Cool, mais comment gérer plusieurs polygones lorsqu'ils sont côte à côte ? comme lorsque vous avez des formes de différentes zones de code postal ?

30voto

ire_and_curses Points 32802

Le problème de la simple suppression de points est que vous pouvez rapidement déformer la forme du polygone d'origine. Il est préférable d'aborder le problème dans l'autre sens : commencez par une approximation de base du polygone, puis affinez-la vers le haut jusqu'à obtenir votre forme complexe.

Un excellent exemple de cette approche est le Algorithme de Douglas-Puecker . Vous commencez avec deux sommets dessinés à partir du polygone complet. Ajoutez un troisième sommet en sélectionnant celui qui est le plus éloigné d'une arête tracée entre les deux premiers sommets. Continuez à ajouter des points jusqu'à ce que vous obteniez quelque chose qui ressemble suffisamment à votre polygone d'origine.

24voto

Carlos Rendon Points 2023

Au lieu de QGIS, je suggère d'utiliser ogr2ogr car il ne supprime pas les polygones !

ogr2ogr output.shp input.shp -simplify 0.0001

3 votes

Les unités de simplification sont-elles les unités de la projection ? Par exemple, peut-être s'agit-il de degrés lat ou long ?

0 votes

Il semble que les unités soient bien les unités utilisées pour les coordonnées dans le fichier.

0 votes

Utilisez plutôt ST_SimplifyPreserveTopology. Il utilise le même algorithme que ST_Simplify (Douglas-Pecker), mais il est garanti qu'il ne produira pas de géométries invalides.

8voto

Will Points 30630

Voici un algorithme de lissage itératif simple :

pour chacun des trois points séquentiels sur un chemin quelconque, si le point du milieu n'a pas d'intersection et se trouve à l'intérieur d'un petit angle seuil du chemin direct entre les deux points extérieurs, le supprimer.

Répétez l'opération jusqu'à ce que vous soyez satisfait.

8voto

Lars Grammel Points 862

Vous pouvez également essayer l'algorithme de Visvalingam, qui supprime par itération la partie la moins perceptible d'une ligne. Voici une excellente explication de cet algorithme :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X