APP下载

基于ArcGIS、Visual C++的DEM数据接边检验方法

2016-12-28裴光菊唐德利魏德照

地理空间信息 2016年12期
关键词:图幅同名网点

裴光菊,唐德利,魏德照

(1.国家测绘地理信息局重庆测绘院,重庆 40001)

基于ArcGIS、Visual C++的DEM数据接边检验方法

裴光菊1,唐德利1,魏德照1

(1.国家测绘地理信息局重庆测绘院,重庆 40001)

为提高DEM数据接边检验的高效性、准确性、可靠性,比较各种检验方法后,本文结合ArcGIS组件,利用Visual C++开发平台开发了一套DEM检验软件,并在实际检验项目中验证了该软件的使用效果。检验结果表明,该软件在DEM接边检验工作中高效、准确、可靠。

数字高程模型(DEM);数据接边;质量检验

数字高程模型(digital elevation model,DEM)是用一组有序数值阵列形式表示地面高程的一种实体地面模型,是数字地形模型(digital terrain model,DTM)的一个分支。DEM的建立方法和存储格式有很多种,如 ARC ASCII Grid(*.asc)、ARC Info GRID(*.grd)、ESRI FLOAT BIL(*.bil *.hdr *.blw)、DEM GB(*.dem)、GRID GB(*.grd)、DEM VZ(*.dem)等,其数据内容的表现形式有两种:规则矩形格网和不规则三角网。由于DEM描述的是地面高程信息,在测绘、水文、气象、地貌、地质、土壤、工程建设、通讯、气象、军事等国民经济、国防建设以及人文和自然科学领域都有着广泛的应用[1-6]。因此,DEM产品质量检验的智能化和数据拼接质量的检验十分重要。

1 DEM数据接边及基本要求

在地理信息数据中,DEM按国家标准经纬度梯形分幅编号存放,其数据范围由该梯形在高斯平面的最小外接矩形经过一定外扩来确定,相邻图幅间存在重叠区域,重叠区域的同名格网点高程要保持一致,这就要求对图幅数据进行接边处理。DEM数据的质量要素中接边质量要求尤为严格,最终成果均要求同名格网的高程值必须相同。生产过程数据接边的同名格网点高程值较差不能超过两倍高程中误差,符合要求时,以平均值确定格网点高程值,如不符合要求,则要查明原因并处理后再作接边。DEM最终成果不允许相邻图幅同名点高程值存在差异[2]。

2 DEM数据接边检验原理

DEM接边质量检验就是查看相邻图幅DEM数据重叠部分同名格网点的高程值是否能达到规定要求[7]。

在ArcGIS上打开相同投影带中相邻的两幅DEM数据,利用该软件的DEM视图功能,直接比较同名格网点灰度值,获取同名格网点高程差值,也可以利用ArcGIS的栅格计算功能直接以同名格网点灰度差值显示重叠部分视图,以获取同名格网点高程差值。若开发个人软件实现接边检验,则嵌入ArcGIS的COM组件同时加载相邻两幅DEM数据,获取重叠区域,并在重叠区域内循环读取同名格网点高程数据对,并计算较差,完成循环后计算接边中误差,最后输出检验报表。

跨投影带图幅数据接边检验不能依靠手工完成,只能开发专业软件来实现。由于不同投影带下的相邻图幅在拼接前需要将其中一幅数据进行换带处理,也就是需要按照很复杂的数学规则进行计算,使两幅数据处于同一投影带下,手工方法是不可能实现的,必须借助计算机程序进行批量处理。数据跨带接边检验与相同带接边检验不同,必须先把相邻DEM数据投影到同一投影带,然后再获取同名格网点高程数据对,并计算较差,完成循环后计算接边中误差,最后输出检验报表。

3 DEM数据接边检验方法

现有的DEM数据接边质量检验方法主要有:

1)在ArcGIS下,采用单点查询方式检查同名格网高程。

2)在ArcGIS下,利用其栅格计算功能手工逐个文件检查同名格网高程。具体方法是首先加载相邻两幅DEM数据,加载后图幅邻接处如图1。然后在Spatial Anlyst工具栏下运行Raster Calculator工具,如图2。在弹出的对话框中选择一个数据文件→点击所需运算符“<>”→选择另一数据文件→点击Evaluate按钮。完成后,在图层浏览窗口会自动产生一个新的栅格图层Calculation,并在主窗口显示该图层,效果如图3。图中亮显的星云状部分即为灰度值为1的格网点,表示这些格网点高程值不同。

图1 相邻DEM数据加载后邻接处

图2 DEM栅格叠加工具

