李 江,周 浩
(1.南京集艾思軟件科技有限公司,江蘇 南京 210009)
各行各業(yè)已從信息化、數(shù)據(jù)庫(kù)化發(fā)展到數(shù)據(jù)整合、數(shù)據(jù)統(tǒng)一、云平臺(tái)階段,行業(yè)內(nèi)部需要將各種信息系統(tǒng)整合成一個(gè)平臺(tái),供行業(yè)內(nèi)云共享。但是目前,空間數(shù)據(jù)庫(kù)缺少通用性的建庫(kù)工具[1,2]。如何把已經(jīng)形成的大容量、多冗余數(shù)據(jù)進(jìn)行統(tǒng)一,是擺在各行業(yè)前面的頭等問(wèn)題。實(shí)現(xiàn)通用的空間數(shù)據(jù)建庫(kù)系統(tǒng),要求結(jié)合各行業(yè)自身特點(diǎn),把建庫(kù)工作簡(jiǎn)單化、標(biāo)準(zhǔn)化,把各種資源數(shù)據(jù)整合成一個(gè)統(tǒng)一平臺(tái),為大數(shù)據(jù)應(yīng)用打下堅(jiān)實(shí)的基礎(chǔ)。
通用的空間數(shù)據(jù)建庫(kù)系統(tǒng),關(guān)鍵技術(shù)基于ArcGIS Engine與XML實(shí)現(xiàn),ArcGIS Engine利用接口負(fù)責(zé)空間數(shù)據(jù)的定義、輸入、處理與輸出;XML承擔(dān)著數(shù)據(jù)字典、數(shù)據(jù)配置、業(yè)務(wù)標(biāo)準(zhǔn)的角色。
ArcGIS Engine是ESRI公司產(chǎn)品。它有完備的嵌入式GIS 組件庫(kù)和工具庫(kù),使用ArcGIS Engine開(kāi)發(fā)的GIS應(yīng)用程序可以脫離ArcGIS Desktop而運(yùn)行。它的數(shù)據(jù)提取快速,是穩(wěn)定性好的多優(yōu)勢(shì)平臺(tái)[3]。
可擴(kuò)展標(biāo)記語(yǔ)言XML[4]具有定義嚴(yán)格、結(jié)構(gòu)清晰、靈活易讀的特點(diǎn),可以用來(lái)描述各種復(fù)雜信息。XML可以對(duì)文檔和數(shù)據(jù)進(jìn)行結(jié)構(gòu)化處理,在不同業(yè)務(wù)之間進(jìn)行交換,實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容生成、企業(yè)集成和應(yīng)用開(kāi)發(fā)。
基于ArcGIS Engine與XML實(shí)現(xiàn)通用的空間數(shù)據(jù)建庫(kù)系統(tǒng),技術(shù)實(shí)現(xiàn)的關(guān)鍵點(diǎn)主要在如下4個(gè)功能模塊:建庫(kù)坐標(biāo)系統(tǒng)開(kāi)發(fā);建庫(kù)數(shù)據(jù)字典開(kāi)發(fā);空間數(shù)據(jù)的導(dǎo)入匹配;空間數(shù)據(jù)的拓?fù)錂z查。
ArcGIS Engine提供了一系列對(duì)象供開(kāi)發(fā)者管理GIS系統(tǒng)的坐標(biāo)系統(tǒng),對(duì)大部分開(kāi)發(fā)者而言了解Proiected Coordinate System,GeographicCoordinateSystem,SpatialReferen ce Environment這3個(gè)組件類(lèi)是非常有必要的。對(duì)于高級(jí)開(kāi)發(fā)者而言,需要自定義坐標(biāo)系統(tǒng),了解更多對(duì)象,如Proiection,Datum,AngularUnit,Spheriod,PrimeMeridian和GeoTransformation等。通常使用3種方式定義坐標(biāo)系統(tǒng)。
1)使用接口創(chuàng)建地理坐標(biāo)系對(duì)象:
ISpatialReferenceFactory spatialReferenceFactory = new Spati alReferenceEnvironmentClass();
ISpatialReference spatialReference = spatialReference Factory.CreateGeographicCoordinateSystem((int)esriSRGeo CSType.esriSRGeoCS_WGS1984);
備注:ISpatialReference是地理坐標(biāo)系統(tǒng)對(duì)象接口,esriSRGeoCSType、esriSRProiCSType是空間坐標(biāo)枚舉。
2)自定義坐標(biāo)系統(tǒng):
用ArcMap工具定義好坐標(biāo)系后導(dǎo)出成pri文件,再用IspatialReferenceFactory中的CreateESRISpatialRefe renceFromPRJFile方法創(chuàng)建坐標(biāo)系。
//定義投影坐標(biāo)工廠(chǎng)對(duì)象
ISpatialReferenceFactory spatialReferenceFactory = new Spati alReferenceEnvironmentClass();
//通過(guò)定義或者用戶(hù)導(dǎo)入的投影坐標(biāo)文件創(chuàng)建坐標(biāo)系統(tǒng) , 創(chuàng)建 SpatialReference
IProjectedCoordinateSystem projectedCoordinateSystem =spatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile(s trPath) as IProjectedCoordinateSystem;
3)配置坐標(biāo)系統(tǒng)XML文件:
//定義數(shù)據(jù)流對(duì)象
StreamWriter objStreamWriter;
//投影坐標(biāo)空模板或者用戶(hù)導(dǎo)入投影坐標(biāo)
string strPath= Application.StartupPath + @"Models emp.prj";
string str 1954= "PROJCS["Beijing_1954",GEOGCS["GCS_Beijing_1954",DATUM["D_Beijing_1954",SPHEROID["Krasovsky_1940",6378245.0,298.3]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",500000.0],P ARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian"," + jx + "],PARAMETER["Scale_Factor",1.0],PARA METER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]";
//寫(xiě)入數(shù)據(jù)流
objStreamWriter.WriteLine(str1954);
通用數(shù)據(jù)建庫(kù),首先要求數(shù)據(jù)詞典的靈活性。采用XML配置文件方式,實(shí)現(xiàn)數(shù)據(jù)字典的動(dòng)態(tài)加載,數(shù)據(jù)字典可以認(rèn)為是對(duì)數(shù)據(jù)的描述性信息以及數(shù)據(jù)間任何相關(guān)的附加信息[5]。根據(jù)通用建庫(kù)具體需求創(chuàng)建數(shù)據(jù)模型,在系統(tǒng)中設(shè)計(jì)匹配數(shù)據(jù)字典文件 ,用戶(hù)通過(guò)調(diào)整數(shù)據(jù)字典文件,靈活配置建庫(kù)模型。XML模型中包括設(shè)置字段名稱(chēng)、字段代碼、字段數(shù)據(jù)類(lèi)型、字段長(zhǎng)度、值域范圍、字段條件等。
以 XML標(biāo)準(zhǔn)規(guī)范,建立數(shù)據(jù)字典清單:
//空間數(shù)據(jù)-圖層信息節(jié)點(diǎn)配置
//注釋?zhuān)嚎臻g數(shù)據(jù)代碼
//注釋?zhuān)嚎臻g數(shù)據(jù)名稱(chēng)
//注釋?zhuān)嚎臻g數(shù)據(jù)類(lèi)型,0:注記;1:點(diǎn) ;2:線(xiàn) ;3:面
//注釋?zhuān)嚎臻g數(shù)據(jù)所屬數(shù)據(jù)集
//注釋?zhuān)嚎臻g數(shù)據(jù)必要性。M:必選;O:可選
//空間數(shù)據(jù)-字段信息節(jié)點(diǎn)配置
//注釋?zhuān)鹤侄涡蛱?hào)
//注釋?zhuān)鹤侄蚊Q(chēng)
//注釋?zhuān)鹤侄未a
//注釋?zhuān)鹤侄螖?shù)據(jù)類(lèi)型
//注釋?zhuān)鹤侄伍L(zhǎng)度
//注釋?zhuān)褐涤蚍秶?gt;0:大于0
//注釋?zhuān)鹤侄伪匾?。M:必選;O:可選
//通過(guò)Linq獲取XML字典信息:
//打開(kāi)Xml文檔
XDocument xdocument = XDocument.Load(XmlFile); var Tabs = from TCs in xdocument.Element("Root").Elements() select new
{
//獲取所有空間數(shù)據(jù)基礎(chǔ)信息
TCName = TCs.Element("TCName").Value,
TCTabName = TCs.Element("TCTabName").Value ,
TCLX = TCs.Element("TCLX").Value,
……
};
var Cols = from Colinfo in xdocument.Element("Root").Elements("空間數(shù)據(jù)代碼") select new
{
//獲取某空間數(shù)據(jù)表的字段信息XH = Colinfo.Element("XH").Value,
ZDMC = Colinfo.Element("ZDMC").Value,ZDDM = Colinfo.Element("ZDDM").Value,……};
空間數(shù)據(jù)的導(dǎo)入格式,主要包括MDB、GDB、SHP、DWG等。需要將數(shù)據(jù)轉(zhuǎn)換成IFeatureClass,不同格式的數(shù)據(jù)需要不同的工作空間打開(kāi),再轉(zhuǎn)換成IfeatureClass。
//創(chuàng)建mdb格式工作空間
IWorkspaceFactory pmdbFC = new AccessWork spaceFactoryClass() ;
//創(chuàng)建gdb格式工作空間
FileGDBWorkspaceFactory pgdbFC =new FileGDB WorkspaceFactoryClass();
//創(chuàng)建shp格式工作空間
IWorkspaceFactory pshpFC = new Shapef i leWorkspaceFactor yClass();
//創(chuàng)建dwg格式工作空間
IWorkspaceFactory pcadFC = new CadWorkspace FactoryClass() ;
上面通過(guò)對(duì)應(yīng)工作空間打開(kāi)數(shù)據(jù)源,并轉(zhuǎn)換成IfeatureClass,通過(guò)如下代碼可以進(jìn)行數(shù)據(jù)導(dǎo)入。
//獲取IFeatureClass對(duì)象后,再循環(huán)獲取數(shù)據(jù)導(dǎo)入目標(biāo)數(shù)據(jù)集中:
ITable m_pTable = pFeatureWorkspace.OpenTable(layerName);
IRowBuffer pRowBuffer = m_pTable.CreateRowBuffer();
ICursor pCursor = m_pTable.Insert(true);
//循環(huán)加載記錄行中的數(shù)據(jù)
for (int i = 0; i < RowCounts; i++)
{
IRow pRow = pSearchCursor.NextRow();
IFeature tmpFea = pRow as IFeature;
pRowBuffer.set_Value(colIndex,value);
pCursor.InsertRow(pRowBuffer);
……
}
空間數(shù)據(jù)的匹配,負(fù)責(zé)將導(dǎo)入的空間數(shù)據(jù)與XML字典標(biāo)準(zhǔn)進(jìn)行匹配。數(shù)據(jù)匹配第一步是確定來(lái)源表與目標(biāo)表的對(duì)應(yīng)關(guān)系;第二步確定空間表中來(lái)源字段與目標(biāo)字段的對(duì)應(yīng)關(guān)系,來(lái)源字段與目標(biāo)字段的字段類(lèi)型必須為包容關(guān)系,來(lái)源字段長(zhǎng)度必須小于等于目標(biāo)字段長(zhǎng)度,來(lái)源字段中的數(shù)據(jù)必須可以正確地轉(zhuǎn)換為目標(biāo)字段類(lèi)型,例如數(shù)字類(lèi)型可以轉(zhuǎn)換為字符串類(lèi)型。匹配及轉(zhuǎn)換實(shí)現(xiàn)采用Visual Studio 2013常規(guī)類(lèi)庫(kù)實(shí)現(xiàn)如圖1所示。
圖1 空間數(shù)據(jù)匹配實(shí)現(xiàn)界面
數(shù)據(jù)檢查在完成空間數(shù)據(jù)導(dǎo)入之后,對(duì)空間數(shù)據(jù)進(jìn)行一般性檢查與拓?fù)錂z查。
一般性檢查目標(biāo)是空間圖層的屬性數(shù)據(jù),檢查內(nèi)容包括必選圖層在數(shù)據(jù)庫(kù)中是否存在、各個(gè)圖層屬性表結(jié)構(gòu)是否正確、必填字段是否有缺失、字段中的數(shù)據(jù)是否超出值域范圍[6],檢查完成給出檢查日志。
拓?fù)錂z查模塊檢查空間圖層的邏輯關(guān)系,開(kāi)發(fā)時(shí)遵從模塊可配置擴(kuò)展的原則,用戶(hù)可根據(jù)業(yè)務(wù)需要配置一份拓?fù)錂z查內(nèi)容。為了不影響原數(shù)據(jù)的完整性,系統(tǒng)將重新創(chuàng)建備份空間數(shù)據(jù)庫(kù)與拓?fù)鋽?shù)據(jù)集,拓?fù)錂z查將在該數(shù)據(jù)集中進(jìn)行。檢查完成后可方便地查看錯(cuò)誤類(lèi)型與錯(cuò)誤來(lái)源等信息,如需查看更加詳盡的信息可以在ArcMap軟件中查看拓?fù)鋽?shù)據(jù)集。
2.4.1 一般性檢查
1)檢查必選圖層。使用SQL語(yǔ)句,循環(huán)查找必選圖層是否存在。
2)檢查圖層屬性表結(jié)構(gòu)是否正確、必填字段是否缺失。獲取圖層結(jié)構(gòu)后,通過(guò)填充至DataTable,循環(huán)對(duì)比字段數(shù)據(jù)類(lèi)型是否正確、必填字段是否存在。dt.Columns[字段代碼].DataType可以獲取字段數(shù)據(jù)類(lèi)型。
3)檢查字段值域。獲取XML值域要求或具體內(nèi)容,與屬性?xún)?nèi)容比較,用DataTable比較的方式。
2.4.2 拓?fù)錂z查
ArcEngine中封裝了一組拓?fù)浣涌冢糜谟脩?hù)定制拓?fù)潢P(guān)系規(guī)則,幫助用戶(hù)發(fā)現(xiàn)存在的拓?fù)潢P(guān)系錯(cuò)誤。
該模塊提供空間數(shù)據(jù)圖形與屬性的查看,并提供數(shù)據(jù)加載、放大、縮小、移動(dòng)等基本功能。
2.5.1 圖層加載
通過(guò)使用工廠(chǎng)接口模式加載數(shù)據(jù),并將數(shù)據(jù)加載到地圖容器。
IWorkspaceFactory pmdbFC = new AccessWorkspace FactoryClass() ;
IFeatureWorkspace featureWorkspace= pWorkspaceFactory.OpenFromFile(“數(shù)據(jù)路徑”, 0) as IFeatureWorkspace;
IFeatureclass pFC= featureWorkspace.OpenFeatureClass (“圖層名稱(chēng)”);
axMapControl1.AddLayer(pFC as ILayer); //將圖層加載到地圖容器
2.5.2 地圖工具的實(shí)現(xiàn)
在ArcEngine類(lèi)庫(kù)中有豐富的Command控件用來(lái)與地圖控件進(jìn)行操作和交互,全面采用COM技術(shù)、支持跨平臺(tái)、跨語(yǔ)言及多模式開(kāi)發(fā)[7]。比如有一系列的地圖瀏覽控件、地圖查詢(xún)控件、選取控件、編輯控件來(lái)與MapControl和PageLayoutControl進(jìn)行交互。
作為地理信息系統(tǒng)的重要組成階段,空間數(shù)據(jù)建設(shè)是至關(guān)重要的第一步,也是各種信息化建設(shè)的關(guān)鍵一步。本系統(tǒng)以可擴(kuò)展標(biāo)記語(yǔ)言XML,設(shè)計(jì)生成數(shù)據(jù)庫(kù)模型;采用ArcGIS Engine接口開(kāi)發(fā)技術(shù),建設(shè)通用的空間數(shù)據(jù)庫(kù)。能幫助業(yè)務(wù)人員快速建庫(kù)、矢量數(shù)據(jù)入庫(kù)、數(shù)據(jù)檢查、成果打包等,有效提高作業(yè)效率、提升作業(yè)品質(zhì)。
[1] 左澤均,周順平.基于MapGIS數(shù)據(jù)中心構(gòu)建基礎(chǔ)地理信息地圖集模型[J].地球科學(xué):中國(guó)地址大學(xué)學(xué)報(bào),2010,35(3):391-396
[2] 張龍,汪新慶.基于數(shù)據(jù)字典的空間數(shù)據(jù)庫(kù)通用建庫(kù)技術(shù)[J].國(guó)土資源遙感,2014,26(1) :173-178
[3] 黃雯翠,任福. 基于ArcEngine開(kāi)發(fā)的應(yīng)用數(shù)據(jù)平臺(tái)更新與維護(hù)[J].測(cè)繪與空間地理信息,2010,33(3):158-163
[4] 馮進(jìn),丁博,史殿習(xí),等.XML解析技術(shù)研究[J].計(jì)算機(jī)工程與科學(xué),2009,31(2):120-124
[5] 李連勝.Geodatabase在空間數(shù)據(jù)庫(kù)建庫(kù)中的應(yīng)用[J].現(xiàn)代計(jì)算機(jī)(專(zhuān)業(yè)版),2009(12) :131-134
[6] 李江,周浩,羅吳亮.ArcGIS空間數(shù)據(jù)庫(kù)中拓?fù)溴e(cuò)誤的檢查與批量處理方法[J].北京測(cè)繪,2015(2) :5-8
[7] 尹暉,王艷濤,張曉鳴,等. 基于ArcEngine的輸電走廊三維可視化系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J] .測(cè)繪地理信息,2015,40(2) :14-16