geodatabase中如何获取feature class的ObjectID

来源:互联网 发布:mac销量 编辑:程序博客网 时间:2024/05/27 06:54
ArcGIS geodatabase数据库中,所有的空间数据表(feature class)都带有objectid字段,该字段是ArcGIS自动创建和维护的主键字段。在一个feature class中,该字段的只不允许为空或重复。当我们在应用程序中,通过SQL的方式往feature class表中插入记录或将一个feature class的数据迁移到另一个feature class表中时,如何自动生成objectid字段的值,保证唯一性,是我们经常遇到的问题。以Oracle geodatabase为例,Arcgis SDE用户下提供了一个函数专门用于生成objectid的值。该函数的用法如下:

.next_rowid (

, )

其中,geodatabase administrator schema就是我们创建geodatabase后,在oralce中创建的arcgis管理员用户,一般为sde用户。
该函数有两个入参,分别为:
table owner为我们所要生产objectid值得feature class所在的数据库用户名。
table name为我们要生产objectid值得feature class名称。
函数返回Integer类型的objectid值,该值保证是和该表中现有记录的objectid值不存在重复。

比如,我们需要将一个feature class表中的记录插入到另一个feature class中,可以一通过如下SQL语句实现:

INSERI INTO c_cblseg_l_backup(objectid, g3e_fid,name,code,shape)
SELECT sde.next_rowid(‘shtfm’,’c_cblseg_l_backup’) objectid,
g3e_fid,name,code,shape
FROM c_cblseg_l_1

INSERI INTO c_cblseg_l_backup(objectid, g3e_fid,name,code,shape)
SELECT sde.next_rowid(‘shtfm’,’c_cblseg_l_backup’) objectid,
g3e_fid,name,code,shape
FROM c_cblseg_l_2

通过此方式,可以保证两句INSERT INTO语句执行后,所插入到c_cblseg_l_backup表中的objectid字段值不会重复。即使在c_cblseg_l_1和c_cblseg_l_2中的数据objectid值都是从1开始编号的,即存在重复的情况。

另外,需要注意的是,使用此函数的表,一定是在ArcGIS geodatabase中注册的feature class(通过ArcMap创建的feature class即为geodatabase中注册的表。),未注册的表使用此函数,会如下报错。
INSERT INTO webman.logins (id, l_name)
VALUES
(sde.gdb_util.next_rowid(‘WEBMAN’, ‘LOGINS’), ‘maplebutter’);

(sde.gdb_util.next_rowid(‘WEBMAN’, ‘LOGINS’), ‘maplebutter’);
*
ERROR at line 3:
ORA-20220: Class WEBMAN.LOGINS not registered to the Geodatabase.

0 0
原创粉丝点击