Identificare gli attributi duplicati nel campo usando QGIS?


27

Ho un file shapefile con migliaia di punti. Ha un campo codice ID che dovrebbe essere univoco. Ogni tanto l'addetto alla registrazione dei dati digita erroneamente l'ID creando duplicati. In questo momento sto scorrendo manualmente il campo per trovare il duplicato.

Esiste un altro modo per farlo utilizzando Search Query Builder?


5
Se è necessario applicare l'univocità, raccomanderei di utilizzare un database, ad esempio Postgres / PostGIS, Spatailite
Nathan,

Ho un problema simile. Ho un grande file di forma contenente quadrati UTM in cui si verificano determinate specie (fino a 5 in un quadrato, per lo più 2). Tuttavia ho un problema a visualizzarli tutti su una mappa poiché si sovrappongono esattamente. Le opzioni di fusione sembrano orribili. La mia soluzione alternativa sarebbe quella di dividere i poligoni in parti uguali a seconda della quantità di specie nel quadrato UTM: Prima: il quadrato mostra 1 colore ma dovrebbe mostrarne due poiché si verificano due specie ! [Prima: il quadrato mostra 1 colore ma dovrebbe mostrarne due ] ( i.stack.imgur.com/6WqKn.jpg ) dopo: split the square s
Hannes Ledegen

Penso che dovresti aprire una nuova domanda invece di pubblicare la tua qui alla fine.
Jens,

Risposte:


7

Se gli ID sono consecutivi, aggiungerei una nuova colonna temporanea con valori univoci come suggerito da @ Ship.shp e quindi utilizzare il generatore di query per cercare ID! = UniqueID.

Ciò restituirebbe direttamente i duplicati. Dopo aver corretto gli ID originali, rimuovere la colonna aggiuntiva o ripetere l'intero processo secondo necessità - non è chiaro quale tipo di modello deve corrispondere agli ID. Se devono solo essere univoci, annota prima l'ultimo valore e puoi quindi modificare gli ID errati in una iterazione, semplicemente saltando il numero mentre procedi.


18

Un altro modo grafico, dinamico e soprattutto semplice per rilevare attributi duplicati: usare il generatore di espressioni di QGIS.

Evidenzia i duplicati nella tabella degli attributi :

Abilita la formattazione condizionale (vedere la freccia rossa in basso) con la seguente condizione:

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

Per raggruppare tutti i duplicati in alto, fai clic con il pulsante destro del mouse sulla colonna, seleziona Ordina
Inserisci l'espressione sopra senza il >1simbolo e deseleziona Ordina crescente.

attributi duplicati evidenziati nella tabella degli attributi QGIS

Evidenzia funzionalità con attributi duplicati nell'area di disegno :

È possibile aggiungere un nuovo simbolo o etichetta con il filtro impostato sulla condizione precedente.

E ovviamente è possibile abilitare un override derivato dai dati basato sullo stesso.

Ad esempio, se si desidera evidenziare le etichette per le funzioni con un attributo duplicato, è possibile impostarlo per disegnare uno sfondo di etichetta (= 1) con la seguente sostituzione:

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

per ottenere qualcosa di simile al seguente

etichette di attributi duplicate evidenziate nell'area di disegno di QGIS

In entrambe le situazioni, ovviamente, dopo aver eliminato o modificato gli attributi duplicati, la formattazione / lo stile si aggiornano all'istante.


1
Questa è di gran lunga la risposta più legittima qui. Volevo solo aggiungere che l'espressione può essere utilizzata direttamente anche con lo strumento di query standard.
maxwhere

@maxwhere, intendi nel Generatore di query utilizzato per filtrare i livelli? Non riesco a convincerlo a filtrare effettivamente i risultati in Q 3.4 o 3.8, anche se sono sorpreso che non abbia generato un errore come in Q 2.x.
she_weeds

14

Utilizza il plug-in Statistiche di gruppo e imposta l'ID come classificazione dei campi. Puoi vedere quante volte ogni valore è stato inserito nella colonna "conteggio".


13

Un modo rapido (sebbene non elegante) per farlo è quello di accedere alle proprietà dei livelli, selezionare Stile - Classificato usando la colonna che ti interessa. Applicalo, quindi fai clic con il pulsante destro del mouse sul livello nella finestra dei livelli e controlla Mostra conteggio funzioni casella di controllo. Quindi espandi il livello nella finestra dei livelli e puoi immediatamente vedere quante volte è stato inserito ciascun valore.


11

Questa è una buona domanda su cui mi sono appena imbattuto. Non mi piace nessuna delle risposte che sono state date finora. Ho un set di dati valido con ID univoci non sequenziali e non interi. Il problema è che il set di dati contiene geometrie singole ma alcuni confini sono di natura multi geometria. Il mio compito è identificare e unire queste geometrie.

Consiglio di utilizzare DB Manager e SQL per questo tipo di lavoro. DB Manager ora fa parte di QGIS. È necessario esportare i dati in PostGIS o in un set di dati SpatiaLite. SpatiaLite dovrebbe comunque essere il formato di dati basato su file preferito.

Ora puoi usare count (), raggruppare per e ordinare come preferisci e dovresti essere in grado di risolvere questo e altri problemi piuttosto rapidamente.

inserisci qui la descrizione dell'immagine


1
L'uso di un plug-in SQL è il modo migliore per procedere!
Devdatta Tengshe,

Bello funziona. Come sarebbe selezionare la funzione (dai duplicati) con un valore minimo / massimo in un'altra colonna di attributi? Non sono riuscito a capirlo. Potresti aiutarmi per favore?
christian.gobel,

Non sono sicuro di aver capito. L'intervallo (tra minimo / massimo) definisce se un record è un duplicato?
Dennis Bauszus,

4

Sì, ho sbattuto la testa contro il muro per un problema simile.

Ecco il mio script per la rimozione di funzionalità con gli stessi ID. Prende la prima funzione con più di un attributo di indice e lo scrive nella nuova classe di caratteristiche.

#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

Inoltre puoi usare la divisione per attributo e finire con una tabella separata per ogni valore.

Mi piace il suggerimento di Rayo però. tranne che lo statista non funziona come pensavo.
Fornisce un conteggio di valori univoci ma non aiuta a stabilire quali siano questi valori.
Un altro software potrebbe aggiungere un campo di conteggio e consentire di esportarlo in formato CSV o altro foglio di calcolo.

statst
Il mio suggerimento per il livello diviso per attributo è negli strumenti di gestione dei vettori
anche la gestione

Diviso
dividi i tuoi dati su qualsiasi campo 1 e avrai i tuoi conteggi.
molto più inelegante della soluzione di ship.ship


2
Ti preghiamo di valutare l'upgrade delle risposte che ti piacciono!
whuber

3
l'auto-voto non è permesso!
Brad Nesom,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.