Выявление дубликатов атрибутов в поле с использованием QGIS?

27

У меня есть точечный шейп-файл с тысячами точек. У него есть поле кода ID, которое должно быть уникальным. Время от времени клерк ввода данных ошибочно вводит идентификатор, создавая дубликаты. Прямо сейчас я вручную прокручиваю поле, чтобы найти дубликат.

Есть ли другой способ сделать это с помощью Search Query Builder?

obsidianz
источник
5
Если вам нужно обеспечить уникальность, я бы порекомендовал использовать базу данных, например, Postgres / PostGIS, Spatailite
Натан W
У меня похожая проблема. У меня есть один большой шейп-файл, содержащий квадраты UTM, в которых встречаются определенные виды (до 5 на один квадрат, в основном 2). Однако у меня есть проблема визуализации их всех на карте, так как они точно совпадают. Варианты смешивания выглядят ужасно. Мой обходной путь - разделить полигоны на равные части в зависимости от количества видов в квадрате UTM: До: в квадрате показан 1 цвет, но должно отображаться два, поскольку встречаются два вида ! [До: в квадрате показан 1 цвет, но должны отображаться два ] ( i.stack.imgur.com/6WqKn.jpg ) после: разделил квадрат s
Ханнес Ледеген
Я думаю, что вы должны открыть новый вопрос вместо того, чтобы публиковать свой здесь в конце.
Дженс

Ответы:

7

Если идентификаторы являются последовательными, я бы добавил новый временный столбец с уникальными значениями, такими как предложенный @ Ship.shp, а затем использовал бы конструктор запросов для поиска идентификатора! = UniqueID.

Это вернет дубликаты напрямую. После исправления исходных идентификаторов удалите лишний столбец или повторите весь процесс по мере необходимости - неясно, какому шаблону должны соответствовать ваши идентификаторы. Если они просто должны быть уникальными, сначала запишите последнее значение, а затем вы можете отредактировать неверные идентификаторы за одну итерацию, просто увеличивая число на ходу.

lynxlynxlynx
источник
18

Еще один графический, динамичный и самое главное простой способ обнаружения дублирующихся атрибутов: используйте конструктор выражений QGIS.

Выделите дубликаты в таблице атрибутов :

Включите условное форматирование (см. Красную стрелку ниже) со следующим условием:

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

Чтобы сгруппировать все дубликаты вверху, щелкните правой кнопкой мыши столбец, выберите «Сортировать».
Введите вышеприведенное выражение без >1и снимите флажок «Сортировать по возрастанию».

дубликаты атрибутов выделены в таблице атрибутов QGIS

Выделите элементы с дублирующимися атрибутами на холсте :

Вы можете добавить новый символ или метку с установленным фильтром для вышеуказанного условия.

И, конечно же, вы можете включить переопределение на основе полученных данных.

Например, если вы хотите выделить метки для объектов с дублирующимся атрибутом, вы можете настроить его на рисование фона метки (= 1) со следующим переопределением:

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

достичь чего-то вроде следующего

дублированные метки атрибутов выделены на холсте QGIS

Конечно, в обеих ситуациях после того, как вы удалите или измените дублирующиеся атрибуты, форматирование / стилирование обновляются мгновенно.

she_weeds
источник
1
Это, безусловно, самый законный ответ здесь. Я просто хотел добавить, что выражение можно использовать напрямую и со стандартным инструментом запросов.
максимум
@ maxwhere, вы имеете в виду Query Builder, используемый для фильтрации слоев? Я не могу заставить его отфильтровать результаты в Q 3.4 или 3.8, хотя я удивлен, что он не вывел ошибку, как это было в Q 2.x.
she_weeds
14

Используйте плагин Group Stats и установите идентификатор в качестве классификации полей. Вы можете увидеть, сколько раз каждое значение было введено в столбце 'count'.

Райо
источник
13

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

Ship.shp
источник
11

Это хороший вопрос, на который я только что наткнулся. Мне не нравится ни один из ответов, которые были даны до сих пор. У меня есть действительный набор данных с уникальными идентификаторами, которые не являются последовательными и не целочисленными. Проблема состоит в том, что набор данных содержит одну геометрию, но некоторые границы по своей природе являются мульти геометриями. Моя задача - идентифицировать и объединить эти геометрии.

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

Теперь вы можете использовать count (), group by и order by по своему усмотрению, и сможете быстро и быстро решить эту и другие проблемы.

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

Деннис Баусус
источник
1
Использование плагина SQL - лучший способ!
Девдатта Тенгше
Хорошо, что это работает. Как выбрать функцию (из дубликатов) с минимальным / максимальным значением в другом столбце атрибута? Я не мог понять это. Не могли бы вы мне помочь, пожалуйста?
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
Greg
источник
2

Также вы можете использовать разделение по атрибутам и получить отдельную таблицу для каждого значения.

Мне нравится предложение Райо, хотя. кроме статистики не совсем так, как я думал.
Это дает количество уникальных значений, но не помогает с этими значениями.
Другое программное обеспечение может добавить поле счетчика и позволить вам экспортировать его в CSV или другой формат электронной таблицы.

statst
Я предлагаю разделить слой по атрибутам в инструментах управления вектором
управление тоже

Трещина
разделите ваши данные на любое 1 поле, и вы будете считать.
гораздо более не элегантный, чем решение ship.ship

Брэд Несом
источник
2
Пожалуйста, рассмотрите возможность проголосовать за понравившиеся ответы!
whuber
3
Самостоятельное голосование запрещено!
Брэд Несом