🐶

DockerでPythonにてGDALを利用する

2023/02/14に公開

概要

自分の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

Dockerfile
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"]

docker-compose.yaml
version: "2"
services:
  test:
    container_name: "test"
    build:
      context: ./app
    volumes:
      - ./app:/app

テスト

テストコードは以下の通り。

test.py
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版で十分だと思います。

参考

Discussion