linux(Ubuntu )搭C++ 最新版GDAL完整教程

在前面的文章中主要是介绍如何在windows系统下利用python安装gdal库,如下:
如何快速安装GDAL

在linux环境下python安装gdal也可以利用现成的whl文件,但是安装c++ GDAL环境的比较麻烦,目前网络上大多是安装的老版本的教程,以及Windows 下vs的相关配置方法,对于在linux系统上如何安装最新版的资料较少,此文主要介绍如何从安装虚拟机部署linux系统,到安装最新的GDAL版本,以及利用vs code上运行C++ 代码调用GDAL库等流程进行全面梳理和描述。

1 安装vmware虚拟机

先安装虚拟机,在虚拟机里面部署linux系统,使之与电脑的windows系统隔离,达到一电脑两个系统的目的。
最好相关版本和我的保持一致,
链接:https://pan.baidu.com/s/1iDQXDocVE1_78JP5w6v3Dw?pwd=mebg
提取码:mebg

下载后,点击exe安装。
一直都是下一步,直到下面这步最好修改位置到磁盘空间大的磁盘,不建议安装在C盘:
在这里插入图片描述
取消默认的勾选:
在这里插入图片描述

之后点击下一步,完成后,在下面界面选择个人用途:
在这里插入图片描述

安装成功后打开vmware ,在创建新的虚拟机之前需要下载linux安装文件,其链接如下,我用的是24.04,
Ubuntu
下载完系统之后在vmware中创建虚拟机,
在这里插入图片描述
在这里插入图片描述

设置密码和账户之后:
在这里插入图片描述

一路下一步,根据提示进行相关设置即可,操作较为简单。

2 C++ GDAL相关库配置

以下所有操作都是linux系统上进行的,首先要了解如何打开终端以及输入常用命令等。

安装gdal之前需要先配置proj库,而安装proj库时会提示安装sqllite3和libtiff-4等,所以先配置其他依赖的库。
注意:根据需要安装的GDAL版本,查看官网对其他库的版本要求,后面操作相关依赖库都是版本对应的,
安装GDAL先查看PROJ的版本,然后安装PROJ库时查看要求的sqllite3和其他库的版本等,如果没有版本要求,则选择最稳定的版本即可。
可先看2.4和2.5节的版本要求。

2.1 libtiff安装

下载链接:libtiff-4.6.0
注意要根据GDAL和PROJ的版本要求选择合适的版本,PROJ对libtiff的要求参考2.4节
手动解压

cd '解压的文件夹下'
# 如何依次输入下面命令进行编辑
./configure
make
make install
sudo ldconfig #创建连接

然后输入命令:tiffinfo 检查是否成功。

2.2 安装CURL

sudo apt update
sudo apt install curl

2.3 安装sqllite3

建议源码编译,可以比较明确的对应各个库的版本问题,可参考:
Sqlite3安装
注意要根据GDAL和PROJ的版本要求选择合适的版本,PROJ对sqllite的要求参考2.4节

在Ubuntu可以不用源码编译,

sudo apt-get install sqlite3

Ubuntu >= 20.04,需要使用命令

sudo apt install libsqlite3-dev

安装后,输入命令sqlite3 -version查看版本

2.4 安装PROJ

对其他库的要求:
在这里插入图片描述

下载链接:PROJ
手动解压后,在终端依次输入:

cd '进入解压后的文件夹下'# 然后依次输入下面命令
mkdir build
cd build
# 注意后面的 点 不要遗漏
cmake ..
cmake --build .
cmake --build . --target install

2.5 安装GDAL

在上述都配置好之后,在官网:GDAL
我下载的是3.9.2的版本:
添加图片注释,不超过 140 字(可选)

注意目前关于C++ GDAl的编译方式以前版本和较新版本方式不一样,网络上大多是通过configure 文件编译,类似2.1的方式,但新版本解压后里面没有这文件,所以编译方式不一样,新版方式如下 ,在文件解压后进入文件夹下:

mkdir build
cd build# 注意后面的 点 不要遗漏
cmake ..
cmake --build .
cmake --build . --target install

2.6 配置环境变量

上述等库默认位置安装成功后,会放置在/usr/local/lib和/usr/local/bin下,所以需要将这两个位置在环境变量中设置一下。

sudo gedit /etc/profile
# 打开文件后,在文件的最后输入下面语句
export PATH=$PATH:/usr/local/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

验证GDAL:在终端输入:

gdalinfo --version

在这里插入图片描述

可见gdal配置成功,但这只是开发利用的第一步,在linux中没有vs那样厉害的ide开发工具,一般使用vs code安装c++插件来实现c++编程以调用gdal函数。

