1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

DockerでPythonにてGDALを利用する

概要

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?