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;
- }