Gdal总结

article/2025/11/6 2:51:24

1、头文件

#include<gdal.h>
#include<gdal_priv.h>
#include<gdalwarper.h>

2、注册驱动+设置中文路径+加载数据

	//注册所有的驱动GDALAllRegister();//设置支持中文路径和文件名CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //加载tif数据string file_path_name = "test.tif";//std::cout << "请输入图片路径:" << std::endl;//std::cin >> file_path_name;//将数据读入poDataset数据集GDALDataset* poDataset = (GDALDataset*)GDALOpen(file_path_name.c_str(),GA_ReadOnly);if (poDataset == NULL){std::cout << "指定的文件不能打开!" << std::endl;return 0;}

注意:GDALOpen中参数分为GA_Update(写数据),GA_ReadOnly(仅仅读数据)

3、获取图像的尺寸

  int nImgSizeX = poDataset->GetRasterXSize();int nImgSizeY = poDataset->GetRasterYSize();

注意:此处得Xsize指的是有多少列(即宽度),Ysize指的是有多少行(即高度)。如下图

4、 获取图像的通道数

    int bandCount = poDataset->GetRasterCount();

5、获取特定波段

    GDALRasterBand* poBand1 = poDataset->GetRasterBand(1);

注意:此处得波段数是从1计数,不是从0;

6、获取数据类型

    GDALDataType g_type = GDALDataType(poBand1->GetRasterDataType());

注意:Gdal总共有12中数据类型,具体如下

  • GDT_Unknown : 未知数据类型
  • GDT_Byte : 8bit正整型 (C++中对应unsigned char)
  • GDT_UInt16 : 16bit正整型 (C++中对应 unsigned short)
  • GDT_Int16 : 16bit整型 (C++中对应 short 或 short int)
  • GDT_UInt32 : 32bit 正整型 (C++中对应unsigned long)
  • GDT_Int32 : 32bit整型 (C++中对应int 或 long 或 long int)
  • GDT_Float32 : 32bit 浮点型 (C++中对应float)
  • GDT_Float64 : 64bit 浮点型 (C++中对应double)
  • GDT_CInt16 : 16bit复整型 (?)
  • GDT_CInt32 : 32bit复整型 (?)
  • GDT_CFloat32 : 32bit复浮点型 (?)
  • GDT_CFloat64 : 64bit复浮点型 (?)

7、读写GDAL数据

(1)读取Gdal数据

poDataset->GetRasterBand(2)->RasterIO(GF_Read, 0, 0, nImgSizeX, nImgSizeY, data, nImgSizeX, nImgSizeY, g_type, 0, 0);

参数解释:

        1、GF_Read:代表是读取tif文件数据。

        2、3:代表初始位置(a,b),注意第二个参数a指的是X方向,即多少列。第三个参数b指的是Y方向,即多少行。原点在左上角。如下图所示。

         4,5指的是偏移量(X,Y)。X代表距离参数(a,b)的水平平移量和竖直偏移量。即宽和高。

如下图所示

         6、中data用来将读取到的影像数据进行存储。想到于读到缓存中。data是一个数组指针类型,数据类型需要和GDAL通过GetRasterDataType获取的数据类型一致。创建格式如下

数组的大小要能存放下计划读入缓存的数据。如果是读取图像,那么读取出来的图像像素值就存储在这个Data中,如果是写入图像,那么这个Data中的数据会被写入到图像上指定的位置中去

unsigned short* data_ref = new unsigned short[100 * nRows];

         7、8 表示data数据的大小。比如4、5设置读取图像的范围是300×200,如果我要读取图像中的原始数据,那么这两个参数分别应该设置为nImgSizeX=300和nImgSizeY = 200。如果设置比这个小或者大就会进行重采样生成放大或者缩小的图像。

        9、gtype标记data 的数据类型。此时用的是GDAL格式的数据类型。

        10、11默认0即可。具体不再阐述。

(2)写数据

写数据需要在加载数据的时候改为GA_Update,然后用以下代码写入

