pyproj を Jetson/RasPiにインストール


Docker でpyprojの新しいの(ver2.1以上)を Jetson Nanoのdocker build でインストールするのにハマったのでメモします。
pyproj は測地系の変換をするのに使用できる、とても便利なツールです。
(cf.) 過去の自分の投稿
- 【python】WGS84から平面直角座標系への変換

背景

何に困ったか

今まで pip3 する requirementx.txt にpyproj==2.6.1.post1 を書いて使っていました。ノートPCのWSL1 (ubuntu18.04)や Google Cloud Platform のCI/CDのDocker image (ubuntu18.04 base)で動いていました。同じことを Jetson Nano (Jetpak4.4? ubuntu18.04)や raspberry pi4 の docker で行おうとしましたが、CPUがARMv8と異なるせいか、このrequirements.txt では動きませんでした。

PROJ のversion

pyproj の安定板は、現在(2020/10/07)では 2.6.1 のようです。
http://pyproj4.github.io/pyproj/stable/

ここにあるように、PROJは6.2.0以上のものをインストールしておく必要があります。問題は、pyproj が使用するPROJ というライブラリの新しいものをインストールできていないことありました。
(cf.) PROJ (https://proj.org/)

PROJとlibproj.a だけをインストールするだけなら、以下で入ります。
実際に、本家のインストールの説明に書かれています。

$ sudo apt install proj-bin
$ sudo apt install libproj-dev

しかし、これを実行しても古いものしか入らないのが問題。

$ proj
Rel. 4.9.3, 15 August 2016
usage: proj [ -bCeEfiIlormsStTvVwW [args] ] [ +opts[=arg] ] [ files ]

$  ldd `which proj` | grep libproj
        libproj.so.12 => /usr/lib/x86_64-linux-gnu/libproj.so.12 (0x00007f2adad70000)

この状態でも pyproj == 1.9.6 とpyprojも古いものにすれば、pip3 install できました。しかし、自分の書いたコードは pyproj >= 2.1 のAPIを利用していました。コードを書き換えたくないので、頑張ってpyproj をインストールすることにしました。

インストール方法

結局、PROJ の最新版をソースからbuild して install して、そのあとにpip3 すれば pyproj==2.6.1.post1 が入りました。この PROJ のインストールですが、割とはまりました。

PROJのインストール

ポイントは、
- PROJに必要なライブラリをビルド前にインストールする
- libproj.a は /usr/local/lib にinstall されるので、ここをLD_LIBRARY_PATH に含めておくこと。自分の環境では、この変数は空だった。

$ apt install -y \
  zlib1g-dev libsqlite3-dev pkg-config sqlite3 libcurl4-gnutls-dev libtiff5-dev 
$ wget https://download.osgeo.org/proj/proj-7.1.1.tar.gz
$ tar zxvf proj-7.1.1.tar.gz
# cd proj-7.1.1 && ./configure && make && make install
$ export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH

無事に新しいのが入ったぞ。

$ proj
Rel. 7.0.1, May 1st, 2020
usage: proj [-bdeEfiIlmorsStTvVwW [args]] [+opt[=arg] ...] [file ...]
$ ldd `which proj` | grep libproj
        libproj.so.19 => /usr/local/lib/libproj.so.19 (0x0000007fad95b000)

pyproj のインストール

pip3を実行すると分かりますが、PROJ_DIR という環境変数の設定が必要です。私は以下でOKでした。$PROJ_DIR/lib/libproj.a$PROJ_DIR/bin/proj を参照しているようでした。

$ export PROJ_DIR=/usr/local/
$ pip3 install pyproj==2.6.1.post1

この内容をDockerfile に書き、無事にdocker build できました。docker build には時間がかかりました。ソースからbuild は大変だ。

後で気が付いたきっと楽かもしれない方法

PROJ のビルドや pyprojのインストールには依存関係にいろいろはまりましたが、pyprojのソースにある Dockerfile を参考にすればよかったかも。じつはdocker で配布するのが今どきなのか?

https://github.com/OSGeo/PROJ/blob/master/Dockerfile には以下のようにあります。

pyproj もgithubからcloneして直接にビルドしてみる?(https://github.com/pyproj4/pyproj)

おわり

というわけで、無事に目的(ARMv8 での docker build/runで pyproj を利用)はできました。特にTODOはないですが、きっと将来 apt や pip で簡単に入るようになる幸せな世の中になっているに違いない、、、、と思います。他力本願ですみませんが、とりあえず今日はここまでです。