我不需要特殊的排序,例如最大的多边形得到的ID最小。我只需要结尾处带有ID的所有多边形,而无需像现在必须手动那样进行操作。
如果有人知道如何做,那将是很棒的。
#1 楼
使用字段计算器的方法是:在没有输入任何ID的情况下,对每个功能进行数字化处理。
在导出之前,使用字段
calculator用表达式'$ Id'更新唯一ID。
已经提供了一些ID
如果您已经有ID,则可以使用'-$ Id'。确保仅选择新功能,这意味着id行中的“ NULL”。只需订购色谱柱即可。
现在从图片中进行操作:
评论
是的,太棒了超级简单,可以正常工作。谢啦。顺便说一句:也许您知道如何在已经存在的现有ID上执行此操作?如果执行此操作,则得到-2 -3,依此类推
–kwoxer
2015年2月3日在9:57
找到了解决方案并将其添加到您的帖子中。再次感谢。
–kwoxer
2015年2月3日,10:17
#2 楼
哈利路亚!或尤里卡。管他呢。可以做到的。使用shapefile。如果还没有一个,请添加一个字段,其中包含整数(整数)类型的要素ID,例如“ FID”。
打开“图层属性”(在图层上单击鼠标右键,然后选择“属性...”或双击图层),单击“属性表单”选项卡,然后在“常规”下取消选中“可编辑”,在“默认值”下的“默认值”字段中键入“
maximum("FID") + 1
”。通过取消选中“可编辑”,您无法输入其他值或删除其中的内容。请注意,如果有些值没有ID,则不会更新这些值。在某些时候,我将尝试检查“在更新时应用默认值”并修改公式以检查零或NULL值,以便仅在编辑记录时更新那些记录,而不是任何值大于1的记录。(在此早期版本)帖子中讨论了如何使用唯一值更新FID字段,如果在shapefile中已经包含特征之后添加该字段,则需要执行此操作。)
请注意,这与当前的地图文件,而不是shapefile,因此要多次添加该shapefile,则需要将图层样式的该部分复制到新添加的图层中。为此,右键单击图层,选择“样式”>“复制样式”>“字段”,然后右键单击另一层,选择“样式”>“粘贴样式”>“所有样式类别”(或继续至“字段”)。您还可以根据shapefile将样式的该部分复制到任何其他层,但是ID字段必须与要复制的层的名称相同。
评论
请注意,要使此功能起作用,您必须至少创建一个功能并输入其FID,然后将属性形式更改为默认值。否则,您将获得NULL FID。
– Techie_Gus
19-10-10在7:06
您还可以使用以下公式避免使用NULL FID:if(maximum(“ id”)为NULL,1,maximum(“ id”)+ 1)
– LeoC
20 Mar 10 '15在15:13
为防止功能的“ id”在更新后立即增加,此公式应作为默认值使用(选中“更新时应用”复选框)。原因:当使用表达式中的字段时,较新的QGIS版本(在3.14上)不允许取消选中该框(这很奇怪):IF(“ id”为NULL,maximum(“ id”)+ 1) “ID”)
–sn1ks
20 Jun 25'10:31
您也可以将窗口小部件类型设置为Range,并将其最小值设置为1,以避免在表达式中使用“ if”。它在3.16上启用,不需要启用“在更新时应用”选项,它仍然有效。
– Techie_Gus
20年11月2日,10:06
#3 楼
我想添加到vinayan的帖子中,并简要提及rownum函数,因为它非常相似,并且在某些情况下可能更方便。id返回功能ID,表示它始终从零开始。 rownum返回行号,表示它从1开始。
因此,基本上,如果您希望自动递增从0开始,则$ id,如果要从1开始,则选择$ rownum。
评论
尝试了,确实是一个很好的解决方案。但是在这里使用这种解决方案,如果您已经有一些ID并希望保留它们,那么rownum功能就不好了。该功能始终从1开始。上面的方法虽然更难设置,但是却更加智能。因此,感谢您的替代选择,但现在我更喜欢ID函数=)
–kwoxer
15年2月13日在8:32
#4 楼
这个话题出现在这里:在QGIS中使用自动增量主键创建Shapefile我的建议是:
1)SQLITE / SpatialLite数据库支持字段的自动增量设置为INTEGER PRIMARY KEY:
在INSERT上,如果未明确给ROWID或INTEGER PRIMARY KEY列
指定值,则将自动用
未使用的整数,通常比当前使用的最大ROWID多一个
。无论是否使用AUTOINCREMENT
关键字,都是如此。
每次编辑/创建多边形时,您都可以填写其属性,SQLITE会给予它在已设置为INTEGER PRIMARY KEY类型的字段中增加的唯一值。
准备导出为GEOJSON时,都已设置了UNIQUE ID。
2)如果使用Shapefile,请在每次编辑/创建多边形并需要导出多边形时,创建一个INTEGER类型的OBJECTID字段,并使用一个字段计算器表达式来填充该字段。您将失去一个多边形曾经拥有的原始ID,但这是使用.SHP来实现此目标的唯一方法。 (我必须找到字段计算器表达式)。
PostGIS是您可能想探索的另一个数据源,尽管比SQLITE繁重,但您可能会在这样的系统中找到价值前进...
评论
感谢您的解释。但是,我认为直接在工具中使用auto_increment选项不是一个好的解决方案。我已经有很多数据格式,并且不想要其他工具。也许我有空的时候应该为此写一个插件...
–kwoxer
15年1月29日在19:57
放弃.SHP可能会更容易!谁知道它将带给您什么新的冒险...
– DPSSpatial
15年1月29日在19:59
#5 楼
旧帖子,但是对于寻找快速解决方案的任何其他人,都是创建一个$ ID + 1的字段,它将自动从1开始生成!#6 楼
QGIS 3的更新我知道我已经很晚了,但是总是可以提供任何更新:
现在QGIS 3中有一个本机工具,可用于做到这一点,它就被称为“添加自动增量字段”。
无需在字段计算器中使用表达式或进行任何编码,但是这些仍然非常有用并且很容易理解。 />
评论
这将为现有功能创建增量值,但不会为新功能创建增量值。使用bkepl答案为新功能创建增量值。
–皮埃尔·拉辛(Pierre Racine)
20-2-27在22:02
#7 楼
如果您不需要人类可消化的东西,现在可以轻松解决:在现场属性中,选择“ UUID Generator”,并将所有内容留空。
这将自动创建一个字段中的UUID。不像简单的数字(按$ id或$ rownum那样)友好,但是从一开始就生成UUID,因此没有连续的步骤。
#8 楼
您只需删除第一个colmn(id)并创建一个新的“作为虚拟字段”即可。#9 楼
这些解决方案在QGIS 2.01 Dufour中不再对我有用。在表达式输入字段中的新字段或现有字段“ id”上键入$id
会给我一个错误“表达式无效” 起作用的是键入函数
$rownum
,然后单击“确定” 评论
如前所述-仅适用于现有图层。因此不是答案。
– CARTOS
20年7月23日在14:06
#10 楼
最简单的方法可能是使用python脚本,也可能使用字段计算器。抱歉,我没有一个适合您,也许其他人会给您。同时,我将为其搜索python脚本。对于ArcGIS,我已经了解了很多,但是我敢肯定QGIS还有一些东西。评论
最好是,如果真的没有功能请求。如果它是一键式解决方案,我也不想在QGIS之外添加python脚本。但是谢谢你。
–kwoxer
15年1月29日在18:38
不,这也不是一种用户友好且简便的方法。
–卡通
20/07/23在14:07
评论
您是否在使用shapefile?每次导出后ID是否必须相同,还是可以在每次编辑会话之后填充ID字段?如何通过脚本创建多边形,在QGIS桌面中数字化或从shapefile复制等?
好吧,我在QGIS中创建了一个形状,另存为Geojson,这很好。抱歉,我可能以错误的方式回答了您的问题?
我想补充一点,当您使用postgreSQL数据库层时,这似乎不起作用。 $ ID和$ rownum都返回0。PostgreSQL 9.6 QGIS 2.18.12