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

还有其他方法可以使用搜索查询生成器吗?

#1 楼

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

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

#2 楼

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

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


假设FieldWithDuplicates是属性包含重复项(在下面的屏幕快照中为TreeID)。
在以下情况下启用条件格式设置(请参见下面的红色箭头):

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


将所有重复项分组为在顶部,右键单击该列,选择Sort
,输入不带>1的上述表达式,然后取消选择Ascending升序。



突出显示具有重复属性的功能canvas:

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

当然,您可以基于相同的条件启用数据派生的覆盖。

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

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


实现以下内容



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

评论


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

– maxwhere
19年7月4日在9:50

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

– she_weeds
19年7月15日在8:47

如@caiohamamura所建议,该表达式可以稍微简化为:count(1,“ FieldWithDuplicates”)> 1

–onietosi
20 Jul 15'15:13



#3 楼

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

#4 楼

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

#5 楼

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

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

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



#6 楼

这是我的脚本,用于删除具有相同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
 


#7 楼

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

我喜欢Rayo的建议。除了统计员不能像我想的那样工作。
它的确提供了一个唯一值的计数,但对这些值的含义却无济于事。
另一个软件可能会添加一个计数字段并允许您将其导出为csv或其他电子表格格式。


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


将数据拆分到任意1个字段和dyou上将会有您的数量。
比ship.ship的解决方案更优雅

#8 楼

我想知道为什么没有人建议仅对查询使用Select By Expression工具:
COUNT(1, "attribute")>1

然后将选择所有重复attribute的功能,然后可以过滤,保存选择或执行任何操作您需要。

#9 楼

caiohamamura的回答解决了一个相关的问题:在粘贴了另一层的要素后,fid字段(应该是唯一的)具有一些重复项。我不允许保存该图层!
在属性表的过滤器下拉菜单页面左下方的属性表中,我找到了高级过滤器(表达式)并输入:
Count(1, "fid")>1

我要添加到主题的内容是:编辑fid值时,您必须在属性表窗口右下角单击“应用”以更新过滤器。然后,您的清单随即减少,只显示剩余的重复项。

#10 楼

您可以使用pyqgis和collections。Counter:
def findduplicates(layername, fieldname):
    from collections import Counter
    lyr = QgsProject.instance().mapLayersByName(layername)[0]
    c = Counter([f[fieldname] for f in lyr.getFeatures()]) #Count elements
    for i in c.copy(): #Delete if count <=1
        if c[i] <= 1:
            del c[i]
    print('There are {0} repeated {1}s, selecting...'.format(len(c), fieldname))
    processing.run("qgis:selectbyexpression", 
    {'INPUT':lyr.source(),
    'EXPRESSION':'"{0}" in {1}'.format(fieldname,tuple(c)),'METHOD':0}) #Select