poDataset->GetRasterBand(2)->RasterIO(GF_Write, 0, 0, nImgSizeX, nImgSizeY, data, nImgSizeX, nImgSizeY, g_type, 0, 0);

指的是将data中的数据写入打开的tiff文件指定位置

注意:data中的数据是一行,和影像对应的关系如下图

(3)GDAL与OPENCV联动

注意:cv::Mat创建时,是(height,width)的格式,与GDAL的(width,height)刚好相反。

如以下代码所示

pDataset->GetRasterBand(1)->RasterIO(GF_Read, 0, 0, ncols, nrows, data, ncols, nrows, dataType, 0, 0);
Mat temp= (Mat(nrows, ncols, dataType, data)).clone();

也可以直接读取数据到mat中

cv::Mat gdal_mat1(nImgSizeY, nImgSizeX, CV_8UC1, Scalar(0));poDataset->GetRasterBand(1)->RasterIO(GF_Read, 0, 0, nImgSizeX, nImgSizeY, gdal_mat1.data, nImgSizeX, nImgSizeY, g_type, 0, 0);

8、Gdal复制影像

//加载原始影像数据GDALDataset* poSrcDS = (GDALDataset*)GDALOpen(file_path_name.c_str(), GA_ReadOnly);//创建要存储的数据集GDALDataset* pDatasetc;//注册create的驱动GDALDriver* poDriver;//设置驱动格式const char* pszFormat = "GTiff";//接下来的两步是完成复制,file_path_nameout是输出位置+文件名,poSrcDS是原始影像数据集poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);pDatasetc = poDriver->CreateCopy(file_path_nameout.c_str(), poSrcDS, FALSE, NULL, NULL, NULL);//判断复制后的影像是不是空的,是不是都关闭数据集。if (pDatasetc != NULL) {GDALClose((GDALDatasetH)pDatasetc);}GDALClose((GDALDatasetH)poSrcDS);

注意:这段程序只需要修改输入文件:file_path_name,和输出位置文件:file_path_nameout,即可直接复制运行。

9、Gdal地理信息

影像左上角横坐标(经度):geoTransform[0]
影像左上角纵坐标(纬度):geoTransform[3]

遥感图像的水平空间分辨率为geoTransform[1]
遥感图像的垂直空间分辨率为geoTransform[5]
通常geoTransform[5] 与 geoTransform[1]相等

double dfTransform[6] = { 0 };//获取影像六参数
readDataset->GetGeoTransform(dfTransform);
cout << dfTransform[0] << endl;//获取起始经度
cout << dfTransform[3] << endl;//获取起始纬度

10、获取投影

	char* Project = NULL;Project = const_cast<char*>(readDataset->GetProjectionRef());

11、获取影像转换参数

	double dfTransform[6] = { 0 };readDataset->GetGeoTransform(dfTransform);

12、创建数据集并打开

	GDALDriver* pDriver = GetGDALDriverManager()->GetDriverByName("GTiff");GDALDataset* pDDst = pDriver->Create(filepathChong.c_str(), nNewWidth, nNewHeight, nBandCount,g_type, NULL);if (pDDst == NULL){GDALClose((GDALDatasetH)readDataset);cout << "创建重采样文件失败" << endl;return -2;}

13、对创建的影像设置投影和六参数

	pDDst->SetProjection(Project);//设置投影pDDst->SetGeoTransform(dfTransformnew);//设置6参数

 14、遥感影像重采样

