关于DEM文件的介绍和应用
<转>关于DEM文件的介绍和应用
DEM文件是一种摄影测量学专用的文件格式,分为文本和二进制两种,存储的是一个区域内的高程值。就其介绍如下:
文本格式采用的国标NSDTF格式,使用文本格式保存,可以使用记事本打开查看。
起头的12行描述了DEM的基本信息
NSDTF-DEM 文件标识
1.0 版本号
M 单位(米)
0.000000
0.000000
3000.000000 左上角X坐标
9990.000000 左上角Y坐标
30.000000 X方向采样间隔
30.000000 Y方向采样间隔
334 行数
201 列数
1000 缩放比例
后面是DEM的采样高程,首先是最上面的一行高程坐标,然后是第二行,第三行...总共有行数×列数个高程坐标。保存的数值是整数,需要除以缩放比得到真实的浮点高程值。-99999为无效高程值。
二进制格式说明
在文件头部是一个结构体,结构体的定义如下
typedef struct tagDEMHEADERINFO
{
int nType;//类型 给0
double lfStartX;//起点
double lfStartY;//
double lfDx;//采样间隔
double lfDy;//
int nRow;//行
int nColumn;//列
double lfKapa;//旋转角,给0
int nProjection;//投影,给0
double lfHeight;//平均高度?
double lfNoData;//无效数
int nScale;//缩放比
int nDot;//小数点位数
int nPixelSize;//占用的字节数
}DEMHEADERINFO,*PDEMHEADERINFO;
在文件头后面开始真实的高程值,浮点形式。写入的顺序和文本格式的相同。
简单例子如下:
FILE *fp;
if((fp=fopen(lpszFileName,"rt"))==NULL)
{
AfxMessageBox("文件无法打开!");
return FALSE;
}
fscanf(fp,"%s",&m_DataMark);
if(strcmp(m_DataMark,"NSDTF-DEM")!=0)
{
AfxMessageBox("文件错误!");
return FALSE;
}
//AfxMessageBox(m_DataMark);
fscanf(fp,"%f",&m_Version);//版本号
fscanf(fp,"%s",&m_Unit);//单位(米)
fscanf(fp,"%lf",&m_Alfa);//α
fscanf(fp,"%lf",&m_Beta);//β
fscanf(fp,"%lf",&m_lfStartX);
fscanf(fp,"%lf",&m_lfStartY);
fscanf(fp,"%lf",&m_lfDx);
fscanf(fp,"%lf",&m_lfDy);
fscanf(fp,"%d",&m_nRow);
fscanf(fp,"%d",&m_nColumn);
fscanf(fp,"%d",&m_nScale);
int j;
m_pHeight=new long*[m_nRow];
for(j=0; j<m_nRow; j++)
{
m_pHeight[j]=new long[m_nColumn];
}
for(int i=0; i<m_nRow; i++)
for(int j=0; j<m_nColumn; j++)
{
fscanf(fp,"%ld",&x);
m_pHeight[i][j]=x;
if(x==-99999)
{
m_pHeight[i][j]=(long) NoData;
}
else
m_pHeight[i][j]=(long) x/m_nScale;
}
fclose(fp);