SpatialiteをMacでビルドしようとして失敗した話


Spatialiteというものがあります。
簡単に言うと、Sqliteです。

OSMのデータを扱うとき、大規模な場合は普通PostGISを使うのですが、Sqliteにはこんな利点があります。

* データが1つのファイルにまとまる
* 1つのファイルにまとまるので、TileMillやQGISで扱いやすく、データを同梱して配布しやすい

で、「せっかくだからやってみっか」と思ってビルドしてみて失敗したので、メモを残しておきます。
(追記: homebrewしたら成功しました。記事の後半を参照)


# Spatialiteの配布
ここで行われています。

https://www.gaia-gis.it/fossil/spatialite-tools/wiki?name=spatialite-tools

基本的には、これを configure -> make -> make installすればよいようです。
ですが、configureすると、いきなりコケます。

```
configure: error: 'libreadosm' is required but it doesn't seem to be installed on this system.
```

どうやら`libreadosm`が必要のようです。
ググってみると、以下のページを見つけました。

https://www.gaia-gis.it/fossil/readosm/index

これを configure -> make -> make install します。
これをインストールした後にもう一度 splatialite本体をビルドしようとすると、`libspatialite`が無いと言われます。

ぐぐってみると、どうやらここがsource置き場のようです。

http://www.gaia-gis.it/gaia-sins/libspatialite-sources/

最新版(今回は`libspatialite-4.1.1.tar.gz`)をダウンロードして configure -> make -> make install します。

これでまた spatialite本体をビルドしようとすると、make時に以下のエラーが出ます。
ここで詰まってしまいました。

```
$ make
make  all-am
gcc -DHAVE_CONFIG_H -I. -g -O2 -I.    -g -O2 -MT shell.o -MD -MP -MF .deps/shell.Tpo -c -o shell.o shell.c
mv -f .deps/shell.Tpo .deps/shell.Po
/bin/sh ./libtool --tag=CC   --mode=link gcc  -g -O2   -o spatialite shell.o -L/usr/local/lib -lspatialite -lsqlite3 -lm -lz -L/usr/local/Cellar/freexl/1.0.0f/lib -lfreexl -lm -lreadline -lcurses  -lproj -lexpat -L/usr/local/Cellar/geos/3.4.2/lib -lgeos_c
libtool: link: gcc -g -O2 -o spatialite shell.o  -L/usr/local/lib /usr/local/lib/libspatialite.dylib -L/usr/local/Cellar/geos/3.4.2/lib -lpthread -ldl -liconv -lsqlite3 -lz -L/usr/local/Cellar/freexl/1.0.0f/lib -lfreexl -lreadline -lcurses /usr/local/Cellar/proj/4.8.0/lib/libproj.dylib -lm -lexpat -lgeos_c
Undefined symbols for architecture x86_64:
  "_sqlite3_enable_load_extension", referenced from:
      _open_db in shell.o
  "_sqlite3_load_extension", referenced from:
      _do_meta_command in shell.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make[1]: *** [spatialite] Error 1
make: *** [all] Error 2
```

## 突然のインタラプト！！

とか書いていたら、

```
brew install libspatialite
brew install spatialite-tools
brew install librasterlite
```

でええやろ、というお言葉をいただきました。

とりあえずインストールはこれでできました。
ありがてぇありがてぇ ヽ('ω')ﾉ三ヽ('ω')ﾉ

でも、pbfファイルをインポートしようとすると

```
$ spatialite_osm_raw -o ./japan-latest.osm.pbf -d japan-latest.sqlite
SQLite version: 3.8.2
SpatiaLite version: 4.1.1

Segmentation fault: 11
$ 
```

コケます(´・ω・`)
まだまだ道は遠そうです。

## 復旧
なんかどっかでライブラリおかしくなってるのかな？と思ったので、いちどアンインストール→インストールしたら動くようになりました。

✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

```
brew uninstall libspatialite
brew uninstall spatialite-tools
brew uninstall librasterlite
```

まだ詳しく検証していませんが、`spatialite-tools`だけのインストールでもよいかもしれません。
なお、`spatialite-tools`のインストール -> `libspatialite`のインストール、の順に行おうとすると、「インストール済みだけどlinkされてないよ」といわれます。

```
$ brew install libspatialite
Warning: libspatialite-4.1.1 already installed, it's just not linked
```

いくつかのファイルを削除してください、という指示がでてきますので、指示通りにそのファイルを消して、何度か `brew install libspatialite`を試してみてください。

## spatialiteのファイル作成
[GeoFabrik](http://download.geofabrik.de/)のサイトからpbfファイルをダウンロードしてきて、spatialiteのDBを作成します。

```
$ wget http://download.geofabrik.de/asia/japan-latest.osm.pbf
$ spatialite_osm_raw -o ./japan-latest.osm.pbf -d japan-latest.sqlite
```

僕の環境だと、だいたい5時間30分ほどかかって22GBほどのファイルができました。
(`spatialite_osm_map`だとカラムが削減されるので、もっと速いかもしれません)