Identifier les attributs en double dans le champ à l'aide de QGIS?


27

J'ai un fichier de formes de points avec des milliers de points. Il a un champ de code d'identification qui est censé être unique. De temps en temps, le commis à la saisie des données tape à tort l'ID créant des doublons. En ce moment, je fais défiler manuellement le champ pour trouver le doublon.

Existe-t-il une autre façon de procéder à l'aide du Search Query Builder?


5
Si vous avez besoin d'imposer l'unicité, je recommanderais d'utiliser une base de données, par exemple Postgres / PostGIS, Spatailite
Nathan W

J'ai le même problème. J'ai un grand fichier de formes contenant des carrés UTM dans lesquels certaines espèces se trouvent (jusqu'à 5 dans un carré, principalement 2). Cependant, j'ai un problème pour les visualiser tous sur une carte car ils se chevauchent exactement. Les options de mélange sont horribles. Ma solution de contournement serait de diviser les polygones en parties égales en fonction de la quantité d'espèces dans le carré UTM: Avant: le carré montre 1 couleur mais devrait en montrer deux car deux espèces se produisent ! [Avant: le carré montre 1 couleur mais devrait en montrer deux ] ( i.stack.imgur.com/6WqKn.jpg ) après: division du carré s
Hannes Ledegen

Je pense que vous devriez ouvrir une nouvelle question au lieu de poster la vôtre ici à la fin.
Jens

Réponses:


7

Si les ID sont consécutifs, j'ajouterais une nouvelle colonne temporaire avec des valeurs uniques comme @ Ship.shp suggérée, puis utiliser le générateur de requêtes pour rechercher ID! = UniqueID.

Cela retournerait directement les doublons. Après avoir corrigé les identifiants d'origine, supprimez la colonne supplémentaire ou répétez l'ensemble du processus si nécessaire - le type de modèle auquel vos identifiants doivent correspondre n'est pas clair. S'ils doivent simplement être uniques, notez d'abord la dernière valeur et vous pouvez ensuite modifier les mauvais ID en une seule itération, en augmentant simplement le nombre au fur et à mesure.


18

Un autre moyen graphique, dynamique et surtout simple de détecter les attributs en double: utilisez le générateur d'expression de QGIS.

Mettez en surbrillance les doublons dans la table attributaire :

Activez la mise en forme conditionnelle (voir la flèche rouge ci-dessous) avec la condition suivante:

count("FieldWithDuplicates","FieldWithDuplicates") > 1

Pour regrouper tous les doublons en haut, cliquez avec le bouton droit sur la colonne, sélectionnez Trier
Entrez l'expression ci-dessus sans le >1, et désélectionnez Tri croissant.

attributs en double mis en évidence dans la table d'attributs QGIS

Mettez en surbrillance les fonctionnalités avec des attributs en double sur le canevas :

Vous pouvez ajouter un nouveau symbole ou une nouvelle étiquette avec le filtre défini sur la condition ci-dessus.

Et bien sûr, vous pouvez activer un remplacement dérivé des données basé sur le même.

Par exemple, si vous souhaitez mettre en surbrillance des étiquettes pour des entités avec un attribut en double, vous pouvez le définir pour dessiner un arrière-plan d'étiquette (= 1) avec le remplacement suivant:

CASE WHEN
count("FieldWithDuplicates","FieldWithDuplicates") > 1
THEN 1
ELSE 0
END

pour réaliser quelque chose comme ce qui suit

étiquettes d'attributs en double mises en évidence dans le canevas QGIS

Dans les deux situations, bien sûr, une fois que vous avez supprimé ou modifié les attributs en double, le formatage / style est mis à jour instantanément.


1
C'est de loin la réponse la plus légitime ici. Je voulais juste ajouter que l'expression peut également être utilisée directement avec l'outil de requête standard.
maxwhere

@maxwhere, voulez-vous dire dans le générateur de requêtes utilisé pour filtrer les couches? Je n'arrive pas à obtenir qu'il filtre réellement les résultats dans Q 3.4 ou 3.8, bien que je suis surpris qu'il n'ait pas généré d'erreur comme il le faisait dans Q 2.x.
she_weeds

14

Utilisez le plugin Group Stats et définissez l'ID comme une classification de champ. Vous pouvez voir combien de fois chaque valeur a été entrée dans la colonne "nombre".


13

Un moyen rapide (bien qu'élégant) de le faire est d'aller dans les propriétés du calque, sélectionnez Style - Catégorisé en utilisant la colonne qui vous intéresse. case à cocher. Développez ensuite le calque dans la fenêtre des calques et vous pouvez immédiatement voir combien de fois chaque valeur a été entrée.


11

C'est une bonne question sur laquelle je viens de tomber. Je n'aime aucune des réponses qui ont été données jusqu'à présent. J'ai un ensemble de données valide avec des ID uniques qui ne sont pas séquentiels et non entiers. Le problème est que l'ensemble de données contient des géométries uniques, mais certaines limites sont de nature multi-géométrique. Ma tâche est d'identifier et d'unir ces géométries.

Je recommande d'utiliser DB Manager et SQL pour ce type de travail. Le gestionnaire DB fait désormais partie de QGIS. Vous devez exporter vos données dans PostGIS ou dans un jeu de données SpatiaLite. SpatiaLite devrait de toute façon être le format de données basé sur les fichiers de votre choix.

Vous pouvez maintenant utiliser count (), grouper et trier par comme vous le souhaitez et vous devriez pouvoir résoudre ce problème et d'autres assez rapidement.

entrez la description de l'image ici


1
L'utilisation d'un plug-in SQL est la meilleure solution!
Devdatta Tengshe

Bien, ça marche. Comment serait de sélectionner la fonction (parmi les doublons) avec une valeur minimale / maximale dans une autre colonne d'attribut? Je ne pouvais pas le comprendre. Pourrais-tu m'aider s'il te plait?
christian.gobel

Pas sûr que je comprenne. La plage (entre minimium / maximum) définit-elle si un enregistrement est un doublon?
Dennis Bauszus

4

Ouais, je me suis cogné la tête contre le mur pour un problème similaire.

Voici mon script pour supprimer des fonctionnalités avec les mêmes identifiants. Il prend la première entité avec plus d'un attribut d'index et l'écrit dans une nouvelle classe d'entités.

#Definition of inputs and outputs
# Written by: Gregor Skrt 
#==================================
##[Example scripts]=group
##input=vector
##unique_field=field input
##output=output vector

#Algorithm body
#==================================
from qgis.core import *
from PyQt4.QtCore import *
from processing.core.VectorWriter import VectorWriter

# "input" contains the location of the selected layer.
# We get the actual object, so we can get its bounds
layer = processing.getobject(input)
provider = layer.dataProvider()
fields = provider.fields()
writer = VectorWriter(output, None, fields, provider.geometryType(), layer.crs() )

inFeat = QgsFeature()
outFeat = QgsFeature()
inGeom = QgsGeometry()
nElement = 0
values = {}

value_field_index = layer.fieldNameIndex(unique_field)

feats = processing.getfeatures(layer)
nFeat = len(feats)

for inFeat in feats:
    progress.setPercentage(int((100 * nElement)/nFeat))
    nElement += 1
    inGeom = inFeat.geometry()
    attrs = inFeat.attributes()
    value = attrs[value_field_index]

    if value not in values:
    #to ne vem ce bo drzalo ???
        values[value]=[]
    outFeat.setGeometry(inGeom)
    outFeat.setAttributes(attrs)
    writer.addFeature(outFeat)
del writer

2

Vous pouvez également utiliser l'attribut split by et vous retrouver avec une table séparée pour chaque valeur.

J'aime bien la suggestion de Rayo. sauf que statist ne fonctionne pas tout à fait comme je le pensais.
Il donne un décompte de valeurs uniques mais n'aide pas à ce que sont ces valeurs.
Un autre logiciel peut ajouter un champ de comptage et vous permettre de l'exporter au format csv ou autre feuille de calcul.

statst
Ma suggestion pour la couche divisée par attribut se trouve dans les outils de gestion vectorielle
gestion aussi

Divisé
divisez vos données sur n'importe quel champ et vous aurez vos comptes.
bien plus inélégant que la solution de ship.ship


2
Veuillez envisager de voter pour les réponses que vous aimez!
whuber

3
l'auto-vote n'est pas autorisé!
Brad Nesom
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.