图3 DEM栅格叠加计算结果

3)在ArcGIS下,利用其卷帘功能,观察同名格网点像素灰度值。

4)在ArcGIS下利用VB进行内嵌式编程检查。

5)利用ArcGIS组件,在Visual C++/Visual Basic等开发平台下,开发独立运行检查软件[3]。

前3种方法主要是基于手工方式,只能用于相同投影带数据检验,不能用于跨带数据接边检验,且不能直接形成检验结果统计报表。第4种方法可以实现自动,但其在运行界面、运行速度及用户使用舒适性等方面均有一定的局限性。实际数据生产中,DEM数据的接边不一致现象非常普遍。然而,一个图幅范围的DEM数据栅格有上百万个,数据量十分庞大,接边检验是一项十分繁重的任务。这种情况下,采用手工检验方法是不切实际的。因此,本文探讨了基于ArcEngine 9.3新增的栅格数据接口,在Visual C++6.0开发平台下实现DEM数据的自动接边检验,并运用到实际生产过程中,以提高DEM接边检验的工作效率。

4 检验软件的开发

4.1 软件功能要求

软件设计以方便实用、高效准确、界面友好、易于掌握为原则。这就要求软件界面能设置用户参数(如坐标系统、高程系统),自动搜索指定路径下的所有DEM数据文件,自动判断邻接图幅DEM数据文件名及其存在性,判断本图幅与邻接图幅是否在同一投影带下,进行数据读入并获取同名格网点的高程值,统计同名格网点高程较差及其中误差,输出检验报表。由于DEM数据量大,往往需要较长时间的数据处理,所以还需要设计适时刷新且不会卡死的进度显示条。

4.2 软件界面设计

由于软件要实现批量自动处理和结果输出,所以,除主窗口菜单、工具条外,还需要选择数据文件路径界面、软件运行进度界面、运行结束提示界面和运行结果显示界面。

4.3 设计框图

图4 设计框图

4.4 核心功能实现

4.4.1 导入所需ArcGIS组件

#import文件夹所在路径+"/com/esriGeometry.olb" raw_interfaces_only raw_native_types no_namespace named_guids;其他所需的组件同样导入。com组件导入后,ArcGIS对象及方法才能被正常使用。

4.4.2 自动搜索DEM文件

自动搜索指定文件夹下的按比例尺分幅存放的DEM数据(其文件名为标准图幅编号),并将结果存放在CStringList列表对象中。实现模块为GetFileByFolder,传递参数为文件扩展名CString ContainFileEx,返回值为CStringList对象。关键代码[5]:

ContainFileEx.MakeUpper(); CFileFind finder;

CString fileName,ls;

CStringList strList,strList0; strList.AddTail(BeginFolder);

POSITION ps=strList.GetHeadPosition();

while(ps)

{

CString strName=strList.GetNext(ps);

BOOL bWorking = finder.FindFile(strName+"\*.*");

while(bWorking)

{

bWorking = finder.FindNextFile( );

if (finder.IsDirectory()&&(!finder.IsDots()))//文件夹

……

}

}

4.4.3 计算并搜索邻接DEM文件

循环读取放在CStringList列表对象中的DEM文件,并获取全部邻接图幅DEM文件名称,验证其存在。实现模块为GetRoundNum,传递参数为当前DEM图幅文件名CString strThisNum。由于不同比例尺图幅的邻接关系不一样,所以编程过程中需要判断DEM的分幅比例尺,按照国家标准分幅进行判断和计算。

4.4.4 加载DEM文件数据并读取同名格网点高程

加载DEM数据需要用到ArcGIS的IRaster组件接口IRasterPtr、IrasterLayer的IrasterLayerPtr接口[3]。代码为:

IRasterLayerPtr pRasterLayer(CLSID_RasterLayer);

pRasterLayer->CreateFromFilePath((CComBSTR)strPath);其中,strPath是包含DEM数据的文件路径。由于DEM采用高斯投影平面坐标系统,涉及到投影分带的问题,如果邻接图幅在不同投影带,则需要对加载数据进行投影换带,以保证接边检验的邻接数据在相同投影带下。需要引入ArcGIS的ISpatialReferenceFactory3、ISpatialReference组建接口:ISpatialReferenceFactory3Ptr、ISpatialReferencePtr。代码为:

ipSRFactory->CreateESRISpatialReferenceFromPRJFile(str PrjP,&ipPSR);

pRasterLayer ->putref_SpatialReference(ipPSR);

