Compter les polygones qui se chevauchent à partir d'un seul fichier Shapefile à l'aide d'ArcGIS Desktop?

10

J'ai un fichier de formes avec 16 400 polygones. Chaque polygone montre l'expansion d'une espèce d'oiseau pour le monde entier.

entrez la description de l'image ici

Maintenant, je dois compter les polygones qui se chevauchent. Je l'ai essayé avec union et dissous (comptez l'union), mais l'union ne fonctionne pas pour autant de polygones.

Ensuite, j'ai essayé de découper des continents, mais cela ne fonctionne pas non plus en raison du grand nombre de polygones. D'ailleurs j'ai essayé cette méthode , également sans succès.

Par conséquent, je vous demande s'il existe un moyen de compter les polygones qui se chevauchent si 16 400 polygones sont dans un fichier de formes?

Je travaille avec 10.0 et je peux travailler avec 10.2. Une solution ArcPy est également merveilleuse.

En ce moment, je pense à créer un résille et itérer sur les lignes du shp avec les 16400 polygones et écrire 1 dans un champ de valeur d'une cellule résille si le polygone est dans cette cellule et prendre la ligne suivante (polygone) et si c'est également dans le nombre de cellules résille +1.

Mais je ne sais pas si c'est une bonne solution et comment la réaliser. Ou je dois apprendre R pour utiliser cette approche.

Le résultat: ce devrait être une forme où vous avez de nouveaux polygones parmi ceux qui se chevauchent et un champ où les chevauchements sont comptés.

Donc, à la fin, il devrait y avoir un fichier de formes où vous pouvez voir combien d'espèces d'oiseaux se trouvent au même endroit.

Nora
la source
votre problème est un problème en raison de la taille de votre ensemble de données. Les réponses (et le lien que vous proposez) sont corrects mais vous aurez des problèmes de mémoire. Peut-être pourriez-vous d'abord essayer d'intégrer vos données à quelques centaines de mètres (en fonction de la précision attendue) pour éviter la création de milliards de polygones de ruban). Assurez-vous de travailler sur une copie car cela modifiera vos données.
radouxju
1
Divisez notre fichier de formes en fichiers de formes régionaux, puis exécutez l'analyse sur les fichiers de formes régionaux, puis dissolvez-les pour obtenir à nouveau le fichier complet.
til_b
J'ai essayé de couper cette forme avec un seul pays, mais j'ai récupéré l'erreur 999999.
Nora
1
Avez-vous regardé l' outil Dés pour réduire la complexité de vos polygones? De plus, si vous obtenez une erreur 999999 en essayant simplement de couper vos données, avez-vous essayé l'outil de vérification de la géométrie pour voir si cela génère des informations?
Hornbydd
2
J'ai fait une vérification partielle de la géométrie sur les données et il y a beaucoup d'auto-intersections. Je suggérerais 1. Assurer une utilisation maximale de la RAM et un grand fichier d'échange 2. Réparer la géométrie 3. Si nécessaire, simplifier les polygones 3. Sous-ensemble de données à 1 / 3s ou 1 / 4s (ou tout ce qui est nécessaire) 4. Exécutez le flux de travail Union-Dissolve-Rasterize comme dans cette réponse 5. Additionnez les rasters.
Cotton.Rockwood

Réponses:

9

Je recommanderais d'utiliser l' outil Count Overlapping Features (Analysis) .

Génère des entités superposées planarisées à partir des entités en entrée. Le nombre d'entités qui se chevauchent est écrit dans les entités en sortie.

entrez la description de l'image ici

Aaron
la source
J'ai aussi essayé ça, et ça ne marche pas pour mon shp (trop gros). merci d'avoir répondu
Nora
1
@Aaron le lien est mort. Il y a maintenant cette implémentation dans Pro: pro.arcgis.com/en/pro-app/tool-reference/analysis/…
Albert
1
Merci @Albert, le message a été mis à jour en fonction de vos recommandations.
Aaron
5

En utilisant des jetons de géométrie arcpy, vous pouvez essayer quelque chose comme ceci:

entrez la description de l'image ici

import os
import arcpy

arcpy.env.workspace = r"" #path to workspace
arcpy.env.overwriteOutput = 1

polygon_fc = r"" #path to polygon fc

base = [row for row in arcpy.da.SearchCursor(polygon_fc,["OID@","SHAPE@"])]
compare = base

overlaps_stats = {}

for b in base:
    for c in compare:
        if b[1].overlaps(c[1]):
            #print "{0} overlaps {1}".format(b[0],c[0])
            if overlap_stats.has_key(b[0]):
                overlap_stats[b[0]].append(c[0])
            else:
                overlap_stats[b[0]] = [c[0]]

for key,value in overlap_stats.iteritems():
    print "Polygon {0}:  Overlaps: {1}.".format(key,len(value))

Pour les exemples de données ci-dessus, le code renverra les comptes de chevauchement suivants: entrez la description de l'image ici

