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


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

目录
相关文章
|
Java 定位技术 数据处理
windows下gdal的java开发环境搭建
本文介绍了gdal在windows环境下怎么搭建java开发,同时提供一个开发示例,通过输出gdal支持的数据驱动来演示其支持的数据类型,同时表明我们的环境搭建完成,可以基于java进行相应开发。
1310 0
windows下gdal的java开发环境搭建
|
数据可视化 前端开发 关系型数据库
基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
本文讲解在mybatis-plus中操作geometry空间字段,同时实现查询和插入操作​。通过geojson,结合前端可视化组件即可完成​矢量数据的空间可视化。
3306 0
基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
|
数据采集 缓存 负载均衡
请解释什么是代理服务器,以及在爬虫中如何使用代理服务器?
【2月更文挑战第23天】【2月更文挑战第72篇】请解释什么是代理服务器,以及在爬虫中如何使用代理服务器?
622 1
|
算法 API C++
【Qt UI】QT 窗口/控件置顶方法详解
【Qt UI】QT 窗口/控件置顶方法详解
1218 0
|
存储 Java 定位技术
gis利器之Gdal(二)shp数据读取
本文首先简单介绍了空间数据shp数据的基本知识,其常见的文件组成形式。使用qgis软件对数据进行常规预览,最后重点介绍了使用gdal对矢量信息进行读取,​包括空间信息和属性信息
1631 0
gis利器之Gdal(二)shp数据读取
|
3月前
|
机器学习/深度学习 传感器 人工智能
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在人工智能和计算机视觉的快速发展中,火灾检测与火焰识别逐渐成为智慧城市、公共安全和智能监控的重要研究方向。一个高质量的数据集往往是推动相关研究的核心基础。本文将详细介绍一个火灾火焰识别数据集,该数据集共包含 2200 张图片,并已按照 训练集(train)、验证集(val)、测试集(test) 划分,同时配有对应的标注文件,方便研究者快速上手模型训练与评估。
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
JavaScript 前端开发
在VSCode中 使用 ESLint + Prettier检查代码规范及自动格式化前端Vue代码
般的代码格式化工作,ESLint完全可以胜任,为什么要用Prettier代替ESLint的代码格式化功能?简而言之,Prettier的代码格式化功能比ESLint更强大,配置更简单,通过配置,ESLint可以使用Prettier的代码规则进行校验,如果不配置好,会出现冲突,导致二者不能配合使用。 下面详细介绍如何配置ESLint+Prettier在VSCode中开发Vue代码:
1823 29
在VSCode中 使用 ESLint + Prettier检查代码规范及自动格式化前端Vue代码
|
机器学习/深度学习 人工智能 运维
智能化运维:从传统到未来的转型之路####
本文深入探讨了智能化运维(AIOps)的兴起背景、核心价值及其在现代IT运维管理中的实践应用。通过分析智能化技术如何优化运维流程、提升系统稳定性与效率,并结合具体案例,揭示智能化运维在降低成本、增强响应速度及预测性维护方面的优势。文章还展望了智能化运维的未来发展趋势,为读者提供一幅从传统运维向智能化转型的清晰蓝图。 ####
Qt对动态库(*.dll)的封装以及使用
Qt对动态库(*.dll)的封装以及使用
1235 0
|
SQL 数据可视化 关系型数据库
开源低代码平台推荐!10款优秀的开源低代码平台!
本文介绍了10款免费开源低代码开发平台,包括JeeLowCode、Ample、WaveMaker等,它们通过减少代码编写量,提供高效、灵活的开发工具,帮助企业快速构建复杂应用,支持企业数字化转型。各平台特色鲜明,适用于不同开发需求和应用场景。