AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

GIS三维地景仿真设计之数字高程模型

51自学网 2015-08-30 http://www.wanshiok.com

  DEM数据文件的读取与保存

  既然已经清楚DEM数据文件的存储格式,数据的读取就不是一件困难的事情了。下面先给出执行函数ReadDEM(CString sDemFile)的实现过程:

CFile file(sDemFile, CFile::modeRead); // 打开文件
DWORD length = file.GetLength(); // 得到文件长度
if (file.Read((LPSTR)&DemHeader, sizeof(DEMFILEHEADER)) != sizeof(DEMFILEHEADER)) { // 读入DEM头文件
 MessageBox("文件头信息错误!","提示信息");
 return false;
}
m_nDemX = DemHeader.iDemX; // 从文件头中取数据
m_nDemY = DemHeader.iDemY;
m_nInterval = (int)DemHeader.interval; // 网络间隔
m_pDemX = new int[(m_nDemX + 1) * (m_nDemY + 1)]; // X坐标
m_pDemY = new int[(m_nDemX + 1) * (m_nDemY + 1)]; // Y坐标
m_pDemH = new int[length - sizeof(DEMFILEHEADER)]; // Z坐标
m_nHSize = length - sizeof(DEMFILEHEADER);
m_nSumPointOfDem = m_nDemX * m_nDemY; // 网格总点数
int m_nSumFaceOfDem = 2 * (m_nDemX - 1) * (m_nDemY - 1); // 网格总面数
file.ReadHuge(m_pDemH, length - sizeof(DEMFILEHEADER)); // 读取数据
file.Close(); // 关闭文件

  至此,已经取出DEM文件头信息和高程点阵数据。这只是原始信息,为了能够在后面将要进行的场景绘制中以此来建模,还要标定格网点的X、Y坐标并将坐标原点移动到地形的中心:

for (int i = 0; i < m_nDemY; i++) {
 for (int j = 0; j < m_nDemX; j++) {
  m_pDemX[m_nDemX * i + j] = m_nInterval * j - (m_nDemX / 2) * m_nInterval;
  m_pDemY[m_nDemX * i + j] = m_nInterval * i - (m_nDemY / 2) * m_nInterval;
 }
}

  至此,已经从DEM文件恢复出各节点的坐标参数(X,Y,Z坐标数据分别存放在m_pDemX、m_pDemY和m_pDemH指向的缓冲区中)。

  如果需要将当前正在显示的地景仿真数据保存,只需简单的将DEMFILEHEADER 结构对象DemHeader中的数据保存到DEM文件头、将整型数组m_pDemH中的数据保存到DEM文件高程点阵即可:

CFile file(m_sDEMFile, CFile::modeReadWrite); // 保存文件
file.Write((LPSTR)&DemHeader, sizeof(DemHeader));
file.WriteHuge((LPSTR)m_pDemH, DemHeader.iDemX * DemHeader.iDemY * sizeof(int));
file.Close();

  小结

  本文主要介绍了对DEM数字高程模型数据的一般使用方法,为三维地景仿真处理系统的场景绘制提供了基本的数据来源。读者需要掌握的技术主要有对DEM文件的创建和对DEM文件的读写访问等。本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译通过。

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:VC++大数据量绘图时无闪烁刷屏技术实现  下一篇:最常见的20种VC++编译错误信息