#include<iostream>
#include<string>
using namespace std;
#include<gdal.h>
#include<gdal_priv.h>
#include<gdalwarper.h>
#define PI 3.1415926535897932384626433832795int main(int argc, char* argv[])
{//读取设置参数GDALResampleAlg eResample; int method;if (argc < 4){method = 2;}else{sscanf(argv[3], "%d", &method);}switch (method){case 1:eResample = GRA_NearestNeighbour;//最邻近采样 速度最快break;case 2:eResample = GRA_Bilinear; //双线性内插采样break;case 3:eResample = GRA_Cubic;//三次立方卷积采样break;}double newscale;sscanf(argv[2], "%lf", &newscale);FileInfo file(argv[1]);string filepath = file.path +"/"+ file.name +"."+ file.format;string filepathChong = file.path + "/" + file.name + "-Resampling"+"." + file.format;//注册所有的驱动GDALAllRegister();CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //设置支持中文路径和文件名GDALDataset* readDataset = (GDALDataset*)GDALOpen(filepath.c_str(), GA_ReadOnly);//加载tif原图if (readDataset == NULL){std::cout << "指定的文件不能打开!" << std::endl;return 0;}//获取影像分辨率double dfTransform[6] = { 0 };readDataset->GetGeoTransform(dfTransform);double resolution_lat = -dfTransform[5];double resolution_lon = dfTransform[1];double resolutiony = Latitude_difference_to_distance(resolution_lat);double resolutionx = Longitude_difference_to_distance(resolution_lon, dfTransform[3]);//double resolution = std::max(resolutionx, resolutiony);//获取影像大小int nImgSizeX = readDataset->GetRasterXSize();int nImgSizeY = readDataset->GetRasterYSize();//获取投影char* Project = NULL;Project = const_cast<char*>(readDataset->GetProjectionRef());//获取影像数据类型GDALDataType g_type = GDALDataType(readDataset->GetRasterBand(1)->GetRasterDataType());//获取通道数int nBandCount = readDataset->GetRasterCount();double dfTransformnew[6] = { 0 };dfTransformnew[0]= dfTransform[0];dfTransformnew[1]= distance_to_latitude_difference(newscale);dfTransformnew[2]= dfTransform[2];dfTransformnew[3]= dfTransform[3];dfTransformnew[4]= dfTransform[4];dfTransformnew[5]= -distance_to_longitude_difference(newscale, dfTransform[3]);double fResX = dfTransform[1] / dfTransformnew[1];//计算重采样前后的比例double fResY = dfTransform[5] / dfTransformnew[5];cout << dfTransform[0] << endl;int nNewWidth = static_cast<int>(nImgSizeX * fResX + 0.5);//计算重采样后的宽度int nNewHeight = static_cast<int>(nImgSizeY * fResY + 0.5);//计算重采样后的高度//创建结果数据集  GDALDriver* pDriver = GetGDALDriverManager()->GetDriverByName("GTiff");GDALDataset* pDDst = pDriver->Create(filepathChong.c_str(), nNewWidth, nNewHeight, nBandCount,g_type, NULL);if (pDDst == NULL){GDALClose((GDALDatasetH)readDataset);cout << "创建重采样文件失败" << endl;return -2;}pDDst->SetProjection(Project);//设置投影pDDst->SetGeoTransform(dfTransformnew);//设置6参数//重采样GDALWarpOptions* psWo = GDALCreateWarpOptions();psWo->eResampleAlg = eResample;//设置重采样方式psWo->eWorkingDataType = g_type;//设置数据格式psWo->hSrcDS = (GDALDatasetH)readDataset;//源数据psWo->hDstDS = (GDALDatasetH)pDDst;//设置目标数据psWo->pfnTransformer = GDALGenImgProjTransform;psWo->pTransformerArg = GDALCreateGenImgProjTransformer((GDALDatasetH)readDataset, Project, (GDALDatasetH)pDDst, Project, FALSE, 0.0, 1);;psWo->nBandCount = nBandCount;psWo->panSrcBands = (int*)CPLMalloc(nBandCount * sizeof(int));psWo->panDstBands = (int*)CPLMalloc(nBandCount * sizeof(int));for (int i = 0; i < nBandCount; i++){psWo->panSrcBands[i] = i + 1;psWo->panDstBands[i] = i + 1;}GDALWarpOperation oWo;if (oWo.Initialize(psWo) != CE_None){GDALClose((GDALDatasetH)readDataset);GDALClose((GDALDatasetH)pDDst);cout << "处理出错" << endl;return -3;}oWo.ChunkAndWarpImage(0, 0, nNewWidth, nNewHeight);GDALFlushCache(pDDst);GDALDestroyGenImgProjTransformer(psWo->pTransformerArg);GDALDestroyWarpOptions(psWo);GDALClose((GDALDatasetH)readDataset);GDALClose((GDALDatasetH)pDDst);cout << "重采样完成,生成文件地址为:" << filepathChong <<endl;return 0;
}

