Identificando atributos duplicados no campo usando o QGIS?


27

Eu tenho um shapefile de ponto com milhares de pontos. Ele possui um campo de código de identificação que deve ser exclusivo. De vez em quando, o recepcionista digita incorretamente o ID, criando duplicatas. No momento, estou rolando manualmente o campo para encontrar a duplicata.

Existe outra maneira de fazer isso usando o Search Query Builder?


5
Se você precisar impor exclusividade eu recomendo usar um banco de dados, por exemplo Postgres / PostGIS, Spatailite
Nathan W

Eu tenho um problema similar. Eu tenho um grande arquivo de forma que contém quadrados UTM nos quais certas espécies ocorrem (até 5 em um quadrado, principalmente 2). No entanto, tenho um problema ao visualizar todos eles em um mapa, pois eles se sobrepõem exatamente. As opções de mesclagem parecem horríveis. Minha solução alternativa seria dividir os polígonos em partes iguais, dependendo da quantidade de espécies no quadrado UTM: Antes: o quadrado mostra 1 cor, mas deve mostrar duas, pois duas espécies ocorrem ! [Antes: o quadrado mostra 1 cor, mas deve mostrar duas ] ( i.stack.imgur.com/6WqKn.jpg ) depois: dividiu o quadrado s #
Hannes Ledegen

Eu acho que você deveria abrir uma nova pergunta em vez de postar a sua aqui no final.
Jens

Respostas:


7

Se os IDs forem consecutivos, eu adicionaria uma nova coluna temporária com valores exclusivos como @ Ship.shp sugeridos e, em seguida, usaria o construtor de consultas para procurar o ID! = UniqueID.

Isso retornaria as duplicatas diretamente. Após corrigir os IDs originais, remova a coluna extra ou repita todo o processo, conforme necessário - não está claro que tipo de padrão seus IDs devem corresponder. Se eles precisarem ser exclusivos, observe primeiro o último valor e você poderá editar os IDs inválidos em uma iteração, apenas aumentando o número à medida que avança.


18

Outra gráfica, dinâmica e mais importante simples maneira de detectar atributos duplicados: Construtor de expressão uso do QGIS.

Destaque duplicatas na tabela de atributos :

Ative a formatação condicional (veja a seta vermelha abaixo) com a seguinte condição:

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

Para agrupar todas as duplicatas na parte superior, clique com o botão direito do mouse na coluna, selecione Classificar
Digite a expressão acima sem o >1e desmarque Classificar em ordem crescente.

atributos duplicados destacados na tabela de atributos QGIS

Destaque recursos com atributos duplicados na tela :

Você pode adicionar um novo símbolo ou rótulo com o filtro definido para a condição acima.

E, é claro, você pode ativar uma substituição derivada de dados com base no mesmo.

Por exemplo, se você deseja destacar rótulos para recursos com um atributo duplicado, é possível configurá-lo para desenhar um segundo plano de rótulo (= 1) com a seguinte substituição:

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

para conseguir algo como o seguinte

rótulos de atributo duplicados destacados na tela do QGIS

Em ambas as situações, é claro, depois de excluir ou alterar os atributos duplicados, a formatação / estilo é atualizada instantaneamente.


11
Esta é de longe a resposta mais legítima aqui. Eu só queria acrescentar que a expressão também pode ser usada diretamente com a ferramenta de consulta padrão.
maxwhere

@maxwhere, o Query Builder usado para filtrar camadas? Parece que não consigo filtrar os resultados no Q 3.4 ou 3.8, embora eu esteja surpreso por não ter gerado um erro como costumava no Q 2.x.
she_weeds 15/07

14

Use o plug-in Estatísticas do grupo e defina o ID como uma classificação de campo. Você pode ver quantas vezes cada valor foi inserido na coluna 'contagem'.


13

Uma maneira rápida (embora deselegante) de fazer isso é acessar as propriedades da camada, selecione Estilo - categorizado usando a coluna da qual você está interessado. Aplique isso e clique com o botão direito do mouse na camada na janela de camadas e verifique a opção Mostrar contagem de recursos caixa de seleção. Em seguida, expanda a camada na janela de camadas e você pode ver imediatamente quantas vezes cada valor foi inserido.


11

Esta é uma boa pergunta sobre a qual acabei de me deparar. Não gosto de nenhuma das respostas que foram dadas até agora. Eu tenho um conjunto de dados válido com IDs únicos que não são seqüenciais e não inteiros. O problema é que o conjunto de dados contém geometrias únicas, mas alguns limites são de geometrias múltiplas por natureza. Minha tarefa é identificar e unir essas geometrias.

Eu recomendo usar o DB Manager e o SQL para esse tipo de trabalho. O DB Manager agora faz parte do QGIS. Você precisa exportar seus dados para um conjunto de dados PostGIS ou SpatiaLite. O SpatiaLite deve ser o formato de dados baseado em arquivo de qualquer maneira.

Agora você pode usar count (), agrupar por e ordenar conforme desejar e deve poder resolver esse e outros problemas rapidamente.

insira a descrição da imagem aqui


11
Usar um plug-in SQL é o melhor caminho a seguir!
Devdatta Tengshe

Bom, funciona. Como seria selecionar o recurso (de duplicatas) com um valor mínimo / máximo em outra coluna de atributo? Eu não conseguia descobrir. Você poderia me ajudar por favor?
christian.gobel

Não tenho certeza se entendi. O intervalo (entre mínimo e máximo) define se um registro é duplicado?
Dennis Bauszus 12/04

4

Sim, eu bati minha cabeça contra a parede por um problema semelhante.

Aqui está o meu script para remover recursos com os mesmos IDs. Ele pega o primeiro recurso com mais de um atributo de índice e o grava na nova classe de recurso.

#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

Além disso, você pode usar a divisão por atributo e acabar com uma tabela separada para cada valor.

Mas eu gosto da sugestão de Rayo. exceto que estatista não funciona como eu pensava.
Ele fornece uma contagem de valores exclusivos, mas não ajuda com o que esses valores são.
Outro software pode adicionar um campo de contagem e permitir exportá-lo para csv ou outro formato de planilha.

statst
Minha sugestão para a camada dividida por atributo está nas ferramentas de gerenciamento de vetores
gestão também

Dividido
divida seus dados em qualquer campo 1 e você terá suas contagens.
muito mais deselegante que a solução ship.ship


2
Por favor, considere votar as respostas que você gosta!
whuber

3
auto voto positivo não é permitido!
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.