Ubuntu基于Docker快速配置GDAL的Python、C++环境-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

  本文介绍在LinuxUbuntu操作系统中基于Docker快速配置PythonC++2种不同编程语言可用的地理数据处理库GDAL开发环境的方法。

  本文就将PythonC++2种不同编程语言的GDAL模块配置方法分开来介绍大家依据自己的需求来选择即可——但无论是哪种方法配置GDAL模块的方法都非常简单终端中输入几句代码就完成了。和我们之前在Windows系统中配置GDAL模块的文章Visual Studio配置并编译C++环境下GDAL库、SQLite环境与PROJ库的方法https://blog.csdn.net/zhebushibiaoshifu/article/details/127088090比起来真的是方便了很多。

1 Python版本

  首先我们访问GDAL库的Docker镜像官方网站https://github.com/OSGeo/gdal/tree/master/docker。这里需要注意虽然这个官方网站似乎并没有明确说明它提供的版本只能Python使用但是我这里下载后发现C++ 代码确实无法调用这个镜像中的GDAL模块。

  其中官方网站提供了AlpineUbuntu两种不同系统的Docker镜像并且对于不同的系统版本其还提供了SmallFull两种不同的镜像内容其中前者包含的内容相对较少而后者包含的内容较为齐全因此后者的镜像大小也就更大一些而这两种镜像自身都是包含Python3.8或以上版本的。此外关于SmallFull两种不同镜像的具体详细内容差异我们这里就不再赘述了大家在其官方网站查阅即可具体如下图所示。

  在我这里由于只是需要用GDAL库完成一些读取.tif格式文件的操作所以并不需要特别完整的GDAL库所以就选择了Small这个小一点的版本。

  接下来我们在Ubuntu电脑的终端中执行如下的代码。这里需要注意由于我需要的是Ubuntu系统的Small版本所以我就输入如下的代码即可如果大家使用的是Alpine操作系统或者是Ubuntu系统的Full版本那么按照上图中自己所需要的版本对应的名称修改下述代码并执行即可。

docker pull ghcr.io/osgeo/gdal:ubuntu-small-latest

  运行上述代码如下图所示。

  稍等片刻我们就完成了镜像的获取。此时我们可以通过如下的代码查看当前电脑中Docker镜像的下载情况也就是看看我们已经有了哪些镜像。

docker images

  运行上述代码如下图所示。

  其中那个ghcr.io/osgeo/gdal就是我们刚刚下载好的GDAL库的镜像。

  接下来运行如下的代码从而基于刚刚下载好的镜像运行一个容器。

docker run -it --rm ghcr.io/osgeo/gdal:ubuntu-small-latest

  其中docker run是运行容器的命令-it表示以交互模式运行容器并分配一个终端--rm表示在容器停止后自动删除容器如果大家在使用容器后不想让它自动删除就将这里的--rm去掉即可如果大家是第一次接触Docker那么建议带上这个--rm防止自己摸索过程中不知不觉建立了好多个无用的容器到时候还要手动一个一个删除后面的就是我们刚刚下载好的镜像表示我们要基于这个镜像去运行一个容器。运行上述代码如下图所示。

  接下来我们就进入了容器。此时继续输入如下的代码查看当前容器中GDAL库的版本信息。

gdalinfo --version

  运行上述代码如下图所示。可以看到此时将打印出我们GDAL库的版本信息。

  接下来我们先通过如下的代码退出当前镜像回到终端中。

exit

  运行上述代码如下图所示。

  我们既然配置了一个GDAL库的Docker镜像那么后续肯定是需要将一些我们自己电脑中的文件比如栅格图像、矢量数据等文件带入到这个镜像的容器中去运行所以肯定需要这个GDAL库的Docker镜像要和我们Ubuntu电脑中文件可以交互换句话说也就是可以读取、修改我们电脑中的文件与数据。因此我们在之后进入我们这个GDAL库的Docker镜像的容器时需要通过如下的代码。

