DockerでPythonにてGDALを利用する
概要
自分のqiitaの記事をこちらに転記。少し古い記事なので注意。
geotiffを利用する際に、少しハマったので、備忘録。
結論から言うと、Pyhonにおける「GDAL」ライブラリと「libgdal-dev」のバージョン対応が間違っていたことが原因でした。
apt標準リポジトリにおいて管理される安定版「libgdal-dev」はv2.4.0です(2020年11月19日現在)。これにより、pipにて単純に「pip install GDAL」とするとv3.2.0がダウンロードされますが、v3.2.0に対応する「libgdal-dev」はv3.2.0以上必要です。そのため、インストールする際は「pip install GDAL==2.4.4」とし、バージョン指定する必要があります。「no module named _gdal_array」が出たため、修正。「pip install GDAL==$(gdal-config --version) --global-option=build_ext --global-option="-I/usr/include/gdal"」としないと、gdal_arrayが上手く入らない様子。
この辺りを踏まえたdockerfileなどを以下に記載します。
前提条件
ここでは、以下のことを考えています。
- dockerを利用し、環境を使いまわせるようにする。
- あまりanacondaは好きじゃない
- Pythonを利用するのは、学習コストが低いため
- docker-composeはあくまで動作テスト用に記載
- コード変更がきくようにボリュームを設定
- とくにこだわらないので、ベースイメージは「python:3.8」(多分OSはDebian)
構造
/
|-/app
| |-/image # tifファイルを入れる
| |-test.py # テストコード
| '-Dockerfile
'-docker-compose.yaml
Dockerfile/docker-compose.yaml
FROM python:3.8
ENV APP_HOME /app
WORKDIR $APP_HOME
RUN apt-get update && apt-get install -y tzdata \
libgdal-dev
RUN pip install --upgrade pip
RUN pip install GDAL==$(gdal-config --version) --global-option=build_ext --global-option="-I/usr/include/gdal"
CMD ["python", "/app/test.py"]
version: "2"
services:
test:
container_name: "test"
build:
context: ./app
volumes:
- ./app:/app
テスト
テストコードは以下の通り。
from osgeo import gdal, gdalconst
if __name__ == "__main__":
print("gdal version", gdal.VersionInfo())
file_name = '/app/image/1_index_ndvi.tif'
src = gdal.Open(file_name,
gdalconst.GA_ReadOnly) # tifの読み込み (read only)
print(type(src)) # "osgeo.gdal.Dataset"
実行は、docker-composeを使用しているので、以下の通り。
docker-compose up
おわりに
結構こういうことってよくありますね。ライブラリの最新バージョンを利用する場合は、debianだとパッケージがなかったりするので、ubuntuで環境構築する必要があったりしますし(ubuntuだとリポジトリ登録すればtestバージョン利用できることが多いイメージ)。基本的にある程度データが読める状態にさえなってくれれば、あとは自分で数値処理した方が早いので、stable版で十分だと思います。
参考
- Import error: no module named _gdal_array:https://gis.stackexchange.com/questions/153199/import-error-no-module-named-gdal-array
Discussion