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.mzph.cn/diannao/52488.shtml

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

相关文章

自适应学习率(Datawhale X 李宏毅苹果书 AI夏令营)

传统的梯度下降方法在优化过程中常常面临学习率设置不当的问题。固定的学习率在训练初期可能过大&#xff0c;导致模型训练不稳定&#xff0c;而在后期可能过小&#xff0c;导致训练速度缓慢。为了克服这些问题&#xff0c;自适应学习率方法应运而生。这些方法通过动态调整学习…

ssrf漏洞之——漏洞复现

漏洞介绍 SSRF漏洞&#xff1a;SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由恶意访问者构造url&#xff0c;由服务端对此url发起请求的一个安全漏洞。 漏洞原理 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&#xff0c;并且没有对目…

工业4G路由器

设备概述 路由器是基于4G 技术研发的无线路由网关设备&#xff0c;除了具备传统路由器 的 VPN 、防火墙、 NAT 、 PPPoE 、 DHCP 等功能之外&#xff0c;还能支持 4G 无线拨号&#xff0c;提供最高可达 150Mbps 的无线高速带宽。路由器支持四个以太网接口&#xff0c;可更好…

谷歌、火狐及Edge等浏览器中实现allWebPlugin中间件自动安装及升级

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

【Kotlin设计模式】Kotlin实现单例模式

前言 单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。在 Android 中&#xff0c;有许多系统服务和 API 使用了单例模式&#xff0c;比如&#xff1a; Context: 通过getApplication…

Mora:多智能体框架实现通用视频生成

人工智能咨询培训老师叶梓 转载标明出处 尽管已有一些模型能够生成视频&#xff0c;但大多数模型在生成超过10秒的长视频方面存在局限。Sora模型的出现标志着视频生成能力的一个新时代&#xff0c;它不仅能够根据文本提示生成长达一分钟的详细视频&#xff0c;而且在编辑、连接…

Image Stride(内存图像行跨度)

When a video image is stored in memory, the memory buffer might contain extra padding bytes after each row of pixels. The padding bytes affect how the image is store in memory, but do not affect how the image is displayed. 当视频图像存储在内存时&#xff0…

【USRP】 Link 16 战术数据链 实训系统

Link 16 战术数据链 实训系统 一、基于USRP的Link16平台简介1、整体架构2、JTIDS终端架构3、平台特点3.1、提高技术理解与应用能力3.2、培养创新思维与问题解决能力3.3、加强跨学科融合与团队合作 4、平台建设4.1、基础理论教学模块4.2、LabVIEW 算法模块4.3、USRP仿真模块4.4、…

Unity+Addressable

前期准备 下载一个hfs本地服务器&#xff0c;打开即可 HFS ~ HTTP 文件服务器 (rejetto.com) 1.安装Addressable插件 创建组 2.使用图片创建预制体 放入Addressable Groups内 3.右键 新建组 创建预制体t拖拽放入新建组里 新组命名为Gameobject 简化名称 4.创建一个测试脚本 …

点亮编程之路:如何克服学习中的挫折感

目录 引言 一、心态调整 A. 保持积极乐观的学习态度 1. 接受错误和失败 2. 专注于过程而非结果 3. 设定合理的目标和期望 B. 培养持续学习的习惯 1. 制定学习计划 2. 定期反思和总结 3. 寻找学习的乐趣 二、学习方法 A. 有效的学习策略 1. 分解复杂问题 2. 主动实践…

jmeter中CSV 数据文件设置用例

1、CSV数据文件的基础使用 线程组->添加->配置远近->CSV数据文件设置 2、多条用例运行CSV数据文件 由于我的csv请求的json数据有“&#xff0c;”所以我这边 分隔符选择了*号 写了两行需要测试的用例&#xff0c;需要添加一个“循环控制器” 线程组->添加-&g…

内存管理篇-09伙伴系统初始化一:memblock管理

1.伙伴系统的初始化概述 硬件初始化&#xff1a;计算机加电后进行硬件检测。加载引导程序&#xff0c;将Linux内核加载到内存中。 内核初始化&#xff1a;内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。 内存管理初始化&…

Oracle开始严查Java许可!

0x01、 前段时间在论坛里就看到一个新闻&#xff0c;说“Oracle又再次对Java下手&#xff0c;开始严查Java许可&#xff0c;有企业连夜删除JDK”&#xff0c;当时就曾在网上引起了一阵关注和讨论。 这不最近在科技圈又看到有媒体报道&#xff0c;Oracle再次严查&#xff0c;对…

C语言典型例题51

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.3 while循环与do……while循环的比较 代码&#xff1a; &#xff08;1&#xff09;while语句 #include <stdio.h> int main() {int sum0;// char ch;while(1){sum0;//每一次输入结束后数的和重置int …

GDB的基本使用(1)

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…

dubbo:dubbo+zookeeper整合nginx实现网关(四)

文章目录 0. 引言1. nginx简介2. 集成nginx2.1 负载均衡实现 3. 源码4. 总结 0. 引言 我们之前讲解过dubbozookeeper实现服务调用和注册中心&#xff0c;但是还缺乏一个统一的入口&#xff0c;即网关服务。dubbozookeeper的模式更加适合的网关组件为nginx&#xff0c;所以今天…

SQLserver中的触发器和存储过程

在 SQL Server 中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它在指定的数据库表上发生特定的数据修改事件时自动执行。触发器可以用于执行各种任务&#xff0c;如数据验证、数据审计、自动更新相关表等。 触发器的类型 SQL Server 支持以下几种类型的触发器&#x…

如何使用ssm实现开放式教学评价管理系统+vue

TOC ssm121开放式教学评价管理系统vue 第1章 绪论 1.1 背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于开放式教学评价管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如个人中心、教师管理、学生管理、游客管理、评价信息管理、综合评…

XSS- - - DOM 破坏案例与靶场

目录 链接靶场&#xff1a; 第一关 Ma Spaghet 第二关 Jefff 第三关 Ugandan Knuckles 第四关 Ricardo Milos 第五关 Ah Thats Hawt 第六关 Ligma 第七关 Mafia 第八关 Ok, Boomer 链接靶场&#xff1a; XS…

在DDD中应用模式

深层模型和柔性设计并非唾手可得。要想取得进展&#xff0c;必须学习大量领域知识并进行充分的讨论&#xff0c;还需要经历大量的尝试和失败。但有时我们也能从中获得一些优势。一位经验丰富的开发人员在研究领域问题时&#xff0c;如果发现了他所熟悉的某种职责或某个关系网&a…