c/c++ 使用libgeotiff读取全球高程数据ETOPO

cpp 复制代码
#include <geotiff.h>
#include <geotiffio.h>
#include <tiffio.h>
#include <iostream>
#include <xtiffio.h>
void MyTIFFErrorHandler(const char* module, const char* fmt, va_list args) {
    // 格式化错误消息
    char buffer[1024];
    vsnprintf(buffer, sizeof(buffer), fmt, args);

    // 输出到标准错误(或日志文件)
    std::cerr << "[TIFF ERROR] Module: " << (module ? module : "unknown")
              << ", Message: " << buffer << std::endl;
}
void ReadFloatTifGrid(const char *file) {
TIFFErrorHandler oldHandler = TIFFSetErrorHandler(MyTIFFErrorHandler);
    TIFF *tif = NULL;
    GTIF *gtif = NULL;

    tif = XTIFFOpen(file, "r");
    if (!tif) {
        return ;
    }

    gtif = GTIFNew(tif);
    if (!gtif) {
        XTIFFClose(tif);
        return ;
    }

    unsigned short sampleFormat, samplesPerPixel, bitsPerSample;
    TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel);// 1: 无符号整数,2: 有符号整数,3: 浮点
    TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bitsPerSample);
    TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &sampleFormat);

    if (sampleFormat != SAMPLEFORMAT_IEEEFP || bitsPerSample != 32 || samplesPerPixel != 1) {
        GTIFFree(gtif);
        XTIFFClose(tif);
        return ;
    }

    int width, height;
    TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
    TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);

    short tiepointsize, pixscalesize;
    double* tiepoints;//[6];
    double* pixscale;//[3];
    TIFFGetField(tif, TIFFTAG_GEOTIEPOINTS,  &tiepointsize,
                 &tiepoints);
    TIFFGetField(tif, TIFFTAG_GEOPIXELSCALE, &pixscalesize,
                 &pixscale);
    float data1[30000] = {0};

    auto cellSize = pixscale[0];
   auto top = tiepoints[4];
    auto left = tiepoints[3];
   auto bottom = tiepoints[4]-(pixscale[1] * float(height));
    auto right = tiepoints[3]+(pixscale[0] * float(width));


    if (TIFFIsTiled(tif)) {
        // 处理分块图像
        uint32_t tileWidth, tileHeight;
        TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tileWidth);
        TIFFGetField(tif, TIFFTAG_TILELENGTH, &tileHeight);
        int a=TIFFTileSize(tif);
        unsigned char* buf = (unsigned char*)_TIFFmalloc(TIFFTileSize(tif));

        for (uint32_t y = 0; y < height; y += tileHeight) {
            for (uint32_t x = 0; x < width; x += tileWidth) {
                TIFFReadTile(tif, buf, x, y, 0, 0);
                if(y>=3437&&x>18042)
                {
                    int a=0;
                }
                if (bitsPerSample == 32) {
                    float* floatData = (float*)buf;//高度
                    int a=0;
                    // 处理32位浮点数据...
                } else if (bitsPerSample == 64) {
                    double* doubleData = (double*)buf;
                    int a=0;
                    // 处理64位浮点数据...
                }
                else if (bitsPerSample == 16) {
                    uint16_t* shortData = (uint16_t*)buf;

                }

            }
        }
        _TIFFfree(buf);
    }
        else {
            for (long i = 0; i < height; i++) {
                if (TIFFReadScanline(tif, data1, (unsigned int)i, 0) == -1) {

                    GTIFFree(gtif);
                    XTIFFClose(tif);
                    return ;
                }
                if(i>3000)
                {
                    float sss=data1[17000];
                    int a=0;
                }
        }
    }
    GTIFFree(gtif);
    XTIFFClose(tif);

}
int main(int argc, char *argv[]) {

    ReadFloatTifGrid("ETOPO_2022_v1_60s_N90W180_surface.tif");
}

全球高程tif从https://www.ncei.noaa.gov/products/etopo-global-relief-model下载

自己编译tiff库要开启zlib,后续补充一个经纬度到xy的映射

相关推荐
小向是个Der10 小时前
嵌入式进阶——MCU上电后的动作
c语言·单片机·mcu·学习·链接脚本
dtq042410 小时前
C++小案例 - 日志实战
开发语言·c++
码匠许师傅11 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
码匠许师傅12 小时前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++
bkspiderx12 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
WBluuue14 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
必须得开心呀16 小时前
字节序大小端科普
c++·程序人生
会编程的小孩16 小时前
C++ 子集
c++
SunkingYang17 小时前
C++20 vs C++17:新特性对比与用法指南
c++·c++20·特性·版本·新特性·对比·c++17
前进吧-程序员17 小时前
C++20 协程入门实战:从 co_await 到一个 100 行的异步任务调度器
网络·c++·c++20