Mable API について語る
Mable のハイパー グレート バックエンド GIS エンジニアの PEmugi です。
今日は Mable API をご紹介しようと思います。
Mable API って何?
Mable はレーザー カッターで道路線をテーブルやコースターに焼き付けて作ります。
レーザー カッターは入力としてベクターデータを必要とするので、道路線のデータ元である OpenStreetMap から必要な範囲のデータを切り出して一般的なベクターデータフォーマットに変換・出力する必要があるのです。
当初は、Overpass API などをつかって手作業で切り出していたのですが、パフォーマンスの問題や切り出す作業に手間がかかり、「自前で作るか!」となり生まれたのが Mable API です。
つまり「OpenStreetMap から指定範囲の道路を SVG で出力する」というのが最初の機能だったのです。
しかし、このブログでもご紹介した Mable Preview 開発のために画像で出力したり、背景画像を付けたりなどなどの機能が加わり今では以下のようなことができる API になってます。
- 出力形式: SVG, PNG, GeoJSON
- 背景画像の設定 (インターネット上の画像を利用可能)
- クレジット表記の追加 (OSM 使ってるよって表記!)
- マスク画像でのくりぬき (インターネット上の画像を利用可能)
- ラインのポリゴン化
どこでどうやって動いているの?
どこで?
GMO さんの ConoHa というクラウドで運用しています。
ConoHa の利点としては、ディスクが SSD で低スペックのインスタンスでもそこそこのパフォーマンスを確保できるところ、そして基本的にネットワーク トラフィックなどで従量課金が無いのでコストが見積もりやすいことが挙げられます。
要は低予算でそこそこのパフォーマンスが出せるっていう理由ですね。毎月約 2000 円くらいですw これで全世界の道路を出力できる API が運用できちゃってるんです。
どうやって?
OpenStreetMap の全世界のラインデータを格納した Database Serverと、Database Server から送られたデータを画像やデータにレンダリングして配信する Application Server の 2 台構成です。
図を見ながら各コンポーネントの役割を少し解説しますね。
- DB Server: PostgreSQL + PostGIS
全球のラインデータを PostGIS で空間データを扱えるように拡張した PostgreSQL に格納しています。
ラインのポリゴン化の機能は PostGIS の機能を使って RDBMS 内でポリゴンを計算して実現しています。 - App Server: GeoServer
Java で実装された OSS な GIS データの配信・共有を行うサーバーソフトウェアです。WMS / WFS などの GIS データにアクセスするためのプロトコルでクライアントからのリクエストに応じて指定範囲のデータをレンダリング (SVG, PNG, JPEG) したりベクターデータ (GeoJSON) として配信します。Mable API はかなりの部分をこの GeoServer に助けてもらってます。 - App Server: Tornado
Tornado は Python の Web Framework & 非同期ネットワークライブラリです。Tornado をベースに Web Application を構築しその中で GeoServer への処理の移譲や GeoServer からの出力画像に背景を付けたり、マスク画像でクリップしたりといったような画像処理をやってます。
App Server は 2 コア しかないので、Tornado のように シングルスレッドで動作しつつも non-blocking i/o を活用し多くのリクエストをさばけるのは大変うれしい。適切に実装すれば GeoServer で時間のかかるリクエストを待つ間も他のリクエストを受け処理することができます。 - App Server: Nginx
Nginx はリバースプロキシおよびコンテンツキャッシュとして採用しています。
こんな感じです。
今後もいろんな機能を実装しつつ Mable Project から生まれるかわいいプロダクトたちを支えていきたいと思います。