李 江,周 浩
(1.南京集艾思軟件科技有限公司,江蘇 南京 210009)
各行各業已從信息化、數據庫化發展到數據整合、數據統一、云平臺階段,行業內部需要將各種信息系統整合成一個平臺,供行業內云共享。但是目前,空間數據庫缺少通用性的建庫工具[1,2]。如何把已經形成的大容量、多冗余數據進行統一,是擺在各行業前面的頭等問題。實現通用的空間數據建庫系統,要求結合各行業自身特點,把建庫工作簡單化、標準化,把各種資源數據整合成一個統一平臺,為大數據應用打下堅實的基礎。
通用的空間數據建庫系統,關鍵技術基于ArcGIS Engine與XML實現,ArcGIS Engine利用接口負責空間數據的定義、輸入、處理與輸出;XML承擔著數據字典、數據配置、業務標準的角色。
ArcGIS Engine是ESRI公司產品。它有完備的嵌入式GIS 組件庫和工具庫,使用ArcGIS Engine開發的GIS應用程序可以脫離ArcGIS Desktop而運行。它的數據提取快速,是穩定性好的多優勢平臺[3]。
可擴展標記語言XML[4]具有定義嚴格、結構清晰、靈活易讀的特點,可以用來描述各種復雜信息。XML可以對文檔和數據進行結構化處理,在不同業務之間進行交換,實現動態內容生成、企業集成和應用開發。
基于ArcGIS Engine與XML實現通用的空間數據建庫系統,技術實現的關鍵點主要在如下4個功能模塊:建庫坐標系統開發;建庫數據字典開發;空間數據的導入匹配;空間數據的拓撲檢查。
ArcGIS Engine提供了一系列對象供開發者管理GIS系統的坐標系統,對大部分開發者而言了解Proiected Coordinate System,GeographicCoordinateSystem,SpatialReferen ce Environment這3個組件類是非常有必要的。對于高級開發者而言,需要自定義坐標系統,了解更多對象,如Proiection,Datum,AngularUnit,Spheriod,PrimeMeridian和GeoTransformation等。通常使用3種方式定義坐標系統。
1)使用接口創建地理坐標系對象:
ISpatialReferenceFactory spatialReferenceFactory = new Spati alReferenceEnvironmentClass();
ISpatialReference spatialReference = spatialReference Factory.CreateGeographicCoordinateSystem((int)esriSRGeo CSType.esriSRGeoCS_WGS1984);
備注:ISpatialReference是地理坐標系統對象接口,esriSRGeoCSType、esriSRProiCSType是空間坐標枚舉。
2)自定義坐標系統:
用ArcMap工具定義好坐標系后導出成pri文件,再用IspatialReferenceFactory中的CreateESRISpatialRefe renceFromPRJFile方法創建坐標系。
//定義投影坐標工廠對象
ISpatialReferenceFactory spatialReferenceFactory = new Spati alReferenceEnvironmentClass();
//通過定義或者用戶導入的投影坐標文件創建坐標系統 , 創建 SpatialReference
IProjectedCoordinateSystem projectedCoordinateSystem =spatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile(s trPath) as IProjectedCoordinateSystem;
3)配置坐標系統XML文件:
//定義數據流對象
StreamWriter objStreamWriter;
//投影坐標空模板或者用戶導入投影坐標
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]]";
//寫入數據流
objStreamWriter.WriteLine(str1954);
通用數據建庫,首先要求數據詞典的靈活性。采用XML配置文件方式,實現數據字典的動態加載,數據字典可以認為是對數據的描述性信息以及數據間任何相關的附加信息[5]。根據通用建庫具體需求創建數據模型,在系統中設計匹配數據字典文件 ,用戶通過調整數據字典文件,靈活配置建庫模型。XML模型中包括設置字段名稱、字段代碼、字段數據類型、字段長度、值域范圍、字段條件等。
以 XML標準規范,建立數據字典清單:
//空間數據-圖層信息節點配置
//注釋:空間數據代碼
//注釋:空間數據名稱
//注釋:空間數據類型,0:注記;1:點 ;2:線 ;3:面
//注釋:空間數據所屬數據集
//注釋:空間數據必要性。M:必選;O:可選
//空間數據-字段信息節點配置
//注釋:字段序號
//注釋:字段名稱
//注釋:字段代碼
//注釋:字段數據類型
//注釋:字段長度
//注釋:值域范圍。>0:大于0
//注釋:字段必要性。M:必選;O:可選
//通過Linq獲取XML字典信息:
//打開Xml文檔
XDocument xdocument = XDocument.Load(XmlFile); var Tabs = from TCs in xdocument.Element("Root").Elements() select new
{
//獲取所有空間數據基礎信息
TCName = TCs.Element("TCName").Value,
TCTabName = TCs.Element("TCTabName").Value ,
TCLX = TCs.Element("TCLX").Value,
……
};
var Cols = from Colinfo in xdocument.Element("Root").Elements("空間數據代碼") select new
{
//獲取某空間數據表的字段信息XH = Colinfo.Element("XH").Value,
ZDMC = Colinfo.Element("ZDMC").Value,ZDDM = Colinfo.Element("ZDDM").Value,……};
空間數據的導入格式,主要包括MDB、GDB、SHP、DWG等。需要將數據轉換成IFeatureClass,不同格式的數據需要不同的工作空間打開,再轉換成IfeatureClass。
//創建mdb格式工作空間
IWorkspaceFactory pmdbFC = new AccessWork spaceFactoryClass() ;
//創建gdb格式工作空間
FileGDBWorkspaceFactory pgdbFC =new FileGDB WorkspaceFactoryClass();
//創建shp格式工作空間
IWorkspaceFactory pshpFC = new Shapef i leWorkspaceFactor yClass();
//創建dwg格式工作空間
IWorkspaceFactory pcadFC = new CadWorkspace FactoryClass() ;
上面通過對應工作空間打開數據源,并轉換成IfeatureClass,通過如下代碼可以進行數據導入。
//獲取IFeatureClass對象后,再循環獲取數據導入目標數據集中:
ITable m_pTable = pFeatureWorkspace.OpenTable(layerName);
IRowBuffer pRowBuffer = m_pTable.CreateRowBuffer();
ICursor pCursor = m_pTable.Insert(true);
//循環加載記錄行中的數據
for (int i = 0; i < RowCounts; i++)
{
IRow pRow = pSearchCursor.NextRow();
IFeature tmpFea = pRow as IFeature;
pRowBuffer.set_Value(colIndex,value);
pCursor.InsertRow(pRowBuffer);
……
}
空間數據的匹配,負責將導入的空間數據與XML字典標準進行匹配。數據匹配第一步是確定來源表與目標表的對應關系;第二步確定空間表中來源字段與目標字段的對應關系,來源字段與目標字段的字段類型必須為包容關系,來源字段長度必須小于等于目標字段長度,來源字段中的數據必須可以正確地轉換為目標字段類型,例如數字類型可以轉換為字符串類型。匹配及轉換實現采用Visual Studio 2013常規類庫實現如圖1所示。

