Xác định các thuộc tính trùng lặp trong trường bằng cách sử dụng QGIS?


27

Tôi có một shapefile điểm với hàng ngàn điểm. Nó có một trường mã ID được coi là duy nhất. Thỉnh thoảng nhân viên nhập dữ liệu nhập sai ID tạo trùng lặp. Ngay bây giờ tôi đang cuộn thủ công trường để tìm bản sao.

Có cách nào khác để thực hiện việc này bằng Trình tạo truy vấn tìm kiếm không?


5
Nếu bạn cần thực thi tính duy nhất, tôi khuyên bạn nên sử dụng cơ sở dữ liệu, ví dụ Postgres / PostGIS, Spatailite
Nathan W

Tôi có một vấn đề tương tự. Tôi có một shapefile lớn chứa các ô vuông UTM trong đó một số loài nhất định xảy ra (tối đa 5 trong một ô vuông, chủ yếu là 2). Tuy nhiên tôi có một vấn đề hình dung tất cả chúng trên bản đồ vì chúng trùng nhau chính xác. Tùy chọn pha trộn trông thật kinh khủng. Cách giải quyết của tôi là chia các đa giác thành các phần bằng nhau tùy thuộc vào số lượng loài trong hình vuông UTM: Trước: hình vuông hiển thị 1 màu nhưng sẽ hiển thị hai vì hai loài xuất hiện ! [Trước: hình vuông hiển thị 1 màu nhưng sẽ hiển thị hai màu ] ( i.stack.imgur.com/6WqKn.jpg ) sau: chia tách hình vuông s
Hannes Ledegen

Tôi nghĩ bạn nên mở một câu hỏi mới thay vì đăng câu hỏi của bạn ở đây vào cuối.
Jens

Câu trả lời:


7

Nếu các ID liên tiếp, tôi sẽ thêm một cột tạm thời mới với các giá trị duy nhất như @ Ship.shp được đề xuất và sau đó sử dụng trình tạo truy vấn để tìm kiếm ID! = UniqueID.

Điều đó sẽ trả lại các bản sao trực tiếp. Sau khi sửa ID gốc, hãy xóa cột thêm hoặc lặp lại toàn bộ quá trình nếu cần - không rõ loại ID nào của bạn phải khớp. Nếu chúng chỉ cần là duy nhất, trước tiên hãy lưu ý giá trị cuối cùng và sau đó bạn có thể chỉnh sửa ID xấu trong một lần lặp, chỉ cần trả số khi bạn đi.


18

Một cách đồ họa, năng động và quan trọng nhất đơn giản nhất để phát hiện các thuộc tính trùng lặp: sử dụng trình tạo biểu thức của QGIS.

Đánh dấu trùng lặp trong bảng thuộc tính :

Bật định dạng có điều kiện (xem mũi tên màu đỏ bên dưới) với điều kiện sau:

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

Để nhóm tất cả các mục trùng lặp ở trên cùng, nhấp chuột phải vào cột, chọn Sắp xếp
Nhập biểu thức trên mà không >1chọn và bỏ chọn Sắp xếp tăng dần.

các thuộc tính trùng lặp được tô sáng trong bảng thuộc tính QGIS

Làm nổi bật các tính năng với các thuộc tính trùng lặp trên canvas :

Bạn có thể thêm một biểu tượng hoặc nhãn mới với bộ lọc được đặt ở điều kiện trên.

Và tất nhiên bạn có thể kích hoạt ghi đè dữ liệu dựa trên cùng.

Ví dụ: nếu bạn muốn làm nổi bật nhãn cho các tính năng có thuộc tính trùng lặp, bạn có thể đặt nó để vẽ nền nhãn (= 1) với ghi đè sau:

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

để đạt được điều gì đó như sau

nhãn thuộc tính trùng lặp được tô sáng trong khung hình QGIS

Tất nhiên, trong cả hai tình huống, một khi bạn xóa hoặc thay đổi các thuộc tính trùng lặp, định dạng / kiểu dáng sẽ cập nhật ngay lập tức.


