当前位置:首页 > C++ > 正文内容

C++读取ASCII格式DEM数据

admin4年前 (2020-10-03)C++12173

要使用OpenGL显示DEM,就把tif的DEM转成了ASCII格式的,用的是ArcMap工具箱里的栅格转ASCII,转出来的格式是这样的:用了6行来描述数据,如下:

第一行:数据的列数ncols

第二行:数据的行数 nrows

第三行:数据左下角的X值xllcorner

第四行:数据左下角的Y值yllcorner

第五行:像元大小cellsize

第六行:无数据的值NODATA_value

第七行开始就是数据了,按照行和列的位置排列,值代表像元值的大小。

关于一些DEM格式的转换可以看这里

下面是ASCII格式DEM的截图:

image.png

这里的思路是,先读取第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;
}

 

 

扫描二维码推送至手机访问。

版权声明:本文由lovedm.club发布,如需转载请注明出处。

本文链接:http://lovedm.club/?id=91

分享给朋友:

“C++读取ASCII格式DEM数据” 的相关文章

C++ vector

vector是一个容器,类似于数组,使用的顺序存储结构,可以看做是可以动态拓展的数组,使用vector的优点是其以常数时间进行索引,缺点是在中间进行插入和删除操作代价比较高,但是如果插入和删除发生在尾端速度仍然较快。使用时需要包含头文件#include<vector>初始化方式:vect...

C++计算程序运行的时间

最近在程序中有个读取文件的操作,想知道耗费的时间,查找之后大家都在用C++11中的库chrono,找了个能运行的现成写好的类:链接代码如下:#include <iostream> #include <chrono> using names...

C++ 计算点到空间直线的距离

最近的工作中需要计算空间中点到直线的距离,网上找了个算法:链接很简单,就是余弦定理算出余弦,知道余弦算出正弦,然后求出高也就是距离。当然这里不考虑效率问题,实验性的代码,先能用再优化。struct Point {     double ...

C++ 派生类的析构函数的执行顺序

C++ 派生类的析构函数的执行顺序

C++中派生类是不会继承父类的构造函数和析构函数的,这一点要明确。派生类中构造函数的执行顺序是先父类的构造函数然后当前类,析构函数则相反。举例如下:#include <iostream> using namespace std; class&nb...

C++常量

关于常量的一些形式以及含义在此记录一下:#include <iostream> using namespace std; int main() { //常量,不能改变值 const int a =&n...

GDAL构建Delaunay三角网

GDAL能创建Delaunay三角网我是没想到的,需要包含头文件gdal_alg.h使用GDALTriangulationCreateDelaunay函数,函数说明在此 ,三个参数:第一个是点的个数,第二三个分别是点的X坐标和点的Y坐标。返回值是GDALTriangulation* 类型的...