0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

概要

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

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

ローカル環境では、

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

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

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

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

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

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

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です。 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?