其中,strPrjP为高斯投影坐标系统的定义文件(包含路径)。注意,这里要先定义pRasterLayer的原坐标系统,再加载DEM数据,之后重定义pRasterLayer的坐标系统为目标系统,实现跨带转换。读取格网点高程代码为:

IRaster2Ptr ipRa2=ipRaster;// ipRaster为读取的IRaster数据接口。

IRasterCursorPtr ipRaCur;

ipRa2->CreateCursorEx(ipPnt,&ipRaCur);// ipPnt相邻图幅重叠范围IPnt接口。

IPixelBlockPtr ipPB;

ipRaCur->get_PixelBlock(&ipPB);

VARIANT vtValue;

ipPB->GetVal(0,m,n,&vtValue);//m,n为行列序号。

4.4.5 不同格网间距DEM的接边检验

由于格网间距不同,邻接图幅的重叠区域就没有明确的同名格网点,需要将其中一个文件的DEM数据进行双线性内插,以求取同名点高程值进行比较,确定拼接精度[4]。双线性内插数学模型为:设Q11、Q12、Q21、Q22分别为内插点位最邻近的4个格网点,其点位坐标分别为(X1,Y1) (X2,Y2)(X3,Y3)(X4,Y4),dx为横坐标差,内插点坐标为(xc,yc)。则插值如下。

其中,H为最终内插值。

4.5 数据格式转换

实际应用中可能存在不同数据格式的DEM,这就需要将数据转换为满足程序运行要求的目标格式。在ArcMap下可以实现多数常用格式的转换,也可以在VC++下进行编程处理。

4.6 进度条的实现

由于DEM数据文件较大、数量多,程序往往会运行较长时间,需要设计进度条来为用户显示程序处理的进度情况,这就要求进度条显示更新与数据处理运行在不同空间。因此,该程序把DEM数据处理放在线程去运行,进度条在主进程中实时显示刷新。代码中用“static UINT DEMGCJD_Thread(LPVOID param)”语句申明线程,“UINT DEMJBJD_Thread(LPVOID param)”语句定义线程。所有DEM数据处理的代码将在此线程中运行,使进度条在程序运行期间始终处于活跃更新状态,避免了程序卡死的现象。

4.7 项目检验应用

该程序在国家基础测绘1∶50 000和地方基础测绘1∶10 000、1∶5 000等比例尺的DEM数据接边检验工作中得到了充分使用。例如,重庆1∶5 000数字地形测量项目中,其生产期持续三年多,成果包含数千幅分幅的DEM数据,检验工作量巨大,人工检验不可能在期限内完成。通过对该项目全部DEM数据进行接边检验、裁切范围检验,在0.5 h内程序运行结束,以100%的准确率输出全部数据检验报表。

5 结 语

在诸多DEM数据接边检验的方法中,借助现行的工具软件进行手工操作的方式只能适应极少量的数据。在面对大量数据时,通过借助ArcGIS提供的组件,结合VC++(或者VB等)程序开发工具,编写一套程序来完成大批量数据接边检验(也可以包括数据范围检验),快速、高效、准确、可靠,是地理信息数据检验必要的方法。

[1] 李志林,朱庆. 数字高程模型[M].武汉:武汉大学出版社,2001

[2] CH/T 1015.2-2007.基础地理信息数字产品1∶10 000 1∶50 000生产技术规程 第二部分:数字高程模型(DEM)[S].

[3] 彭珊鸰,李军,廖明,等.基于arcengine10的dem数据自动接边检查实现[J].科技资讯,2012,(18):9

[4] 王佩,吕志勇.DEM产品质量检查标准研究与实现[J].测绘与空间地理信息,2011,34(5):280-283

[5] 李书涛.C语言程序设计教程[M].北京:北京理工大学出版社,1993

[6] 杨秀伶.数字高程模型DEM的构建与应用[J].绿色科技,2014(5):315-316

[7] 刘锦军,钮利平,孙颖.1∶50 000数字高程模型(DEM)的质量控制[J].东北测绘,2002,25(2):44

P208

B

1672-4623(2016)12-0084-03

10.3969/j.issn.1672-4623.2016.12.028

裴光菊,工程师,主要从事测绘地理信息产品检验工作。

2015-12-15。

猜你喜欢

图幅同名网点
快递网点进村 村民有活儿干有钱赚
基于ArcEngine自动生成1∶5万地形图标准分幅图框
同名
于细微之处见柔版网点的“真面目”
79首同名民歌《放风筝》的宗族关系
基于Arcpy的地形图接图表快速生成方法
三 人 行
优化内部劳动组合 释放网点营销潜能
基于EXCEL的地形图图幅号转换查询方法
集成成像同名像点三维形貌获取方法