docker run -it --rm -v /home/dell/cppGDAL:/home/dell/cppGDAL ghcr.io/osgeo/gdal:ubuntu-small-latest

  上述代码和我们前面的docker run -it --rm ghcr.io/osgeo/gdal:ubuntu-small-latest相比很显然是多了-v /home/dell/cppGDAL:/home/dell/cppGDAL这一个部分——这一部分是用于挂载主机文件系统中的目录容器中的命令参数。其中-vDocker命令中用于挂载文件或目录的选项其后面的/home/dell/cppGDAL:/home/dell/cppGDAL则是文件挂载的源目录和目标目录的路径——它指定了主机文件系统中的/home/dell/cppGDAL目录将被挂载到容器内的/home/dell/cppGDAL目录。

  这里多提一句我们这里是将主机中的一个指定文件路径挂载到了容器中所以属于Docker中的Bind mounts如果我们这里是手动创建了一个Volume然后挂载到容器中那么就叫做Volume此外还有一种叫做tmpfs mounts是把容器的数据写入主机的内存中——上述的Bind mountsVolumetmpfs mounts3种都是Docker用以数据管理、数据记忆的方式。

  回到前述的代码。换句话说上述命令将我的Ubuntu电脑中的/home/dell/cppGDAL目录与GDAL库的Docker镜像的容器中的/home/dell/cppGDAL目录进行了挂载。这样在容器中对挂载点/home/dell/cppGDAL的操作将反映在主机系统的/home/dell/cppGDAL目录上反之亦然。

  相当于通过这种方式只要我将我需要用GDAL库处理的数据、代码等文件都放在电脑的/home/dell/cppGDAL目录下那么就可以在容器中对这些数据加以访问和处理。这样即实现了文件的交互同样可以保证容器不会访问我们电脑中其他文件夹内的数据或者文件保证了数据的安全。

  如果大家还是没有明白这句代码的意义不着急我们先运行上述代码如下图所示。

  上图中运行完代码我又不小心多运行了一句pwd代码大家理解即可。

  为了更清晰地看到前述那一种进入容器的代码的意义我们做一个如下的对比。如下图所示这是我们用了那一句包含挂载文件夹命令的代码进入我们的容器后执行的操作可以看到此时在容器中我们就可以进入/home/dell/cppGDAL目录下。

  而如果我们并没有挂载文件而是用了本文中第一次出现的那一句代码进入容器的代码也就是前面的docker run -it --rm ghcr.io/osgeo/gdal:ubuntu-small-latest代码进入容器后会发现cd进入home文件夹后再ls是看不到我们这个cppGDAL文件夹的换句话说此时我们就没有办法在容器内部读取我们电脑里/home/dell/cppGDAL目录下的文件了——连文件、数据都无法获取那么这个GDAL镜像肯定也是没有用处的了。

  此外前面我们还提到-v /home/dell/cppGDAL:/home/dell/cppGDAL这一个部分可以保证镜像可以且仅可以读取/home/dell/cppGDAL目录下的文件而不会读取到我们没有挂载的其他文件夹。针对这一个内容我们再做一个对比。如下图所示是我们直接在Ubuntu电脑的终端中进入/home/dell目录的情况可以很明显地看到在电脑中的/home/dell目录下不仅有我们的这个cppGDAL文件夹还有很多很多其他的文件或者文件夹而在上上图中可以看到在容器中我们进入/home/dell/cppGDAL目录下只能看到这个cppGDAL文件夹而看不到电脑中这一路径下原本还有的其他文件或者文件夹。所以很明显相当于我们就是可以在镜像中访问/home/dell/cppGDAL目录但是无法访问没有挂载的其他文件夹从而保证了其他无关文件夹的安全性。

  明白了上述内容就可以开始我们的GDAL操作了。例如我这里在/home/dell/cppGDAL目录下还有一个名称为TIF的文件夹其中保存了一景遥感影像那么我就可以通过gdalinfo语句查看这一栅格数据的信息。如下图所示。

  最后每一次完成镜像中的操作后不要忘记通过exit命令退出镜像。

  因为我这里是需要C++ 版本的GDAL模块所以后来也就没有对上述Python版本的再加以代码测试但经过上述配置运行Python代码的GDAL程序应该是没有问题了。

2 C++版本

  接下来我们介绍配置C++ 版本的GDAL模块的方法。

  由于GDAL官方似乎并未提供直接的C++ 版本镜像所以我们这里就自己创建一个Docker镜像随后在其中配置GDAL模块。这里需要注意如果大家刚刚根据前文的流程先配置了一个Python语言的GDAL模块的镜像那么建议大家在另一个新的镜像内重新配置C++ 版本的不要直接在前面的Python语言镜像中配置GDAL模块——因为官网说在前面这个Python语言的GDAL模块的镜像内配置其他版本的GDAL模块会容易由于GDAL模块的版本冲突导致容器无法工作虽然我当时简单尝试了一下发现即使如此容器似乎还是可以正常工作的。

  我们这里就在一个新的Ubuntu镜像中加以配置。首先在终端中输入如下代码创建一个Ubuntu镜像。

