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

相关文章

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造