J'ai un grand fichier de formes qui contient tous les bâtiments et maisons de la ville dans laquelle je travaille (environ 90 000 fonctionnalités). Les données des bâtiments / maisons sont enregistrées par les ingénieurs géomètres de la ville et en raison des mauvaises pratiques et de l'accès de différents arpenteurs à ces données, de nombreux bâtiments / maisons ont été enregistrés deux fois et apparaissent sur la carte en double.
Certains d'entre eux sont exactement dupliqués (ils apparaissent l'un sur l'autre) tandis que d'autres sont dupliqués avec un espace entre les deux objets (comme un objet est à l'intérieur de l'autre - voir la capture d'écran ci-jointe).
Je veux nettoyer ces données afin de n'avoir que les bons bâtiments / maisons dans la ville, donc ma question est:
Y a-t-il une analyse SIG ou une expression SQL que je peux exécuter pour trouver toutes les fonctionnalités dupliquées (à la fois celles exactes et celles qui se trouvent à l'intérieur des autres)? J'ai à la fois ArcGIS et QGIS, donc je suis ouvert à toutes vos suggestions.
Réponses:
dans QGIS, le plugin Topology Checker peut résoudre correctement votre problème
la source
J'utiliserais les outils de navigation de Python et un SearchCursor pour un moyen très efficace de trouver les relations spatiales que vous recherchez. Vous pouvez incorporer les méthodes de la géométrie
overlaps
,contains
etequal
pour obtenir les propriétés de la géométrie.Commencez par créer une fonction pour mieux organiser le flux de travail et pour la répétabilité
def findOverlaps(x):
Ouvrez un curseur de recherche pour parcourir la géométrie d'une entité individuelle
with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
utiliser
itertools.combinations()
pour renvoyer des sous-séquences d'éléments de l'entrée itérablecur
for feature1,feature2 in itertools.combinations(cur, 2):
Accédez aux propriétés de la géométrie avec les méthodes suivantes:
equals()
,overlaps()
etcontains()
. Ceux-ci sont configurés dans une séquence logique - vous pouvez modifier cela pour répondre à vos objectifs spécifiques si nécessaire.Exécuter...
enter code here
findOverlaps (fc)La capture d'écran montre une variété de fonctionnalités qui se chevauchent, se chevauchent et sont identiques et uniques.
la source
J'ai une idée de ce qui peut vous convenir. Cela va être basé sur certaines hypothèses, mais cela aiderait à affiner votre liste de fonctionnalités identiques possibles. Ce ne serait pas un processus automatisé, mais il faudrait examiner manuellement les doublons. Sur la base des commentaires, il semble que les outils automatisés ne comparent pas les attributs, ce qui vous aiderait à ne pas supprimer accidentellement des fonctionnalités.
Utilisation d'ArcMap
(1) Faites une copie de votre fichier de formes en cas de problème.
(2) Ajoutez une colonne à votre fichier de formes sous forme de double.
(3) Calculez l'aire de chaque entité en utilisant le format le plus descriptif (le plus précis) possible. Quelque chose où l'arrondi peut ne pas être un problème.
(4) Exécutez un résumé (résumé) sur cette colonne. Assurez-vous de sélectionner un identifiant unique dans le résumé et marquez le premier et le dernier.
(5) Dans votre tableau de sortie, recherchez les enregistrements dont le champ de comptage est supérieur à 1.
(6a) Vérifiez manuellement les fonctionnalités et répétez le processus jusqu'à ce qu'il n'y ait plus de doublons.
(6b) Vous pouvez simplement créer une liste de ces identifiants uniques et supprimer les fonctionnalités via arcpy, mais vous courez la chance d'avoir éventuellement deux fonctionnalités non identiques avec la même zone.
Une autre technique utilisant ArcPy
En construisant la réponse ci-dessus, j'ai pensé à la possibilité que les multiples auteurs de ces données aient en fait utilisé les mêmes identificateurs uniques pour les fonctionnalités dupliquées. SI c'est le cas, vous pourrez peut-être trouver des doublons en bouclant dans arcpy.
La façon dont je penserais à le faire en utilisant ArcPy pourrait être lourde de conséquences pour votre système et prendre un peu de temps.
(1) Faites une copie de votre fichier de formes (au cas où encore)
(2) Ajoutez une nouvelle colonne pour indiquer les doublons. Quelque chose qui prend comme un «y» ou «n» ou 0 ou 1 ou quoi que ce soit qui fonctionnerait.
(3) Créez une liste en python pour stocker l'identifiant unique.
(4) Exécutez un curseur de mise à jour (
arcpy.UpdateCursor('LAYERNAME')
). Pour chaque enregistrement, vérifiez votre liste pour voir si elle contient cet identifiant et marquez votre colonne pour les doublons s'il est là.(5) Ensuite, vous pouvez comparer ou faire ce que vous voulez avec ces colonnes marquées.
Il existe probablement de meilleures façons de faire ces comparaisons, mais ce sont deux qui, à mon avis, devraient fonctionner ou au moins vous aider à démarrer.
Éditer
Sur la base du commentaire d' elrobis , vous pouvez utiliser le rectangle de délimitation minimum pour réduire davantage les chances de supprimer des fonctionnalités incorrectes.
À l'aide d'ArcMap, vous pouvez exécuter l' outil Géométrie de contour minimum dans la gestion des données. Après avoir vérifié les options, je pense que l'utilisation de l' option CONVEX_HULL serait probablement la meilleure.
Si vous comparez les champs MBG_APodX / Y1 , MBG_APod_X / Y2 avec MBG_Orientation pour les doublons, vous devriez pouvoir vous faire une bonne idée des fonctionnalités dupliquées. Je suggère d'utiliser la méthode de résumé que j'ai décrite ci-dessus pour comparer. Choisissez l'un des sommets (coordonnées) du rectangle englobant pour trouver des doublons. Vous pouvez obtenir quelques `` correspondances '' accidentelles, mais une fois que vous ajoutez les autres sommets plus l'orientation, il serait assez sûr que les fonctionnalités de résultats sont des doublons.
Bien que je ne l'aie pas utilisé et que je ne sois pas tout à fait sûr des résultats de cet outil, vous trouverez peut-être plus facile d'examiner le fichier de formes résultant si vous utilisez l' outil Statistiques récapitulatives dans ArcMap. Il semble que vous puissiez résumer plusieurs colonnes de cette façon au lieu de mon option de colonne unique.
Je ne pense pas qu'il y aurait une façon complètement automatisée de le faire sans avoir le souci de supprimer une fonctionnalité non dupliquée. Ces méthodes devraient cependant aider à limiter le nombre de fonctionnalités que vous auriez besoin d'examiner manuellement.
la source
Vous pouvez le faire en SQL en utilisant une auto-jointure spatiale. Vous ne précisez pas quel dialecte SQL vous utilisez, donc cet exemple utilise Postgres / Postgis, mais il pourrait être facilement adapté à Oracle ou SQL Server. En supposant une table appelée bâtiments, avec la géométrie stockée dans une colonne appelée geom:
Cela trouvera les intersections. Si vous voulez une égalité totale, remplacez ST_Intersects par ST_Equals. Ou, combinez simplement les deux:
Remarque, le a.id <b.id signifie que vous ne considérez que la moitié des cas dans l'auto-jointure, ce qui le rend a) plus rapide et b) vous donne une liste que vous pouvez utiliser pour supprimer la moitié des polygones qui se chevauchent sans les supprimer tous . De toute évidence, il s'agit toujours d'un algorithme O (n²), mais en pratique, ce sera beaucoup plus rapide si vous avez un index spatial en place - ce qui est vraiment une exigence totale pour tout ensemble de données non trivial.
Vous devrez peut-être masser cela un peu pour répondre à une définition du chevauchement - vous ne voulez pas supprimer les maisons voisines qui ont été mal étudiées.
la source
a.rowid
place dea.id
.rowid
est un mot-clé dans SQLite qui vous donnera l'ID interne de l'ensemble de données.Le plugin Topology Checker est un bon outil s'il est utilisé correctement. Vous devez toujours avoir une compréhension fondamentale de vos données ET vous devez effectuer les «corrections» manuellement. Le plugin mettra en évidence ce qu'il pense être des erreurs. C'est à vous de les examiner ensuite et de prendre la décision appropriée pour vous et vos données. Avec 90 000 articles dans votre couche, vous serez peut-être chez vous à Noël!
la source