15、如果一直循环IO读取数据会导致大量缓存,可通过以下代码清楚缓存

		ref.readDataset->FlushCache();src.readDataset->FlushCache();


http://chatgpt.dhexx.cn/article/o5WcpS0j.shtml

相关文章

gdal概览

GDAL 1 gdal库2 栅格驱动3 栅格数据集&#xff08;就是包含各种栅格属性的一个类&#xff09;3.1 坐标&#xff08;6个参数&#xff09;3.1.2 tif文件的地理坐标&#xff08;两种情况&#xff09; 3.2 波段数、大小、投影等信息3.3 读取栅格像元3.4 创建栅格影像3.4.1 直接用数…

2.GDAL简介

1. 什么使GDAL GDAL全称是Geospatial Data Abstraction Library(地理空间数据抽象库),在一个X/MIT许可协议下读写空间数据(包括栅格数据和矢量数据)的开源库&#xff0c;它利用抽象数据模型来表达所支持的各种文件格式&#xff0c;还使用一系列命令行来进行数据转换和处理。 …

GDAL学习笔记02:GDAL基础知识

你的习惯决定了你会成为什么样的人。 GDAL学习笔记02&#xff1a;GDAL基础知识 前言1. 版本2. 摘要3. 说明4. 微信公众号GISRSGeography 一、GDAL简介二、导入GDAL三、读取遥感影像的信息 前言 1. 版本 1.1 山东青岛&#xff0c;2022年7月17日&#xff0c;Version 1 2. 摘要…

GDAL 安装教程(Python)

引言 本文介绍 GDAL&#xff08;Geospatial Data Abstraction Library&#xff0c;空间数据抽象库&#xff09;的 Python 版本安装教程。 简介 GDAL 是用于栅格和矢量地理空间数据格式的开源转换器。向调用应用程序提供所有受支持格式的单个栅格抽象数据模型和单个矢量抽象数…

TrAdaBoost

TraAdaBoost是AdaBoost算法的扩展。 TraAdaBoost核心思想&#xff1a; same-distribution instance feature:训练数据中与测试数据分布相同的数据&#xff0c;用Ts表示&#xff0c;m 错误预测增加权重 diff-distribution instance feature:训练数据中与测试数据分布不同的数据&…

Boost Build

Window XP Visual Studio 2008 获取Boost库源码 我们可以从http://www.boost.org/ 上获取boost的源代码。当前最新版本为1.45.0。 解压到指定目录 例如&#xff1a;D:/Program Files/boost/目录下 获取bjam 一种方式&#xff1a;从http://sourceforge.net/projects/boos…

BoF and Bos

Bag of freebies 采用一些方法使模型有更高的准确度但是不增加模型的复杂度和模型的推理代价 PS&#xff1a;数据增强应该在图像标准化(normalization)之前完成&#xff1b; Library: Albumentations arxiv github docsAugmentor arxiv github docs Biomedical image augment…

Boost 作为客户端 boost

系列文章目录 lotus Boost 作为客户端 系列文章目录前言一、同步区块高度二、boost 初始化1. 生成钱包地址2. boost设置默认钱包地址 三、boostx向存储市场添加资金四、发单五、离线交易参考 前言 Boost 作为客户端 一、同步区块高度 可以远程调用其它api&#xff0c;也可以…

DART booster

XGBoost基本上都是组合大量小学习率的回归树。在这种情况,越晚添加的树比越早添加的树更重要。 Rasmi根据深度神经网络社区提出一个新的使用dropout的boosted trees,并且证明它在某些情况有更好的结果。 以下是新的tree boosterdart的介绍。 原始文章 特征 Drop Trees是…

boost::format

