使用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)


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

目录
相关文章
|
JavaScript 前端开发
在VSCode中 使用 ESLint + Prettier检查代码规范及自动格式化前端Vue代码
般的代码格式化工作,ESLint完全可以胜任,为什么要用Prettier代替ESLint的代码格式化功能?简而言之,Prettier的代码格式化功能比ESLint更强大,配置更简单,通过配置,ESLint可以使用Prettier的代码规则进行校验,如果不配置好,会出现冲突,导致二者不能配合使用。 下面详细介绍如何配置ESLint+Prettier在VSCode中开发Vue代码:
2098 29
在VSCode中 使用 ESLint + Prettier检查代码规范及自动格式化前端Vue代码
|
11月前
|
定位技术
安徽京准分享:北斗RDSS授时和北斗授时RNSS的区别
安徽京准分享:北斗RDSS授时和北斗授时RNSS的区别
1791 15
|
5月前
|
运维 网络协议 Ubuntu
Linux网络路径追踪利器(手把手教你使用traceroute命令)
教程来源https://www.vps5.cn/本文介绍Linux下的网络诊断工具traceroute,帮助用户了解数据包从本机到目标主机的完整路径。通过分析每跳的响应时间与IP,快速定位网络延迟或中断问题。涵盖安装方法、基本用法、常用参数及实际应用场景,是运维和网络排查的必备技能。
|
10月前
|
算法 数据可视化 数据挖掘
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
|
SQL 数据可视化 关系型数据库
开源低代码平台推荐!10款优秀的开源低代码平台!
本文介绍了10款免费开源低代码开发平台,包括JeeLowCode、Ample、WaveMaker等,它们通过减少代码编写量,提供高效、灵活的开发工具,帮助企业快速构建复杂应用,支持企业数字化转型。各平台特色鲜明,适用于不同开发需求和应用场景。
|
JavaScript 前端开发 Java
驼峰命名规范及其在代码可读性中的重要性
驼峰命名规范及其在代码可读性中的重要性
854 15
|
安全 程序员 数据处理
CreateFileMapping函数详解
CreateFileMapping函数详解
|
编译器 图形学 C语言
SSE2 指令集简介以及与SSE的差别
SSE2,Intel在2001年为Pentium 4引入的扩展,增强了SSE的功能,添加了对双精度浮点和64位整数运算的支持,新增144条指令,提升向量处理能力。SSE2的C代码示例展示了如何通过`_mm_add_ps`加速向量加法。启用SSE2编译器支持可优化处理图像、音频和视频等大量计算任务的性能。
|
算法
空间判断点是否在线段上
空间判断点是否在线段上
370 0