李 江,周 浩
(1.南京集艾思軟件科技有限公司,江蘇 南京 210009)
各行各業(yè)已從信息化、數(shù)據(jù)庫化發(fā)展到數(shù)據(jù)整合、數(shù)據(jù)統(tǒng)一、云平臺階段,行業(yè)內(nèi)部需要將各種信息系統(tǒng)整合成一個平臺,供行業(yè)內(nèi)云共享。但是目前,空間數(shù)據(jù)庫缺少通用性的建庫工具[1,2]。如何把已經(jīng)形成的大容量、多冗余數(shù)據(jù)進行統(tǒng)一,是擺在各行業(yè)前面的頭等問題。實現(xiàn)通用的空間數(shù)據(jù)建庫系統(tǒng),要求結(jié)合各行業(yè)自身特點,把建庫工作簡單化、標(biāo)準(zhǔn)化,把各種資源數(shù)據(jù)整合成一個統(tǒng)一平臺,為大數(shù)據(jù)應(yīng)用打下堅實的基礎(chǔ)。
通用的空間數(shù)據(jù)建庫系統(tǒng),關(guān)鍵技術(shù)基于ArcGIS Engine與XML實現(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 組件庫和工具庫,使用ArcGIS Engine開發(fā)的GIS應(yīng)用程序可以脫離ArcGIS Desktop而運行。它的數(shù)據(jù)提取快速,是穩(wěn)定性好的多優(yōu)勢平臺[3]。
可擴展標(biāo)記語言XML[4]具有定義嚴(yán)格、結(jié)構(gòu)清晰、靈活易讀的特點,可以用來描述各種復(fù)雜信息。XML可以對文檔和數(shù)據(jù)進行結(jié)構(gòu)化處理,在不同業(yè)務(wù)之間進行交換,實現(xiàn)動態(tài)內(nèi)容生成、企業(yè)集成和應(yīng)用開發(fā)。
基于ArcGIS Engine與XML實現(xiàn)通用的空間數(shù)據(jù)建庫系統(tǒng),技術(shù)實現(xiàn)的關(guān)鍵點主要在如下4個功能模塊:建庫坐標(biāo)系統(tǒng)開發(fā);建庫數(shù)據(jù)字典開發(fā);空間數(shù)據(jù)的導(dǎo)入匹配;空間數(shù)據(jù)的拓?fù)錂z查。
ArcGIS Engine提供了一系列對象供開發(fā)者管理GIS系統(tǒng)的坐標(biāo)系統(tǒng),對大部分開發(fā)者而言了解Proiected Coordinate System,GeographicCoordinateSystem,SpatialReferen ce Environment這3個組件類是非常有必要的。對于高級開發(fā)者而言,需要自定義坐標(biāo)系統(tǒng),了解更多對象,如Proiection,Datum,AngularUnit,Spheriod,PrimeMeridian和GeoTransformation等。通常使用3種方式定義坐標(biāo)系統(tǒng)。
1)使用接口創(chuàng)建地理坐標(biāo)系對象:
ISpatialReferenceFactory spatialReferenceFactory = new Spati alReferenceEnvironmentClass();
ISpatialReference spatialReference = spatialReference Factory.CreateGeographicCoordinateSystem((int)esriSRGeo CSType.esriSRGeoCS_WGS1984);
備注:ISpatialReference是地理坐標(biāo)系統(tǒng)對象接口,esriSRGeoCSType、esriSRProiCSType是空間坐標(biāo)枚舉。
2)自定義坐標(biāo)系統(tǒng):
用ArcMap工具定義好坐標(biāo)系后導(dǎo)出成pri文件,再用IspatialReferenceFactory中的CreateESRISpatialRefe renceFromPRJFile方法創(chuàng)建坐標(biāo)系。
//定義投影坐標(biāo)工廠對象
ISpatialReferenceFactory spatialReferenceFactory = new Spati alReferenceEnvironmentClass();
//通過定義或者用戶導(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ù)流對象
StreamWriter objStreamWriter;
//投影坐標(biāo)空模板或者用戶導(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]]";
//寫入數(shù)據(jù)流
objStreamWriter.WriteLine(str1954);
通用數(shù)據(jù)建庫,首先要求數(shù)據(jù)詞典的靈活性。采用XML配置文件方式,實現(xiàn)數(shù)據(jù)字典的動態(tài)加載,數(shù)據(jù)字典可以認(rèn)為是對數(shù)據(jù)的描述性信息以及數(shù)據(jù)間任何相關(guān)的附加信息[5]。根據(jù)通用建庫具體需求創(chuàng)建數(shù)據(jù)模型,在系統(tǒng)中設(shè)計匹配數(shù)據(jù)字典文件 ,用戶通過調(diào)整數(shù)據(jù)字典文件,靈活配置建庫模型。XML模型中包括設(shè)置字段名稱、字段代碼、字段數(shù)據(jù)類型、字段長度、值域范圍、字段條件等。
以 XML標(biāo)準(zhǔn)規(guī)范,建立數(shù)據(jù)字典清單:
//空間數(shù)據(jù)-圖層信息節(jié)點配置
//注釋:空間數(shù)據(jù)代碼
//注釋:空間數(shù)據(jù)名稱
//注釋:空間數(shù)據(jù)類型,0:注記;1:點 ;2:線 ;3:面
//注釋:空間數(shù)據(jù)所屬數(shù)據(jù)集
//注釋:空間數(shù)據(jù)必要性。M:必選;O:可選
//空間數(shù)據(jù)-字段信息節(jié)點配置
//注釋:字段序號
//注釋:字段名稱
//注釋:字段代碼
//注釋:字段數(shù)據(jù)類型
//注釋:字段長度
//注釋:值域范圍。>0:大于0
//注釋:字段必要性。M:必選;O:可選
//通過Linq獲取XML字典信息:
//打開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ù)需要不同的工作空間打開,再轉(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() ;
上面通過對應(yīng)工作空間打開數(shù)據(jù)源,并轉(zhuǎn)換成IfeatureClass,通過如下代碼可以進行數(shù)據(jù)導(dǎo)入。
//獲取IFeatureClass對象后,再循環(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)進行匹配。數(shù)據(jù)匹配第一步是確定來源表與目標(biāo)表的對應(yīng)關(guān)系;第二步確定空間表中來源字段與目標(biāo)字段的對應(yīng)關(guān)系,來源字段與目標(biāo)字段的字段類型必須為包容關(guān)系,來源字段長度必須小于等于目標(biāo)字段長度,來源字段中的數(shù)據(jù)必須可以正確地轉(zhuǎn)換為目標(biāo)字段類型,例如數(shù)字類型可以轉(zhuǎn)換為字符串類型。匹配及轉(zhuǎn)換實現(xiàn)采用Visual Studio 2013常規(guī)類庫實現(xiàn)如圖1所示。
圖1 空間數(shù)據(jù)匹配實現(xiàn)界面
數(shù)據(jù)檢查在完成空間數(shù)據(jù)導(dǎo)入之后,對空間數(shù)據(jù)進行一般性檢查與拓?fù)錂z查。
一般性檢查目標(biāo)是空間圖層的屬性數(shù)據(jù),檢查內(nèi)容包括必選圖層在數(shù)據(jù)庫中是否存在、各個圖層屬性表結(jié)構(gòu)是否正確、必填字段是否有缺失、字段中的數(shù)據(jù)是否超出值域范圍[6],檢查完成給出檢查日志。
拓?fù)錂z查模塊檢查空間圖層的邏輯關(guān)系,開發(fā)時遵從模塊可配置擴展的原則,用戶可根據(jù)業(yè)務(wù)需要配置一份拓?fù)錂z查內(nèi)容。為了不影響原數(shù)據(jù)的完整性,系統(tǒng)將重新創(chuàng)建備份空間數(shù)據(jù)庫與拓?fù)鋽?shù)據(jù)集,拓?fù)錂z查將在該數(shù)據(jù)集中進行。檢查完成后可方便地查看錯誤類型與錯誤來源等信息,如需查看更加詳盡的信息可以在ArcMap軟件中查看拓?fù)鋽?shù)據(jù)集。
2.4.1 一般性檢查
1)檢查必選圖層。使用SQL語句,循環(huán)查找必選圖層是否存在。
2)檢查圖層屬性表結(jié)構(gòu)是否正確、必填字段是否缺失。獲取圖層結(jié)構(gòu)后,通過填充至DataTable,循環(huán)對比字段數(shù)據(jù)類型是否正確、必填字段是否存在。dt.Columns[字段代碼].DataType可以獲取字段數(shù)據(jù)類型。
3)檢查字段值域。獲取XML值域要求或具體內(nèi)容,與屬性內(nèi)容比較,用DataTable比較的方式。
2.4.2 拓?fù)錂z查
ArcEngine中封裝了一組拓?fù)浣涌?,用于用戶定制拓?fù)潢P(guān)系規(guī)則,幫助用戶發(fā)現(xiàn)存在的拓?fù)潢P(guān)系錯誤。
該模塊提供空間數(shù)據(jù)圖形與屬性的查看,并提供數(shù)據(jù)加載、放大、縮小、移動等基本功能。
2.5.1 圖層加載
通過使用工廠接口模式加載數(shù)據(jù),并將數(shù)據(jù)加載到地圖容器。
IWorkspaceFactory pmdbFC = new AccessWorkspace FactoryClass() ;
IFeatureWorkspace featureWorkspace= pWorkspaceFactory.OpenFromFile(“數(shù)據(jù)路徑”, 0) as IFeatureWorkspace;
IFeatureclass pFC= featureWorkspace.OpenFeatureClass (“圖層名稱”);
axMapControl1.AddLayer(pFC as ILayer); //將圖層加載到地圖容器
2.5.2 地圖工具的實現(xiàn)
在ArcEngine類庫中有豐富的Command控件用來與地圖控件進行操作和交互,全面采用COM技術(shù)、支持跨平臺、跨語言及多模式開發(fā)[7]。比如有一系列的地圖瀏覽控件、地圖查詢控件、選取控件、編輯控件來與MapControl和PageLayoutControl進行交互。
作為地理信息系統(tǒng)的重要組成階段,空間數(shù)據(jù)建設(shè)是至關(guān)重要的第一步,也是各種信息化建設(shè)的關(guān)鍵一步。本系統(tǒng)以可擴展標(biāo)記語言XML,設(shè)計生成數(shù)據(jù)庫模型;采用ArcGIS Engine接口開發(fā)技術(shù),建設(shè)通用的空間數(shù)據(jù)庫。能幫助業(yè)務(wù)人員快速建庫、矢量數(shù)據(jù)入庫、數(shù)據(jù)檢查、成果打包等,有效提高作業(yè)效率、提升作業(yè)品質(zhì)。
[1] 左澤均,周順平.基于MapGIS數(shù)據(jù)中心構(gòu)建基礎(chǔ)地理信息地圖集模型[J].地球科學(xué):中國地址大學(xué)學(xué)報,2010,35(3):391-396
[2] 張龍,汪新慶.基于數(shù)據(jù)字典的空間數(shù)據(jù)庫通用建庫技術(shù)[J].國土資源遙感,2014,26(1) :173-178
[3] 黃雯翠,任福. 基于ArcEngine開發(fā)的應(yīng)用數(shù)據(jù)平臺更新與維護[J].測繪與空間地理信息,2010,33(3):158-163
[4] 馮進,丁博,史殿習(xí),等.XML解析技術(shù)研究[J].計算機工程與科學(xué),2009,31(2):120-124
[5] 李連勝.Geodatabase在空間數(shù)據(jù)庫建庫中的應(yīng)用[J].現(xiàn)代計算機(專業(yè)版),2009(12) :131-134
[6] 李江,周浩,羅吳亮.ArcGIS空間數(shù)據(jù)庫中拓?fù)溴e誤的檢查與批量處理方法[J].北京測繪,2015(2) :5-8
[7] 尹暉,王艷濤,張曉鳴,等. 基于ArcEngine的輸電走廊三維可視化系統(tǒng)設(shè)計與實現(xiàn)[J] .測繪地理信息,2015,40(2) :14-16