基于VC++的DEM彩色图像快速显示.docx
《基于VC++的DEM彩色图像快速显示.docx》由会员分享,可在线阅读,更多相关《基于VC++的DEM彩色图像快速显示.docx(22页珍藏版)》请在冰豆网上搜索。
基于VC++的DEM彩色图像快速显示
基于VC++的DEM彩色图像快速显示
地理信息系统王宇鹏
指导老师:
徐精文副教授
摘要:
本文通过对DEM(*.txt)文件特征的研究,结合VisualC++开发的特点,运用VisualC++6.0实现了对DEM数据的快速显示。
并且对比了传统DEM图像显示软件ArcGIS,总结出提升显示速度的原因主要是分析空间的选取以及步骤的简化。
关键词:
DEM(数字高程模型);VC;显示
QuickDisplayoftheDEMColorImageBasedonVC++
GeographicInformationalSystem:
WangYupeng
Instructor:
XuJingwen,associateprofessor
Abstract:
ThispapercarriesthequickdisplayofDEMdataintoeffectbyanalyzingthefilefeaturesofDEM(*.txt),incombinationwiththecharacteristicsofVisualC++andbyapplyingVisualC++6.0.AuthoralsocontraststheitwiththetraditionalDEMimagedisplaysoftware,ArcGIS,andsumupthecauseofincreasingdisplayspeedistheselectionofanalyticalspaceandsimplificationoftheprocedure.
Keywords:
DEM(digitalelevationmodel);VC;Display
1前言
DEM(DigitalElevationModel):
即数字高程模型,是高程值在地理空间上的变化,是一定范围内规则格网点的平面坐标(X,Y)及其高程(Z)的数据集,它主要是描述区域地貌形态的空间分布。
它是上世纪50年代提出、应用,是地理信息系统(GIS)的基础,由于地理信息系统的提出是上世界60年代,可认为DEM是GIS的前身,对GIS的发展有着深远的影响。
DEM受到了极大的关注,并在测绘、土木工程、地质、矿山工程、景观建筑、道路设计、防洪、农业、规划、军事工程、飞行器与战场仿真等领域得到了广泛的应用。
近年来,由于地理信息系统的普及,在美国、中国、英国和其它国家,DEM作为数字地形模拟的重要成果已经成为国家空间数据基础设施的基本内容之一,并已经进行规模化生产。
由于数字高程模型运用广泛,现在世界上许多大型的软件公司都开发的相应的显示、处理DEM数据的软件,比如ESRI公司的MapObjects和ArcGIS等,由于这些软件都是建立的Windows操作系统上的,许多模块是由Windows操作系统的开发工具编写而成,因此在数据转换是会花费较多的时间,特别是在庞大的数据转换时,耗费的时间量就更大了,在当今这个时间就是金钱的社会,这些在一定程度上是有弊端的。
目前国内外图像显示的软件有许多,比如由乔恩·沃诺克和查理斯·格什克创建于1982年的Adobe公司的AdobePhotoshop、ACDSystems公司的ACDSee以及Microsoft公司的Windows图片和传真查看器等,但这些软件显示的主要是JPEG、BMP、TIF等格式的文件,并没有专门针对GIS数据的模块来显示GIS数据。
在显示和处理一般图像时,能发挥很好的优势,但不适合专业的GIS发展。
2理论依据
2.1DEM概述
DEM(DigitalElevationModel),数字高程模型,是对空间起伏变化的连续表示方法。
DEM有自身的特点,主要体现在:
I.易以多种形式显示地形信息。
经计算机处理后可以产生多种比例尺的地形图、纵横断面图和立体图。
II.精度不会丢失。
III.容易实现自动化、实时化。
IV.多比例尺特性。
如1m分辨率的DEM自动涵盖了更小分辨率如10m和100m的DEM内容。
DEM的主要表示模型有以下几种:
I.等高线模型:
等高线通常被存储成一个有序的坐标点序列,可以认为是一条带有高程值属性的简单多边形或多边形弧段。
II.不规则三角网(TIN)模型:
TIN(TriangulatedIrregularNetwork)表示法利用所有采样点取得的离散数据,按照优化组合的原则,把这些离散点(各三角形的顶点)连接成相互连续的三角面。
III.层次模型:
(LayerofDetails,LOD)是一种表达多种不同精度水平的数字高程模型。
大多数层次模型是基于不规则三角网模型的,通常不规则三角网的数据点越多精度越高,数据点越少精度越低,但数据点多则要求更多的计算资源。
IV.规则格网模型:
规则网格将区域空间切分为规则的格网单元,每一个格网单元对应一个数值。
图1DEM格网模型
Fig.1ModelofgridDEM
本文主要是研究的就是DEM数据以规则格网模型在计算机中的储存和显示。
2.2DEM数据在计算机中的储存格式
DEM可以说是点的集合,它是许多具有高程的离散点的集合,90%以上的DEM数据主要是以规则格网模型表示的。
格网模型的DEM有自身的优点,主要体现在结构简单,计算机实现比较方便。
本次研究主要就是针对DEM的规则格网模型在计算机中的实现。
DEM主要表示的是单位点的坐标、高程值的大小,那么就可以用行表示X坐标,用列表示Y坐标,以具体的数值表示高程值Z,并以顺序文件形式储存在文本文件中方便读取。
具体形式如下:
{NODATA_VALUExxx}
row1
row2
……
rown
Note:
xxxisanumberandthekeywordnodata_valueisoptional
其中,NCOLS表示文件所拥有的行数,NROWS表示文件拥有的列数,XLLCENTER表示左下角第一个元素的经度值,YLLCENTER表示左下角第一个元素的纬度值,CELLSIZE表示每一个格网单元的边长大小(以米为单位),也可以说是精度,NODATA_VALUE表示为没有数据单元格的值可以用-32768表示。
图2DEM(*.txt)文件
Fig.2FileofDEM(*.txt)
2.3VisualC++实现DEM彩色图像显示的可行性研究
2.3.1经济可行性
作为研究性质的使用,不需要对VisualC++软件付费,假如作为商业化的使用,一套正版VisualStudio大概在一万元人民币左右,而ESRI公司的ArcGIS一套至少是十五万以上,从成本上来说是具有一定优势的。
本次研究成果可以作为一个模块嵌入以后的中型或者大型的软件中,具有一定的经济效应。
2.3.2技术可行性
VisualC++作为微软最重要的程序设计语言之一,是一个功能强大的可视化软件开发工具,它可以直接调用Windows操作系统的API函数直接来显示图像,而不像一些软件需要将数据先转换成自身可识别的类型,才能显示。
完成以上DEM数据的显示,主要分为两个步骤:
数据读取和图像显示。
图3系统流程图
Fig.3SystemFlowchart
3实现过程
3.1DEM数据读取
图4DEM数据读取流程图
Fig.4DEMdataacquisition
首先对打开对话框进行设计,文件打开类型主要为“文本文档(*.txt)”,将文件路径标识传给CString类对象m_msg。
然后,对头文件进行处理,用fopen函数打开所要显示的文档fopen(m_msg,”r”),fscanf,fgets函数获取头文件中的NCOLS,NROWS等值。
最后,建立动态数组,初始化变量,将数据文件的值赋给二维数组dem[i][j]。
二维数组dem[i][j]储存的数据不能直接用于显示,原因有两个,第一,亮度值的取值范围是0-255,也就是说计算机只能表现出256个不同的亮度值,而dem[i][j]中的高程数据差值可能大于255,比如dem[3][4]=-10,dem[5][7]=364,差值就达到了374。
因此必须将dem[i][j]中的数据转换成0-255的值;第二,软件显示的区域有限,当数据量超过的显示区域时,就造成数据越界了,一部分数据就不能显示,比如:
显示区域为500×600,而DEM文件中的数据为500×700,那么就有100列不能显示,因此必须将数据文件大小压缩至显示区域的大小。
针对于高程值超过亮度值的问题,首先找出dem[i][j]中的最大值(demmax)和最小值(demmin),用最大值减去最小值的差再除以256,这样就得到了一个表示间隔的变量(interval),伪代码如下:
interval=(demmax-demmin)/255。
那么每一个dem[i][j]对应的亮度值最后就为:
(dem[i][j]-demnin)/interval。
这样就将所有的DEM高程数据控制在0-255之间了。
对于数据越界的问题,也要采取相似的方法将超出区域的数据压缩至指定的区间,详细算法见附录。
完成数据的读取。
3.2DEM图像显示
图5DEM图像显示流程图
Fig.5DEMimagedisplayflowchart
在完成DEM数据读取后,将DEM数据保存在color[i][j]中。
首先对显示区域进行清理,将整个显示区域(Picture控件指定区域)用白色色调RGB(255,255,255)覆盖,完成显示DEM之前的初始化工作。
然后创建CDC对象DrawPicture,调用SetPixel函数按照不同的高程值在显示区域对应的位置着上不同的亮度值。
最后调用DeleteDC函数,释放释放CDC对象DrawPicture,完成黑白图像的显示。
在用彩色图像显示DEM时,主要选取了红色渐变、绿色渐变、蓝色渐变、红色到绿色渐变、紫色到绿色渐变、蓝色到黄色渐变这六种彩色渐变方式,添加不同的按钮,实现不同的功能。
(详细代码请见附录)
4设计成果图
打开可执行程序DEM.exe,点击“打开DEM”,选择需要打开的DEM(*.txt)文件,点击“打开”;(见图6)
图6打开界面
Fig.6Openinterface
屏幕上出现了DEM黑白图像,根据不同的情况在彩色显示栏中点击不同的显示方式。
(见图7)
图7DEM黑白图
Fig.7Blackandwhiteturningtogreen
图8DEM绿色渐变图图9DEM蓝色->黄色渐变图
Fig.8PictureofDEMturningtogreenFig.9PictureofDEMfrombluetoyellow
5结论与展望
5.1与ArcGIS显示DEM数据对比
ArcGIS产品中的ArcMap可以显示DEM(*.txt)文件,但它必须建立在数据转换的基础上,不能直接进行显示。
它是先将数据导入到ArcToolBox->ConversionTools->ToRaster->ASCIItoRaster,将DEM数据转换为栅格数据,输出栅格数据后,再进行显示。
图10ArcMap显示DEM图像过程
Fig.10ProcessofDEMimagedisplayedbyArcMap
在同样配置的电脑上用ArcGIS和VisualC++制作成的显示软件进行DEM(*.txt)文件的显示。
测试电脑配置如下:
CPU:
AMDAthlon64X27750
主板:
技嘉MA770-US3
显卡:
蓝宝石HD3850白金版3代512MDDR3
内存:
金士顿DDR28002G
硬盘:
希捷320G16MSATA2
ArcGIS用了5秒钟的时间,而VisualC++制作成的显示软件只用了不到1秒钟就显示出了一个大小为2.7M的DEM(*.txt)文件。
图11ArcMap显示DEM黑白图像
Fig.11BlackandwhitepictureofDEMdisplayedbyArcMap
5.2显示DEM图像速度不同的分析
ArcGIS在显示DEM(*.txt)文件时,是将数据先数据转换为Raster(栅格)数据,然后再进行显示的,而VisualC++是直接对数据进行显示的,这样减少了中间过程,一步到位;并且ArcGIS运用的处理空间选择的是计算机硬盘,而VisualC++运用的处理空间是计算机内存,这样VisualC++又大幅度地提高了数据读取的速度。
图12ArcGIS与VisualC++显示DEM图像流程图
Fig.12DEMimageflowchartdisplayedbyArcGISandVisualC++
5.3展望
DEM的运用越来越广泛,其重要性不断增强,希望世界各国能够加强对DEM的研究,能够使DEM的理论更加完善,应用更加广泛。
VisualC++,作为微软的主流开发工具,可广泛用于GIS(地理信息系统)的底层开发,随着技术的不断革新,像VisualStudio2005、VisualStudio2008的出现,地理信息系统的底层开发软件变得更加丰富,今后对于底层开发来说,更加容易。
由于水平有限,未能实现DEM显示后的其他一些操作,本文存在不少缺点,请各位老师和同学提出宝贵的意见。
6参考文献
[1]孙鑫.VC++深入详解[M].北京:
电子工业大学出版社,2006.6:
361-403.
[2]谭浩强.C程序设计[M].北京:
清华大学出版社,2005.7:
201-222.
[3]陈维兴,林小茶.C++面向对象程序设计教程[M].北京:
清华大学出版社,2004.8:
114-117.
[4]陆宗骐.C/C++图像处理编程[M].北京:
清华大学出版社,2005.1:
15-23.
[5]郎锐.数字图像处理学VisualC++实现[M].北京:
北京希望电子出版社,2002.5.
[6]李含璞.基于小波变换的DEM多尺度综合研究.[硕士论文].甘肃:
兰州大学:
2006.1.
[7]张丽梅.DEM数据压缩方法研究.[硕士论文].北京:
北京师范大学,2005.5:
2-3.
[8]马振刚,李黎黎.基于GIS和DEM的洋河流域水文特征提取方法研究[J].河北北方学院学报:
自然科学版,2008.3:
11-12.
[9]张瑞军,杨武年.数字高程模型(DEM)的构建及其应用[J].工程勘察.2005.3:
3-5.
[10]周云轩,王磊.基于DEM的GIS地形分析的实现方法研究[J]计算机应用研究,2002.5:
3-5.
[11]刘鎏,齐舒工作室.VisualC++6.0用户界面制作技术与应用实例[M].北京.中国水利水电出版社:
111-124.
[12]HoppeH.Smooth.View—DependentLevelofDetailControlanditApplicationtoTerrainRendering[J].IEEEVisualization.1998:
35~42.
[13]廖邦固.基于矢量结构的空间数据转换模型构建与实现[D].上海:
华东师范大学地理系,2005.7:
5-7.
[14]朱喆.基于VC++在数字图像处理中的格式转换和图像增强处理[D].武汉大学遥感信息工程学院.2005.3:
3-4.
[15]刘慧,郭伟.用MFC生成文件列表的方法[J].电脑学习,2002,(01):
2-4.
[16]吴亮.用VC实现文件操作功能[J].中文信息,2003,(07):
2-3.
[17]李悦,刘旭,杨晓.MATCOM与VC++混合编程方法在图像处理中的应用[J].计算机与信息技术,2009,(03):
88-89.
[18]朱莹,李自胜,向中凡.基于VC的位图图像处理方法[J].四川工业学院学报,2002,(02):
8-9.
[19]张杰,俞娜,李文秀.便于VC++进行图像编程的几个实用类[J].电脑学习,2000,(03):
6-7.
[20]耿迅.VC图像处理——快速傅立叶变换[J].电脑编程技巧与维护,2006,(01):
7.
[21]PietroAlessandroBrivioandDanieleMariniA.FractalMethodforDigitalElevationModelConstructionanditsApplicationtoaMountainRegion,ComputerGraphicsForum,12(5):
297.
[22]Chang,K,Tsai,B.TheeffectofDEMresolutiononslopeandaspectmapping[J].CartographyandGeographicInformationSystems.1991,18:
69-77.
7致谢
感谢徐精文老师的精心执导!
感谢全院老师对我的教导!
感谢表姐和孟哥孜孜不倦的教诲!
感谢余燕同学在英语上给予我的帮助!
感谢李睿同学在语文上给予我的帮助!
感谢全寝室同学的鼓励!
8附录(核心代码)
///////////////////////////////////////////////////读取头文件////////////////////////////////////////////////
fp=fopen(m_file,"r");
fscanf(fp,"%s",temp1);
fscanf(fp,"%d",&ncol);
fgets(temp,100,fp);
fscanf(fp,"%s",temp1);
fscanf(fp,"%d",&nrow);
fgets(temp1,100,fp);
for(i=1;i<=2;i++)
{
fgets(temp1,100,fp);
}
fscanf(fp,"%s",temp1);
fscanf(fp,"%lf",&csize);
fscanf(fp,"%s",temp1);
fscanf(fp,"%lf",&nodata);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////读取数据文件////////////////////////////////////////////
for(i=1;i{
dem[i]=dem[i-1]+nrow;
dem1[i]=dem1[i-1]+nrow;
}
for(i=0;ifor(j=0;j{
fscanf(fp,"%lf",&dem[j][i]);
if(dem[j][i]!
=nodata)
{
if(dem[j][i]if(dem[j][i]>demmax)demmax=dem[j][i];
}
}
interval=(demmax-demmin)/255;
fclose(fp);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////压缩数据////////////////////////////////////////////////////
if(ncol>800||nrow>600)
{
if((ncol-800)>=(nrow-600))
n=ncol/800+1;
else
n=nrow/600+1;
for(inty=0;y{
inty3=0;
for(intx=0;x{
for(k=y;k{
for(z=x;z{
dem1[y3][x2]=dem1[y3][x2]+larr[z][k];
}
}
dem1[y3][x2]=dem1[y3][x2]/(n*n);
y3++;
y2=y3;
}
x2++;
}
for(i=0;ifor(j=0;j{
if(dem1[j][i]>0)
{
color1[j][i]=(larr[j][i]-demmin)/interval;
}
else
{
color1[j][i]=255;
}
}
}
else
{
for(i=0;ifor(j=0;j{
if(larr[j][i]color[j][i]=255;
else
color[j][i]=(larr[j][i]-threshold)/interval;
}
}
//////////////////////////////////////////////初始化画图区域/////////////////////////////////////////////
CWnd*wnd=GetDlgItem(IDC_dem);
CDC*cdc=wnd->GetDC();
wnd->Invalidate();
wnd->UpdateWindow();
cdc->SelectStockObject(BLACK_BRUSH);
CDCcdc1;
CBitmapbtm;
cdc1.CreateCompatibleDC(NULL);
btm.CreateCompatibleBitmap(cdc,800,600);
CBitmap*pOldBit=cdc1.SelectObject(&btm);
cdc1.FillSolidRect(0,0,800,600,RGB