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

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

# 背景

### 何に困ったか

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

### PROJ のversion

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/7e1fa45c-0626-2155-4625-df29a1cf04b6.png)

ここにあるように、PROJは6.2.0以上のものをインストールしておく必要があります。問題は、pyproj が使用するPROJ というライブラリの新しいものをインストールできていないことありました。
(cf.) [PROJ (https://proj.org/)](https://proj.orig/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/6846ce7b-32c1-8cf5-ee61-e0a448235bc6.png)

PROJとlibproj.a だけをインストールするだけなら、以下で入ります。
実際に、本家の[インストールの説明](https://proj.org/install.html)に書かれています。

```
$ 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 という環境変数の設定が必要です。私は以下でＯＫでした。```$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 には以下のようにあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/b1c4bdab-44b3-cf1c-0b58-699e5d0178f6.png)

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

# おわり

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