Zidentyfikować zduplikowane atrybuty w polu za pomocą QGIS?

27

Mam punktowy plik kształtu z tysiącami punktów. Ma pole kodu identyfikacyjnego, które powinno być unikalne. Od czasu do czasu urzędnik wprowadzania danych błędnie wpisuje identyfikator, tworząc duplikaty. W tej chwili ręcznie przewijam pole, aby znaleźć duplikat.

Czy istnieje inny sposób, aby to zrobić za pomocą Kreatora zapytań wyszukiwania?

obsidianz
źródło
5
Jeśli chcesz wymusić wyjątkowość, polecam korzystanie z bazy danych, np. Postgres / PostGIS, Spatailite
Nathan W
Mam podobny problem. Mam jeden duży plik kształtu zawierający kwadraty UTM, w których występują pewne gatunki (do 5 na jednym obszarze, w większości 2). Mam jednak problem z wizualizacją ich wszystkich na mapie, ponieważ dokładnie się pokrywają. Opcje mieszania wyglądają okropnie. Moim obejściem byłoby podzielenie wielokątów na równe części w zależności od ilości gatunków w kwadracie UTM: Przed: kwadrat pokazuje 1 kolor, ale powinien pokazywać dwa, ponieważ występują dwa gatunki ! [Przed: kwadrat pokazuje 1 kolor, ale powinien pokazywać dwa ] ( i.stack.imgur.com/6WqKn.jpg ) po: podzielono kwadrat s
Hannes Ledegen
Myślę, że powinieneś otworzyć nowe pytanie zamiast zamieszczać tutaj swoje pytanie na końcu.
Jens

Odpowiedzi:

7

Jeśli identyfikatory są następujące po sobie, dodam nową tymczasową kolumnę z unikalnymi wartościami, takimi jak sugerowana @ Ship.shp, a następnie użyję konstruktora zapytań, aby wyszukać ID! = UniqueID.

To zwróci duplikaty bezpośrednio. Po naprawieniu oryginalnych identyfikatorów usuń dodatkową kolumnę lub powtórz cały proces w razie potrzeby - nie jest jasne, jakiego rodzaju wzorce muszą pasować twoje identyfikatory. Jeśli po prostu muszą być unikalne, najpierw zanotuj ostatnią wartość, a następnie możesz edytować złe identyfikatory w jednej iteracji, po prostu podskakując liczbę w trakcie podróży.

lynxlynxlynx
źródło
18

Kolejny graficzny, dynamiczny i co najważniejsze prosty sposób wykrywania duplikatów atrybutów: użyj konstruktora wyrażeń QGIS.

Podświetl duplikaty w tabeli atrybutów :

Włącz formatowanie warunkowe (patrz czerwona strzałka poniżej) z następującym warunkiem:

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

Aby zgrupować wszystkie duplikaty u góry, kliknij kolumnę prawym przyciskiem myszy, wybierz Sortuj
Wprowadź powyższe wyrażenie bez >1i odznacz Sortuj rosnąco.

zduplikowane atrybuty podświetlone w tabeli atrybutów QGIS

Wyróżnij obiekty ze zduplikowanymi atrybutami na płótnie :

Możesz dodać nowy symbol lub etykietę z ustawionym filtrem do powyższych warunków.

I oczywiście możesz włączyć zastępowanie danych na podstawie tego samego.

Na przykład, jeśli chcesz podświetlić etykiety dla obiektów ze zduplikowanym atrybutem, możesz ustawić, aby rysował tło etykiety (= 1) z następującą przesłoną:

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

aby osiągnąć coś takiego

zduplikowane etykiety atrybutów wyróżnione w obszarze roboczym QGIS

Oczywiście w obu sytuacjach po usunięciu lub zmianie zduplikowanych atrybutów formatowanie / styl aktualizuje się natychmiast.

