基于ArcGIS Engine与XML的通用空间数据建库系统
2018-04-27李江,周浩
李 江,周 浩
(1.南京集艾思软件科技有限公司,江苏 南京 210009)
各行各业已从信息化、数据库化发展到数据整合、数据统一、云平台阶段,行业内部需要将各种信息系统整合成一个平台,供行业内云共享。但是目前,空间数据库缺少通用性的建库工具[1,2]。如何把已经形成的大容量、多冗余数据进行统一,是摆在各行业前面的头等问题。实现通用的空间数据建库系统,要求结合各行业自身特点,把建库工作简单化、标准化,把各种资源数据整合成一个统一平台,为大数据应用打下坚实的基础。
1 实现技术
通用的空间数据建库系统,关键技术基于ArcGIS Engine与XML实现,ArcGIS Engine利用接口负责空间数据的定义、输入、处理与输出;XML承担着数据字典、数据配置、业务标准的角色。
1.1 ArcGIS Engine
ArcGIS Engine是ESRI公司产品。它有完备的嵌入式GIS 组件库和工具库,使用ArcGIS Engine开发的GIS应用程序可以脱离ArcGIS Desktop而运行。它的数据提取快速,是稳定性好的多优势平台[3]。
1.2 XML
可扩展标记语言XML[4]具有定义严格、结构清晰、灵活易读的特点,可以用来描述各种复杂信息。XML可以对文档和数据进行结构化处理,在不同业务之间进行交换,实现动态内容生成、企业集成和应用开发。
2 实现方法
基于ArcGIS Engine与XML实现通用的空间数据建库系统,技术实现的关键点主要在如下4个功能模块:建库坐标系统开发;建库数据字典开发;空间数据的导入匹配;空间数据的拓扑检查。
2.1 坐标系统开发
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);
2.2 数据字典开发
通用数据建库,首先要求数据词典的灵活性。采用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,……};
2.3 空间数据导入匹配
空间数据的导入格式,主要包括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 空间数据匹配实现界面
2.4 数据检查
数据检查在完成空间数据导入之后,对空间数据进行一般性检查与拓扑检查。
一般性检查目标是空间图层的属性数据,检查内容包括必选图层在数据库中是否存在、各个图层属性表结构是否正确、必填字段是否有缺失、字段中的数据是否超出值域范围[6],检查完成给出检查日志。
拓扑检查模块检查空间图层的逻辑关系,开发时遵从模块可配置扩展的原则,用户可根据业务需要配置一份拓扑检查内容。为了不影响原数据的完整性,系统将重新创建备份空间数据库与拓扑数据集,拓扑检查将在该数据集中进行。检查完成后可方便地查看错误类型与错误来源等信息,如需查看更加详尽的信息可以在ArcMap软件中查看拓扑数据集。
2.4.1 一般性检查
1)检查必选图层。使用SQL语句,循环查找必选图层是否存在。
2)检查图层属性表结构是否正确、必填字段是否缺失。获取图层结构后,通过填充至DataTable,循环对比字段数据类型是否正确、必填字段是否存在。dt.Columns[字段代码].DataType可以获取字段数据类型。
3)检查字段值域。获取XML值域要求或具体内容,与属性内容比较,用DataTable比较的方式。
2.4.2 拓扑检查
ArcEngine中封装了一组拓扑接口,用于用户定制拓扑关系规则,帮助用户发现存在的拓扑关系错误。
2.5 数据浏览
该模块提供空间数据图形与属性的查看,并提供数据加载、放大、缩小、移动等基本功能。
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进行交互。
3 结 语
作为地理信息系统的重要组成阶段,空间数据建设是至关重要的第一步,也是各种信息化建设的关键一步。本系统以可扩展标记语言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