还有其他方法可以使用搜索查询生成器吗?
#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
实现以下内容
当然,在两种情况下,一旦删除或更改重复属性,格式/样式就会立即更新。
#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
评论
这是迄今为止最合法的答案。我只是想补充一点,该表达式也可以直接与标准查询工具一起使用。
– 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