使用QGIS识别字段中的重复属性?


27

我有一个包含数千个点的shapefile文件。它具有一个应该唯一的ID码字段。数据输入服务员有时会错误地键入ID,从而创建重复项。现在,我正在手动滚动字段以查找重复项。

使用搜索查询生成器还有另一种方法吗?


5
如果需要强制唯一性,我建议您使用数据库,例如Postgres / PostGIS,Spatailite
Nathan W

我有一个类似的问题。我有一个很大的shapefile,其中包含一些特定种类的UTM正方形(在一平方中最多5个,大多数为2个)。但是,由于它们完全重叠,因此我无法在地图上可视化它们。混合选项看起来很可怕。我的解决方法是根据UTM正方形中物种的数量将多边形分成相等的部分:之前:正方形显示1种颜色,但应显示两种,因为会出现两种物质![之前:正方形显示1种颜色但应显示两种 ] i.stack.imgur.com/6WqKn.jpg)之后:分割了正方形s
Hannes Ledegen

我认为您应该提出一个新问题,而不要在此处最后发表您的问题。
詹斯(Jens)

Answers:


7

如果这些ID是连续的,我将添加一个新的临时列,并使用诸如@ Ship.shp建议的唯一值,然后使用查询生成器搜索ID!= uniqueID。

那将直接返回重复项。固定原始ID后,请删除多余的列或根据需要重复整个过程-尚不清楚您的ID必须匹配哪种模式。如果只需要唯一,请先记下最后一个值,然后可以一次迭代编辑错误的ID,只需随便增加数字即可。


18

检测重复属性的另一种图形,动态,最重要的简单方法是:使用QGIS的表达式生成器。

在属性表中突出显示重复项

在以下情况下启用条件格式设置(请参见下面的红色箭头):

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

要在顶部将所有重复项归为一组,请右键单击该列,选择“排序”,
输入不带的上述表达式>1,然后取消选择“升序”。

在QGIS属性表中突出显示的重复属性

在画布上突出显示具有重复属性的功能

您可以添加一个新的符号或标签,并将过滤器设置为上述条件。

当然,您可以基于该数据启用数据派生的覆盖。

例如,如果要突出显示具有重复属性的要素的标签,则可以将其设置为使用以下替代来绘制标签背景(= 1):

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

实现以下目标

在QGIS画布中突出显示的重复属性标签

当然,在两种情况下,一旦删除或更改重复的属性,格式/样式都会立即更新。


1
这是迄今为止最合法的答案。我只是想补充一点,该表达式也可以直接与标准查询工具一起使用。
maxwhere

@maxwhere,您是指在查询生成器中用于过滤图层吗?我似乎无法获得它来实际过滤Q 3.4或3.8中的结果,尽管我很惊讶它没有像Q 2.x中那样抛出错误。
she_weeds

14

使用Group Stats插件并将ID设置为字段分类。您可以在“计数”列中看到每个值输入了多少次。


13

一种快速(尽管不方便)的方法是进入“图层”属性,选择“样式-使用感兴趣的列进行分类”。应用此样式,然后在“图层”窗口中右键单击该图层并检查“显示要素计数”复选框。然后在“层”窗口中展开该层,您可以立即看到已输入每个值多少次。


11

我只是偶然发现了一个很好的问题。我不喜欢到目前为止给出的任何答案。我有一个有效的数据集,其唯一ID是非连续且非整数的。问题在于数据集包含单个几何图形,但是某些边界实际上是多个几何图形。我的任务是识别并合并这些几何。

我建议使用DB Manager和SQL进行此类工作。DB Manager现在是QGIS的一部分。您需要将数据导出到PostGIS或SpatiaLite数据集中。无论如何,SpatiaLite应该是基于文件的数据格式。

现在,您可以根据需要使用count(),group by和order by,并且应该能够很快解决此问题和其他问题。

在此处输入图片说明


1
最好的方法是使用SQL插件!
Devdatta Tengshe

很好,它有效。在另一个属性列中如何选择具有最小值/最大值的特征(从重复项中选择)?我不知道。请问你能帮帮我吗?
christian.gobel

不确定我是否理解。范围(最小/最大之间)是否定义记录是否重复?
丹尼斯鲍斯

4

是的,我因类似问题而撞在墙上。

这是我的脚本,用于删除具有相同ID的功能。它采用具有多个索引属性的第一个要素,并将其写入新要素类。

#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

您也可以使用split by属性,并为每个值创建一个单独的表。

不过,我喜欢Rayo的建议。除了统计学家不像我想的那样工作。
它的确提供了唯一值的数量,但对这些值没有帮助。
其他软件可能会添加一个计数字段,并允许您将其导出为csv或其他电子表格格式。

地位
我对按属性拆分图层的建议是在矢量管理工具中
管理也

分裂
将您的数据拆分到任意1个字段上,您将拥有自己的数据。
比ship.ship的解决方案更优雅


2
请考虑提高您喜欢的答案!
ub

3
不允许自我投票!
布莱德·尼索姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.