在前面的文章中主要是介绍如何在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的版本:
注意目前关于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");
//放开此段代码,最后一列和最后一行数据不计算经纬高或者XYZ
nImgSizeX -= 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
欢迎点赞,收藏,关注,支持小生,打造一个好的遥感领域知识分享专栏。遥感专栏
同时欢迎私信咨询讨论学习,咨询讨论的方向不限于:地物分类/语义分割(如水体,云,建筑物,耕地,冬小麦等各种地物类型的提取),变化检测,夜光遥感数据处理,目标检测,图像处理(几何矫正,辐射矫正(大气校正),图像去噪等),遥感时空融合,定量遥感(土壤盐渍化/水质参数反演/气溶胶反演/森林参数(生物量,植被覆盖度,植被生产力等)/地表温度/地表反射率等反演)以及高光谱数据处理等领域以及深度学习,机器学习等技术算法讨论,以及相关实验指导/论文指导,考研复习等多方面。