所以下面是进行vs code 配置c++,并给出测试gdal的示例。

2.6 安装中注意事项

如果安装过程中有提示报错,而且不是和上面的库相关的,可以通过下面方式通过apt命令行方式安装

# 安装前先更新一下
sudo apt update
# 然后
sudo apt install package_name=package_version
# 如果不清楚具体版本号,可以不写等号后的
sudo apt install package_name# 如果想知道某个软件包有哪些可用的版本?可以使用这个命令:
apt list --all-versions package_name

如果是安装其他版本的gdal以及proj等库的时候,如果里面有configure文件的一般通过下面方式编译:

cd '源码源码包解压后的位置' 			
./configure --prefix='/home/Softwares' 		#指定安装路径,也可以不要--prefix='/home/Softwares' ,报错时在加上
make										#生成makefile文件
make install								#编译安装
sudo ldconfig #创建连接

3 vs code 配置C++调用GDAL

关于如下下载vs code 并在linux上配置c++的相关操作可参考:
Linux/Ubuntu中Vs Code配置C++/C环境
测试GDAL代码用例为:

#include <iostream> // 正确地包含iostream头文件
#include <gdal_priv.h>
#include <gdal.h>
#include <ogr_spatialref.h>
#include <ogr_geometry.h>
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std; // 声明使用std命名空间
#define BYTE float            //方便数据类型的修改
int main()
{//tif文件读取GDALAllRegister();  //注册所有的驱动CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");//以防中文名不能正常读取int num_iamge_size = 0;const char*  file_path_name = "/home/fanm/文档/test/2004_mosaic_clip.tif"; GDALDataset *poDataset = (GDALDataset *)GDALOpen(file_path_name, GA_ReadOnly);//GDAL数据集if (poDataset == NULL){std::cout << "指定的文件不能打开!" << std::endl;std::cout << file_path_name << std::endl;return 0;}//获取图像波段GDALRasterBand *poBand1;poBand1 = poDataset->GetRasterBand(1);//获取图像的尺寸int nImgSizeX = poDataset->GetRasterXSize();int nImgSizeY = poDataset->GetRasterYSize();std::cout << "ImageX = " << nImgSizeX << ",	ImageY = " << nImgSizeY << std::endl;//获取坐标变换系数double trans[6];CPLErr aaa = poDataset->GetGeoTransform(trans);//读取图像高程数据BYTE *pafScanblock1;  //开辟缓存区pafScanblock1 = (BYTE *)CPLMalloc(sizeof(BYTE)*(nImgSizeX)*(nImgSizeY));// poBand1->RasterIO(GF_Read, 0, 0, nImgSizeX, nImgSizeY, pafScanblock1, nImgSizeX, nImgSizeY, GDALDataType(poBand1->GetRasterDataType()), 0, 0);CPLErr err = poBand1->RasterIO(GF_Read, 0, 0, nImgSizeX, nImgSizeY, pafScanblock1, nImgSizeX, nImgSizeY, GDALDataType(poBand1->GetRasterDataType()), 0, 0);if (err != CE_None) {std::cerr << "Error reading raster data: " << CPLGetLastErrorMsg() << std::endl;return 1; // 或者根据需要处理错误}std::ofstream out("../输出-坐标点.txt");std::ofstream out_range("../输出-范围坐标点.txt");//放开此段代码,最后一列和最后一行数据不计算经纬高或者XYZnImgSizeX -= 1;nImgSizeY -= 1;double UpLeft_Xgeo = trans[0];double	UpLeft_Ygeo = trans[3];double DownRight_Xgeo = trans[0] + nImgSizeX * trans[1] + nImgSizeY* trans[2];double	DownRight_Ygeo = trans[3] + nImgSizeX * trans[4] + nImgSizeY * trans[5];out_range << std::setprecision(15) << UpLeft_Xgeo << "," << UpLeft_Ygeo << "\n";out_range << std::setprecision(15) << DownRight_Xgeo << "," << UpLeft_Ygeo << "\n";out_range << std::setprecision(15) << DownRight_Xgeo << "," << DownRight_Ygeo << "\n";out_range << std::setprecision(15) << UpLeft_Xgeo << "," << DownRight_Ygeo << "\n";out_range.close();//逐像素遍历,获取Xgeo,Ygeo,elevation(原tif数据是地理坐标系,此处就是经纬度;原tif数据是投影坐标系,此处就是XYZ,单位是米;)std::cout << "总计:" << num_iamge_size << std::endl;out.close();delete poDataset;return 0;
}