docker pull ubuntu

  运行上述代码如下图所示。

  接下来我们用前文提到的这一句代码运行一个容器。这里我就不再用--rm了从而使得我们这个容器之后可以多次重复使用。

docker run -it -v /home/dell/cppGDAL:/home/cppGDAL ubuntu:latest

  运行上述代码如下图所示。

  接下来因为我们这个容器是基于一个空白的Ubuntu镜像创建的很多执行GDALC++ 代码所需的配置都没有处理我们需要配置一下基本的环境。

  首先通过如下代码更新软件包列表

apt update

  运行上述代码如下图所示。

  随后输入如下的代码配置GDAL模块的C++ 库。其中libpq-devPostgreSQL数据库的开发库包含了开发PostgreSQL应用程序所需的头文件和静态库gdal-binGDAL的二进制工具包提供了一些用于处理地理空间数据的工具如转换、裁剪等libgdal-devGDAL的开发库包含了开发GDAL应用程序所需的头文件和静态库。

apt install libpq-dev gdal-bin libgdal-dev

  运行上述代码如下图所示。

  稍等片刻中间有一个环节需要我们根据自己所在位置加以选择从而配置自己的时区如下图所示。

  完成配置后通过如下的代码查看GDAL库的版本。

gdalinfo --version

  运行上述代码如下图所示。

  接下来我们再按照文章Linux Ubuntu命令行快速配置C++开发环境https://blog.csdn.net/zhebushibiaoshifu/article/details/133006231介绍的方法配置UbuntuC++ 代码开发环境这里就不再赘述了。

  随后我们就可以在Docker中执行一个简单的C++ 程序来验证这个GDAL库的配置是否成功。其中我们因为已经挂载了文件夹所以既可以在主机中通过其他编辑器来撰写这个C++ 代码也可以在容器中通过Vim来撰写。但无论怎么撰写都要记得将这个代码文件也就是.cpp格式的文件放在已经挂载了的文件路径内。

  这个简单的C++ 代码如下其含义就是从我们已经挂载了的主机的一个文件夹中读取一景栅格影像获取并打印其像元的行数与列数。

#include <iostream>
#include <gdal/gdal.h>
#include <gdal/gdal_priv.h>
using namespace std;

int main() {
    const char* image_path = "/home/cppGDAL/TIF/LAI_A2000057_h30v05.tif";
    GDALAllRegister();
    GDALDataset* dataset = (GDALDataset*)GDALOpen(image_path, GA_ReadOnly);
    if (dataset != nullptr)
    {
        int rows = dataset->GetRasterYSize();
        int cols = dataset->GetRasterXSize();

        printf("Rows: %d\n", rows);
        printf("Cols: %d\n", cols);

        GDALClose(dataset);
    }
    return 0;
}

  随后在容器内的上述代码文件目录下执行如下的代码。

g++ `gdal-config --cflags` rec.cpp  `gdal-config --libs` `gdal-config --dep-libs` -o test

  其中g++GNU C++ 编译器的命令用于编译和链接C++ 代码。gdal-config --cflags表示使用gdal-config命令获取GDAL库的编译选项包括头文件路径和其他必要的编译标志--cflags参数告诉gdal-config命令返回编译选项。rec.cpp是要编译的C++ 源文件的文件名也就是前面我们写的代码文件的文件名称。

  其次gdal-config --libs使用gdal-config命令来获取GDAL库的链接选项包括库文件路径和其他必要的链接标志--libs参数告诉gdal-config命令返回链接选项。gdal-config --dep-libs使gdal-config命令来获取GDAL库所依赖的其他库的链接选项--dep-libs参数告诉gdal-config命令返回依赖库的链接选项。

  最后-o test是编译器选项用于指定生成的可执行文件的名称为test-o选项后跟着要生成的可执行文件的名称。

  完成上述步骤在当前目录下就会有一个可执行文件名称为test。我们执行如下的代码就可以执行这个可执行文件

./test

  运行上述代码如下图所示。

  可以看到已经可以打印出这一景遥感影像的像元行数与列数了。

  至此大功告成。

欢迎关注疯狂学习GIS

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6