Le code tel quel ne renverra que les comptages des polygones ayant au moins un chevauchement.

Nxaunxau
la source
@ Nxau: Ok, je suppose que j'ai fait une erreur pour expliquer à quoi le résultat devrait ressembler. Ce devrait être une forme où vous avez de nouveaux polygones parmi ceux qui se chevauchent. Par exemple, dans votre image, les cercles 4 et 5 se chevauchent. La nouvelle forme doit avoir trois polygones. (Union ne travaille pas pour cette grande forme). La zone de chevauchement doit avoir la valeur 2 dans un champ et les autres cercles 4 et 5 doivent avoir la valeur 1 dans ce champ. Donc, à la fin, il devrait y avoir un fichier de formes où vous pouvez voir combien d'espèces d'oiseaux se trouvent au même endroit. Merci pour votre script!
Nora
5

Une méthode très simple est:

  1. Union du fichier de formes avec lui-même;
  2. Convertir la sortie en plusieurs parties en une seule pièce ;
  3. Utilisez l' outil de jointure spatiale pour compter les chevauchements (utilisez l'option de correspondance ARE_IDENTICAL_TO);
  4. Symbolisez en utilisant le join_countchamp.

entrez la description de l'image ici

user2856
la source
1

Je suppose que vous avez essayé cette méthode: compter et pixelliser les chevauchements de polygones dans ArcGIS Desktop?

16 400 polygones, ce n'est pas beaucoup. Cependant, une solution potentielle consiste simplement à effectuer une jointure spatiale régulière. Dans le ArcMap toolbox, > Analysis Tools -> Overlap -> Spatial Join.

Définissez les entités targetet joinsur le même ensemble de données et spécifiez une sortie. Laissez le reste des paramètres.

Après quelques instants, vous devriez récupérer un fichier de formes contenant une colonne "nombre de jointures". Soustrayez 1 de ceci (car évidemment chaque entité devrait se recouper), et cela devrait être le nombre de "chevauchements" (se croisant en fait) pour chaque polygone.

Je viens de le jouer sur

SIG-Jonathan
la source
Oui, j'ai déjà essayé l'approche à partir du lien. Mais utiliser l'union est impossible pour ce shp. Essayer la jointure spatiale J'ai récupéré ceci: ERREUR 000426: Mémoire insuffisante.
Nora
Je l'exécute sur une machine avec seulement 4 Go de RAM et avait environ 5 fois plus de fonctionnalités, donc je suis surpris que cela ne fonctionne pas avec un nombre beaucoup plus faible. Vous pouvez avoir trop de sommets dans vos données (le mien était d'environ 60 Mo; quelle est la taille de votre fichier .shp?). Essayez de le généraliser.
GIS-Jonathan
Si seulement le shp est dans un fgdb, le fgdb a 1,73 Go. Dans un dossier, la forme a 2,00 Go.
Nora
J'ai également utilisé cet ensemble de données et je pense que de nombreux problèmes se posent parce que bon nombre des polygones comportent de nombreuses parties. Cela, conjointement avec la résolution, en fait une tâche très gourmande en mémoire.
Cotton.Rockwood
@ Cotton.Rockwood: Et vous trouvez la solution dans R, non? Je pense à utiliser la boîte à outils 'Count Overlapping Polygons' avec l'entrée de 500 polygones (33 sélections) que polygone à raster avec la valeur "join count" et à la fin calculer raster (ModelBuilder). Cela prend beaucoup de temps ...
Nora
1

J'ai téléchargé et essayé l'outil "Count Overlapping Polygons". Cela peut fonctionner, mais cela prend énormément de temps (probablement à cause de la taille du fichier, mais mon FC d'entrée ne comptait que <5 000 enregistrements).

Pendant que j'attendais que cet outil s'exécute, j'ai ouvert une autre fenêtre ArcMap et il n'a fallu que quelques étapes rapides pour obtenir ce que je voulais. 1) Jointure spatiale - en utilisant la même classe d'entités que les fonctions cible et jointure et en sélectionnant l'option "Joindre un à plusieurs". 2) Dissoudre - en utilisant la sortie de la dernière étape. Utilisez le "TARGET_FID" comme champ de dissolution et pour les statistiques, vous pouvez soit SUM le champ "Join_Count" ou COUNT le champ "JOIN_FID". 3) Dans le fichier de sortie de l'étape 2, utilisez la calculatrice de champ soustrayez 1 du champ de statistiques ("SUM_Join_Count" ou "COUNT_JOIN_FID") - puisque chaque entité se croise.

Je suggère d'utiliser cette méthode sur l'outil "Count Overlapping Polygon". J'ai commencé à exécuter l'outil COP ~ 5 min avant de démarrer cette méthode Join-> Dissolve et cela m'a donné le résultat avec suffisamment de temps pour l'écrire avant même que l'outil "Count Overlapping Polygon" ne soit terminé.

J'espère que cela t'aides!

Brian à Buffalo
la source