本文介绍在Linux的Ubuntu操作系统中,基于Docker快速配置Python、C++等不同编程语言均可用的地理数据处理库GDAL
的方法。
首先,我们访问GDAL
库的Docker镜像官方网站(https://github.com/OSGeo/gdal/tree/master/docker)。其中,官方网站提供了Alpine和Ubuntu两种不同系统的Docker镜像;并且对于不同的系统版本,其还提供了Small和Full两种不同的镜像内容,其中前者包含的内容相对较少,而后者包含的内容较为齐全(因此后者的镜像大小也就更大一些),关于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
表示在容器停止后自动删除容器;后面的就是我们刚刚下载好的镜像,表示我们要基于这个镜像去运行一个容器。运行上述代码,如下图所示。
接下来,我们就进入了容器。此时,继续输入如下的代码,查看当前容器中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
目录。
换句话说,上述命令将我的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
命令,退出镜像。
至此,大功告成。
欢迎关注:疯狂学习GIS