1
Đây là câu trả lời hợp pháp nhất ở đây. Tôi chỉ muốn thêm rằng biểu thức cũng có thể được sử dụng trực tiếp với công cụ truy vấn tiêu chuẩn.
tối đa

@maxwhere, ý bạn là trong Trình tạo truy vấn được sử dụng để lọc các lớp? Tôi dường như không thể khiến nó thực sự lọc kết quả trong Q 3.4 hoặc 3.8, mặc dù tôi rất ngạc nhiên vì nó không gây ra lỗi như trước đây trong Q 2.x.
she_weed

14

Sử dụng plugin Thống kê nhóm và đặt ID làm phân loại trường. Bạn có thể thấy số lần mỗi giá trị đã được nhập vào cột 'đếm'.


13

Cách nhanh chóng (mặc dù không liên quan) để thực hiện việc này là đi vào thuộc tính Lớp, chọn Kiểu - Phân loại bằng cột mà bạn quan tâm. Áp dụng điều này, sau đó nhấp chuột phải vào lớp trong cửa sổ lớp và kiểm tra Hiển thị số lượng tính năng hộp kiểm. Sau đó mở rộng lớp trong cửa sổ lớp và bạn có thể thấy ngay số lần mỗi giá trị được nhập.


11

Đây là một câu hỏi hay mà tôi chỉ vấp ngã. Tôi không thích bất kỳ câu trả lời nào được đưa ra cho đến nay. Tôi có một bộ dữ liệu hợp lệ với các ID duy nhất không tuần tự và không nguyên. Vấn đề là bộ dữ liệu chứa các hình học đơn nhưng một số ranh giới là nhiều hình học trong tự nhiên. Nhiệm vụ của tôi là xác định và hợp nhất những hình học này.

Tôi khuyên bạn nên sử dụng Trình quản lý DB và SQL cho loại công việc này. Trình quản lý DB hiện là một phần của QGIS. Bạn cần xuất dữ liệu của mình vào PostGIS hoặc bộ dữ liệu SpatiaLite. SpatiaLite phải là định dạng dữ liệu dựa trên tập tin của mọi cách.

Bây giờ bạn có thể sử dụng Count (), nhóm theo và sắp xếp theo ý muốn và sẽ có thể giải quyết vấn đề này và các vấn đề khác khá nhanh chóng.

nhập mô tả hình ảnh ở đây


1
Sử dụng trình cắm SQL là cách tốt nhất để sử dụng!
Devdatta Tengshe

Đẹp nó hoạt động. Làm thế nào để chọn tính năng (từ các bản sao) với giá trị tối thiểu / tối đa trong cột thuộc tính khác? Tôi không thể tìm ra nó. Bạn có thể vui lòng giúp tôi không?
christian.gobel

Không chắc là tôi hiểu. Phạm vi (giữa minimium / max) có xác định xem một bản ghi có trùng lặp không?
Dennis Bauszus

4

Vâng, tôi đập đầu vào tường cho vấn đề tương tự.

Đây là tập lệnh của tôi để xóa các tính năng có cùng ID. Nó nhận tính năng đầu tiên với nhiều hơn một thuộc tính chỉ mục và ghi nó vào lớp tính năng mới.

#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

Ngoài ra, bạn có thể sử dụng phân chia theo thuộc tính và kết thúc với một bảng riêng biệt cho mỗi giá trị.

Tôi thích đề nghị của Rayo mặc dù. ngoại trừ thống kê không hoạt động như tôi nghĩ.
Nó đưa ra một số giá trị duy nhất nhưng không giúp được những giá trị đó là gì.
Một phần mềm khác có thể thêm trường đếm và cho phép bạn xuất nó sang csv hoặc định dạng bảng tính khác.

trạng thái
Đề xuất của tôi cho lớp phân tách theo thuộc tính là trong các công cụ quản lý vector
quản lý cũng vậy

chia
chia dữ liệu của bạn trên bất kỳ trường nào 1 dyou sẽ có số lượng của bạn.
không phù hợp hơn giải pháp của ship.ship


2
Vui lòng xem xét nâng cao các câu trả lời bạn thích!
whuber

3
tự upvote không được phép!
Brad Nesom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.