当我们创建一个Shapefiles(shp), geodatabase feature classes(gdb中的要素类)或独立的dBase表(dbf)时,ArcGIS会自动为上述三种格式创建一个ID字段,这个ID是由ArcGIS来管理,是不能手动更改或删除的。它被用于指定Shapefiles, geodatabase feature classes或dBase表中的每条记录。因此这个ID是唯一的。
*****
```
我们日常工作中经常会面对三种ArcGIS中的ID,分别是FID、OBJECTID和OID。他们之间的区别是什么呢?
```
> 说明一下,图中ID可以理解为属性内容,它与FID、OBJECTID和OID都没有任何关系,示例数据没有做好命名,若造成误导还请理解。
## FID
- FID存在于shapefile中,它的值从0开始。
- 在shapefile中新增一个图形,则属性表中相应的增加一条记录,该记录的FID按顺序编号。
- 在shapefile中删除一条记录时,FID会重新编号,编号之间保持顺序,没有间隔。
- 如下图所示,删除了FID为2的记录,则其余FID重新编号。
![](https://img.kancloud.cn/7e/66/7e660ea36d1fcb7d1775cd3561d3a0f1_1279x550.png)
- 如下图所示,对FID为1的图形进行切割后,生成了新的图形被赋值为新FID-4。
![](https://img.kancloud.cn/77/73/77737446c65286b23e35a3859d486b52_1283x550.png)
- 需要注意的是,当编辑状态下,会因为某些不知道的什么原因,显示出现BUG,甚至连记录的数量都显示不正确。当出现这种情况时,我们只需要保存编辑,重新打开即可。
## OBJECTID
- OBJECTID存在于.gdb数据库中的geodatabase feature classes(要素类)或geodatabase table(表)中,它的值是从1开始。
- 如果一个 geodatabase feature class 或者一个 geodatabase table中的一条记录被删除了, OBJECTID不会重新编号, 并且列表中的间隔会保存。
- 如下图所示,删除了FID为3的图形后,OBJECTID并没有重新编号。
![](https://img.kancloud.cn/61/4f/614f6f58044cd1286e6127522bec9a8a_1285x469.png)
- 如下图所示,对2和4图斑进行了多次切割,新生成的图形,其OBJECTID按现有记录继续向下编号,没有占用之前删掉的OBJECTID-3。
![](https://img.kancloud.cn/84/58/84587a63a93c4bb8886166b42f85116e_1285x492.png)
- 同样在.gdb数据中新建Table表,对表进行编辑时,OBJECTID不会重新编号, 并且列表中的间隔会保存。
![](https://img.kancloud.cn/0e/23/0e23e71a904f611be6a4bc238a0c1cc4_592x128.png)
## OID
- OID存在于独立的dBase表格中,格式为.dbf,它的值是从0开始
- 当dBase表格中的一条记录被删除了,OID会从0开始重新编号,编号之间没有间隔。
## 三者之间的转换
- 当一个geodatabase feature class被导出或者转换成shapefile的格式,输出shapefile中的记录将被从0开始按顺序重新编号。
- 我们将之前OBJECTID为1/2/4/5/6/7的要素类导出为shapefile格式,查看其属性表变化如下:
![](https://img.kancloud.cn/85/9c/859ca81808d929b2a4dd571c92b09161_787x304.png)
可以看到导出后的shapefile新增了一个FID字段,且编号从0开始顺序编号,中间没有间隔。而其中OBJECTID则继承原要素类的OBJECTID值,并变成了一个可编辑的字段。
- 当一个geodatabase 表格被导出成dBase格式, 输出dbf表格中的记录将被从0开始按顺序重新编号。
- 当一个geodatabase feature class被导出或者转换到一个新的 geodatabase feature class, 输出的feature class 中的记录将被从1开始按顺序重新编号。
![](https://img.kancloud.cn/0e/c5/0ec561f6a74753b3e06ee7430ffe2cf9_753x276.png)
可以看到将geodatabase feature class导出到另一个gdb数据库中后,OBJECTID被从1开始重新编号。也就是说一组数据经过两个数据库之间的转换后,如果直接按OBJECTID进行连接将有可能不再准确对应(原geodatabase feature class进行过删减操作)。
- 当一个geodatabase table 被导出或者转换到一个新geodatabase table, 输出的table中的记录将被从1开始按顺序重新编号。
- 当一个shapefile导入或转换到geodatabase feature class中,输出的feature class中将没有FID,会出现一个OBJECTID,并从1开始重新编号。
![](https://img.kancloud.cn/b0/6d/b06dd792a8e97b3b30575852a0d41ebb_483x269.png)
在选择字段用来Join或者Relate表格的时候,需要注意这些特点。如果一个 shapefile要使用FID 和 OBJECTID 来Join到一个feature class, 由于feature class 没有一条记录是OBJECTID = 0,所以shapefile的FID = 0的记录将不会与feature class 中的任何一条记录相匹配。