Supprimer les petits espaces (rubans) entre les polygones? [fermé]


51

J'ai un ensemble de polygones représentant des districts administratifs. Les districts ont été numérisés à la main et il y a de petits espaces (rubans) entre polygones où les polygones doivent se toucher.

Comment puis-je faire en sorte que les polygones s'emboîtent pour supprimer les espaces?

QGIS est préférable, mais ArcGIS et la programmation générale sont également des options.

Réponses:


27

Utiliser Éliminer (licence ArcInfo requise)

Élimine les polygones en les fusionnant avec des polygones voisins possédant la plus grande surface ou la plus longue bordure partagée. Eliminer est souvent utilisé pour supprimer les petits polygones de ruban résultant d’opérations de superposition, telles que Intersection ou Union.

http://help.arcgis.com/fr/arcgisdesktop/10.0/help/index.html#//00170000005p000000.htm

entrez la description de l'image ici

Utilisateurs d'ArcGIS 10 Remarque: il existe une NOUVELLE fonctionnalité dans les options de cet outil.

Il est maintenant possible de conserver le POLYGONE ou POLYLINE d'origine avec l'option> ex_features (Facultatif) Polyligne ou classe d'entités polygonales en entrée ou couche définissant des limites de polygone, ou des parties de celles-ci, à ne pas supprimer.


3
Est-ce que ça marche dans le cas du zoo? Il semble n'y avoir aucun fragment dans le jeu de données, juste des espaces entre les polygones.
underdark

3
J'ai utilisé cet outil avec succès pour supprimer les espaces entre les polygones. L'utilisation de cet outil pose cependant un problème. Lorsqu'il craque les polygones lors du géotraitement, il généralise les polygones nouvellement créés. Ainsi, les courbes ne seront pas aussi lisses, mais auront plutôt des lignes "déchiquetées". Ymmv.
Amasephy

3
@underdark Bon point. Cependant, on pourrait toujours introduire les éclats via une union des données avec un polygone environnant monolithique (tel que le cadre de sélection du jeu de données). Une question intéressante est de savoir comment "Eliminer" choisit les polygones dans lesquels fusionner les rubans. Cela pourrait biaiser les résultats (bien que je doute que le biais soit important dans la plupart des applications). Dans cette situation particulière, une solution idéale permettrait de scinder les rubans ou de répartir les erreurs en moyenne.
whuber

L’une des options de l’outil consiste à fusionner le fragment avec le polygone voisin avec la bordure la plus longue (option par défaut) ou la plus grande surface.
Kenbuja

4
Si vous ne possédez pas de licence ArcInfo, arcscripts.esri.com/details.asp?dbid=14672 contient un script qui automatise cette opération via Python. Je l'ai utilisé avec succès il y a quelques années.
Stephen Lead

20

Pour effectuer cette opération manuellement dans QGIS, accédez à Settings|Project Properties...l' Generalonglet Sur l' onglet en bas, Snapping options...vérifiez le calque que vous souhaitez accrocher, définissez le mode sur to vertexet définissez la tolérance sur une valeur inférieure à la distance la plus courte entre deux points. Si vous n'êtes pas sûr, définissez les unités pixelset la tolérance sur quelque chose comme 5, de sorte que s'il y a des détails difficiles, vous pouvez effectuer un zoom avant et vous assurer que vous n'accrochez pas au mauvais sommet.

Editez ensuite votre couche vectorielle, sélectionnez l'outil Nœud et déplacez les points errants vers leurs homologues.

Le faire automatiquement est un peu plus compliqué. Autant que je sache, AFAIK QGIS ne dispose pas de plug-in pour l’automatiser. Bien que PostGIS soit basé sur GEOS, qui dispose de fonctions de capture, il n’est pas exposé à PostGIS. Il serait peut-être possible d'écrire une requête pour vérifier chaque point d'un polygone à la recherche de voisins à l'intérieur de la distance de capture, mais cela me dépasse actuellement.

GRASS contient v.clean.snap auquel vous pouvez accéder via QGIS, mais il existe l'étape supplémentaire de créer un jeu de données GRASS.


Vous pouvez toujours utiliser la boîte à outils de traitement QGIS et appliquer v.clean.snap directement à votre fichier de formes.
Samerka

v.clean.snap n'est pas disponible. J'ai utilisé v.clean, puis sélectionné l'outil de capture et il a donné un calque vide. La documentation indique que l'accrochage consiste à joindre des lignes à un sommet. Je souhaite joindre un sommet à un autre sommet dans les limites du seuil.
Neogeomat

17

Si vous connaissez QGIS: Dans le tronc 1.9 de QGIS (peut être installé en tant que qgis.dev via le programme d’installation OSGEO, voir page d’accueil de qgis) est une nouvelle fonction du menu vectoriel intitulée "Éliminer les polygones de ruban", qui fait exactement ce que vous voulez. vouloir. Vous pouvez sélectionner les polygones problématiques et les fusionner avec des polygones adjacents en fonction d'une limite ou d'une proposition de zone. Essaye le!


3
Pour mettre à jour cette réponse, dans QGIS 2.18.1, "Eliminer les polygones fendus" est disponible dans le paquet stable et se trouve sous Vecteur -> Outils de géotraitement.
Valerie Anderson

