|
阅读:840回复:0
读取 国家标准地球空间数据交换格式 (简称CNSDTF)DEM
<a href="http://www.cnblogs.com/wuhanhoutao/archive/2007/10/31/943791.html" target="_blank" >在南京城市地质调查项目中需要读取<font face="Courier New">CNSDTF</font> DEM数据,这种格式与美国USGS DEM数据格式相比较,有些简单,不包含椭球体,投影方式等元数据,实际上就是投影后的平面格网数据,所以读取入系统不困难.以后将介绍ERDAS IMG格式的读取,这个就显得有些复杂了.<br>
</a><br>std::locale::global(std::locale(""));</p> <p> ifstream _demfile; //DEM文件流<br> _demfile.open(lpszPathName); //读取文件<br> <br> string sDataName,sCNDataName;<br> string sVersion;float iVersion;<br> string sAlpha;float fAlpha;<br> string sUnit; string sUnitName;<br> string sCompress; float dCompress;<br> string sX0; double dX0;<br> string sY0; double dY0;<br> string sDX; double dDX;<br> string sDY; double dDY;<br> string sRow; int iRows;<br> string sColumn; int iColumns;<br> string sValueTypeName; string sValueType;<br> string sHzoom; int iHzoom;<br> string sMinV;<br> string sMaxV;</p> <p> if(_demfile)<br> {<br> _demfile>>sDataName>>sCNDataName;<br> _demfile>>sVersion>>iVersion;<br> _demfile>>sAlpha>>fAlpha;<br> _demfile>>sUnit>>sUnitName;<br> _demfile>>sCompress>>dCompress;<br> _demfile>>sX0>>dX0;<br> _demfile>>sY0>>dY0;<br> _demfile>>sDX>>dDX;<br> _demfile>>sDY>>dDY;<br> _demfile>>sRow>>iRows;<br> _demfile>>sColumn>>iColumns;<br> _demfile>>sValueTypeName>>sValueType;<br> _demfile>>sHzoom>>iHzoom;<br> _demfile>>sMinV;<br> _demfile>>sMaxV;</p> }<br> else <br> {<br> AfxMessageBox("无法读取文件数据头!");<br> return false;<br> }<br> dY0 = dY0 - dDY*iRows; //从文件中读取的dYO记录的是最大数值<br> long index = 0,PointsTotalNumber = 0;<br> int i,j;<br> double tmpHeight = 0;<br> <br> POINT3d* p3dDEMGridPoint = new POINT3d[iRows*iColumns]; //准备读文件中数据<br> <br> double dNodata = -99999;<br> double dZMin = 9999,dZMax = -9999;<br> for(j=iRows-1;j>=0;j--) //由于此文件记录Y数值的方法与其他不同,需要翻转数据<br> {<br> for(i=0;i<iColumns;i++)<br> {<br> index = j*iColumns+i;<br> _demfile>>tmpHeight;<br> if(iHzoom != 0) tmpHeight = tmpHeight/iHzoom; //原始的缩放因子<br> p3dDEMGridPoint[index][2] = tmpHeight;<br> <br> if( tmpHeight > -9999) //也就是不等于 dNodata<br> {<br> if(dZMin > tmpHeight) dZMin = tmpHeight; //记录高程上的最小数值<br> if(dZMax < tmpHeight) dZMax = tmpHeight; //记录高程上的最大数值<br> }<br> <br> }<br> } |
|
|