值得一提是的,最好通过cmake方式编译代码,用g++方式调用gdal会显示无法定位到其中的函数,
但可以这样调用:

g++ -o your_program your_program.cpp -lgdal -lsqlite3

不过没有cmake方式简单,在程序的目录下新建CMakeLists.txt文件,文件里面输入下面语句,其中my_program是文件名,替换自己的即可

cmake_minimum_required(VERSION 3.10)
project(TEST)
find_package(GDAL REQUIRED)
set(CMAKE_CXX_STANDARD 17)add_executable(my_program my_program.cpp)
target_link_libraries(my_program GDAL::GDAL)

生成构建文件: 在项目目录中,运行以下命令来生成构建文件:

# 注意后面的 点
cmake .

编译项目: 在生成的构建文件夹中,运行以下命令来编译项目:

make

运行程序: 在项目目录中,运行以下命令来运行你的程序:

./my_program

欢迎点赞,收藏,关注,支持小生,打造一个好的遥感领域知识分享专栏。遥感专栏
同时欢迎私信咨询讨论学习,咨询讨论的方向不限于:地物分类/语义分割(如水体,云,建筑物,耕地,冬小麦等各种地物类型的提取),变化检测,夜光遥感数据处理,目标检测,图像处理(几何矫正,辐射矫正(大气校正),图像去噪等),遥感时空融合,定量遥感(土壤盐渍化/水质参数反演/气溶胶反演/森林参数(生物量,植被覆盖度,植被生产力等)/地表温度/地表反射率等反演)以及高光谱数据处理等领域以及深度学习,机器学习等技术算法讨论,以及相关实验指导/论文指导,考研复习等多方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408726.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp在线视频监控开发

我这里是uniapp开发的H5项目 视频流是flv模式 用到的插件是flv.js Flv.js Flv.js 是 HTML5 Flash 视频&#xff08;FLV&#xff09;播放器&#xff0c;纯原生 JavaScript 开发&#xff0c;没有用到 Flash。。由 bilibili 网站开源。 常见直播协议 RTMP: 底层基于TCP&…

安泰ATA-7015高压放大器在机器人测试中的应用研究

随着机器人技术的快速发展&#xff0c;机器人在各个领域的应用日益广泛。然而&#xff0c;要确保机器人能够稳定、准确地完成各种任务&#xff0c;就需要对其进行严格的测试和评估。在机器人测试过程中&#xff0c;高压放大器作为一种关键的测试设备&#xff0c;发挥着不可替代…