Ceci s’applique aux polygones de rubans dispersés existants entre les polygones principaux, pas dans le cas d’espaces entre polygones.
Stragu

15

Si vous êtes un utilisateur de QGIS, vous bénéficiez de toute la puissance de GRASS, car il s’agit d’un SIG entièrement topologique. Dans QGIS, activez le plug-in GRASS, créez un emplacement / un jeu de cartes où importer vos données.

Ouvrez le mapset et importez votre couche sale avec v.in.ogr: jouez avec les deux paramètres avancés "seuil de capture pour les limites" et "taille minimale de la zone à importer".

Vous pouvez également utiliser les options fournies par le module v.clean.


10

ArcGIS a des règles de topologie qui vous aideront à identifier et à corriger les lacunes dans vos données, telles que ce à quoi vous faites référence. Pour créer des règles de topologie, vous aurez besoin d'une licence ArcEditor ou ArcInfo et stockerez votre classe d'entités dans un jeu de données d'entité dans une géodatabase personnelle ou un fichier.

Vous voudrez probablement implémenter la règle " Doit ne pas avoir de lacunes ". Une fois que vous avez créé la base de règles avec toutes les règles que vous jugez nécessaires, vous souhaitez valider la topologie qui identifiera toutes les erreurs dans vos données.

Ensuite, à l'aide de l' inspecteur d'erreurs et de l' outil Corriger les erreurs de topologie , vous pouvez sélectionner individuellement ou en bloc les erreurs à corriger et la manière de les corriger (par exemple, créer de nouveaux polygones pour combler les vides ou fusionner avec des polygones plus grands à proximité). .


7

Il existe une fonction "Éliminer les polygones de ruban" dans QGIS 2.12 (Lyon) Toolbox. Je suis sûr que c'est aussi dans une version antérieure.


2

Eh bien, j'ai utilisé une fonction PostGIS (que j'utilise directement sur mon QGIS) qui exécute une capture récursive pour résoudre ce problème. Les résultats sont assez bons, il faut juste un bon joice de valeurs de tolérance pour obtenir les meilleurs résultats. Si vous êtes prêt à essayer, vérifiez-le (dans mon cas, les géométries sont toutes multi, d'où le st_multi dans mon execute):

CREATE OR REPLACE FUNCTION dsgsnap(tabela text, snap float) RETURNS void AS 
        $BODY$
            DECLARE
            id int;
            BEGIN
                FOR id in execute('select id from '||tabela)
                LOOP
                    EXECUTE     
                'update '||tabela||' as classe set geom = st_multi(res.geom) 
                from 
                    (
                        select st_snap(a.geom, st_collect(b.geom), '||snap||') as geom, a.id as id 
                        from '||tabela||' a, '||tabela||' b 
                        where a.id != b.id and a.id = '||id||' 
                        group by a.id, a.geom
                    ) as res 
                where res.id = classe.id';
                END LOOP;
                RETURN;                        
            END
        $BODY$
        LANGUAGE plpgsql;

1

Pas une solution parfaite, mais une de ces deux choses fonctionne pour moi dans la plupart des cas:

  1. Dans QGIS, enregistrez la couche au format GEOJSON. Mais avant d'enregistrer, dans la boîte de dialogue "Enregistrer la couche sous", définissez la précision des coordonnées sur 3 (la valeur par défaut est 15). Cela aura pour effet d'unir les sommets très proches les uns des autres.

  2. Allez sur Mapshaper , téléchargez le fichier et cliquez sur "simplifier". Dans le coin supérieur gauche, il vous indiquera le nombre d'intersections de lignes trouvées et vous permettra de les corriger. Je trouve que ce correctif fonctionne environ la moitié du temps.


0

Je ne l’ai pas utilisé, mais ET Geowizards , qui apporte de nombreux outils de traitement d’ArcEditor et ArcInfo à la licence de niveau ArcView (également appelé ArcGIS Standard), comporte un assistant d’élimination qui "élimine les polygones indésirables en les fusionnant dans les polygones voisins. en les supprimant " . La boîte à outils de l’assistant vous coûtera 250 USD ( liste de prix ).


0

J'ai rencontré le même problème qui, en explorant les outils, m’a permis de régler très facilement, bien que je ne connaisse pas la logique. ! [Dans les outils, accédez à la boîte à outils Gestion des données, accédez à la classe d'objets et exécutez le script d'intégration par un double clic] [1]

dans la fenêtre Script, sélectionnez la classe d'objets posant problème et dans la tolérance XY, ajoutez la valeur de la distance en mesurant la distance à l'aide de l'outil de mesure en plusieurs points et obtenez une valeur moyenne, mettez cette valeur dans l'environnement de tolérance et appliquez le problème à résoudre. pas maintenant comment mais résolu avec une précision d'environ 90%. ! [entrez la description de l'image ici] [2]

J'ai essayé toutes les autres méthodes décrites dans les réponses ci-dessus, mais il était difficile et fastidieux d'obtenir des corrections automatisées pour les espaces entre les polygones adjacents.


1
Si vous collez un lien vers les images
auxquelles
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.