GeoPandasをGoogle App Engine(GAE)上で動かすためには、libspatialindexを事前ビルドする必要がある

※ 2021年4月時点での検証内容であり、ライブラリ側の更新により解消済みの可能性があります。

GAE上でGeoPandasを動かすには、libspatialindexをDebian系x64 OS上でビルドして依存関係に含めておく必要があります。本記事ではその方法を共有します。

概要

GeoPandasはGISデータを扱うために使用するライブラリです。本ライブラリはfiona, Rtree, shapelyなどのライブラリに依存しており、利用するにはこれらのライブラリのインストールも必要です。 このうちRtreeはlibspatialindexライブラリに依存しているのですが、C++で実装されたライブラリなのでPythonのパッケージマネージャとは別にインストールする必要があります。

今回の問題: GAE上でlibspatialindexをインストールするには?

ローカル環境では、

  • conda-forge(Windowsの場合)
  • brew install spatialindex(Macの場合)
  • sudo apt install libspatialindex-dev(DebianLinux)

などでlibspatialindexをインストールすることができます。一方でGAE環境ではlibspatialindexを直接インストールできません。そのため、

  • A: あらかじめlibspatialindexライブラリをDebianLinux x64環境でビルドする
  • B: Cloud Build時にlibspatialindexライブラリをビルドする

のどちらかでライブラリをビルドし、デプロイ時にコード内に組み込んでおく必要があります*1。本稿では、A.について記載します(当該ライブラリについてアップデートされる頻度がかなり少なく、Cloud Buildに対応する恩恵があまりないのでB.については割愛します)

手順: あらかじめlibspatialindexライブラリをDebianLinux x64環境でビルドする

過去検証した限り、GAEにおけるOSはDebian系x64由来のものが使用されています。そのため、同環境に互換性のあるOS下でlibspatialindexライブラリをビルドし、GAEにデプロイするコードからロードするようにすれば同ライブラリを依存関係に含めることができます*2

1. ビルド環境構築

まず、仮想マシンでx64版のUbuntuを準備しておきます。その後、ホスト側にてビルドに必要なcmakeをインストールします。

2. ビルド

libspatialindexをクローンし、INSTALLに記載の手順に従ってビルドします。ビルド後、bin/下にlibspatialindex*.soが生成されます(コード量は多くないので、数分でビルドされます)。

コマンド

$ git clone https://github.com/libspatialindex/libspatialindex
$ cd libspatialindex

$ cmake .
$ make

生成物(bin/下)

libspatialindex.6.1.1.so   
libspatialindex.6.so
libspatialindex.so
libspatialindex_c.6.1.1.so
libspatialindex_c.6.so
libspatialindex_c.so

3. libspatialindex*.soをGAEアプリに組み込む

前述のlibspatialindex*.soをGAEアプリのどこか(例えば、libs/libspatialindex/など)にコピーします。

GAEアプリについて、クラウド環境であれば明示的に同ライブラリを参照するようにします(ローカル環境は開発メンバーによって異なる可能性があるので、環境変数に参照を追加しません)。

if os.getenv('GAE_ENV', '').startswith('standard'):
    os.environ["SPATIALINDEX_C_LIBRARY"] = \
            "./libs/libspatialindex/libspatialindex.so"

また、最新のRtreeにおいてGAEにデプロイできない問題があったため、 バージョンを0.8.3に固定する必要があります(2020年1月頃の0.9.3時点。0.9.4以降で修正されている可能性があります)

以上の手順により、GAE環境でGeoPandas(の特にsjoinなど)が利用可能になります。


以上になります。ご覧いただきありがとうございます!

*1:libspatialindexライブラリはMITライセンスで提供されているため、個別にビルドしたものをプログラム中に組み込むことはOKです

*2:GAE/Python2ではGeoPandasライブラリ自体がインストールできません。GAE/Python2がC言語依存のライブラリをサポートしていないためです