Analyse SIG pour trouver des géométries en double

9

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).

entrez la description de l'image ici

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.

GIS_DBA
la source
Vous pouvez essayer d'explorer l' outil de suppression identique . Cependant, il nécessite un niveau de licence d'entreprise. Vous pouvez consulter d'autres options disponibles dans l'article technique 36031. ArcGIS fournit-il un moyen d'identifier ou de supprimer des entités avec des géométries en double, votre meilleur pari est l' Extenstion du réviseur de données . aucun de ces outils n'adressera cependant vos géométries divisées
MDHald
vous devrez également tenir compte du fait que les composants tabulaires ne seront pas comparés dans l'outil de suppression identique. Je sais que ce n'est pas une réponse mais j'espère que cela aide à résoudre les problèmes.
MDHald
Les données sont-elles dans une base de données? Quel type?
Russell à l'ISC du
Une option pourrait être d'utiliser l'outil d'intersection (comme décrit dans cette réponse ) dans ArcMap, qui produirait tous les emplacements de chevauchement. Cela nécessiterait de vérifier et de décider manuellement le polygone à supprimer, mais dans le cas de doublons non exacts, je pense que vous devriez le faire de toute façon.
Erica
4
L'utilisation du terme «doublon» est un peu trompeuse dans cette question. Dans le cas de copies exactes, identiques et empilées, alors oui, ce sont (ou pourraient être - les attributs peuvent varier) en double et, comme d'autres l'ont suggéré, l'outil Supprimer ou Rechercher Identique pourrait être utile si vous avez ce niveau de licence. Mais s'ils sont décalés du tout, ou d'une forme différente, ce ne sont pas vraiment des doublons en soi. Si vous avez une licence avancée, j'examinerais une topologie de géodatabase, exécutant la vérification Ne pas se chevaucher. Sans avancé, peut-être la même chose peut être faite avec QGIS et un plugin comme le suggère la réponse de Luigi.
Chris W

Réponses:

4

dans QGIS, le plugin Topology Checker peut résoudre correctement votre problème

Luigi Pirelli
la source
3
Je suis d'accord qu'une topologie est probablement la meilleure solution unique au problème de nettoyage des données. Cependant, vous souhaiterez peut-être développer un peu votre réponse en fournissant un lien vers le plugin et une brève description de ce qu'est ou fait la topologie et de la vérification que vous exécuterez. Je crains que votre réponse telle que saisie ne soit probablement signalée comme de faible qualité.
Chris W
ok: une description du plugin est ici: docs.qgis.org/2.2/en/docs/user_manual/plugins/… et "ne doit pas se chevaucher" peut aborder le problème. Un guide vidéo du plugin est ici: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli
6

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 , containset equalpour obtenir les propriétés de la géométrie.

  1. Commencez par créer une fonction pour mieux organiser le flux de travail et pour la répétabilité

    def findOverlaps(x):

  2. Ouvrez un curseur de recherche pour parcourir la géométrie d'une entité individuelle

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. 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):

  4. Accédez aux propriétés de la géométrie avec les méthodes suivantes: equals(), overlaps()et contains(). Ceux-ci sont configurés dans une séquence logique - vous pouvez modifier cela pour répondre à vos objectifs spécifiques si nécessaire.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
    
  5. Exécuter...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

entrez la description de l'image ici

La capture d'écran montre une variété de fonctionnalités qui se chevauchent, se chevauchent et sont identiques et uniques.

entrez la description de l'image ici

Aaron
la source
2

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à.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(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.

Branco
la source
Je suppose que c'étaient des polygones. S'il s'agit de lignes, vous pouvez utiliser la longueur. Les points sont plus faciles avec les coordonnées X / Y.
Branco
2
J'ai aussi pensé aux "caractéristiques de surface égales", mais il me semble probable que les empreintes de l'édifice pourraient avoir suffisamment des mêmes types de formes pour créer des correspondances involontaires. Je pense que cela améliorerait les chances d'affiner davantage les choses avec une intersection MBR des fonctionnalités. Autrement dit, s'ils ont la même zone (et peuvent être la même fonctionnalité) ET que leurs MBR se croisent, alors il est probable qu'ils soient deux générations de la même fonctionnalité. Cela a-t-il du sens?
elrobis
2

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:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

Cela trouvera les intersections. Si vous voulez une égalité totale, remplacez ST_Intersects par ST_Equals. Ou, combinez simplement les deux:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

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.

John Powell
la source
S'il vous manque un attribut unique dans le fichier de formes, vous pouvez utiliser à la a.rowidplace de a.id. rowidest un mot-clé dans SQLite qui vous donnera l'ID interne de l'ensemble de données.
LuWi
1

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!

Johanna
la source