圖1 空間數據匹配實現界面
數據檢查在完成空間數據導入之后,對空間數據進行一般性檢查與拓撲檢查。
一般性檢查目標是空間圖層的屬性數據,檢查內容包括必選圖層在數據庫中是否存在、各個圖層屬性表結構是否正確、必填字段是否有缺失、字段中的數據是否超出值域范圍[6],檢查完成給出檢查日志。
拓撲檢查模塊檢查空間圖層的邏輯關系,開發時遵從模塊可配置擴展的原則,用戶可根據業務需要配置一份拓撲檢查內容。為了不影響原數據的完整性,系統將重新創建備份空間數據庫與拓撲數據集,拓撲檢查將在該數據集中進行。檢查完成后可方便地查看錯誤類型與錯誤來源等信息,如需查看更加詳盡的信息可以在ArcMap軟件中查看拓撲數據集。
2.4.1 一般性檢查
1)檢查必選圖層。使用SQL語句,循環查找必選圖層是否存在。
2)檢查圖層屬性表結構是否正確、必填字段是否缺失。獲取圖層結構后,通過填充至DataTable,循環對比字段數據類型是否正確、必填字段是否存在。dt.Columns[字段代碼].DataType可以獲取字段數據類型。
3)檢查字段值域。獲取XML值域要求或具體內容,與屬性內容比較,用DataTable比較的方式。
2.4.2 拓撲檢查
ArcEngine中封裝了一組拓撲接口,用于用戶定制拓撲關系規則,幫助用戶發現存在的拓撲關系錯誤。
該模塊提供空間數據圖形與屬性的查看,并提供數據加載、放大、縮小、移動等基本功能。
2.5.1 圖層加載
通過使用工廠接口模式加載數據,并將數據加載到地圖容器。
IWorkspaceFactory pmdbFC = new AccessWorkspace FactoryClass() ;
IFeatureWorkspace featureWorkspace= pWorkspaceFactory.OpenFromFile(“數據路徑”, 0) as IFeatureWorkspace;
IFeatureclass pFC= featureWorkspace.OpenFeatureClass (“圖層名稱”);
axMapControl1.AddLayer(pFC as ILayer); //將圖層加載到地圖容器
2.5.2 地圖工具的實現
在ArcEngine類庫中有豐富的Command控件用來與地圖控件進行操作和交互,全面采用COM技術、支持跨平臺、跨語言及多模式開發[7]。比如有一系列的地圖瀏覽控件、地圖查詢控件、選取控件、編輯控件來與MapControl和PageLayoutControl進行交互。
作為地理信息系統的重要組成階段,空間數據建設是至關重要的第一步,也是各種信息化建設的關鍵一步。本系統以可擴展標記語言XML,設計生成數據庫模型;采用ArcGIS Engine接口開發技術,建設通用的空間數據庫。能幫助業務人員快速建庫、矢量數據入庫、數據檢查、成果打包等,有效提高作業效率、提升作業品質。
[1] 左澤均,周順平.基于MapGIS數據中心構建基礎地理信息地圖集模型[J].地球科學:中國地址大學學報,2010,35(3):391-396
[2] 張龍,汪新慶.基于數據字典的空間數據庫通用建庫技術[J].國土資源遙感,2014,26(1) :173-178
[3] 黃雯翠,任福. 基于ArcEngine開發的應用數據平臺更新與維護[J].測繪與空間地理信息,2010,33(3):158-163
[4] 馮進,丁博,史殿習,等.XML解析技術研究[J].計算機工程與科學,2009,31(2):120-124
[5] 李連勝.Geodatabase在空間數據庫建庫中的應用[J].現代計算機(專業版),2009(12) :131-134
[6] 李江,周浩,羅吳亮.ArcGIS空間數據庫中拓撲錯誤的檢查與批量處理方法[J].北京測繪,2015(2) :5-8
[7] 尹暉,王艷濤,張曉鳴,等. 基于ArcEngine的輸電走廊三維可視化系統設計與實現[J] .測繪地理信息,2015,40(2) :14-16