• 关于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);

         

  • 相关阅读:
    4 Apr 18 软件开发目录 logging模块的使用 序列化(Json, Pickle) os模块
    3 Apr 18 内置函数 列表生成式与生成器表达式 模块的使用之import 模块的使用之from…import…
    2 Apr 18 三元表达式 函数递归 匿名函数 内置函数
    30 Mar 18 迭代器 生成器 面向过程的编程
    29 Mar 18 函数 有参、无参装饰器
    28 Mar 18 函数
    27 Mar 18 函数的参数
    26 Mar 18 函数介绍
    23 Mar 18 文件处理
    22 Mar 18 补充数据类型+字符编码+文件处理
  • 原文地址:https://www.cnblogs.com/sunliming/p/1975774.html
Copyright © 2020-2023  润新知