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

2024-08-26 13:04

本文主要是介绍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

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

这篇关于linux(Ubuntu )搭C++ 最新版GDAL完整教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108643

相关文章

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H