实在不好意思&#xff0c;原本计划每天一篇&#xff0c;这几天工作遇到问题&#xff0c;只好改为“不定期”一篇&#xff0c; 今天是format library&#xff0c;其实N天前我已经看过了&#xff0c;也动手实验了一下&#xff0c;现在才来把笔记补上。 用过MFC或ATL中的CString的…

adboost

要明确Adaboost是一种算法。 介绍一下Adaboost的历史。 Adaboost的前身的Boosting算法。 Boosting是一种提高任意给定学习算法准确度的方法。它的思想起源于Valiant提出的PAC(Probably Approximately Correct)学习模型。Valiant和Kearns提出了弱学习和强学习的概念,识别错误…

buuctf easymd5

点击f12&#xff0c;查看源代码看看有没有消息 Hint&#xff1a;select * from ‘admin’ where password md5($pass,ture) 我们要让passwordmd5($pass,ture) mysql里面&#xff0c;在用作布尔型判断时&#xff0c;以数字开头的字符串会被当做整型数。 要注意的是这种情况是必…

fastboot与fastbootd介绍

fastboot与fastbootd介绍 前言一、fastboot和fastbootd介绍二、fastbootd与fastbootd区别参考文献 前言 在项目中遇到使用fastboot刷机场景&#xff0c;刷vendor分区出现异常&#xff0c;从而对fastboot和fastbootd有一个更深入的了解&#xff0c;进行一个总结。 一、fastbo…

Everything+Wox

Everything可对磁盘上文件/文件夹进行快速查找 Wox可对应用程序/网站进行快速启动 两者最好结合使用&#xff08;结合使用&#xff0c;两个软件都必须都启动&#xff09; Everything 下载地址&#xff1a;https://www.voidtools.com/zh-cn/ Wox 下载地址&#xff1a;https://gi…

wox wpm 安装 有道插件

1. wox 安装插件 可以通过右键点击setting&#xff0c;到官网上安装&#xff0c;也可以采用简单的方法&#xff1a; wpm install 有道翻译注意&#xff0c;选择有道翻译即可。 2. 英译汉 yd china3. 汉译英

Wox使用指南

下载安装 从下载地址下载最新版本的 wox &#xff0c;我下载的是 exe 版的 Wox-1.3.578.exe 下载以后直接安装即可&#xff0c;不会有选择项&#xff0c;安装成功以后会在屏幕上出现一个搜索框&#xff0c;默认失去焦点以后搜索框就会消失&#xff0c;可以在系统状态栏的 wox 图…

实用工具 Wox

今天分享一个我一直在用&#xff0c;并且让我爱不释手的一个工具软件&#xff0c;Wox。 Wox 是一款国产开源免费的软件快捷启动工具&#xff0c;它可以快速搜索并打开你电脑上的程序、文件、或是查词翻译、网站查找等其他操作&#xff0c;同时还支持插件安装。 Tips: 如果你需…

使用Python编写Wox插件

最近正再使用Wox&#xff0c;这个软件还挺高效的&#xff0c;而且还能自己编写一些插件&#xff0c;这里打算自己写点插件用用. Wox官网 Plugin (wox.one)插件,此外官方也提供了编写文档&#xff0c;编写插件 GitBook (wox.one)提供Python和C#两种优秀的语言编写方案。我这里就…

Wox插件之程序员不安装会死系列

Wox 安装 在操作系统上&#xff0c;可快速启动、计算、查找程序、文件等&#xff0c;同时也提供了一系列插件&#xff0c;使用起来非常的方便。默认启动 Wox 快捷键 Alt Space&#xff0c;当然你也可以自己设置自己喜欢的快捷键 Wox下载地址&#xff1a;下载地址 不安装会…

快速搜索Wox工具之Everything Client没有运行报错,解决办法!

一直在用的一款快速搜索神器——Wox&#xff0c;但是在使用过程中出现一个报错&#xff01; 报错如下&#xff1a; Everything Client 没有运行令我很烦&#xff0c;百度了一下&#xff0c;试了很多方法&#xff0c;还是不能发挥它的最大功效。 由于我是一个好学的人&#xff…