时间:2024-05-22
毕云华,马 霖,罗 明
(1.黄山市国土资源信息中心, 安徽 黄山245000;2.安徽省基础测绘信息中心,安徽 合肥 230031)
随着“数字黄山”地理空间框架项目的建设实施,黄山市地理信息系统的应用范围也越来越广泛,已经逐步在国土管理、公安警用、城市规划、数字城管、旅游、交通等方面推广应用。作为地理信息系统血液的地理空间数据,是GIS应用的关键和核心[1]。本文在ArcMap中通过ID字段挂接清华山维MDB中的属性表,将清华山维数据无损转换至ArcGIS的Shape格式;通过编写分层表,将转换后的Shape格式数据进行分层,提取有用数据,提高数据使用效率,集成不同平台功能和数据,为黄山市城镇地籍数据库和数字黄山地理空间框架等系统建设提供了方便。本文编译的软件也可为国内现阶段中小城市基础测绘数据库建设提供借鉴。
清华山维EPS平台以关系型数据库Access保存的MDB为基本存储单位,每个MDB均由若干数量的二维表组成,表之间通过关键字段进行关联。其数据类型可以分为空间数据和属性数据。空间数据有点类型、线类型、面类型和注记类型。属性数据视具体的应用而定,不同的应用有不同的属性表,但均通过关键字段ID和图形进行挂接。清华山维和ArcGIS属性数据的转换可以在ArcMap中通过关键字段ID进行挂接,所以在此不分析具体的属性数据,只分析空间数据类型。4种类型的空间数据由相应的表构成。
点类型的空间数据由GeoPointTB和CPointTB_p 2张表构成。GeoPointTB表中的每条记录对应于清华山维EPS软件上的1个点。GeoPointTB表共有23个字段,其中字段ID为关键字段挂接CPointTB_p表及点类型属性表,其余字段存储该点的地物代码、线型、颜色和所在图层等信息。CPointTB_p表中的每条记录保存每个点的X、Y坐标值。CPointTB_p表共有7个字段,其中ID为关键字段挂接GeoPointTB表,其余字段存储每个点的X、Y坐标值及高程、点名、点类型等信息。
线类型的空间数据由GeoLineTB和CPointTB_l构成。GeoLineTB表中的每条记录对应于清华山维EPS软件上的1条线。GeoLineTB表共有23个字段,其中字段ID为关键字段挂接CPointTB_l表及线类型的属性表,其余字段存储该线的地物代码、线型、颜色和所在图层等信息。CPointTB_l表共有7个字段,其中ID为关键字段挂接GeoLineTB表,其余字段存储每条线的X、Y坐标值及构成该线的点的高程、点名和点类型等信息。
面类型的空间数据由GeoAreaTB、CPointTB_a构成。GeoAreaTB表中的每条记录对应于清华山维EPS软件上的1个面。GeoAreaTB表共有23个字段,其中字段ID为关键字段挂接CPointTB_a表及面类型的属性表,其余字段存储该面的地物代码、颜色和所在图层等信息。CPointTB_a表共有7个字段,其中ID为关键字段挂接GeoAreaTB表,其余字段存储每个面的X、Y坐标值及构成该面的点的高程、点名和点类型等信息。
注记类型的空间数据由MarkNoteTB、CPointTB_n构成。MarkNoteTB表中的每条记录对应于清华山维EPS软件上的1个注记。GeoPointTB表共有34个字段,其中字段ID为关键字段挂接CPointTB_n表及注记类型的属性表,其余字段存储该注记的内容、颜色等信息。CPointTB_n表中的每条记录保存每个注记的X、Y坐标值。CPointTB_n表共有7个字段,其中ID为关键字段挂接MarkNoteTB表,其余字段存储每个注记的X、Y坐标值、点名和点类型等信息。
ArcGIS的 数 据 格 式 主 要 有Shape、Coverage、Geodatabase和E00[2]。本文通过Shape文件格式进行数据转换。一个ESRI的Shapefile数据包含一个主文件(.shp),一个索引文件(.shx)和一个dBASE(.dbf)表。主文件是直接访问的变长记录的文件,每一条记录都描述一个形状的一系列结点。在索引文件中,每一条记录包含主文件相应记录相对于主文件头的偏移量。dBASE表中每条记录表示一个要素的属性。这种几何结构和属性要素一对一的关系是通过记录号来控制的,表中的属性记录的顺序必须和主文件中的记录顺序相同。本文主要介绍主文件(.shp)。
表1 shp文件的头文件结构
主文件(.shp)包含一个定长的文件头,之后就是变长的记录。每一条变长的记录都由一个定长的记录头和变长的记录内容组成。Shapefile的内容分为2类:一是数据相关,包括主文件记录内容和主文件头的数据描述范围(形状类型、最小矩形外框等);另一个是文件管理相关,包括文件和记录的长度、记录的偏移量等。主文件中用于记录数据相关的Integer和DoubleInteger的字节序是 little endian(PC 或 Intel),而用于文件管理相关的字节序则是big endian(Sun or Motorola)[3]。主文件头长度为100 byte。表1列出文件头的字节位置、值、类型和字节序。
实现清华山维EPS到ArcGIS的转换,几何对象转换是关键,因此在数据转换之前首先考虑实体几何类型的对照问题,然后根据该问题创建相应的Shape要素类。其几何类型的对照关系如表2所示。
表2 数据对照表
通过ArcEngine的二次开发,对清华山维EPS数据文件内容全读取,然后利用ArcEngine调用相应的接口实现数据向目标文件的写入,并保存成Shape格式的数据(如图1所示)。
图1 EPS转换Shape格式步骤
程序主要由3个部分组成:新建相应类型的Shape文件、读入MDB文件、根据MDB文件相应的表写入并保存到Shape文件。下面给出部分主要代码。
1)新建Shape文件,并添加相应字段。具体代码及注释如下:
string tname = "EPS区"; //新建Shape的文件名
string strShapeFieldName = "Shape";
IFeatureWorkspace pFWS;
IWorkspaceFactory pWorkSpaceF= new Shapefi leWo rkspaceFactoryClass();
pFWS=pWorkSpaceF.OpenFromFile(strFolder,0) as IFeatureWorkspace;
IFields pFields= new FieldsClass();
IFieldsEdit pFieldsEdit;
pFields pFieldsEdit = pFields as IFieldsEdit;
IField pField= new FieldClass();
IFieldEdit pFieldEdit;
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = strShapeFieldName;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDef pGeomDef;
IGeometryDefEdit pGeomDefEdit;
pGeomDef = new GeometryDefClass();
pGeomDefEdit = pGeomDef as IGeometryDefEdit;
pGeomDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
//新建Shape文件的类型为esriGeometryType.esriGeometryPolygon是POLYGON类型的数据、
esriGeometryType.esriGeometryPoint为POINT类型的数据、esriGeometryType.esriGeometryPolyLine为POLYLINE类型的数据。
pFieldEdit.GeometryDef_2 = pGeomDef;
pFieldsEdit.AddField(pField);
//新建字段ID
pField = new FieldClass();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = "ID";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
pFieldsEdit.AddField(pField);
pFeatureClass = pFWS.CreateFeatureClass(strName,pFields, null, null, esriFeatureType.esriFTSimple,strShapeFieldName, "");
2)读取MDB数据。具体代码及注释如下:
读取mdb数据
OleDbConnection objConnection = new OleDbConnection(strcon);
objConnection.Open();
String sqldd = "select id,layername from GeoAreaTB";
OleDbDataAdapter sda = new OleDbDataAdapter(sqldd,objConnection);
sda.Fill(ds, "属性记录");
3)根据mdb写Shape文件[4]。
for (int i = 0; i < ds.Tables["属性记录"].Rows.Count; i++)
//循环GeoAreaTB区文件表中的所有区
{
DataSet ds1 = new DataSet("属性记录1") ;
String sqldd1 = "select x,y,id,seqid from CPointTB_a where id=" + ds.Tables["属 性 记 录"].Rows[i].ItemArray[0]+ " order by seqid"; //通过SQL语句从CPointTB_a表里查询出与GeoAreaTB表中当前ID相同的X,Y坐标值,id和seqid值。
OleDbDataAdapter sda1 = new OleDbDataAdapter(sqldd1, objConnection);
sda1.Fill(ds1, "属性记录1");
if (ds1.Tables["属性记录1"].Rows.Count >= 3) //3个以上的结点才能构成面
{
IPoint p1 = new PointClass(); //新建IPoint对象P1。
p1.PutCoords((double)ds1.Tables["属性记录1"].Rows[0].ItemArray[0], (double)ds1.Tables["属性记录1"].Rows[0].ItemArray[1]);//数据集的第1条记录的X,Y坐标赋给p1点
INewPolygonFeedback m_PolyFeed = new NewPolygonFeedbackClass();//新建INewPolygonFeedback对象m_PolyFeed
m_PolyFeed.Start(p1) ;//将P1作为该多边形的第1个结点
for (int j = 1; j < ds1.Tables["属性记录1"].Rows.Count; j++)
{
IPoint p2 = new PointClass();
p2.PutCoords((double)ds1.Tables["属性记录1"].Rows[j].ItemArray[0], (double)ds1.Tables["属性记录1"].Rows[j].ItemArray[1]);
m_PolyFeed.AddPoint(p2);
}//循环添加该多边形的其他结点
IPolygon m_Polygon = m_PolyFeed.Stop();//生成多边形
IPointCollection m_PointCollection =(IPointCollection)m_Polygon;
IGeometry m_Geometry = (IGeometry)m_PointCollection;
CreateFeature(m_Geometry, ds.Tables["属性记录"].Rows[i].ItemArray[0].ToString());
//调用CreateFeature函数将图形信息保存至Shape文件的Shape字段,并将改多边形的ID存入Shape文件的ID字段
cmap.Extent = cmap.FullExtent;//显示所有转换后的图形
}
4)保存要素至Shape文件[5]。
private void CreateFeature(IGeometry m_Geometry,String t_id) //创建要素并保存
{
string tid = t_id;//接收变量
if (m_Geometry == null) return;
if (m_CurrentLayer == null) return;
IWorkspaceEdit m_WorkspaceEdit = GetWorkspaceEdit();
//新建 IWorkspaceEdit空间
IFeatureLayer m_FeatureLayer = (IFeatureLayer)m_CurrentLayer;
IFeatureClass m_FeatureClass = m_FeatureLayer.FeatureClass;
m_WorkspaceEdit.StartEditOperation();
//使用WorkspaceEdit接口新建要素
IFeature m_Feature = m_FeatureClass.
CreateFeature();
m_Feature.Shape = m_Geometry;
m_Feature.set_Value(2, tid.ToString());
m_Feature.Store();//保存要素
m_WorkspaceEdit.StopEditOperation();//保存Shape文件
}
通过ArcEngine进行二次开发,将现有的清华山维EPS数据转换为ArcGIS格式的数据,并在ArcMap中通过ID字段挂接清华山维MDB中的属性表,将清华山维的空间、属性数据无损转换为ArcGIS的Shape格式,通过编写分层表,能方便地将转换后Shape格式数据进行分层,提取有用数据,提高数据使用效率,集成不同平台功能和数据,为各级部门使用GIS数据提供了方便[6]。本程序已经过实际的验证,并应用于黄山市城镇地籍数据库和数字黄山地理空间框架等系统建设中。它减少了数据转换的工作量,拓展了地理信息数据的应用范围,取得了良好的经济效益与社会效益[7]。
[1]黄杏元,马劲松,汤勤.地理信息系统概论[M].北京:高等教育出版社,2001
[2]ESRI Press.ESRI ArcGIS Desktop Developer Guide[M].ESRI PR,2004
[3]兰小机,刘德儿.ArcObjects GIS应用开发——基于C#.NET[M].江西:江西理工大学出版社,2006
[4]蒋波涛.ArcObjects 开发基础与技巧——基于VisualBasic.Net[M].武汉:武汉大学出版社,2006
[5]张鹏.CAD与GIS集成技术在城市基础测绘中的应用[J].地理空间信息,2010,8(5):22-24
[6]毕旭东.基于ArcGIS的地籍管理信息系统的设计与实现[D].成都:西南交通大学,2009
[7]CH/Z9001-2007.数字城市地理空间信息公共平台技术规范[S]
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!