Визначення повторюваних атрибутів у полі за допомогою QGIS?


27

У мене є точковий профіль з тисячами точок. У ньому є поле з ідентифікаційним кодом, яке повинно бути унікальним. Раз у раз чиновник введення даних неправильно вводить ідентифікатор, створюючи дублікати. Зараз я вручну прокручую поле, щоб знайти дублікат.

Чи є інший спосіб зробити це за допомогою конструктора пошукових запитів?


5
Якщо вам потрібно застосувати унікальність, я рекомендую використовувати базу даних, наприклад Postgres / PostGIS, Spatailite
Nathan W

У мене схожа проблема. У мене є одне велике формуле, що містить UTM квадрати, в яких зустрічаються певні види (до 5 в одному шкварі, переважно 2). Однак у мене є проблема візуалізації всіх на карті, оскільки вони точно перетинаються. Варіанти змішування виглядають жахливо. Моє вирішення полягало б у тому, щоб розділити багатокутники на рівні частини залежно від кількості видів у квадраті UTM: Перед: квадрат показує 1 колір, але має показувати два, оскільки трапляються два види ! [Раніше: квадрат показує 1 колір, але повинен показувати два ] ( i.stack.imgur.com/6WqKn.jpg ) після: розділив квадрат s
Hannes Ledegen

Я думаю, вам слід відкрити нове запитання, а не публікувати своє в кінці.
Єнс

Відповіді:


7

Якщо ідентифікатори послідовні, я б додав новий тимчасовий стовпець з унікальними значеннями, як-от @ Ship.shp запропонований, а потім використати конструктор запитів для пошуку ідентифікатора! = UniqueID.

Це поверне дублікати безпосередньо. Після виправлення оригінальних ідентифікаторів видаліть зайвий стовпець або повторіть весь процес за необхідності - незрозуміло, для якого шаблону повинні відповідати ваші ідентифікатори. Якщо вони просто повинні бути унікальними, спочатку відзначте останнє значення, а потім ви можете відредагувати неправильні ідентифікатори за одну ітерацію, просто підписуючи число під час проходження.


18

Ще один графічний, динамічний і найголовніше простий спосіб виявити повторювані атрибути: використовувати конструктор виразів QGIS.

Виділіть дублікати в таблиці атрибутів :

Увімкніть умовне форматування (див. Червону стрілку нижче) при наступному умові:

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

Щоб згрупувати всі дублікати вгорі, клацніть правою кнопкою миші стовпчик, виберіть Сортувати
Введіть вищевикладений вираз без >1, і зніміть позначку Сортувати за зростанням.

дублюючі атрибути, виділені в таблиці атрибутів QGIS

Виділіть на полотні функції з подвійними атрибутами :

Ви можете додати новий символ або мітку з фільтром, встановленим до вищевказаної умови.

І звичайно, ви можете ввімкнути переосмислення отриманих даних на основі одних і тих же.

Наприклад, якщо ви хочете виділити мітки для функцій з повторюваним атрибутом, ви можете встановити її для малювання фону мітки (= 1) із наступним переопределенням:

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

щоб домогтися чогось подібного

копії міток атрибутів, виділених на полотні QGIS

В обох ситуаціях, звичайно, щойно ви видаляєте або змінюєте дублікати атрибутів, форматування / стилізація оновлюється миттєво.


1
Це на сьогодні найбільш законний відповідь. Я просто хотів додати, що вираз можна використовувати і безпосередньо зі стандартним інструментом запиту.
максимум

@maxwhere, ви маєте на увазі в "Builder запитів", який використовується для фільтрації шарів? Я не можу зрозуміти, що він фактично фільтрує результати в Q 3.4 або 3.8, хоча я здивований, що він не видав помилку, як це було раніше у Q 2.x.
she_weeds

14

Використовуйте плагін статистики групи та встановіть ідентифікатор як класифікацію поля. Ви можете бачити, скільки разів було введено кожне значення у стовпці "count".


13

Швидкий (хоча і не елегантний) спосіб зробити це - зайти у властивості шару, виберіть Стиль - категоризовано за допомогою стовпця, який вас цікавить. Застосуйте це, потім клацніть правою кнопкою миші на шарі у вікні шарів та перевірте Показувати кількість функцій прапорець. Потім розгорніть шар у вікні шарів, і ви зможете відразу побачити, скільки разів було введено кожне значення.


11

Це хороше питання, на яке я просто натрапив. Мені не подобається жоден із відповідей, які були отримані до цих пір. У мене є дійсний набір даних з унікальними ідентифікаторами, які не є послідовними та не цілими. Проблема полягає в тому, що набір даних містить єдині геометрії, але деякі межі мають багатогеометрію. Моє завдання - визначити та об'єднати ці геометрії.

Я рекомендую використовувати диспетчер БД та SQL для подібних робіт. Менеджер БД зараз є частиною QGIS. Вам потрібно експортувати свої дані в або PostGIS, або в набір даних SpatiaLite. SpatiaLite у будь-якому разі повинен бути вибором файлового формату даних.

Тепер ви можете використовувати count (), групувати і упорядковувати за своїм бажанням, і ви зможете досить швидко вирішити цю та інші проблеми.

введіть тут опис зображення


1
Використання плагіна SQL - найкращий спосіб!
Devdatta Tengshe

Приємно, що це працює. Як було б вибрати функцію (з дублікатів) з мінімальним / максимальним значенням в іншому стовпці атрибутів? Я не міг цього зрозуміти. Чи можете ви мені допомогти?
christian.gobel

Не впевнений, що розумію. Чи визначає діапазон (між мінімумом / максимальним), чи є запис дублікатом?
Денніс Баушус

4

Так, я стукнув головою об стіну за подібну проблему.

Ось мій сценарій для видалення функцій з однаковими ідентифікаторами. Він приймає першу функцію з більш ніж одним атрибутом індексу та записує її в новий клас функції.

#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

Крім того, ви можете використовувати розділення за атрибутом і закінчити окрему таблицю для кожного значення.

Мені подобається пропозиція Райо. за винятком статистики не зовсім так, як я думав, що це зробив.
Він дає кількість унікальних значень, але не допомагає у тому, якими є ці значення.
Інше програмне забезпечення може додати поле для підрахунку та дозволити експортувати його у формат csv або інший формат електронних таблиць.

статист
Моя пропозиція щодо розділеного шару за атрибутом знаходиться в інструментах управління векторними
управління також

розколоти
розділіть ваші дані на будь-яке 1 поле, яке матиме ваш рахунок.
набагато неелегантніше рішення корабля


2
Будь ласка, подумайте про те, щоб просити відповіді, які вам подобаються!
whuber

3
самовизначення заборонено!
Бред Несом
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.