您的位置:首页 > 移动开发 > Objective-C

geodatabase中如何获取feature class的ObjectID

2015-10-14 21:59 731 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 objectID arcgis