我正在创建虚拟地图,因此需要创建许多点,线和确定的多边形。稍后,我将数据导出为geojson。但是在此之前,我必须离开并给每个元素一个唯一的ID。

我不需要特殊的排序,例如最大的多边形得到的ID最小。我只需要结尾处带有ID的所有多边形,而无需像现在必须手动那样进行操作。

如果有人知道如何做,那将是很棒的。

评论

您是否在使用shapefile?每次导出后ID是否必须相同,还是可以在每次编辑会话之后填充ID字段?

如何通过脚本创建多边形,在QGIS桌面中数字化或从shapefile复制等?

好吧,我在QGIS中创建了一个形状,另存为Geojson,这很好。抱歉,我可能以错误的方式回答了您的问题?

我想补充一点,当您使用postgreSQL数据库层时,这似乎不起作用。 $ ID和$ rownum都返回0。PostgreSQL 9.6 QGIS 2.18.12

#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类型的字段中增加的唯一值。

准备导出为G​​EOJSON时,都已设置了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