基于YOLOv8的无人机高空红外(HIT-UAV)检测算法,魔改SimAM注意力助力涨点(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;针对基于YOLOv8的无人机高空红外&#xff08;HIT-UAV&#xff09;检测算法进行性能提升&#xff0c;加入各个创新点做验证性试验。 1&#xff09;魔改SimAM注意力&#xff0c;引入切片操作&#xff1a;mAP从原始的…

python-随机序列(赛氪OJ)

[题目描述] 小理的作业太多了&#xff0c;怎么也做不完。 小理的数学作业由 T 张试卷组成&#xff0c;每张试卷上有 n 个数 a1..n​ &#xff0c;小理需要算出这些数的极差和方差。极差是一个整数&#xff0c;方差是一个浮点数&#xff0c;要求保留到小数点后 3 位。虽然题目很…

第100+22步 ChatGPT学习:概率校准 Platt Scaling

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

Unet改进3:在不同位置添加NAMAttention注意力机制

本文内容:在不同位置添加NAMAttention注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 识别不太显著的特征是模型压缩的关键。然而,它在革命性的注意机制中尚未得到研究。在这项工作中,我们提出了一种新的基于归一化的注意力模块(NAM),它抑制…

2024/8/25 Nacos本机配置

目录 一、nacos下载 二、修改配置文件 2.1、配置数据库 2.2、配置鉴定密钥 2.3、配置启动脚本 三、nacos启动 3.1、启动运行脚本 3.2、新增配置 3.3、服务列表 记录一下本机nacos2.2.3配置全过程 一、nacos下载 下载地址&#xff1a;https://github.com/alibaba/nacos/r…

【通俗易懂】分库分表时分表字段应该如何选择?

目录 一、按买家ID分还是卖家ID分&#xff1f; 二、卖家查询怎么办&#xff1f; 三、订单查询怎么办&#xff1f; 在分库分表的过程中&#xff0c;我们需要有一个字段用来进行分表&#xff0c;比如按照用户分表、按照时间分表、按照地区分表。这里面的用户、时间、地区就是所…

MYSQL————数据库的约束

1.约束类型 1.not null&#xff1a;指示某列不能存储null值 2.unique&#xff1a;保证某列的每行必须有唯一值 3.default&#xff1a;规定没有给列赋值时的默认值 4.primary key&#xff1a;not null和unique的结合。确保某列&#xff08;或两个或多个列的结合&#xff09;有唯…

游戏开发设计模式之命令模式

目录 命令模式的定义和工作原理 应用场景 实现方式 优点 缺点 结论 命令模式在游戏开发中的具体实现案例是什么&#xff1f; 如何在Unity3D中有效地实现和管理命令模式以提高游戏性能&#xff1f; 命令模式与其他设计模式&#xff08;如观察者模式、状态模式&#xff…

2024前端面试题-js篇

1.js有哪些数据类型 基础数据类型&#xff1a;string,number,boolean&#xff0c;null&#xff0c;undefined&#xff0c;bigInt&#xff0c;symbol 引用数据类型&#xff1a;Object 2.js检测数据类型的方式 typeof&#xff1a;其中数组、对象、null都会被判断为object&…

多动症的孩子有哪些症状表现?

在星启帆自闭症儿童康复机构&#xff0c;我们不仅关注自闭症儿童的成长与康复&#xff0c;也深刻认识到多动症对儿童日常生活、学习和社交的深远影响。多动症&#xff0c;全称注意缺陷多动障碍&#xff0c;是一种常见于儿童时期的神经发育性疾病&#xff0c;其症状表现多种多样…

Python酷库之旅-第三方库Pandas(097)

目录 一、用法精讲 416、pandas.DataFrame.memory_usage方法 416-1、语法 416-2、参数 416-3、功能 416-4、返回值 416-5、说明 416-6、用法 416-6-1、数据准备 416-6-2、代码示例 416-6-3、结果输出 417、pandas.DataFrame.empty属性 417-1、语法 417-2、参数 …

FTP协议-匿名用户登录 从0到1

前言 日常大家可能接触web漏洞比较多而对其他端口及协议不那么了解&#xff0c;其实其他协议漏洞在渗透中也同样重要只是平时可能接触得不多。本文将介绍FTP协议、FTP匿名用户登录及其具体流程分析和自动化利用demo。 FTP简介 FTP是File Transfer Protocol&#xff08;文件传…

google浏览器chrome用户数据(拓展程序,书签等)丢失问题

一、问题背景 我出现这个情况的问题背景是&#xff1a;因为C盘块满了想清理一部分空间&#xff08;具体看这&#xff1a;windows -- C盘清理_c盘softwaredistribution-CSDN博客&#xff09;&#xff0c;于是找到了更改AppDatta这个方法&#xff0c;但因为&#xff0c;当时做迁移…

opencv-python图像增强十五:高级滤镜实现

文章目录 前言二、鲜食滤镜三、巧克力滤镜三&#xff0c;冷艳滤镜&#xff1a; 前言 在之前两个滤镜文章中介绍了六种简单的滤镜实现&#xff0c;它们大多都是由一个单独函数实现的接下来介绍五种结合了之前图像增强文章提的的算法的复合滤镜。本案例中的算法来自于文章一&…

qt-PLC可视化编辑器

qt-PLC可视化编辑器 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "diagramitem.h" #include "arrow.h"#include <QDebug> #include <QGraphicsScene> #include <QGraphicsSceneContextMenuEvent> #includ…

[000-01-018].第3节:Linux环境下ElasticSearch环境搭建

我的后端学习笔记大纲 我的ElasticSearch学习大纲 1.Linux系统搭建ES环境&#xff1a; 1.1.单机版&#xff1a; a.安装ES-7.8版本 1.下载ES: 2.上传与解压&#xff1a;将下载的tar包上传到服务器software目录下&#xff0c;然后解压缩&#xff1a;tar -zxvf elasticsearch-7…

人工智能算法工程师(中级)课程21-深度学习中各种优化器算法的应用与实践、代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程21-深度学习中各种优化器算法的应用与实践、代码详解。本文将介绍PyTorch框架下的几种优化器&#xff0c;展示如何使用PyTorch中的优化器&#xff0c;我们将使用MNIST数据集和一个简单…

增材制造(3D打印):为何备受制造业瞩目?

在科技浪潮的推动下&#xff0c;增材制造——即3D打印技术&#xff0c;正逐步成为制造业领域的璀璨新星&#xff0c;吸引了航空航天、汽车、家电、电子等众多行业的目光。那么&#xff0c;是什么让3D打印技术如此引人注目并广泛应用于制造领域&#xff1f;其背后的核心优势又是…