有一些同事問過我下面這些問題:
- 我們用了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。