¿Identificando atributos duplicados en el campo usando QGIS?

27

Tengo un archivo de forma de puntos con miles de puntos. Tiene un campo de código de identificación que se supone que es único. De vez en cuando, el empleado de entrada de datos escribe incorrectamente la ID creando duplicados. En este momento estoy desplazando manualmente el campo para encontrar el duplicado.

¿Hay otra forma de hacer esto usando el generador de consultas de búsqueda?

obsidianz
fuente
55
Si necesita hacer cumplir la singularidad, recomendaría usar una base de datos, por ejemplo, Postgres / PostGIS, Spatailite
Nathan W
Tengo un problema similar. Tengo un gran archivo de forma que contiene cuadrados UTM en los que se producen ciertas especies (hasta 5 en un escuadrón, en su mayoría 2). Sin embargo, tengo un problema para visualizarlos todos en un mapa, ya que se superponen exactamente. Las opciones de mezcla se ven horribles. Mi solución sería dividir los polígonos en partes iguales dependiendo de la cantidad de especies en el cuadrado UTM: Antes: ¡el cuadrado muestra 1 color pero debería mostrar dos ya que ocurren dos especies ! [Antes: el cuadrado muestra 1 color pero debería mostrar dos ] ( i.stack.imgur.com/6WqKn.jpg ) después: dividido el cuadrado s
Hannes Ledegen
Creo que deberías abrir una nueva pregunta en lugar de publicar la tuya aquí al final.
Jens

Respuestas:

7

Si las ID son consecutivas, agregaría una nueva columna temporal con valores únicos como @ Ship.shp sugerido y luego usaría el generador de consultas para buscar ID! = UniqueID.

Eso devolvería los duplicados directamente. Después de corregir las ID originales, elimine la columna adicional o repita todo el proceso según sea necesario; no está claro qué tipo de patrón deben coincidir con sus ID. Si solo necesitan ser únicos, primero tenga en cuenta el último valor y luego puede editar las ID incorrectas en una iteración, simplemente pasando el número a medida que avanza.

lynxlynxlynx
fuente
18

Otra forma gráfica, dinámica y, lo más importante, simple de detectar atributos duplicados: use el generador de expresiones de QGIS.

Resalte duplicados en la tabla de atributos :

Habilite el formato condicional (vea la flecha roja a continuación) con la siguiente condición:

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

Para agrupar todos los duplicados en la parte superior, haga clic con el botón derecho en la columna, seleccione Ordenar
Ingrese la expresión anterior sin el >1, y anule la selección de Ordenar ascendente.

atributos duplicados resaltados en la tabla de atributos QGIS

Resalte las características con atributos duplicados en el lienzo :

Puede agregar un nuevo símbolo o etiqueta con el filtro establecido en la condición anterior.

Y, por supuesto, puede habilitar una anulación derivada de datos basada en lo mismo.

Por ejemplo, si desea resaltar etiquetas para entidades con un atributo duplicado, puede configurarlo para dibujar un fondo de etiqueta (= 1) con la siguiente anulación:

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

para lograr algo como lo siguiente

etiquetas de atributos duplicados resaltadas en el lienzo QGIS

En ambas situaciones, por supuesto, una vez que eliminas o cambias los atributos duplicados, el formato / estilo se actualiza instantáneamente.

she_weeds
fuente
1
Esta es, con mucho, la respuesta más legítima aquí. Solo quería agregar que la expresión también se puede usar directamente con la herramienta de consulta estándar.
maxwhere
@maxwhere, ¿quieres decir en el generador de consultas utilizado para filtrar capas? Parece que no puedo hacer que filtre los resultados en Q 3.4 o 3.8, aunque me sorprende que no arroje un error como en Q 2.x.
she_weeds
14

Use el complemento Group Stats y establezca la ID como una clasificación de campo. Puede ver cuántas veces se ha ingresado cada valor en la columna 'contar'.

Rayo
fuente
13

Una forma rápida (aunque poco elegante) de hacer esto es ir a las propiedades de la capa, seleccionar Estilo - Categorizado usando la columna que le interesa. Aplicar esto, luego hacer clic derecho en la capa en la ventana de capas y verificar el Recuento de características caja. Luego expanda la capa en la ventana de capas e inmediatamente podrá ver cuántas veces se ingresó cada valor.

Ship.shp
fuente
11

Esta es una buena pregunta en la que me tropecé. No me gusta ninguna de las respuestas que se han dado hasta ahora. Tengo un conjunto de datos válido con ID únicos que no son secuenciales ni enteros. El problema es que el conjunto de datos contiene geometrías individuales, pero algunos límites son de geometría múltiple. Mi tarea es identificar y unir estas geometrías.

Recomiendo usar DB Manager y SQL para este tipo de trabajo. El DB Manager ahora es parte de QGIS. Debe exportar sus datos a PostGIS o un conjunto de datos SpatiaLite. De todos modos, SpatiaLite debería ser el formato de datos basado en archivos de elección.

Ahora puede usar count (), group by y order by como desee y debería poder resolver este y otros problemas con bastante rapidez.

ingrese la descripción de la imagen aquí

Dennis Bauszus
fuente
1
¡Usar un complemento SQL es la mejor manera de hacerlo!
Devdatta Tengshe
Bien, funciona. ¿Cómo sería seleccionar la función (de duplicados) con un valor mínimo / máximo en otra columna de atributos? No pude entenderlo. ¿Usted me podría ayudar por favor?
christian.gobel
No estoy seguro si entiendo. ¿El rango (entre mínimo / máximo) define si un registro es un duplicado?
Dennis Bauszus
4

Sí, me golpeé la cabeza contra la pared por un problema similar.

Aquí está mi script para eliminar características con las mismas ID. Toma la primera entidad con más de un atributo de índice y la escribe en una nueva clase de entidad.

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

También puede usar la división por atributo y terminar con una tabla separada para cada valor.

Sin embargo, me gusta la sugerencia de Rayo. excepto que statist no funciona como yo pensaba.
Da una cuenta de valores únicos pero no ayuda con cuáles son esos valores.
Otro software podría agregar un campo de recuento y permitirle exportarlo a csv u otro formato de hoja de cálculo.

statst
Mi sugerencia para la capa dividida por atributo está en las herramientas de administración de vectores
gestión también

división
divida sus datos en cualquier campo 1 y tendrá sus cuentas.
mucho más poco elegante que la solución de ship.ship

Brad Nesom
fuente
2
¡Por favor considera votar las respuestas que te gustan!
whuber
3
¡el voto personal no está permitido!
Brad Nesom el