有一些同事问过我下面这些问题:
- 我们用了oracle spatial sdo_geometry,是不是没用arcsde?
- 我们到底是使用oracle spatial还是arcsde,有点懵!
- 执行了create enterprise geodatabase是不是就表示使用了arcsde?那这个动作到底是做什么呢?
- 我们没用arcsde的服务,为什么你还说我们用了arcsde呢?
- ……
因为问得人很多,我打算将我的理解写下来,与大家交流,以收抛砖引玉之效。
1、什么是ARCSDE
SDE的全称是spatial database engine(空间数据引擎),之所以称之为引擎,是因为所有的空间数据IO都需要通过它来管理。它属于中间件技术,位于客户端和数据库之间,其本身并不能够存储空间数据(存储是由数据库完成),它的作用可以理解为将数据库中的对象(表、视图等)抽象成上层GIS应用可以认识的概念,例如feature、feature class等。
2、ARCSDE是怎么工作的
ARCSDE保存了一系统数据库对象,用于管理空间信息,这些对象统称为资料档案库(Repository)。以基于ORACLE数据库的ARCSDE为例,资料档案库包含SDE用户下的数据字典表、存储过程、以及数个.dll文件。数据字典表,用以存储要素类、要素类字段、要素类投影、要素类范围等元数据信息,而存储过程和.dll用于实现对空间数据的GIS运算和操作,例如用于计算polygon周长的方法。
3、空间数据是如何存储的
上文已经说过,ARCSDE并不能够存储空间数据,数据都是存储在RDBMS(关系型数据库)(实际上并不限于RDBMS,ARCSDE也支持非关系型数据库和HADOOP。但现在只谈它与ORACLE SPATIAL的关系,因此,此处说RDBMS)中。以矢量数据为例,它既可以以二近制形式存储为一个BLOB对象,也可以使用RDBMS或ARCSDE提供的矢量数据类型。
最初的时候,即ARCSDE和RDBMS还未提供矢量数据类型之前,所有的数据都是以序列化的二近制形式存储,在数据库里表现为一个BLOB字段。
以BLOB字段的形式存储,虽然解决了存储的问题,但却没能很好地利用RDBMS的能力。例如,它不能用SQL操作(所谓SQL操作,就是我们直接使用SQL语句的增删改对空间数据进行操作,而不是非得用ArcEngine的接口函数对数据进行操作)非常便捷地处理空间数据(处理BLOB需要反序列化)。为了更好地利用RDBMS的资源,从ARCSDE 9.2开始,提供了一个结构化的数据类型——ST_GEOMETRY。由于数据是结构化的,所以通过SQL查询空间数据即可了解数据内容,通过SQL即可非常便捷地对数据进行各种操作(例如更新)。这样的好处是显示易见的,它突破了ARCGIS的种种障碍限制,在特定的环境下特别是用户的数据都是简单的点线面,并且业务只有相关的编辑方面,无需SDE版本要求时,SQL操作将非常便捷直观。这些操作其实也降低了操作人员的GIS门槛,但是切记:高便利与高风险是时刻并存的。
除此之外,RDBMS也纷纷推出了自定义的空间数据类型,例如ORACLE的SDO_GEOMETRY。它的作用与ST_GEOMETRY类似。
4、使用ARCSDE的连接方式
在ARCSDE8.1之前,通过ARCSDE连接数据库是一种三层模型。从8.1之后,ArcSDE提供了两种数据联结架构,即两层和三层模型。两层模型即直连、三层模型即ARCSDE服务连接。
ARCSDE服务连接模型如下图:
在ArcSDE Server上运行着1个giomgr进程和多个gsrvr进程。
giomgr即ArcSDE服务器管理进程,该进程一直存在,负责监听用户连接请求,分配相应的gsrvr管理进程,进行空间数据字典的维护。
gsrvr属于这样一种进程:当有客户端请求数据库连接,由giomgr分配名为gsrvr的独立进程来全面负责客户机与服务器的元数据通信。
当使用ArcSDE服务连接时,需要在ArcSDE Server安装RDBMS Client software。在此种连接模式下,客户端通过SDE服务访问数据表后,ArcSDE Server服务器端完成对数据的各种操作,再把操作结果返回客户端。
ARCSDE直连模型如下图:
与ARCSDE服务连接方式不同,gsrvr进程内嵌到客户端,不再需要服务器端ArcSDE服务。ArcSDE直连驱动和ArcSDE服务采用相同的代码构建。不同的是,ArcSDE直连驱动是一系列动态链接库dll,安装和运行于客户端应用程序的进程空间内;而ArcSDE服务是可执行程序,运行于服务器端。
当使用ArcSDE直连时,需要在客户端安装dbms client software。在此种连接模式下,通过SDE访问数据表后,将在客户端本地完成对数据的各种操作(像空间分析,编辑等)。
直连与服务连接下比,优势表现在:
- 直连方式较服务连接方式卸载了20%-40%的负载
- 直连方式降低了服务器端内存的需求
- 直连速度更快
- 直连配置支持FAILOVER,而服务连接不支持RAC架构
- 不需要安装SDE服务,也不需要维护SDE服务
- 实施部署方便,切换环境只需将工具与ORACLE客户端打包即可
- 使用操作系统认证方式连接到数据库,必须使用直连
劣势表现在:
- 对客户端配置要求高
- 所有的客户端都必须安装oracle客户端(或其它数据库连接驱动程序)
- 数据库客户端必须是32位
注意:自ESRI提供直连方式后,ESRI一直推荐使用直连方式。另外,从ARCGIS 10.3之后,不再提供SDE服务(即不再提供sdeservice工具(从ARCGIS 10.1开始,ESRI官方推荐以直连方式连接SDE,因此在SDE安装时不再自动安装SDE服务,需要手动用sdeservice工具来创建服务 ))。
5、ORACLE SPATIAL是什么
ORACLE SPATIAL提供了一套 SQL 方案和函数,用来存储、检索、更新和查询数据库中的空间要素集合。主要由几何数据类型,空间索引机制,一套操作函数,管理工具组成。
对ORACLE数据库而言,实际上ORACLE SPATIAL可以全面取代ArcSDE, ArcSDE提供的能力它几乎都提供了。它除了提供了数据类型SDO_GEOMETRY,还提供了大量的GIS应用API,还实现了渲染与可视化,只是在实现方式上,功能的丰富性、稳定性上与ARCSDE有所不同。
6、Oracle Spatial+ArcSDE是一种怎样的组合
当前,我们很多项目的确是同时使用了Oracle Spatial和ArcSDE。按照第5个问题的回答,我们有一套东西就够了,为什么这里它们同时都被使用了?
在Oracle Spatial+ArcSDE这种应用中,Oracle Spatial提供矢量数据类型,即SDO_GEOMETRY,而ArcSDE负责将使用SDO_GEOMETRY数据类型的表在SDE Repository中注册,只有注册后,应用层的ArcMap、ArcEngine才能认识它。因为对于ArcMap、ArcEngine等应用程序来讲,它没有数据库中表的概念,它只有geodatabase中定义的feature、feature class、feature dataset这些概念。换句话说,之所以要用SDE Repository,是因为我们的项目是基于ArcEngine开发的。如果项目不基于ArcEngine开发,而是使用ORACLE SPATIAL提供的SDK,那么我们完全可以不用SDE Repository,也就完全不需要使用ARCSDE,而是全面使用ORACLE SPATIAL来实现各种GIS操作、渲染与可视化。
7、create enterprise geodatabase到底在做什么
在ARCGIS 10.0(包括10.0)之前,在安装完ARCSDE软件之后,会跳转到post Installation界面。在这里,可以选择创建用户、创建表空间、安装SDE Repository、创建SDE服务等。如下图:
(当选择“complete”时,创建用户、创建表空间、安装SDE Repository、创建SDE服务四个步骤均会执行)
10.1之后,不再需要安装ARCSDE软件,创建SDE用户、SDE表空间、安装SDE Repository都由create enterprise geodatabase功能完成。与10.1之前相比,默认不再创建SDE服务,SDE服务需要用sdeservice工具手动创建(ARCGIS 10.3不再提供该工具)。
8、没有SDE Repository,通过arcmap为何仍然能够看到feature class
从ARCMAP 10.1开始,如果一个带SDO_GEOMETRY数据类型的表未在SDE Repository中注册,甚至没有SDE Repository,也是可以浏览的。此时ARCMAP会根据矢量数据类型,去读取ORACLE SPATIAL的Repository(元数据表),即user_sdo_geom_metadata,只要能够获取到该图层在oracle spatial中的元数据信息,也可以在arcmap中浏览。但此时也仅限于浏览,因为没有SDE Repository,sdo geodatabase模型的高级功能,如拓扑构建、版本管理等特性将无法使用。
9、Oracle Spatial+ArcSDE算不算用了ARCSDE
算,只要使用SDE Repository就等于说使用了ArcSDE。