Mengidentifikasi atribut duplikat di lapangan menggunakan QGIS?

27

Saya memiliki shapefile titik dengan ribuan poin. Ini memiliki bidang kode ID yang seharusnya unik. Kadang-kadang petugas entri data salah ketik ID membuat duplikat. Saat ini saya sedang menggulir bidang secara manual untuk menemukan duplikat.

Apakah ada cara lain untuk melakukan ini menggunakan Search Query Builder?

obsidianz
sumber
5
Jika Anda perlu menegakkan keunikan saya akan merekomendasikan menggunakan database misalnya Postgres / PostGIS, Spatailite
Nathan W
Saya punya masalah serupa. Saya punya satu shapefile besar yang berisi kotak UTM di mana spesies tertentu terjadi (hingga 5 dalam satu squre, kebanyakan 2). Namun saya memiliki masalah dalam memvisualisasikan semuanya pada peta karena keduanya tumpang tindih. Opsi campuran terlihat mengerikan. Solusi saya adalah dengan membagi poligon dalam bagian yang sama tergantung pada jumlah spesies dalam kotak UTM: Sebelum: kotak menunjukkan 1 warna tetapi harus menunjukkan dua karena dua spesies muncul ! [Sebelum: kotak menunjukkan 1 warna tetapi harus menunjukkan dua ] ( i.stack.imgur.com/6WqKn.jpg ) setelah: membelah persegi s
Hannes Ledegen
Saya pikir Anda harus membuka pertanyaan baru alih-alih memposting pertanyaan Anda di bagian akhir.
Jens

Jawaban:

7

Jika ID berturut-turut, saya akan menambahkan kolom sementara baru dengan nilai unik seperti @ Ship.shp yang disarankan dan kemudian menggunakan pembuat kueri untuk mencari ID! = UniqueID.

Itu akan mengembalikan duplikat secara langsung. Setelah memperbaiki ID asli, hapus kolom tambahan atau ulangi seluruh proses sesuai kebutuhan - tidak jelas pola seperti apa yang harus cocok dengan ID Anda. Jika mereka hanya perlu unik, catat nilai terakhir terlebih dahulu dan Anda kemudian dapat mengedit ID buruk dalam satu iterasi, hanya menabrak nomor saat Anda pergi.

lynxlynxlynx
sumber
18

Cara grafis, dinamis, dan paling penting lainnya sederhana untuk mendeteksi atribut duplikat: gunakan pembuat ekspresi QGIS.

Sorot duplikat dalam tabel atribut :

Aktifkan Pemformatan Bersyarat (lihat panah merah di bawah) dengan kondisi berikut:

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

Untuk mengelompokkan semua duplikat di atas, klik kanan kolom, pilih Urutkan
Masukkan ekspresi di atas tanpa >1, dan hapus pilihan Urutkan naik.

atribut duplikat disorot dalam tabel atribut QGIS

Sorot fitur dengan atribut duplikat di atas kanvas :

Anda dapat menambahkan simbol atau label baru dengan filter diatur ke kondisi di atas.

Dan tentu saja Anda dapat mengaktifkan override data yang diturunkan berdasarkan hal yang sama.

Misalnya, jika Anda ingin menyorot label untuk fitur dengan atribut duplikat, Anda dapat mengaturnya untuk menggambar latar belakang label (= 1) dengan penggantian berikut:

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

untuk mencapai sesuatu seperti berikut ini

label atribut duplikat disorot dalam kanvas QGIS

Dalam kedua situasi, tentu saja, begitu Anda menghapus atau mengubah atribut duplikat, pemformatan / styling akan langsung diperbarui.

she_weeds
sumber
1
Sejauh ini, inilah jawaban paling sah di sini. Saya hanya ingin menambahkan bahwa ekspresi dapat digunakan langsung dengan alat kueri standar juga.
maks
@maxwhere, maksud Anda di Pembuat Kueri yang digunakan untuk memfilter lapisan? Saya sepertinya tidak bisa benar-benar memfilter hasil di Q 3.4 atau 3.8, meskipun saya terkejut itu tidak memunculkan kesalahan seperti dulu di Q 2.x.
she_weeds
14

Gunakan plugin Group Stats dan atur ID sebagai klasifikasi bidang. Anda dapat melihat berapa kali setiap nilai telah dimasukkan di kolom 'hitung'.

Rayo
sumber
13

Cara cepat (walaupun tidak berlaku) untuk melakukan ini adalah dengan masuk ke properti Layer, pilih Style - Categorized menggunakan kolom yang Anda minati. Terapkan ini, kemudian klik kanan pada layer di jendela lapisan dan periksa Show Feature Count kotak centang. Kemudian perluas layer di jendela layer dan Anda dapat langsung melihat berapa kali setiap nilai telah dimasukkan.

Ship.shp
sumber
11

Ini adalah pertanyaan yang bagus untuk yang saya tersandung sendiri. Saya tidak suka jawaban yang telah diberikan sejauh ini. Saya memiliki dataset yang valid dengan ID unik yang tidak berurutan dan non integer. Masalahnya adalah bahwa dataset berisi geometri tunggal tetapi beberapa batasan bersifat multi geometri. Tugas saya adalah mengidentifikasi dan menyatukan geometri ini.

Saya merekomendasikan untuk menggunakan DB Manager dan SQL untuk jenis pekerjaan ini. DB Manager sekarang menjadi bagian dari QGIS. Anda perlu mengekspor data Anda ke dataset PostGIS atau SpatiaLite. SpatiaLite harus menjadi format data pilihan berdasarkan file.

Sekarang Anda dapat menggunakan count (), kelompokkan menurut, dan pesan sesuai keinginan Anda dan harus bisa menyelesaikan ini dan masalah lain dengan lebih cepat.

masukkan deskripsi gambar di sini

Dennis Bauszus
sumber
1
Menggunakan plug-in SQL adalah cara terbaik!
Devdatta Tengshe
Bagus, itu berhasil. Bagaimana cara memilih fitur (dari duplikat) dengan nilai minimum / maksimum di kolom atribut lain? Saya tidak bisa mengetahuinya. Bisakah kamu membantuku?
christian.gobel
Tidak yakin saya mengerti. Apakah rentang (antara minimium / maksimum) menentukan apakah rekaman adalah duplikat?
Dennis Bauszus
4

Ya saya membenturkan kepala ke dinding untuk masalah yang sama.

Ini skrip saya untuk menghapus fitur dengan ID yang sama. Dibutuhkan fitur pertama dengan lebih dari satu atribut indeks dan menulisnya ke kelas fitur baru.

#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
sumber
2

Anda juga dapat menggunakan atribut split by dan berakhir dengan tabel terpisah untuk setiap nilai.

Saya suka saran Rayo. kecuali statist tidak bekerja seperti yang saya kira.
Itu memang memberikan hitungan nilai-nilai unik tetapi tidak membantu dengan apa nilai-nilai itu.
Perangkat lunak lain mungkin menambahkan bidang hitung dan memungkinkan Anda untuk mengekspornya ke csv atau format spreadsheet lainnya.

statst
Saran saya untuk lapisan terbagi berdasarkan atribut ada di alat manajemen vektor
manajemen juga

membagi
bagi data Anda pada 1 bidang apa saja dan Anda akan menghitungnya.
jauh lebih tidak penting daripada solusi ship.ship

Brad Nesom
sumber
2
Harap pertimbangkan untuk memilih jawaban yang Anda sukai!
whuber
3
peningkatan diri sendiri tidak diizinkan!
Brad Nesom