QGIS中的ID列是否有一种auto_increment的方法


22

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

我不需要特殊的排序,例如最大的多边形得到的ID最小。我只是需要所有多边形 一个ID结尾,没有 手动像我现在要做的。

如果有人知道该怎么做会很棒。


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

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

好吧,我在QGIS中创建了一个形状,另存为Geojson,这很好。对不起,也许我以错误的方式回答了您的问题?
kwoxer'1

Answers:


26

使用字段计算器是一种方法:

没有提供ID

  1. 数字化每个功能,而无需输入任何ID。
  2. 导出之前,使用字段计算器使用表达式“ $ Id”更新唯一ID。

没有提供ID

已经提供了一些ID

  1. 如果您已经有ID,则可以使用“-$ Id”。确保仅选择新功能,这意味着id行中的“ NULL”。只需订购该列即可。
  2. 现在执行图片中的步骤:

在此处输入图片说明 在此处输入图片说明


是的,太棒了 超级简单,可以正常工作。谢啦。顺便说一句:也许您知道如何在已经存在的现有ID上执行此操作?如果执行此操作,则得到-2 -3,依此类推
kwoxer 2015年

找到了解决方案并将其添加到您的帖子中。再次感谢。
kwoxer'2

6

哈利路亚!或尤里卡。管他呢。可以做到的。带有shapefile。

  1. 如果还没有,请添加一个字段,其中包含“ 整数(整数)类型的功能部件ID,例如“ FID” 。
  2. 打开图层属性(图层上单击鼠标右键,选择属性...或双击图层),点击属性窗体选项卡,然后在通用取消选中编辑并下默认领域默认值类型maximum("FID") + 1

取消选中Editable,您将无法输入其他值或删除其中的内容。请注意,如果有些值没有ID,则不会更新这些值。在某些时候,我将尝试检查“ 在更新时应用默认值”并修改公式以检查零或NULL值,以便仅在编辑记录时更新那些记录,而不是任何值大于1的记录。(在此早期版本)帖子中讨论了如何使用唯一值更新FID字段,如果在shapefile中已经包含特征之后添加该字段,则需要执行此操作。)

请注意,这是与当前地图文件(而不是shapefile)一起保存的,因此要多次添加该shapefile,将需要将图层样式的该部分复制到新添加的图层中。为此,请右键单击图层,选择“样式”>“复制样式”>“字段”,然后右键单击另一层,选择“样式”>“粘贴样式”>“所有样式类别”(或继续至“ 字段”)。您还可以根据shapefile将样式的该部分复制到其他任何层,但是ID字段必须与要复制的层具有相同的名称。

图层属性


请注意,要使此功能起作用,您必须至少创建一个功能并键入其FID,然后将属性形式更改为默认值。否则,您将获得NULL FID。
Techie_Gus

5

我想添加到vinayan的帖子中,并简要提到rownum函数,因为它非常相似,在某些情况下可能更方便一些。

在此处输入图片说明

id返回功能部件ID,这意味着它始终从零开始
rownum返回行号,这意味着它从 1开始。

在此处输入图片说明

因此,基本上,如果您希望自动递增从0开始,则使用$ id;如果希望自动递增从1开始,则选择$ rownum


尝试了,确实是一个很好的解决方案。但是在这里使用这种解决方案,如果您已经有一些ID并希望保留它们,那么rownum函数就不好了。该功能始终从1开始。上面的方法虽然更难设置,但是却更加智能。因此,感谢您的替代选择,但现在ID函数是我的首选解决方案=)
kwoxer 2015年

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 2015年

放弃.SHP可能会更容易!谁知道它将带给您什么样的新冒险……
DPSSpatial

2

旧帖子,但是对于寻找快速解决方案的任何其他人,都是创建一个$ ID + 1的字段,它将自动从1开始生成!


2

QGIS 3更新

我知道我已经很晚了,但是总是能提供任何更新:

在QGIS 3中,现在有一个本机工具可以用来完成这项工作,它称为“添加自动增量字段”

无需在现场计算器中使用表达式或进行任何编码,但是尽管如此,它们仍然非常有用并且广为人知。

在此处输入图片说明


1

最简单的方法可能是使用python脚本,也可能使用字段计算器。抱歉,我没有一个适合您,也许会有其他人。同时,我将为其搜索python脚本。对于ArcGIS,我已经了解了很多,但是我敢肯定QGIS还有一些东西。


最好是,如果真的没有功能请求。如果它是一键式解决方案,我也不想在QGIS之外添加python脚本。但是谢谢你。
kwoxer'1

1

如果您不需要人类可消化的东西,现在可以轻松解决:在现场属性中,选择“ UUID Generator”,并将所有内容留空。

这将在该字段中自动创建一个UUID。不像简单的数字(按$ id或$ rownum那样)友好,但是从一开始就生成UUID,因此没有连续的步骤。在此处输入图片说明



0

这些解决方案在QGIS 2.01 Dufour中不再对我有用。$id在表达式输入字段中键入新的或现有的名为“ id”的字段给我一个错误“表达式无效”

起作用的是键入函数$rownum,然后单击“确定”

在此处输入图片说明


0

您可以删除第一个colmn(id)并创建一个新的“作为虚拟字段” 在此处输入图片说明 在此处输入图片说明

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.