web-dev-qa-db-fra.com

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

J'ai détaillé les cartes de comté des États-Unis, à partir des ensembles de données TIGER LINE . Comment puis-je échantillonner, lisser ou dégrader les données afin d'obtenir des formes plus droites, plus carrées, moins "bruitées" pour représenter les entités géographiques - dans ce cas, juste les limites de comté et les limites d'état, mais peut-être aussi dans le cas général? 

L'échantillonnage pourrait avoir lieu au moment du rendu si cela pouvait ê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 multi-polylignes générées par shp2pgsql - mais toute solution dans laquelle vous prenez une ligne ondulée et la réduisez à une ligne plus douce ayant à peu près la même signification pour un interprète humain serait très utile .

49
unmounted

Le problème avec le simple rejet de points est que vous pouvez rapidement déformer la forme du polygone d'origine. Une meilleure approche consiste à aborder le problème dans l'autre sens. Commencez par une approximation de base du polygone, puis affinez-le vers le haut en direction de votre forme complexe. 

L’algorithme de Douglas-Puecker . Est un excellent exemple de cette approche. Vous commencez avec deux sommets tirés du polygone complet. Ajoutez un troisième sommet en sélectionnant celui qui se trouve le plus éloigné d'un bord tracé entre les deux premiers sommets. Continuez à ajouter des points jusqu'à obtenir quelque chose qui ressemble suffisamment à votre polygone d'origine.

30
ire_and_curses

Douglas-Peucker est certainement la bonne approche. Il existe quelques moyens simples d'accéder aux implémentations de celui-ci dans PostGIS et QGIS que je pensais ajouter ici pour ceux qui rencontrent ce message avec une question similaire. Le but est de commencer avec quelque chose comme ça:

alt text

et se retrouver avec quelque chose comme ça:

alt text

Dans PostGIS, Douglas-Peucker est implémenté comme simplify, la syntaxe, détaillée ici sur 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 avec l'ensemble de données national complet, quelques erreurs semblant 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 exporte un fichier de formes simplifié de toute géométrie et l'ajoute en tant que couche à votre projet actuel.

C’est un ensemble assez fondamental d’outils et j’ai posé la question à un niveau trop bas, même s’il était agréable d’apprendre les mathématiques sous-jacentes, il ya une bonne explication à cela ici: http: //www.mappinghacks. com/code/PolyLineReduction / , avec un exemple de code qui s'avère ne pas être trop nécessaire!

61
unmounted

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

ogr2ogr output.shp input.shp -simplify 0.0001
19
Carlos Rendon

Voici un algorithme de lissage itératif simple:

pour chacun des trois points séquentiels d'un trajet, si le point milieu n'a pas d'intersection et se situe dans un petit angle de seuil du trajet direct entre les deux points extérieurs, supprimez-le.

Répéter jusqu'à satisfaction. 

8
Will

Vous pouvez également essayer l’algorithme de Visvalingam, qui supprime de manière itérative la partie la moins perceptible d’une ligne. Voici une excellente explication de cet algorithme:

7
Lars Grammel

Vous pouvez également utiliser Simplify.js qui utilise une combinaison des algorithmes Douglas-Peucker et Radial Distance. Il existe également des liens vers de nombreux ports vers d'autres langues répertoriées dans le projet github

4

La réponse de @unmounted est correcte, mais je voudrais ajouter une dernière suggestion.

Utilisez toujours la fonction ST_SimplifyPreserveTopology au lieu de ST_Simplify dans PostGIS. Les deux utilisent le même algorithme sous-jacent (Douglas-Peucker), mais le premier évite toute simplification qui entraînerait des géométries invalides. Par exemple, ST_Simplify peut entraîner une géométrie qui se croise elle-même.

0
Rauni Lillemets