cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5917
  • QQ14265545
  • 铜币29669枚
  • 威望217点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
阅读:1025回复:0

读取SDTS(Spatial Data Transfer Standard )DEM数据显示三维分层设色地图

楼主#
更多 发布于:2007-11-06 00:19
<font face="Courier New">    SDTS(Spatial Data Transfer Standard ) DEM
读取也是颇费力的一件事情,首先这个体系并不是一个单一的数据文件,而是由一系列的相同后缀(.ddf)构成文件的组合.其中,*CATD.DDF是首要
文件,相当于一个索引,告知其他文件的功能.剩下的文件中,*LDEF.DDF可以获得格网的长宽数值。*IREF.DDF文件可以得到XY轴的分辨率。
*CELL.DDF是真正带有数据的文件。可以提取高程数值。另外还涉及到读取8211文件的问题,所以说,是件比较费力的事情.<br>
    <font face="Courier New">下面提供程序框架和结果图供大家参考。<br>
<br><font face="Courier New">bool ImportDEMDataSDTS::LoadSingleFile(LPCSTR lpszPathName)<br>
{<br>
 string temp(lpszPathName);<br>
 long totalSteps = FillSDTSDEM(temp);   //加载进文件并返回可能需要的时间总长度</font></p>
<p><font face="Courier New"> long stepsLeft=1;<br>
 while (stepsLeft > 0)<br>
 {<br>
  stepsLeft = FillSDTSDEM(temp);<br>
 }</font></p>
<p><font face="Courier New"> int x=0,y=0;<br>
 long lindex = 0;</font></p>
<p><font face="Courier New"> for(y=0;y<m_Height;y++)<br>
 {<br>
  for (x=0;x<m_Width;x++)<br>
  {<br>
   lindex = y*m_Width + x;<br>
   m_ppt3dPoint[lindex][0] = x*m_xRes; //m_xRes<br>
   m_ppt3dPoint[lindex][1] = y*m_yRes; //m_yRes<br>
   if( m_grid[lindex] > -500 ;; m_grid[lindex] < 20000)        //防止出现异常数据<br>
   {<br>
    m_grid[lindex] = m_grid[lindex] - 17000;<br>
    m_ppt3dPoint[lindex][2] = m_grid[lindex];<br>
    if(m_dminElevation>m_grid[lindex]) m_dminElevation = m_grid[lindex];   //如果出现更小的数值<br>
    if(m_dmaxElevation<m_grid[lindex]) m_dmaxElevation = m_grid[lindex];   //如果出现更大的数值<br>
   }<br>
   else<br>
   {<br>
    m_ppt3dPoint[lindex][2] = 0;<br>
   }<br>
  }<br>
 }<br>
 m_p3dDEMGrid->SetSurfacePoint( m_ppt3dPoint );<br>
 m_p3dDEMGrid->SetRows(m_Height);<br>
 m_p3dDEMGrid->SetColumns(m_Width);<br>
 //m_p3dDEMGrid->SetXMax(dXMin + width*dXCellSize);<br>
 //m_p3dDEMGrid->SetYMax(dYMin + height*dYCellSize);<br>
 m_p3dDEMGrid->SetZMin( m_dminElevation );<br>
 m_p3dDEMGrid->SetZMax( m_dmaxElevation );<br>
 m_p3dDEMGrid->SetPointTotal( m_index );</font></p>
<p><font face="Courier New"> if( m_bDisplayLegendAndDistributeColor) ImportDEMData::DisplayLegendAndDistributeColor(); //显示图例和分层设色</font></p>
<p><font face="Courier New"> return true;<br>
}</font></p>
<p><font face="Courier New">long ImportDEMDataSDTS::FillSDTSDEM(const string; filename)           //主入口<br>
{<br>
 if (m_bLoadingFileFirstTime)<br>
 {<br>
  m_filePrefix = filename.substr(0,filename.length() - string("CATD.DDF").length());<br>
  m_filePath = m_filePrefix.substr(0,(m_filePrefix.length() -
((filename.length() - filename.find_last_of("\\")) -
string("CATD.DDF").length()))+1);</font></p>
<p><font face="Courier New">  m_converters["X"] = ;bi32_converter;<br>
  m_converters["Y"] = ;bi32_converter;<br>
  m_converters["ELEVATION"] = ;bi16_converter;  // This should be changed...</font></p>
<p><font face="Courier New">  loadCATD();<br>
  loadLDEF();<br>
  //loadDDOM();<br>
  loadIREF();<br>
  //loadDDSH();<br>
  //loadDQLC();<br>
  //loadDQPA();<br>
  //loadDQHL();</font></p>
<p><font face="Courier New">  m_ppt3dPoint = new POINT3d[m_Height*m_Width];     //_grid = new long[_width * _height];<br>
  m_grid = new long[m_Height*m_Width];<br>
  //// XXX need to change this:<br>
  //_missingData = -32766;<br>
 } </font></p>
<p><font face="Courier New"> return LoadCELL(true);            //读取数据文件<br>
}</font></p>
<p><font face="Courier New">void ImportDEMDataSDTS::loadCATD()          //起头的文件<br>
{<br>
 sb_CatalogDir* _catd;</font></p>
<p><font face="Courier New"> // get module names<br>
 string _nameCATD = m_filePrefix + "CATD.DDF";<br>
 ifstream ddf(_nameCATD.c_str(), ios::binary);<br>
 sio_8211Reader reader(ddf, ;m_converters);<br>
 for( sio_8211ForwardIterator i( reader );! i.done();++i )<br>
 {<br>
  i.get( m_record );<br>
  _catd = new sb_CatalogDir( m_record );<br>
  m_modules[_catd->getName()] = m_filePath + _catd->getFile();<br>
  delete _catd;<br>
 }<br>
}</font></p>
<p><font face="Courier New">void ImportDEMDataSDTS::loadLDEF()<br>
{<br>
 // Get important layer info            //得到层信息<br>
 //string _nameLDEF = m_modules["LDEF"];<br>
 string _nameLDEF = m_filePrefix + "LDEF.DDF";<br>
 ifstream ddf(_nameLDEF.c_str(), ios::binary);<br>
 sio_8211Reader reader(ddf, ;m_converters);<br>
 for ( sio_8211ForwardIterator i( reader ); ! i.done(); ++i )<br>
 {<br>
  <br>
  i.get ( m_record );<br>
  for ( m_field_itr = m_record.begin();m_field_itr != m_record.end(); m_field_itr++ )<br>
  {<br>
   <br>
   for ( m_subfield_itr = m_field_itr->begin();m_subfield_itr != m_field_itr->end();m_subfield_itr++ )<br>
   {<br>
    <br>
    if (m_subfield_itr->getMnemonic() == "CMNM") <br>
    {<br>
     m_subfield_itr->getA( m_cellModuleName );<br>
    }<br>
    else if (m_subfield_itr->getMnemonic() == "LLBL")<br>
    {<br>
     <br>
     m_subfield_itr->getA( m_label );<br>
    }<br>
    else if (m_subfield_itr->getMnemonic() == "NROW")<br>
    {<br>
     m_subfield_itr->getI( m_Height );<br>
    }<br>
    else if (m_subfield_itr->getMnemonic() == "NCOL")<br>
    {<br>
     m_subfield_itr->getI( m_Width );<br>
    }<br>
   }<br>
  }<br>
 }                  //结束第一重循环<br>
}</font></p>
<p><font face="Courier New">void ImportDEMDataSDTS::loadIREF()<br>
{<br>
 sb_IntSpatialRef* _iref;</font></p>
<p><font face="Courier New"> // Get x and y resolution            //XY轴分辨率<br>
 //string _nameIREF = _modules["IREF"];<br>
 string _nameIREF = m_filePrefix + "IREF.DDF";<br>
 ifstream ddf(_nameIREF.c_str(), ios::binary);<br>
 sio_8211Reader reader(ddf, ;m_converters);<br>
 for( sio_8211ForwardIterator i( reader );! i.done();++i )<br>
 {<br>
  i.get( m_record );<br>
  _iref = new sb_IntSpatialRef( m_record );<br>
  m_xRes = _iref->getXCompHorizRes();<br>
  m_yRes = _iref->getYCompHorizRes();<br>
  delete _iref;<br>
 }<br>
}</font></p>
<p><font face="Courier New">long ImportDEMDataSDTS::LoadCELL(bool incrementalRead)      //此函数本身处在循环中<br>
{<br>
 if (m_bLoadingFileFirstTime)<br>
 {<br>
  //string _nameCELL = m_modules["CEL0"];<br>
  string _nameCELL = m_filePrefix + "CEL0.DDF";<br>
  m_ddf.open(_nameCELL.c_str(),ios::binary);<br>
  <br>
  m_reader = new sio_8211Reader(m_ddf, ;m_converters);<br>
  m_curRecord = new sio_8211ForwardIterator( *m_reader );<br>
  m_bLoadingFileFirstTime = false;<br>
 }</font></p>
<p><font face="Courier New"> while (! m_curRecord->done() )<br>
 {<br>
  readNextRecord();<br>
  if (incrementalRead)<br>
   return m_Height - m_curHeight;          // 所剩下的<br>
 }<br>
 m_ddf.close();<br>
 return 0;                 //返回0将使得函数调处fill所处的循环<br>
}</font></p>
<p><font face="Courier New">void ImportDEMDataSDTS::readNextRecord()<br>
{<br>
 long *temp = 0;<br>
 m_curRecord->get ( m_record );<br>
 for ( m_field_itr = m_record.begin();m_field_itr != m_record.end();m_field_itr++ )<br>
 {<br>
  for ( m_subfield_itr = m_field_itr->begin();m_subfield_itr != m_field_itr->end();m_subfield_itr++ )<br>
  {<br>
   if (m_subfield_itr->getMnemonic() == m_label)<br>
   {<br>
    //m_ppt3dPoint[m_index][0] = (m_index - m_curHeight*m_Width)*m_xRes;<br>
    //m_ppt3dPoint[m_index][1] = m_curHeight*m_yRes;<br>
    m_subfield_itr->getBI16(m_grid[m_index]);         //m_subfield_itr->getBI16(_grid[_gridLocation]);  //_grid赋值<br>
    <br>
    m_index++;<br>
   }<br>
  }<br>
 }<br>
 ++(*m_curRecord);             //一直加,直到m_curRecord->done()<br>
 m_curHeight++;<br>
}</font></p></font></font>
喜欢0 评分0
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
游客

返回顶部