阅读:1025回复:0
读取SDTS(Spatial Data Transfer Standard )DEM数据显示三维分层设色地图
<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> |
|
|