she_weeds
źródło
1
To zdecydowanie najbardziej uzasadniona odpowiedź tutaj. Chciałem tylko dodać, że wyrażenie może być również użyte bezpośrednio ze standardowym narzędziem do zapytań.
maks. Gdziekolwiek
@maxwhere, masz na myśli w Kreatorze zapytań używanym do filtrowania warstw? Nie wydaje mi się, aby faktycznie filtrował wyniki w Q 3.4 lub 3.8, chociaż jestem zaskoczony, że nie wyrzucił błędu tak jak kiedyś w Q 2.x.
she_weeds
14

Użyj wtyczki Group Stats i ustaw identyfikator jako klasyfikację pola. Możesz zobaczyć, ile razy każda wartość została wprowadzona w kolumnie „liczba”.

Rayo
źródło
13

Szybki (choć nieelegancki) sposób, aby to zrobić, to przejście do właściwości warstwy, wybierz Styl - skategoryzowane za pomocą interesującej kolumny. Zastosuj to, a następnie kliknij prawym przyciskiem myszy warstwę w oknie warstw i sprawdź Pokaż liczbę operacji pole wyboru. Następnie rozwiń warstwę w oknie warstw i od razu możesz zobaczyć, ile razy wprowadzono każdą wartość.

Ship.shp
źródło
11

To dobre pytanie, na które się natknąłem. Nie podoba mi się żadna z udzielonych dotąd odpowiedzi. Mam prawidłowy zestaw danych z unikalnymi identyfikatorami, które nie są sekwencyjne i nie są liczbami całkowitymi. Problem polega na tym, że zestaw danych zawiera pojedyncze geometrie, ale niektóre granice mają charakter wielu geometrii. Moim zadaniem jest zidentyfikowanie i połączenie tych geometrii.

Polecam używać DB Managera i SQL do tego rodzaju pracy. DB Manager jest teraz częścią QGIS. Musisz wyeksportować swoje dane do zestawu danych PostGIS lub SpatiaLite. SpatiaLite i tak powinien być formatem danych opartych na plikach.

Teraz możesz używać count (), grupować według i porządkować według, jak chcesz i powinieneś być w stanie rozwiązać ten i inne problemy dość szybko.

wprowadź opis zdjęcia tutaj

Dennis Bauszus
źródło
1
Najlepszym sposobem jest użycie wtyczki SQL!
Devdatta Tengshe,
Fajnie, że działa. Jak wybrać funkcję (z duplikatów) o wartości minimalnej / maksymalnej w innej kolumnie atrybutu? Nie mogłem tego rozgryźć. Proszę, mógłbyś mi pomóc?
christian.gobel
Nie jestem pewien, czy rozumiem. Czy zakres (od minimum do maksimum) określa, czy rekord jest duplikatem?
Dennis Bauszus
4

Tak, uderzyłem głową w ścianę o podobny problem.

Oto mój skrypt do usuwania funkcji o tych samych identyfikatorach. Pobiera pierwszą funkcję z więcej niż jednym atrybutem indeksu i zapisuje ją w nowej klasie funkcji.

#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
Greg
źródło
2

Możesz także użyć podziału według atrybutu i uzyskać osobną tabelę dla każdej wartości.

Jednak podoba mi się sugestia Rayo. z wyjątkiem tego, że statystyki nie działają tak, jak myślałem.
Podaje liczbę unikalnych wartości, ale nie pomaga w określeniu ich wartości.
Inne oprogramowanie może dodać pole zliczania i umożliwić eksportowanie go do formatu csv lub innego formatu arkusza kalkulacyjnego.

statst
Moja propozycja podziału warstwy według atrybutów dotyczy narzędzi do zarządzania wektorem
zarządzanie również

rozdzielać
podziel swoje dane na dowolne 1 pole, abyś miał swoje liczby.
znacznie bardziej nieeleganckie niż rozwiązanie ship.ship

Brad Nesom
źródło
2
Zastanów się nad poprawieniem swoich odpowiedzi!
whuber
3
samodzielna opinia jest niedozwolona!
Brad Nesom,