使用GDAL库读取Tiff文件

简介: 使用GDAL库读取Tiff文件

库编译

首先需要编译对应版本的GDAL库,官方链接:https://gdal.org/

我有GDAL源码、编译好的win32和win64,百度网盘链接:

链接:https://pan.baidu.com/s/1-7NE56Uue-Xq7DBuqcRukw?pwd=6666

提取码:6666

解压密码:LinXi


项目配置

依赖库

将上面解压好的文件放在一个固定的路径,注意不要有中文。

我的存放路径如下:

项目配置

1、在项目配置中的配置属性-》常规-》输出目录:.\bin_D\

2、在项目配置中的配置属性-》C/C++》常规-》附加包含目录:这里填写你刚刚存放对应平台的include文件。例如:32位你就选择gdal_vs(86);64位你就选择gdal_vs。

3、在项目配置中的配置属性-》连接器》常规-》附加库目录:这里填写你刚刚存放对应平台的lib文件。例如:32位你就选择gdal_vs(86);64位你就选择gdal_vs。

4、在项目配置中的配置属性-》连接器》输入》附加依赖项:这里不与平台有关,直接写gdal_i_lib即可。

5、然后将gdal*.dll动态库拷贝到工程的输入路径下,proj动态库是gdal库依赖的,具体编译可以看我这篇博客:PROJ 9.1.1源码下载编译(Win10+VS2022)


测试

测试图片

采用清华大学宫鹏教授学科组10m土地覆盖数据,具体可以在官网下载。

项目结构

测试代码

#include "gdal_priv.h"
#include<iostream>
#include <iostream>
#include <list>
#include "gdal_priv.h"   
#include "cpl_conv.h" //for CPLMalloc()   
using namespace std;
void ReadTiffFile(double lon, double lat)
{
  //注册文件格式   
  GDALAllRegister();
  const char* pszFile = "./fromglc10v01_0_100.tif"; // 读取tiff文件
  //const char* pszFile = "./01C_20210101-20220101.tif";//"C:\\Test.img";  //1.jpg
  //使用只读方式打开图像 
  GDALDataset* poDataset = (GDALDataset*)GDALOpen(pszFile, GA_ReadOnly);
  if (poDataset == NULL)
  {
    printf("File: %s不能打开!\n", pszFile);
    return;
  }
  //输出图像的格式信息   
  std::cout << "Driver:" << poDataset->GetDriver()->GetDescription() << "/"
    << poDataset->GetDriver()->GetMetadataItem(GDAL_DMD_LONGNAME) << std::endl;
  //输出图像的大小和波段个数   
  std::cout << "Size is" << poDataset->GetRasterXSize() << "*"
    << poDataset->GetRasterYSize() << "*" << poDataset->GetRasterCount() << std::endl;
  //输出图像的投影信息   
  if (poDataset->GetProjectionRef() != NULL)
  {
    std::cout << "Projectionis" << poDataset->GetProjectionRef() << std::endl;
  }
  GDALRasterBand* poBand;
  int            nBlockXSize, nBlockYSize;
  int            bGotMin, bGotMax;
  double         adfMinMax[2];
  //读取第一个波段   
  poBand = poDataset->GetRasterBand(1);
  int   nXSize = poBand->GetXSize();
  int nYSize = poBand->GetYSize();
  //输出图像的坐标和分辨率信息   
  double adfGeoTransform[6];
  if (poDataset->GetGeoTransform(adfGeoTransform) == CE_None)
  {
    printf("Origin =(%.6f,%.6f)\n",
      adfGeoTransform[0], adfGeoTransform[3]);
    printf("PixelSize = (%.6f,%.6f)\n",
      adfGeoTransform[1], adfGeoTransform[5]);
  }
  CPLFree(poDataset);
  //关闭文件   
  GDALClose((GDALDatasetH)poDataset);
}
int main()
{
  double lon = 101.8615835729;
  double lat = 1.7389243989;
  ReadTiffFile(lon, lat);
  return 0;
}


运行结果

Driver:GTiff/GeoTIFF
Size is22265*22265*1
ProjectionisGEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]
Origin =(99.999918,2.000009)
PixelSize = (0.000090,-0.000090)


解析成功。下一篇将会介绍如何读取指定像元值

目录
相关文章
|
算法 数据挖掘 计算机视觉
Python利用K-Means算法进行图像聚类分割实战(超详细 附源码)
Python利用K-Means算法进行图像聚类分割实战(超详细 附源码)
1736 0
|
定位技术
【gis】gdal 切分遥感 tif 格式图片
【gis】gdal 切分遥感 tif 格式图片
980 0
【gis】gdal 切分遥感 tif 格式图片
|
JavaScript 前端开发
在VSCode中 使用 ESLint + Prettier检查代码规范及自动格式化前端Vue代码
般的代码格式化工作,ESLint完全可以胜任,为什么要用Prettier代替ESLint的代码格式化功能?简而言之,Prettier的代码格式化功能比ESLint更强大,配置更简单,通过配置,ESLint可以使用Prettier的代码规则进行校验,如果不配置好,会出现冲突,导致二者不能配合使用。 下面详细介绍如何配置ESLint+Prettier在VSCode中开发Vue代码:
2166 29
在VSCode中 使用 ESLint + Prettier检查代码规范及自动格式化前端Vue代码
|
12月前
|
安全 Linux Android开发
如何将Kindle电子书下载到电脑:技术流程与操作解析
随着数字阅读兴起,Kindle成为主流电子书平台。然而,Amazon的封闭生态和DRM限制,使用户难以灵活管理书籍。本文从技术角度出发,讲解如何合法下载Kindle电子书至电脑,包括使用Kindle for PC、USB导出及进阶方案(如Android模拟器、WINE环境)。同时介绍文件格式处理、自动化备份与阅读体验优化方法,并强调版权合规的重要性,助您构建个人数字图书馆。
4489 3
|
机器学习/深度学习 自然语言处理 算法
AI 世界生存手册(一):从LR到DeepSeek,模型慢慢变大了,也变强了
大家都可以通过写 prompt 来和大模型对话,那大模型之前的算法是怎样的,算法世界经过了哪些比较关键的发展,最后为什么是大模型这条路线走向了 AGI,作者用两篇文章共5.7万字详细探索一下。
AI 世界生存手册(一):从LR到DeepSeek,模型慢慢变大了,也变强了
|
安全 程序员 数据处理
CreateFileMapping函数详解
CreateFileMapping函数详解
|
编译器 图形学 C语言
SSE2 指令集简介以及与SSE的差别
SSE2,Intel在2001年为Pentium 4引入的扩展,增强了SSE的功能,添加了对双精度浮点和64位整数运算的支持,新增144条指令,提升向量处理能力。SSE2的C代码示例展示了如何通过`_mm_add_ps`加速向量加法。启用SSE2编译器支持可优化处理图像、音频和视频等大量计算任务的性能。
|
算法
空间判断点是否在线段上
空间判断点是否在线段上
403 0
|
JSON API 数据格式
Postman 导入导出API 的用法
Postman 导入导出API 的用法
1960 0