Linux Ubuntu配置Python、C++下属GDAL环境的Docker镜像
off999 2024-10-14 12:05 38 浏览 0 评论
??本文介绍在Linux的Ubuntu操作系统中,基于Docker快速配置Python与C++这2种不同编程语言可用的地理数据处理库GDAL开发环境的方法。
??本文就将Python与C++这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模块。
??其中,官方网站提供了Alpine和Ubuntu两种不同系统的Docker镜像;并且对于不同的系统版本,其还提供了Small和Full两种不同的镜像内容,其中前者包含的内容相对较少,而后者包含的内容较为齐全(因此后者的镜像大小也就更大一些),而这两种镜像自身都是包含Python的3.8或以上版本的。此外,关于Small和Full两种不同镜像的具体详细内容差异,我们这里就不再赘述了,大家在其官方网站查阅即可;具体如下图所示。
??在我这里,由于只是需要用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这一个部分——这一部分是用于挂载主机文件系统中的目录到容器中的命令参数。其中,-v是Docker命令中用于挂载文件或目录的选项,其后面的/home/dell/cppGDAL:/home/dell/cppGDAL,则是文件挂载的源目录和目标目录的路径——它指定了主机文件系统中的/home/dell/cppGDAL目录将被挂载到容器内的/home/dell/cppGDAL目录。
??这里多提一句,我们这里是将主机中的一个指定文件路径挂载到了容器中,所以属于Docker中的Bind mounts;如果我们这里是手动创建了一个Volume,然后挂载到容器中,那么就叫做Volume;此外还有一种叫做tmpfs mounts,是把容器的数据写入主机的内存中——上述的Bind mounts、Volume与tmpfs mounts,这3种都是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镜像创建的,很多执行GDAL的C++代码所需的配置都没有处理,我们需要配置一下基本的环境。
??首先,通过如下代码更新软件包列表。
apt update??运行上述代码,如下图所示。
??随后,输入如下的代码,配置GDAL模块的C++库。其中,libpq-dev是PostgreSQL数据库的开发库,包含了开发PostgreSQL应用程序所需的头文件和静态库;gdal-bin是GDAL的二进制工具包,提供了一些用于处理地理空间数据的工具,如转换、裁剪等;libgdal-dev是GDAL的开发库,包含了开发GDAL应用程序所需的头文件和静态库。
apt install libpq-dev gdal-bin libgdal-dev??运行上述代码,如下图所示。
??稍等片刻,中间有一个环节需要我们根据自己所在位置加以选择,从而配置自己的时区;如下图所示。
??完成配置后,通过如下的代码查看GDAL库的版本。
gdalinfo --version??运行上述代码,如下图所示。
??接下来,我们再按照文章Linux Ubuntu命令行快速配置C++开发环境(https://blog.csdn.net/zhebushibiaoshifu/article/details/133006231)介绍的方法,配置Ubuntu的C++代码开发环境,这里就不再赘述了。
??随后,我们就可以在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
相关推荐
-
- 内存清理大师(内存清理大师V1.2.6官方版)
-
1、打开手机清理大师应用APP2、点击扫描垃圾3、在弹出来的窗口点击清理垃圾4、最后即可清理完成在手机中设置里的通用里储存空间与iCloud进行清除。操作方法点开设置->通用->储存空间与iCloud用量点击储存空间-...
-
2026-01-23 17:03 off999
- 登录器下载安装(云端辅助登录器下载安装)
-
有其他的程序正在使用中,你电脑重新启动一次再删除dlq试试,或者把其他的程序都关了然后再重新安装一次再删除.祝你好运!!!!!!!!!!!!1国服的下载很简单,和当年CF、逆战的方式一样,我们直接...
-
- 下载拼音打字输入法(下载拼音汉字输入法)
-
你下载百度手机输入法,默认的就是双拼,可以自己选择26键拼音输入、右键单击桌面右下角的搜狗输入法工具条,将鼠标移到“软键盘”上,然后选择“拼音字母”即可使用这个功能。输入法使用技巧:1、输入法一般支持符号输入,可以右键单击候选框,之后点击“...
-
2026-01-23 16:43 off999
- 彩铃定制(彩铃定制流程)
-
演示品牌型号:联想拯救者R720;系统:Windows10;软件:Chrome88.0。1、用浏览器搜索定制手机彩铃,点击移动官网,进入后点击左上角登录,账户就是自己的手机号,密码就是在营业厅办理需要...
- 同他聊交友软件(他聊软件吗)
-
好他聊app一款优质便捷的单身男女在线互动交友平台,来他聊app遇见更多有趣有料的小伙伴,支持语音通话视频互动,更可以每日分享生活动态。他聊app你可以通过文字、语音、视频等多种方式与同城附近异性聊天...
- 360官方(360官方正版免费下载安装)
-
https://yunpan.360.cn/360云盘是奇虎360科技的分享式云存储服务产品。为广大普通网民提供了存储容量大、免费、安全、便携、稳定的跨平台文件存储、备份、传递和共享服务。360云盘是...
-
- 漫画全免费的看漫画软件下载
-
要是看动漫的话可以用迅雷看看或者PPTV,但是漫画的话4399小游戏里面就有漫画有漫画岛、漫画大全、爱漫画、腾讯动漫、大角虫、快看漫画、布卡漫画和微信读书。1、漫画岛:是一款适用于手机的热门漫画阅读软件。最全的二次元看漫画神器。分安卓版和...
-
2026-01-23 15:43 off999
- 服务器品牌前十大排名(国产服务器品牌前十大排名)
-
品牌排名企业1.Dell戴尔2.Hewlett-Packard惠普3.IBMIBM4.NetApp美国网比较安全系统5.Hitachi日立6.Or...
- mp3在线剪辑工具免费(mp3在线剪切软件下载)
-
风云音频处理大师风云音频处理大师是一款相当出色的专业化音频处理软件。小编使用比较多的也是风云音频处理大师,它的功能全面,能够帮助用户快速上手音频剪辑,还可以对音频的噪音进行降噪处理,对音频进行调速、拼...
- photoshop怎么抠图(ps怎么抠出想要的部分)
-
首先用ps打开要抠的图片,然后鼠标点击菜单栏:选择-色彩范围2,吸管吸取要抠的水,这里要慢慢调节,选择水的最佳位置。选取后,鼠标点击确定3,这时候抠水的部分就被选中,我们就按键盘上的ctrl+j复制,...
- 中国电信测速平台(中国电信测速平台有哪些)
-
山东省电信测速网站的网址是http://10000.sd.cn/。这个网站可以测试山东电信宽带的网速,方便用户了解自己的网络状况。下载电信的宽带助手就可以,给你个网址链接http://gd.189.c...
- 12306列车时刻表查询最新(下载火车时刻表查询最新时刻表)
-
、铁路12306app查询打开手机12306软件,进到首页后,点击下方“我的”,点击左上方头像位置,进入登录/注册页面后,登录12306账号,进到首页面后,点击下方的“订单”,点击“本人车票”,就能看...
- 宇宙战舰类游戏(宇宙战舰类游戏排行榜)
-
亚顿之矛,可以帮星灵度过最危难的时刻船内休眠着一整支圣堂武士部队,74千米的长度内安置着一颗人造(星灵制造)恒星。
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
linux软件(linux软件图标)
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
