ArcSDE杂谈

1、 ArcSDE的理解

是ESRI推出的一个空间数据引擎,我一直简单的理解为一个“插件”,它让数据库(Oracle、PG、SqlServer等主流关系型数据库)有了管理空间数据的能力,建立GIS与RDBMS之间的桥梁。

注意:

  • Oracle本身也可以通过Oracle Spatial等方式处理空间数据,但是在灵活性、效率、存储、开发体系等方面和ArcSDE还是有较大差距的,而且二者并非互斥关系,可以同时使用,有兴趣的可以单独了解一下,而且并不是这里不做扩展。

2、 连接方式

SDE有直连和服务连接两种方式。

  • 服务连接(三层连接)主要在10之前的版本使用,现在很少使用,了解一下即可。服务连接会建立一个“esri_sde”的服务,服务默认端口号是5151,通过gsrvr、gimgr进程管理连接,此种方式负载主要在服务端。ArcSDE 服务自 ArcGIS 10.3 起不再可用。但是,ArcGIS 10.3.1 和更高版本的客户端仍可以使用 ArcSDE 服务连接到 10.1 或 10.2.x 版本的地理数据库(地理数据库和 ArcSDE 服务的软件版本必须保持)。

      image

  • 直连方式(双层连接),通过使用数据库管理系统的连接方法和客户端应用程序中的数据库驱动程序来实现。无需使用 ArcSDE 服务从客户端直接连接到数据库,此种方式负载在客户端。直连方式在负载、效率方面更有优势。ESRI也建议使用直连方式。

     image

对于服务连接和直连方式,其连接数据库参数也有所区别:

imageimage

注意:

在ArcGIS10之前,ArcSDE一般使用服务连接,采用单独的安装包进行安装,在10以及之后版本,提倡使用直连,无需安装单独的ArcSDE软件,直接创建企业级数据库即可(集成在工具箱中)。如果安装有SDE,可以使用SDE命令行工具。

imageimage

ArcGIS Desktop为32位应用程序,如果想要连接数据库,需要安装32位的数据库客户端。

3、 数据存储

我们先来看一个问题,如果我通过ArcCatalog在数据库中导入了DJQ这个面数据,如果我我要删除这个数据,我是否可以在PLSQL中直接DROP掉这个表就行呢?

你会发现手动DROP的表,通过Catalog还可以看到,但是表无法打开了,提示找不到表。

imageimage

DJQ这个表除了在PLSQL中见到的这个表之外,还需要存储其所在的数据集信息,类型信息、索引信息等,这些均存储在sde管理的表中。

那如果我们找到这些关联的表,通过删除关联的记录呢?

这样理论上是可以的,但是何必呢?第一,表关系复杂,要找出来不遗漏会很麻烦;第二,手动操作sde表会有相当大的风险,万一你删错了呢?第三,ArcGIS提供了更便捷的方式,通过Catalog等操作更加方便、安全。

image

在PLSQL中Drop表之后,需要删除相关关联信息,主要包括TABLE_REGISTRY、COLUMN_REGISTRY、GEOMETRY_COLUMNS等表。(可以参考,未测试过,不建议使用,如果需要使用将前面替换为DELETE即可)

SELECT *  from sde.GDB_OBJECTCLASSES where NAME = upper('表名') and owner =upper('用户名') ; --ArcSDE9.3版本使用
SELECT *  from sde.GDB_USERMETADATA where NAME = upper('表名') and owner =upper('用户名') ; --ArcSDE9.3版本使用
SELECT *  from sde.GDB_FEATUREDATASET where NAME = upper('表名') and owner =upper('用户名') ; --ArcSDE 9.3版本使用

SELECT *  from sde.GEOMETRY_COLUMNS where F_TABLE_NAME =upper('表名') and F_table_schema =upper('用户名') ;
SELECT *  from sde.GEOMETRY_COLUMNS where G_TABLE_NAME = upper('表名') and G_table_schema =upper('用户名') ;
SELECT *  from sde.LAYERS where TABLE_NAME = upper('表名') and owner =upper('用户名') ;
SELECT *  from sde.ST_GEOMETRY_INDEX where TABLE_NAME = upper('表名')and owner =upper('用户名') ;
SELECT *  from sde.TABLE_REGISTRY where TABLE_NAME = upper('表名')and owner =upper('用户名') ;
SELECT *  from sde.COLUMN_REGISTRY where table_name = upper('表名')and  owner =upper('用户名') ;
SELECT *  from sde.ALL_ST_GEOMETRY_COLUMNS_V where TABLE_NAME = upper('表名') and owner =upper('用户名') ;
SELECT *  from sde.ST_GEOMETRY_COLUMNS where TABLE_NAME = upper('表名') and owner =upper('用户名') ;
SELECT *  from sde.GDB_ITEMS where name = upper('用户名') ||'.' ||   upper('表名') ;

4、数据编辑

  • 基于版本的编辑:

提前需要对数据注册版本,主要是解决多用户编辑的问题,可以支持多个人员同时编辑一个数据,注册版本后,所有的编辑都是在版本上操作而不是在原始数据上。

  • 直接编辑数据(或者叫非版本编辑):

直接编辑原始数据,编辑人员采用独占方式,一个人在编辑的同事其他人员没法同事进行编辑。

通过sde导入一个表,我们建立用户、表空间(二者名称一直,名称为GIS),在表空间中建立数据集XZQ并导入数据DJQ

通过PLSQL查看

image

注册版本后,登录PLSQL,查看,发现多了下面两张表。

image

A表和D表,其记录编辑历史记录,这就是ArcSDE的版本编辑机制。当然反注册后,A表和D表也会同步消失。

5、ArcSDE主要系统表

参见:http://help.arcgis.com/zh-cn/arcgisserver/10.0/help/arcgis_server_dotnet_help/002n/002n0000008m000000.htm

主要的系统表包括:

  • SERVER_CONFIG:可以设置最大连接数、许可等信息,可以在这里后台更换许可文件。
  • VERSIONS:存储版本信息
  • TABLE_REGISTRY:表注册信息
  • COLUMN_REGISTRY:字段注册信息
  • GDB_ITEMS、LAYERS:存储图层信息等
  • STATE_LOCKS、OBEJCT_LOCKS、LAYER_LOCKS、TABLE_LOCKS表,记录锁信息。

思考:我是否可以通过这些表来获取数据库中所有注册的数据集和图层?后续可以尝试一下,这样就相当于有了一个导出图层内容的工具。

6、ArcSDE常见问题、事项(后续不断补充)

  • 创建的sde用户,一般不在其下面直接存放数据,保证其干净整洁;
  • 默认连接数windows下位48,linux下为64,需要根据实际修改大小并设置TLMINTERVAL为1。

posted on 2023-07-12 11:18  jingkunliu  阅读(167)  评论(0编辑  收藏  举报

导航