3DGIS(3D GIS)

研究OpenGL,DirectX 3D,GPU和GIS

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
    在南京城市地质调查项目中需要读取CNSDTF DEM数据,这种格式与美国USGS DEM数据格式相比较,有些简单,不包含椭球体,投影方式等元数据,实际上就是投影后的平面格网数据,所以读取入系统不困难.以后将介绍ERDAS IMG格式的读取,这个就显得有些复杂了.
    

std::locale::global(std::locale(""));

   ifstream _demfile;           //DEM文件流
   _demfile.open(lpszPathName);        //读取文件
  
   string sDataName,sCNDataName;
   string sVersion;float iVersion;
   string sAlpha;float fAlpha;
   string sUnit; string sUnitName;
   string sCompress; float dCompress;
   string sX0; double dX0;
   string sY0; double dY0;
   string sDX; double dDX;
   string sDY; double dDY;
   string sRow; int iRows;
   string sColumn; int iColumns;
   string sValueTypeName; string sValueType;
   string sHzoom; int iHzoom;
   string sMinV;
   string sMaxV;

   if(_demfile)
   {
    _demfile>>sDataName>>sCNDataName;
    _demfile>>sVersion>>iVersion;
    _demfile>>sAlpha>>fAlpha;
    _demfile>>sUnit>>sUnitName;
    _demfile>>sCompress>>dCompress;
    _demfile>>sX0>>dX0;
    _demfile>>sY0>>dY0;
    _demfile>>sDX>>dDX;
    _demfile>>sDY>>dDY;
    _demfile>>sRow>>iRows;
    _demfile>>sColumn>>iColumns;
    _demfile>>sValueTypeName>>sValueType;
    _demfile>>sHzoom>>iHzoom;
    _demfile>>sMinV;
    _demfile>>sMaxV;

   }
   else
   {
    AfxMessageBox("无法读取文件数据头!");
    return false;
   }
     dY0 = dY0 - dDY*iRows;              //从文件中读取的dYO记录的是最大数值
   long index = 0,PointsTotalNumber = 0;
   int i,j;
   double tmpHeight = 0;
  
   POINT3d* p3dDEMGridPoint = new POINT3d[iRows*iColumns];       //准备读文件中数据
  
   double dNodata =   -99999;
   double dZMin = 9999,dZMax = -9999;
   for(j=iRows-1;j>=0;j--)               //由于此文件记录Y数值的方法与其他不同,需要翻转数据
   {
    for(i=0;i<iColumns;i++)
    {
     index =   j*iColumns+i;
     _demfile>>tmpHeight;
     if(iHzoom != 0) tmpHeight = tmpHeight/iHzoom;      //原始的缩放因子
     p3dDEMGridPoint[index][2] = tmpHeight;
    
     if( tmpHeight > -9999)            //也就是不等于 dNodata
     {
      if(dZMin > tmpHeight) dZMin = tmpHeight;       //记录高程上的最小数值
      if(dZMax < tmpHeight) dZMax = tmpHeight;       //记录高程上的最大数值
     }
    
    }
}

posted on 2007-10-31 08:53  武汉侯涛  阅读(3589)  评论(0编辑  收藏  举报