空間數據管理平臺整體設計 正則表達式
隨需而變 柔性再造 數據庫
成都領君科技有限公司 c#
http://www.linjon.cn 安全
2012年11月 服務器
目錄 網絡
1. 引言... 1 負載均衡
1.2. 背景... 1 數據庫設計
1.3. 定義... 1 ide
4.2. GEODBCONNECTIONINFO空間數據庫鏈接信息表... 27
4.6. DataCheckRuleLib質量檢查規則庫... 29
4.7. DataCheckParam 檢查參數配置... 29
4.8. DataCheckError檢查錯誤表... 30
本文檔描述空間數據管理平臺的整體框架、主要功能模塊。
本系統適用於空間數據管理平臺系統管理人員等。
列出本文件中用到專門術語的定義和外文首字母組詞的原詞組。
GIS:Geographic Information System,地理信息系統
SDE:Spatial Data Engineer,空間數據引擎
ESRI:Environment System Research Institute, Inc美國環境系統研究全部限公司。
ArcGIS的數據管理平臺按照物理結構模式進行數據的管理,該種方式不便於對於地理空間數據的綜合管理和維護,爲便於用戶對空間數據的有效管理和維護,特設計並開發了該空間數據管理平臺。
空間數據管理平臺採用樹狀結構方式進行數據的組織和維護,系統主要按空間數據的邏輯關係實現對地理空間數據的有效組織和管理,以知足對數據資源的高度共享及應用的須要。
空間數據管理平臺基於JLKEngine平臺庫進行二次擴展開發,爲知足地理空間數據綜合管理須要而設計的一個應用系統。
系統整體結構以下:
空間數據庫綜合管理平臺 |
JLKEngige核心庫庫 |
邏輯數據管理類庫 |
JLKEngine插件包 |
邏輯數據庫1 |
邏輯數據庫2 |
物理空間數據庫 |
JLKEngine界面庫 |
邏輯數據管理插件包 |
物理空間數據庫 |
邏輯數據庫3 |
空間數據綜合管理平臺是經過邏輯空間數據庫節點實現對不一樣類型空間數據庫的組織和管理,這裏的邏輯空間數據庫都關聯着一個物理空間數據庫鏈接,不一樣邏輯空間數據庫能夠關聯同一個物理空間數據庫鏈接。
數據管理平臺採用邏輯數據庫模型實現對空間數據庫的管理和維護,利用管理平臺能夠將相同類型數據組織到一個邏輯數據庫中,如能夠將數據劃分爲基礎地理空間數據庫、土地利用數據庫、規劃數據庫等等。
每一個邏輯數據庫都定義了一個關聯的空間數據庫鏈接,不一樣邏輯數據庫能夠是相同空間數據庫鏈接,也能夠是不一樣的空間數據庫鏈接。
管理平臺中數據組織管理模型以下:
在邏輯數據庫中能夠創建文件夾,對各種型數據存放到不一樣文件夾下面,邏輯數據庫節點中能夠關聯要素集、單個要素類、柵格數據、數據表各種型數據。
此外,能夠在邏輯數據庫中建立不一樣的地圖對象,並定義圖層數據配置方案,實現數據的快速加載。地圖節點還能夠定義圖件所使用的空間參考系、地圖的裁剪區等參數。
管理平臺進行數據管理,須要支持邏輯數據庫節點類型的擴充須要,容許用戶根據實際應用須要,擴充開發定義本身的邏輯數據庫節點類型。
根據空間數據綜合管理平臺的目標,本系統主要實現如下三大功能:
一是地理空間數據的組織管理和維護,以創建邏輯空間數據庫,並實現對地理空間數據的組織和管理;同時提供對邏輯空間數據庫的擴展開發。
二是地理空間信息數據的檢查、轉換、入庫管理;
三是地理空間數據的編輯、分析處理;
系統主要功能模塊按以下系統功能結構圖所示:
硬件環境:
使用現有的硬件環境。
軟件環境:
數據庫軟件是Oracle11g(25個客戶端的企業版)或SQL Server 2008 企業版,GIS軟件:ArcGIS 10.0。
根據系統建設的需求,知足新建設應用系統運行的需求,提供建議性網絡設備及硬軟件集成方案,包括硬件、系統軟件、網絡、集成等方面。在知足應用性能和功能的要求下,充分利用甲方現有資源,保護原有投資。必須知足如下原則和要求:
n 實用性原則:能知足系統建設後的須要。
n 可擴展性原則:知足系統往後擴充和升級的須要。
n 經濟性原則:系統配置具備較高的性價比,儘量利用甲方現有資源,保護原有投資。
n 安全性原則:軟硬件選型能知足網絡安全和系統安全的須要。
n 先進性原則:在軟硬件的造型上要具備必定的前瞻性,系統可以知足將來幾年內系統發展的須要。
n 保證系統數據、系統文件、系統用戶的安全;
n 保證系統軟硬件設備的安全與不間斷運行;
n 保證系統在發生常見故障時的繼續運行;
n 保證系統重要信息的備份和可靠恢復;
n 保證系統在發生不可抵禦的故障時可以安全完整地從新運行。
n 電源的安全性、存儲介質的安全性、負載均衡/集羣策略和備份策略。
在軟件平臺的選擇上採用ArcGIS平臺做爲基礎平臺,利用ArcGIS Engine10.0開發平臺。開發用機5臺,數據庫服務器1臺。
n 軟件環境:
開發用機:WINXP Professional、ArcEngine10.0開發包、C#、MS Access。
數據庫服務器:WINDOWS7、Oracle11g服務器端或SQL Server 2008 企業版、ArcSDE 10.0。
n 硬件環境:
開發用機:PⅣ 3.0雙內核INTEL CPU,內存≥1G,以太網卡100Mbs,硬盤160G SCSI硬盤,圖形顯卡(128M顯存以上)
數據庫服務器:PⅣ 3.0GHz、內存≥1G、硬盤≥160G、以太網卡1000Mbs
空間數據管理平臺採用ArcGIS Engine進行擴展開發實現。系統開發方式採用功能插件方式進行應用系統功能的擴充,各類功能插件按類別分別以不一樣的類庫開發實現,功能插件均以dll類庫方式提供,採用c#爲主要開發語言,每一個功能插件的開發方式採用從BaseCommand或BaseTool派生的方式實現,爲使插件有較大的應用性,插件內部採用IHookHelper對傳入插件的對象進行封裝。
採用這種開放模式,使得系統具備較好的擴展性,系統功能的擴展僅需進行相應功能插件的開發後部署到系統運行目錄下,便可實現對系統功能的擴充,使得系統具備較好的兼容性和可拓展性。此外對相應功能插件的升級,也僅須要替換相應的插件庫便可完成。
經過該模塊能夠實現圖層的縮放、平移、漫遊、隱藏/顯示控制等基本圖層操做,實現鷹眼導航;查看圖層屬性,修改圖層的顯示控制範圍,控制地圖提示,控制圖層註記等圖層控制操做。
提供專題地圖製做和打印輸出的功能,能根據出圖圖紙的尺寸自動調整比例尺和製圖範圍,提供所見及所得的圖面整飾功能和地圖成果的打印輸出功能。能夠實現對地圖版面的編輯,如調整方向指示針的位置、控制邊框的形狀及其位置等。
數據庫管理維護功能經過空間數據邏輯節點樹上各節點上右鍵功能實現。
添加數據庫功能是在管理平臺中添加一個新的邏輯數據庫管理,用來組織和管理一組空間數據,其操做界面以下:
輸入要建立的邏輯數據庫名稱,並選擇對應數據庫類型,配置好邏輯數據庫關聯的物理空間數據庫鏈接,肯定後便可完成邏輯空間數據庫的建立。
該窗體中空間數據庫類型組合框下的類型,能夠容許用戶進行擴展,以支持外部用戶定義的其餘空間數據庫類型節點。空間數據庫類型節點來源於應用程序目錄下的配置文件gdbtype.xml,在gdbtype.xml定義了數據庫類型組合框能夠支持的空間數據庫類型以及該數據庫類型所對應的外部程序集名稱和類名稱。經過這種模式,能夠方便用戶擴充本身的邏輯數據庫節點,增長對特定數據的有效組織和管理,並可針對該邏輯數據庫節點,擴充須要的子節點和相應的處理功能插件。如下是一個示例文件:
<?xml version="1.0" encoding="utf-8" ?>
<gbds>
<gdb name="基礎地理數據庫" type="0"></gdb>
<gdb name="規劃數據庫" type="1" path="GDBManageLib.dll" classname="JLK.Catalog.GxGHLogDatabase2"></gdb>
<gdb name="土地利用數據庫" type="2"></gdb>
<gdb name="農田水利數據庫" type="5" path="GDBExtend.dll" classname="GDBExtend.GxLogJTNTDatabase" model="1"></gdb>
</gbds>
每一個gdb對應一個邏輯空間數據庫類型。gdb項提供5個屬性項,其含義以下:
Ø Name-邏輯數據庫類型名稱
Ø Type-邏輯數據庫類別,要求類別不能重複。
Ø Path-擴展數據庫類所在dll文件
Ø Classname-擴展數據庫類名稱
Ø model-指定擴展數據庫右鍵菜單是否使用基類的右鍵菜單,取值0和1,1表示使用基類右鍵菜單項目。默認值爲1。
以上屬性,name和type是必備屬性,僅當使用外部擴展的邏輯數據庫類是,後面3個屬性才須要。
在建立邏輯空間數據庫中,須要同時設置關聯的物理空間數據庫鏈接信息,邏輯空間數據庫對應的物理空間數據庫能夠和當前管理平臺所關聯的物理空間數據庫一致,也能夠配置到新的物理空間數據庫鏈接。設置新的空間數據庫鏈接窗體以下:
添加文件夾用於在邏輯空間數據庫節點下建立一個文件夾類型節點,實現對邏輯數據庫中各種數據的分類組織管。在文件夾節點下面還能夠添加子文件夾,添加文件夾功能界面以下:
用於管理當前邏輯空間數據庫關聯的物理空間數據庫的版本,界面以下:
在邏輯數據庫節點下的註冊版本功能主要提供一次性將當前邏輯空間數據庫節點下面的全部要素類執行註冊版本操做。
附加要素集是將當前邏輯數據庫關聯的物理數據庫中已有的要素集附加到當前邏輯數據庫中。執行附加要素集,將自動將要素集下面的全部要素類附加到當前邏輯數據庫中。界面以下:
已經附加到當前邏輯數據庫中要素集不能被重複附加,所以已經在當前邏輯數據庫節點上的要素集,將被過濾掉不顯示在列表中。
將當前邏輯數據庫關聯的物理數據庫中已有的要素類附加到當前邏輯數據庫中。界面以下:
已經附加到當前邏輯數據庫中要素集不能被重複附加,所以已經在當前邏輯數據庫節點上的要素集,將被過濾掉不顯示在列表中。
在目錄樹上點擊節點名稱,能夠容許用戶修改節點的名稱。對要素集、要素類等這裏修改的名稱是修改對應要素類或要素集的邏輯名稱,在空間數據庫中其實際對應的物理名稱不會進行修改。
數據入庫管理主要提供數據導入,數據建庫方案管理的功能。
(1)導入要素類
將外部數據源中要素類導入到當前邏輯數據庫對應的物理數據庫中,並在邏輯數據庫中建立相應的要素類節點。導入要素類提供單個要素類導入和批量導入2個工具。界面以下:
(2)導入屬性表
將外部數據源中屬性表導入到當前邏輯數據庫對應的物理數據庫中,並在邏輯數據庫中建立相應的屬性表節點。導入屬性表提供單個屬性表導入和批量導入2個工具。界面以下合導入要素類界面相同。
(3)導入柵格
將柵格數據導入到當前邏輯數據庫對應的物理數據庫中,並在邏輯數據庫中建立相應的柵格數據節點。界面以下:
(4) 導入VCT數據
將VCT格式數據導入到邏輯數據庫對應的物理數據庫中,並在邏輯數據庫中建立相應的要素類節點。界面以下:
提供對邏輯數據庫圖層結構的管理和維護。建庫方案管理界面以下:
在該窗體中,點擊添加能夠進入新建圖層窗體,界面以下
在此定義好圖層的相關信息,以及字段名稱等信息後,肯定即完成一個圖層定義。
出手工輸入邏輯數據庫的建庫方案外,在此支持從已有的模板數據庫中自動導入相應的要素類及其屬性結構造成本邏輯數據庫的建庫方案,也支持從xml配置文件中導入已有的建庫方案。以配置的建庫方案能夠保存爲xml文件。
對每一個圖層經過點擊屬性按鈕能夠查看圖層的屬性結構定義。界面以下:
在屬性結構定義界面中能夠對屬性字段進行添加、刪除和屬性編輯處理。能夠定義屬性字段的域值和字段數據驗證格式。界面以下:
數據加載是根據配置的建庫方案,從外部數據源中將多個要素類上載到邏輯數據庫中,導入操做採用嚮導方式由用戶定義外部數據源和邏輯數據庫結構定義之間的映射關係。本系統經過名稱類似原則本身創建二者之間的對照關係。界面以下:
加載外部數據源能夠是一組shapefile文件,也能夠是我的數據庫文件。對shapefile文件,只需指定shapefile文件所在目錄,對我的數據庫,須要指定相應的數據庫文件。設置好後,點擊下一步,創建外部數據源和邏輯數據庫中圖層結構配置中的圖層之間的對照關係及字段的對照關係。界面以下:
點擊該界面上的字段匹配能夠設置導入數據源中數據和邏輯數據庫中數據的對照關係。其界面以下:
上面2個界面中的check框沒有打鉤選中的圖層或屬性字段不會加載到空間數據庫中。此外在圖層和字段對照表中最右邊列中從組合框選擇了「<無>」,這些圖層和字段的數據也不會加載到空間數據庫中。
定義映射關係後,點擊下一步,設置導入方式,界面以下:
數據導入採用從新導入或追加導入2種方式。從新導入將清空已導入數據,追加導入就在現有數據基礎上導入新的數據。
添加地圖是在邏輯數據庫中添加一新的地圖,其界面以下:
地圖屬性設置用來定義地圖的相應配置參數,並配置地圖中所包含的圖層信息,其界面以下:
該界面用來配置地圖所包含圖層,這裏採用樹結構進行地圖圖層配置,用戶在樹節點上能夠添加新的圖層,能夠建立組合圖層,經過拖拽方式能夠調整圖層的顯示順序。
該界面定義了地圖的顯示方式及地圖裁剪方式設置。
該界面設置地圖的座標系統。
在地圖節點右鍵菜單能夠添加新的圖層到地圖中,其界面以下:
選擇相應要素類後,點擊添加,將把所選擇要素類添加當前地圖中。在添加操做時,系統自動根據添加要素類幾何類型肯定數據插入的位置。
元數據功能用來定義節點的元數據信息,其界面以下:
/
質量檢查部分以邏輯數據庫爲基礎進行配置和檢查。在質量檢查模塊以邏輯空間數據庫的定義的數據庫結構爲基礎,進行質量檢查方案的配置和管理。系統的屬性結構合理性檢查也基於建庫方案中配置的數據庫體結構和屬性字段取值設置。
根據空間數據檢查要求分析,目前系統的檢查功能主要實現了以下一組檢查規則
l 圖層結構檢查:檢查字段結構是否符合建庫方案中所定義的結構。主要對邏輯數據庫中要素類的邏輯名、要素類別名、要素類字段結構、字段類型、字段長度、字段名稱等進行檢查。該檢查是針對要素類的結構進行的。
l 字段是否爲空檢查:對要素類中每一個要素進行檢查,肯定每一個要素屬性字段取值是否爲空(對文本類型包含是否長度爲0文本),該檢查也是根據在建庫方案中定義設置字段是否容許爲空爲檢查條件的。
l 字段域值檢查:對要素類中每要素進行檢查,肯定要素屬性字段取值是否符號定義的域值範圍。該檢查也是根據在建庫方案中定義設置字段域值進行的,若是字段沒有定義域值,則該屬性字段不進行該項檢查。
l 字段格式檢查:該檢查是對文本類型字段進行的檢查,它對要素類中每要素進行檢查,檢查文本字段文本值是否符合指定規則要求。本系統對文本字段規則檢查是採用正則表達式進行格式驗證,該檢查也是根據在建庫方案中設置的文本字段取值格式對要素屬性值進行驗證,如文本字段沒有定義該取值格式,該字段不進行該項檢查。
l 微短線檢查:檢查線要素對象,判斷線長是否小於指定長度。
l 微小面檢查:對面要素對象進行檢查,肯定面的面積是否小於指定面積值。
l 重複對象檢查:對點、線、面三種類型要素類進行檢查,檢查是否有完成重合的對象。
l 線自相交檢查:對線要素類進行檢查,判斷線是否存在自相交狀況。
l 線相交檢查:對線要素類進行檢查,檢查同一個線要素類中線對象之間是否存在相交狀況,或者是2個線要素類之間,線線之間是否存在相交的狀況。
l 線重疊檢查:對線要素類進行檢查,檢查同一個線要素類中線對象之間是否存在重疊狀況,或者是2個線要素類之間,線線之間是否存在重疊的狀況。
l 線面相交檢查:檢查線要素和麪要素本身是否存在相交的狀況。
l 面重疊檢查:對面要素類進行檢查,檢查同一個面要素類中面對象之間是否存在重疊狀況,或者是2個面要素類之間,面面之間是否存在重疊的狀況。
l 線上重複點檢查:對線要素類和麪要素類進行檢查,檢查線要素或面要素邊界線上是否存在重複點。
l 懸掛線檢查:對線要素類進行檢查,檢查線要素端點是否存在懸掛狀況。
l 僞節點檢查:對線要素類進行檢查,檢查線要素端點是否存在僞節點狀況。
該功能用於定義數據庫節點的質檢方案。配置界面以下:
在檢查規則節點點擊右鍵能夠添加相應的檢查規則,添加規則窗體以下:
質檢方案要對每一個邏輯數據庫節點分別配置保存。
系統對每一個數據庫獨自維護本身的檢查參數,配置界面以下:
數據檢查時根據前面所定義的檢查規則和配置的檢查參數,對當前數據庫中的要素類進行相應的質量檢查。如下是進行檢查的執行界面。
檢查錯誤列表用於查看邏輯數據庫檢查的錯誤信息,界面以下:
在顯示的錯誤信息若是是要素上的錯誤,並當該要素所在要素類添加到當前地圖視圖中了,則能夠對該要素執行縮放定位操做,若是數據尚未被加載,則不能執行縮放定位操做。
單圖層檢查是對當前加載到地圖視圖中一個圖層進行質量檢查,無論該圖層所在邏輯數據庫是否認義配置了質檢方案。其操做界面以下:
主要空間數據編輯和空間分析功能。
可以對圖形對象增長、刪除、複製和修改等操做;能繪製點、線、面等基本圖形對象;可以精確地捕捉圖形要素幾何特徵點座標,實現拓撲編輯、路徑編輯等高級編輯功能。
圖形編輯提供類CAD數據的編輯操做模式。具體功能參考JLKEngine的相關文檔。
提供基本的空間分析功能,包括緩衝區分析、疊加分析、三維分析、路徑分析等基礎的分析功能。
本處數據庫設計主要從方便空間數據組織管理出發,設計定義的一組屬性表。
來管理和維護空間數據管理數據的目錄層次結構,表結構以下:
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
OBJECTID |
對象OID |
整型 |
|
|
Name |
節點名稱 |
文本 |
150 |
|
NodeType |
節點類型 |
整型 |
|
見注1 |
ParentID |
父節點OID |
整型 |
|
以目錄樹根節點爲父節點,其值爲0 |
Tag |
擴展對象 |
文本 |
150 |
通常可經過另一個表爲對應節點類型提供擴展屬性,該字段可記錄該節點對應擴展屬性表中的一個OID。此外還可採用一個文本串來記錄其擴展屬性 |
MetaDataOID |
元數據OID |
整型 |
|
|
Description |
節點描述 |
文本 |
254 |
|
GDBType |
數據庫類型 |
整型 |
|
該節點對數據庫節點有效,其餘類型節點不使用 |
注1:系統內部已經定義了以下類型,系統根據節點類型查詢其相關對照表獲取節點擴展屬性。
public enum TreeNodeType
{
/// <summary>
/// 數據庫
/// </summary>
Database=0,//數據庫
/// <summary>
/// 地圖集
/// </summary>
Maps=1,//地圖集
/// <summary>
/// 地圖
/// </summary>
Map=2,//地圖
/// <summary>
/// 圖層
/// </summary>
Layer=3,//圖層
/// <summary>
/// 渲染信息
/// </summary>
Render=4,//渲染信息
/// <summary>
/// 數據集,包括要素類、對象類、影像等
/// </summary>
Dataset=5,//數據集,包括要素類、對象類、影像等
/// <summary>
/// 文件夾
/// </summary>
Folder=6,//文件夾
/// <summary>
/// 標準文件夾,下面存放一些標準
/// </summary>
StandardFolder=7,
/// <summary>
/// 標準定義
/// </summary>
StandardIndex=8,
/// <summary>
/// 代碼節點
/// </summary>
Code=9,
/// <summary>
/// 文檔節點
/// </summary>
Documents=10,
/// <summary>
/// 文檔文件夾節點
/// </summary>
DoucmentFolder=11
}
定義了邏輯數據庫的空間數據庫鏈接信息
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
Name |
鏈接名稱 |
文本 |
150 |
|
ConnectionInfo |
鏈接信息 |
二進制 |
|
|
Description |
節點描述 |
文本 |
254 |
|
GDBType |
數據庫類型 |
整型 |
|
該節點對數據庫節點有效,其餘類型節點不使用 |
定義了樹節點上數據集節點所對應的物理數據信息
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
Name |
數據集邏輯名稱 |
文本 |
150 |
|
DataType |
數據類型 |
短整形 |
|
和esriDatasetType取值相同 |
Description |
節點描述 |
文本 |
254 |
|
GDBID |
邏輯數據庫ID |
整型 |
|
|
RealName |
實際數據集名稱 |
文本 |
200 |
|
定義了地圖的相關屬性信息
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
Name |
地圖名稱 |
文本 |
150 |
|
AutoExtentType |
範圍類型 |
短整形 |
|
|
AutoExtentScale |
顯示比例尺 |
雙精度 |
|
|
AutoExtentLeft |
顯示範圍左邊界 |
雙精度 |
|
|
AutoExtentRight |
顯示範圍右邊界 |
雙精度 |
|
|
AutoExtentTop |
顯示範圍上邊界 |
雙精度 |
|
|
AutoExtentBottom |
顯示範圍下邊界 |
雙精度 |
|
|
ClipType |
裁剪方式 |
短整形 |
|
|
ClipGridAndGraticules |
是否裁剪網格 |
短整形 |
|
|
SpatialRefrence |
空間座標系 |
二進制 |
|
|
Border |
邊界符號 |
二進制 |
|
|
ClipGeometry |
裁剪幾何 |
二進制 |
|
|
定義地圖下圖層相關屬性信息
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
LayerName |
圖層名稱 |
文本 |
150 |
|
DatasetOID |
關聯的數據集OID |
整形 |
|
關聯 DATASETTABLE表 |
Render |
圖層渲染信息 |
二進制 |
|
|
LayerType |
圖層類型 |
短整形 |
|
取值見注1 |
MaxScale |
顯示的最大比例 |
雙精度 |
|
|
MinScale |
顯示的最小比例 |
雙精度 |
|
|
IsVisible |
是否可見 |
短整形 |
|
|
IsLable |
是否標註 |
短整形 |
|
|
LayerOrder |
圖層順序 |
整形 |
|
|
AnnoInfo |
標註信息 |
二進制 |
|
|
Filter |
圖層過濾設置 |
文本 |
200 |
|
LayerInfo |
圖層信息 |
二進制 |
|
|
注1:定義的圖層類型以下
/// <summary>
/// 圖層類型
/// </summary>
public enum LayerType
{
/// <summary>
/// 點圖層
/// </summary>
PointLayer=0,
/// <summary>
/// 線
/// </summary>
LineLayer=1,
/// <summary>
/// 面
/// </summary>
PolygonLayer=2,
/// <summary>
/// 註記
/// </summary>
AnnoLayer=3,
/// <summary>
/// 柵格
/// </summary>
RasterLayer=4,
/// <summary>
/// Tin
/// </summary>
TinLayer=5,
/// <summary>
/// 拓撲
/// </summary>
TopoLayer=6,
/// <summary>
/// 組合
///
/// </summary>
GroupLayer=7,
/// <summary>
/// 底圖
/// </summary>
BasicMapLayer =8,
UnknownLayer = 20
}
定義了一個邏輯數據庫的檢查規則,結構以下:
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
GDBOID |
邏輯數據庫ID |
整型 |
|
|
RuleType |
類型 |
短整型 |
|
|
RuleName |
名稱 |
文本 |
150 |
|
DatasetName |
檢查的要素類名 |
文本 |
200 |
|
RelateDatasetName |
關聯要素類名 |
文本 |
200 |
|
定義了一個邏輯數據庫的檢查參數,結構以下:
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
GDBOID |
邏輯數據庫ID |
整型 |
|
|
MinLength |
最短線長 |
雙精度 |
|
|
MinArea |
最小面積 |
雙精度 |
|
|
MinDistance |
2點最小容差 |
雙精度 |
|
|
InvertMinAngle |
最小夾角 |
雙精度 |
|
|
定義了一個邏輯數據庫的檢查結果,結構以下:
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
GDBOID |
邏輯數據庫ID |
整型 |
|
|
DatasetName |
要素類邏輯名 |
文本 |
200 |
|
Realdatasetname |
要素類物理名 |
文本 |
200 |
|
OID |
對象OID |
整型 |
|
|
RelateDatasetName |
關聯要素類邏輯名 |
文本 |
200 |
|
RealRelateDatasetname |
關聯要素類物理名 |
文本 |
200 |
|
RelateOID |
關聯對象OID |
整型 |
|
|
errortype |
錯誤類型 |
短整型 |
|
|
ErrorInfo |
錯誤信息 |
二進制 |
|
|
ModifyFlag |
修改標誌 |
短整型 |
|
|
數據管理平臺擴展開發有以下幾種方式:
(1)功能插件的擴展開發。即根據具體業務須要開發業務處理插件進行系統功能的擴展,其功能插件擴展機制請參考第5部份內容進行。本處不作詳細說明。
(2)管理樹右鍵菜單擴展。即把新開發的工具添加到管理樹節點的右鍵菜單中,其實際也就是把新開發的功能插件配置加載到管理樹節點的右鍵菜單,系統經過相應的外部配置來實現該功能。目前管理平臺對根節點和數據庫節點開放了外部菜單配置支持,其餘節點沒有開放。
(3)管理樹節點擴展。系統可支持多種方式的節點類型擴充機制,以實現管理樹中外部節點類型的添加,來實現對系統的擴展。
(4)圖層樹右鍵菜單擴展。
詳細介紹參考《JLKEngine中間件類庫結構及插件開發應用》第4部份內容進行。這裏簡單說明一下管理平臺中對插件建立的機制:在管理平臺中建立插件時,經過OnCreate方法傳人插件內部的是GxApplicationEx對象,其派生於JLK.Catalog.GxApplication對象,GxApplication派生於 ApplicationBase對象, 並實現了IGxApplication接口。IGxApplication接口定義以下:
public interface IGxApplication : IApplication
{
/// <summary>
/// 獲取或設置在數據管理中選擇的Gx對象集
/// </summary>
IGxSelection GxSelection
{
set;get;
}
/// <summary>
/// 獲取或設置關聯的Gx目錄樹
/// </summary>
IGxCatalog GxCatalog
{
set;get;
}
}
顯然在用於目錄節點的插件,經過該接口能夠獲取當前目錄樹節點上被選中的節點,經過獲取選中的節點能夠進行插件的相應操做。能夠說插件和管理平臺樹節點交互均經過IGxApplication來進行的。和地圖的交互則經過IApplication中的FocusMap來交互。
首先根據第2部分功能插件擴展開發,實現新的功能插件,而後經過配置文件方式加載的對應樹節點的右鍵盤菜單中,目前管理平臺對如下節點類型提供了相應的外部配置文件菜單,見下表:
Gx對象 |
類型 |
菜單配置文件名 |
GxLogCatalog |
|
GxLogCatalog.xml |
GxLogDatabase |
0-基礎地理數據庫
|
GxLogDatabase_0.xml |
1-規劃數據庫 |
GxLogDatabase_1.xml |
|
2-土地利用 |
GxLogDatabase_2.xml |
菜單配置文件要求放到管理平臺運行目錄下的menus目錄下面。
菜單配置文件結構以下:
(1)一個簡單配置文件例子以下
<?xml version="1.0" encoding="utf-8" ?>
<BarItems>
<BarItem name="AddFolderNode" />
<BarItem name="AddMapNode" />
<BarItem name="NewBarSubItem" caption="新建">
<BarItem name="NewFeatureDataset" />
</BarItem>
</BarItems>
如上面配置,其對應BarItem中全部工具都是從主程序的菜單配置加載進來了,因此在這裏的配置就僅是給出BarItem所對應工具的名稱屬性(名稱要求是惟一的)。
(2)第2種配置方式
若是BarItem對應工具不在主程序配置文件中定義,而須要在目錄節點右鍵菜單來動態加載,則須要根據完整的dll路徑和類名稱,相似主程序中BarItem的完整定義。以下的一個BarItem定義:
<?xml version="1.0" encoding="utf-8" ?>
<BarItems>
<BarItem name="AttributeQuery" classname="PlugManage.BaseTools.AttributeQuery" path="PlugManage.BaseTools.dll" BeginGroup="True" />
<BarItem name="AddMapNode" />
<BarItem name="NewBarSubItem" caption="新建">
<BarItem name="NewFeatureDataset" />
</BarItem>
</BarItems>
(3)包含下拉菜單的配置文件
此外,還能夠在配置文件中配置成彈出菜單方式。以下例子
<?xml version="1.0" encoding="utf-8" ?>
<BarItems>
<BarItem name="AddExtLogNode" classname="GDBExtend.AddExtLogNode" path="GDBExtend.dll" hooktype="0" />
<BarItem name="ImportBarSubItem" name=」導入」> //定義了一個導入彈出菜單
<BarItem name="ImportSingleFeatureClassCommand"/>
<BarItem name="ImportVCTData"/>
</BarItem>
<BarItem name="BatchConvertToSHP"/>
</BarItems>
(4)注意事項
(1)菜單配置中對應插件名稱和節點內部已有的插件名稱相同時,配置文件中的插件不會被加載上去。
(2)彈出菜單名和節點內部已有彈出菜單名相同,那麼在配置文件中彈出菜單下的菜單項將加載到內部已有的彈出菜單下面。
(3)管理平臺的樹節點首先建立的是內部菜單項,而後纔是配置文件中的菜單項。
本部份內容主要說明如何對數據管理系統中目錄樹節點進行擴展開發。首先介紹一下數據管理系統中目錄書節點層次關係維護表。在數據管理系統中,經過DataLogTree表來管理和維護數據的目錄層次結構,表結構以下:
字段名稱 |
中文名 |
類型 |
長度 |
備註 |
OBJECTID |
對象OID |
整型 |
|
|
Name |
節點名稱 |
文本 |
150 |
|
NodeType |
節點類型 |
整型 |
|
見注1 |
ParentID |
父節點OID |
整型 |
|
以目錄樹根節點爲父節點,其值爲0 |
Tag |
擴展對象 |
文本 |
150 |
通常可經過另一個表爲對應節點類型提供擴展屬性,該字段可記錄該節點對應擴展屬性表中的一個OID。此外還可採用一個文本串來記錄其擴展屬性 |
MetaDataOID |
元數據OID |
整型 |
|
|
Description |
節點描述 |
文本 |
254 |
|
GDBType |
數據庫類型 |
整型 |
|
該節點對數據庫節點有效,其餘類型節點不使用 |
注1:系統內部已經定義了以下類型
public enum TreeNodeType
{
/// <summary>
/// 數據庫
/// </summary>
Database=0,//數據庫
/// <summary>
/// 地圖集
/// </summary>
Maps=1,//地圖集
/// <summary>
/// 地圖
/// </summary>
Map=2,//地圖
/// <summary>
/// 圖層
/// </summary>
Layer=3,//圖層
/// <summary>
/// 渲染信息
/// </summary>
Render=4,//渲染信息
/// <summary>
/// 數據集,包括要素類、對象類、影像等
/// </summary>
Dataset=5,//數據集,包括要素類、對象類、影像等
/// <summary>
/// 文件夾
/// </summary>
Folder=6,//文件夾
/// <summary>
/// 標準文件夾,下面存放一些標準
/// </summary>
StandardFolder=7,
/// <summary>
/// 標準定義
/// </summary>
StandardIndex=8,
/// <summary>
/// 代碼節點
/// </summary>
Code=9,
/// <summary>
/// 文檔節點
/// </summary>
Documents=10,
/// <summary>
/// 文檔文件夾節點
/// </summary>
DoucmentFolder=11
}
數據庫節點時放到目錄管理樹根節點下面,其擴展有2中實現方式:
(1)簡單方式
這種實現方式主要針對用戶的數據庫節點變化比較小的狀況,代碼修改量較少是,能夠採用該方式。其擴展方式就是從系統中的GxLogDatabase下派生一個新的數據庫類型節點,而後對須要變動的函數進行重載,添加用戶本身的實現代碼。該實現方式可參考GDBExtend工程中的GxLogDatabase2的實現,以及代碼中的註釋說明。
public class GxLogDatabase2 : GxLogDatabase
{
public GxLogDatabase2()
{
m_name = "其餘數據庫";
base.m_Catalog = "數據庫";
//添加其餘環境初始化代碼。
//外部擴展的庫可能會存在一些運行環境參數的擴充,能夠在數據庫加載時進行擴充的環境參數的初始化
//如創建和屬性表的關聯等,讀取配置文件中新添加的一些參數等處理過程
}
public override void Init(object popment)
{
if (Model == 1) //該值爲1加載基類內置菜單,並加裝該節點配置的外部菜單
{
//加載基類的右鍵菜單,基類菜單函數加載也直接加載了外部擴展菜單配置文件
//若是不須要使用基類,請註釋掉下面這一句代碼,並添加本身的右鍵菜單代碼
base.Init(popment);// 加裝該節點配置的外部菜單處理已經包含在該基類函數//中了
}
else //該狀況不採用基類的內部右鍵菜單
{
JLK.Framework.IPopuMenuWrap m_PopuMenu = popment as JLK.Framework.IPopuMenuWrap;
//
m_PopuMenu.Clear(); //首先清空原有的菜單對象
string filename = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath + "\\menus\\", MenuFileName);
if (System.IO.File.Exists(filename))
{
//建立外部菜單
JLK.Framework.CatalogObjectMenuHelper.StartCreateBar(m_PopuMenu, filename);
}
//添加的一些內置插件,能夠根據須要添加
m_PopuMenu.AddItem("DeleteObject", false);//添加刪除節點插件
}
}
/// <summary>
/// 重載以加載外部擴展的節點
/// </summary>
/// <param name="pRow">DataLogTree表中記錄行對象</param>
/// <param name="type">節點類型</param>
protected override void CreateExtendObject(ESRI.ArcGIS.Geodatabase.IRow pRow, int type)
{
base.CreateExtendObject(pRow, type);
//重載進行外部擴展節點的建立
if (type == 20)
{
GxExtendLogObjEx gx = new GxExtendLogObjEx();
GDBManageLib.ManagerTable.DataLogTreeTable table = new GDBManageLib.ManagerTable.DataLogTreeTable();
int ntindex = pRow.Fields.FindField(table.NameField);
string name = pRow.get_Value(ntindex).ToString();
gx.NodeName = name;
int tagindex = pRow.Fields.FindField(table.TagField);
string tag = pRow.get_Value(tagindex).ToString();
gx.OID = pRow.OID;
if (tag.Length > 0)
{
gx.Tag = tag;
}
gx.MetaDataOID = GetMetaDataOID(pRow);
gx.Attach(this, m_pGxCatalog);
}
}
}
(2)複雜方式
這種方式適用於對代碼修改較大的狀況下的一種擴展方式。具體實現參考GDBExtend工程中的GxLogJTNTDatabase的實現,以及代碼中的註釋說明。
/// <summary>
/// 擴充方式一
/// </summary>
/// <remarks>
/// GxLogObjectContainer Gx對象的抽象基類。
/// IGxLogDatabase 數據庫節點接口,必須實現
/// IGxObjectUI 節點顯示圖標,必須實現
/// IGxContextMenuWap 右鍵菜單,須要提供右鍵菜單的節點必須實現
/// IGxObjectEdit 節點編輯操做,須要提供對節點的刪除、拷貝、重命名、屬性編輯等操做的必須實現。
/// </remarks>
public class GxLogJTNTDatabase : GxLogObjectContainer, IGxLogDatabase, IGxObjectUI, IGxContextMenuWap, IGxObjectEdit
(3)擴展後進行部署配置
對數據庫節點擴充後,將編譯的dll放到本系統運行目錄下,此外還須要在系統運行目錄下的gdbtype.xml文件添加該新數據庫類型節點的信息,這樣在根節點進行新建數據庫窗體中就能夠查看到所擴充的數據庫類型。Gdbtype.xml文件以下:
<?xml version="1.0" encoding="utf-8" ?>
<gbds>
<gdb name="基礎地理數據庫" type="0"></gdb>
<gdb name="規劃數據庫" type="1" path="GDBManageLib.dll" classname="JLK.Catalog.GxGHLogDatabase2"></gdb>
<gdb name="土地利用數據庫" type="2"></gdb>
<gdb name="農田水利數據庫" type="5" path="GDBExtend.dll" classname="GDBExtend.GxLogJTNTDatabase" model="1"></gdb>
</gbds>
每一個gdb節對應一個數據庫節點類型,其相應屬性見下表:
名稱 |
說明 |
備註 |
Name |
數據庫名稱 |
必選 |
type |
數據庫類型 |
數字類型,保持名稱的惟一性, 必選。0、1、2三個號用戶之後的擴展不要使用 |
path |
擴展數據庫節點的dll文件名 |
若是數據庫節點類型是用戶擴充的,該屬性就必需要 |
classname |
類名 |
若是數據庫節點類型是用戶擴充的,該屬性就必需要 |
model |
右鍵菜單加載方式 |
對經過派生於GxLogDatabase類進行數據庫類型擴展,GxLogDatabase內部已有菜單能夠被派生類繼承自動加載,用戶也能夠不繼承加載。在配置文件中定義的該屬性用於定義數據庫節點是否要加載基類的右鍵菜單項目,爲1是須要加載,爲0是不須要加載。該屬性默認值爲1,及定義中把包含model屬性時,系統默認爲1。 |
(1)固定節點類型擴展
固定節點類型表示該節點類型是一個固定的節點,它一定存在某個Gx節點下面。可參考GDBExtend工程中的GxExtendLogObj和GxExtendLogObjChild的實現及代碼中的註釋說明。
GxExtendLogObj是一個容器類固定節點,該節點在GxLogJTNTDatabase中被建立添加到其上面;GxExtendLogObjChild是一個非容器類固定節點,被做爲GxExtendLogObj的一個子節點添加到目錄樹中。其定義分佈見下面:
/// <summary>
/// 固定類型節點,該節的類型固定存在於某Gx節點下,不須要保存的數據庫節點上。
/// </summary>
/// <remarks>
/// 該接口設計爲一個容器類Gx對象,所以可直接派生於GxObjectContainer類,因爲該節點爲一個固體類型節點,不須要從管理表來獲取信息
/// 所以它從GxObjectContainer派生,而不是GxLogObjectContainer(GxLogObjectContainer是對本管理信息系統中須要從管理表中來
/// 獲取信息的類的一種方式)。
/// 實現IGxExtendLogObj,能夠表示其爲一個外部擴展的Gx對象,該接口不是必需要實現,
/// 引入它能夠考慮簡化代碼中一下地方的寫法。
/// IGxContextMenuWap是菜單配置接口,節點要提供右鍵菜單,必須實現該接口
/// IGxObjectEdit是對象編輯接口,主要爲節點提供重命名、刪除節點的操做,若有節點支持重命名、刪除操做中的其中一個就須要
/// 實現該接口。若是都不支持能夠,就不須要實現該接口。
/// 本擴展類不提供編輯支持,但實現該接口來講明其代碼寫法
/// </remarks>
public class GxExtendLogObj : GxObjectContainer, IGxExtendLogObj, IGxContextMenuWap, IGxObjectEdit
/// <summary>
/// 固定類型節點,該節的類型固定存在於某Gx節點下,不須要保存的數據庫節點上。
/// </summary>
/// <remarks>
/// 該接口設計爲一個非容器類Gx對象,所以可直接派生於GxObject類,因爲該節點爲一個固體類型節點,不須要從管理表來獲取信息
/// 所以它從GxObject派生,而不是GxLogObject。
/// 實現IGxExtendLogObj,能夠表示其爲一個外部擴展的Gx對象,該接口不是必需要實現,
/// 引入它能夠考慮簡化代碼中一下地方的寫法。
/// IGxContextMenuWap是菜單配置接口,節點要提供右鍵菜單,必須實現該接口
/// IGxObjectEdit是對象編輯接口,主要爲節點提供重命名、刪除節點的操做,若有節點支持重命名、刪除操做中的其中一個就須要
/// 實現該接口。若是都不支持能夠,就不須要實現該接口。
/// 本擴展類不提供編輯支持,但實現該接口來講明其代碼寫法
/// </remarks>
public class GxExtendLogObjChild : GxObject, IGxExtendLogObj, IGxContextMenuWap, IGxObjectEdit
(2)動態類型節點擴展
動態類型節點是將節點記錄到DataLogTree,經過從DataLogTree表中來獲取加載的一種節點類型。
(1)動態類型節點擴展屬性表定義
該實例主要來講明如何進行動態類型節點擴展,這裏考慮給該擴充動態節點建立一個擴展屬性表,用於記錄其擴展的屬性信息。爲經過ArcGISEngine中ITable來操做該表,這裏採用ArcCatalog來定義該數據表。
數據表名:ExtendObject
/
供一個ExtName字段,以進行說明。
(2)動態類型節點擴展類例說明
動態節點擴展的例子可參考GDBExtend工程中的GxExtendLogObjEx和GxExtendLogObjExChild的實現及代碼中的註釋說明。
GxExtendLogObjEx是一個容器類動態節點,該節點在GxLogJTNTDatabase中被添加到其上面;GxExtendLogObjExChild是一個非容器類動態節點,被做爲GxExtendLogObjEx的一個子節點添加到目錄樹中。其定義分佈見下面:
/// <summary>
///動態類型節點,這裏定義的動態節點對應節點類型值爲20。
/// </summary>
/// <remarks>
/// 該接口設計爲一個容器類Gx對象,所以可直接派生於GxObjectContainer類,因爲該節點爲一個固體類型節點,不須要從管理表來獲取信息
/// 所以它從GxObjectContainer派生,而不是GxLogObjectContainer(GxLogObjectContainer是對本管理信息系統中須要從管理表中來
/// 獲取信息的類的一種方式)。
/// 實現IGxExtendLogObj,能夠表示其爲一個外部擴展的Gx對象,該接口不是必需要實現,
/// 引入它能夠考慮簡化代碼中一下地方的寫法。
/// IGxContextMenuWap是菜單配置接口,節點要提供右鍵菜單,必須實現該接口
/// IGxObjectEdit是對象編輯接口,主要爲節點提供重命名、刪除節點的操做,若有節點支持重命名、刪除操做中的其中一個就須要
/// 實現該接口。若是都不支持能夠,就不須要實現該接口。
/// 本擴展類不提供編輯支持,但實現該接口來講明其代碼寫法
/// </remarks>
public class GxExtendLogObjEx : GxLogObjectContainer, IGxExtendLogObj, IGxContextMenuWap, IGxObjectEdit
和固定節點的區別在於,其是從GxLogObjectContainer派生,該抽象類是針對數據管理節點封住的一個容器類,其中封裝了從DataLogTree表加載其子節點的實現,對外部擴展的子節點要能加載到樹目錄中,僅須要重載GxLogObjectContainer中的以下函數:
protected override void CreateExtendObject(ESRI.ArcGIS.Geodatabase.IRow pRow, int type)
可參看GxLogJTNTDatabase和GxExtendLogObjEx相關代碼如何建立外部的節點對象。
/// <summary>
///動態子節點類型節點,這裏定義的動態節點對應節點類型值爲20。
/// </summary>
/// <remarks>
/// 該接口設計爲一個非容器類Gx對象,所以可直接派生於GxLogObject類,因爲該節點爲一個動態類型節點,須要從管理表來獲取信息
/// 所以它從GxLogObject派生。
/// 實現IGxExtendLogObj,能夠表示其爲一個外部擴展的Gx對象,該接口不是必需要實現,
/// 引入它能夠考慮簡化代碼中一下地方的寫法。
/// IGxContextMenuWap是菜單配置接口,節點要提供右鍵菜單,必須實現該接口
/// IGxObjectEdit是對象編輯接口,主要爲節點提供重命名、刪除節點的操做,若有節點支持重命名、刪除操做中的其中一個就須要
/// 實現該接口。若是都不支持能夠,就不須要實現該接口。
///
/// </remarks>
public class GxExtendLogObjExChild : GxLogObject, IGxExtendLogObj, IGxContextMenuWap, IGxObjectEdit
(3)動態擴展節點建立插件實現
動態類型節點須要在父節點上經過右鍵菜單進行節點的建立,所以在GDBExtend工程提供了一個動態節點建立插件的例子來講明如何建立一個動態插件,並保存到目錄樹中,以及動態節點擴展屬性如何保存。如下是插件的例子:
/// <summary>
/// 添加擴展節點工具
/// </summary>
public class AddExtLogNode : ESRI.ArcGIS.ADF.BaseClasses.BaseCommand
{
//這個是應用程序接口,系統建立插件是經過OnCreate方法傳人插件。
IApplication m_pApp = null;
public AddExtLogNode()
{
base.m_name = "AddExtLogNode";//插件名稱,須要保證惟一
base.m_caption = "添加節點";//標題
}
public override void OnCreate(object hook)
{
m_pApp = hook as IApplication;
}
//右鍵菜單點擊時,將調用該方法完成代碼執行
public override void OnClick()
{
frmNewLogNode frm = new frmNewLogNode();
frm.GxOject = (m_pApp as JLK.Catalog.IGxApplication).GxSelection.FirstObject;
if( (m_pApp as JLK.Catalog.IGxApplication).GxSelection.FirstObject is IGxLogDatabase) //若是當前選中一個數據庫節點,則設置建立節點類型爲20
frm.NodeType = 20; //建立的GxExtendLogObjEx
else
frm.NodeType = 22; //不然建立節的類型爲22,建立的是GxExtendLogObjExChild
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
//建立完成後刷新父節點。
(m_pApp as JLK.Catalog.IGxApplication).GxSelection.FirstObject.Refresh();
}
}
}
關於如何保存,參見frmNewLogNode.cs中相關代碼。
(1)注意在擴展節點時要區分容器類節點和非容器類節點。容器類節點下面能夠包含子節點,而非容器類節點下面不能包含子節點,所以它們的派生基類是有區別的。此外建立節點類型對象的插件只能存在容器類節點上。
(2)擴展節點右鍵菜單實現方式和系統內部節點的機制徹底同樣。
(3)擴展的動態節點的NodeType不能和系統中已有的相同,以及被其餘擴展節點使用的值也不能重複使用。
聯繫方式:028-65955282,13982071140 黃先生,
在線聯繫, QQ:26326507, http://www.linjon.cn, 成都領君科技有限公司
對於公司基於ArcGIS開發的JLKEngine中間件平臺產品,能夠在線下載試用, http://www.ljjlk.com
對於公司基於ASP.NET開發的SuperFlow工做流平臺產品,能夠在線下載試用, http://www.ljlk.net