C++读取ASCII格式DEM数据
要使用OpenGL显示DEM,就把tif的DEM转成了ASCII格式的,用的是ArcMap工具箱里的栅格转ASCII,转出来的格式是这样的:用了6行来描述数据,如下:
第一行:数据的列数ncols
第二行:数据的行数 nrows
第三行:数据左下角的X值xllcorner
第四行:数据左下角的Y值yllcorner
第五行:像元大小cellsize
第六行:无数据的值NODATA_value
第七行开始就是数据了,按照行和列的位置排列,值代表像元值的大小。
关于一些DEM格式的转换可以看这里。
下面是ASCII格式DEM的截图:
这里的思路是,先读取第2个和第4个内容也就是列和行到int变量里,然后跳过后面的8个内容,从第13个内容开始就是数据了,开始读到float数组里,当然这是看的人家的代码,应该还有更好的方式来读取。这里的方式也相应的存在一些问题:如果数据没有空间参考,那么出来的ASCII文件没有数据左上角的坐标,读取时数据的起始位置会发生偏差,会出现问题。数据量较大的时候这种方式也会出现问题:需要开辟的数组太大了。当然这里先不管那些,问题留到以后解决。
代码:
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { float *H; float Z; int col, row; ifstream infile; infile.open("demclip1.txt"); if (!infile) cout << "error" << endl; string str; infile >> str >> col >> str >> row; int datanum = col * row; H = new float[datanum]; for (int i = 0; i < 8; i++) { infile >> str; cout << str << endl; } for (int i = 0; i < col * row; i++) { infile >> Z; if (Z <= -9999 || Z >= 9999) H[i] = 0; else H[i] = Z; } cin.get(); return 0; }