結論
プログラミングなしで位置データを使いたければ黙ってPostGIS使っちゃいなよ!
PostGIS以外も機能的なことや周辺ツールについては改善されていくとは思いますが、実はMongoDBもDynamoDBも空間インデックスの内部実装はGeohashベース()なので、そのあたりが変わらない限りは、POIを矩形検索か距離検索する用途以上のことにはほとんど使えません。
結局、2013年時点でAWSで地理データを配信したい場合は、面倒くさがり屋さんや空間処理初心者こそPostGISを使うしかないということになります。
異論は受け付けません。*1
(ていうかCartoDBはこのきのこ先生?)
*1:スケーラビリティを気にする人やイベントストリームとして座標を扱いたい人は・・・お好きなように。データ量やスケール変えたときの性能とか、性能あたりの課金額とかの細かい検証をまとめてくれる人がいたらありがたく参考にさせてもらうけれど(もみ手)
データ入れる
手元にあるGeoJSONのデータ入れてみます。
MongoDBの場合は、Pythonの対話モードとかで入れるのが楽かと思います。GeoJSONのデータをテキストエディタ使って行頭行末を以下のように加工します。
前:{"type":"Point","coordinates":[135.874343,35.076685]} 後:src.append({"type":"Point","coordinates":[135.874343,35.076685]})
で、加工した行を、以下のスクリプトの指定箇所にコピペしてPython上で実行します。
import pymongo conn = pymongo.Connection('[EC2のホスト名]', 27017) gdb = conn.geodb gcol = gdb.geocol gcol.ensure_index([('coodinates', pymongo.GEO2D)]) src = [] # この下にコピペする gcol.insert(src)
データが入ったことを確認する場合はこんな感じで。
for data in gcol.find(): print data
DynamoDBの場合は、Amazon提供のJavaクラスを使ってプログラム組んでデータ入れます。わざわざプログラム組むとかそのコードをここに延々張りつけるとかそんな面倒くさいこと年の瀬のこんな時期に(コードとかもろもろ略)。
気を取り直してPostGISの場合。GDALが入った環境をどっかに持ってればコマンド一発でデータ入れられます。普通はPostGIS入ってるインスタンスにGDALもある・・・はずなんですが、Amazon RDSの場合は直接インスタンスにsshログオンすることができないので、今回はSQLで入れてみます。
例によってGeoJSONのファイルをテキストエディタで加工してこんなSQLに変換します。
前:{"type":"Point","coordinates":[135.874343,35.076685]} 後:insert into testgeom (the_geom) values (ST_GeomFromGeoJSON('{"type":"Point","coordinates":[135.874343,35.076685]}'));
pgAdmin3のSQLウインドウで
create table testgeom (oid serial primary key, the_geom geometry);
した後にそのままコピペして実行すればOK。プログラム書く必要はありません。
PostGISは楽ちんだなあ。
利用の準備をしてみる
では、それぞれ使ってみます。
MongoDBの場合は、EC2のインスタンス作成のときに、"MongoDB" って入れてインスタンスを検索するとMongoDB入りのインスタンスが出てくる。
あとはインスタンスタイプ選んで起動ボタン押せばOK。ベースはAmazon Linuxなのでec2-userでsshログインして普通のec2インスタンスとして使えます。なお、標準ではmongodのインスタンスが起動してないようなので、
sudo chkconfig on mongod
とかしてください。ローカルのPCからつなぐには、セキュリティグループで27107ポートを開けてから、ローカルPCで、
pip install pymongo
して、ローカルPCのPythonでMongoDBが使えるようにしてから、Pythonの対話モードで
import pymongo conn = pymongo.Connection('[EC2のホスト名]', 27107)
とか打ってエラーが出なければOKです。
DynamoDBの場合は、特に何の準備も要りません。いきなり使えばよいです。
やったぜ!といいたいところですけど、基本的にJavaのAPIでしか操作できないのでプログラム書かないことには何もできへんという・・・。
PostGISの場合は、RDSのインスタンス起動で"PostgreSQL"を選びます。
あとはいろいろ聞いてくるので適当に選択して"次へ"ボタンを押していきます。こっちはMongoDBの場合と違ってmicroインスタンスも選べるんで別垢作ってFree Tierで試すこともできてお得!。
初期状態ではなんもextensionが入ってないのでPostGISエクステンションを追加します。
すでにPCにpgAdmin3とか入ってる方は普通に接続してExtensionを右クリックでPostGIS追加できますよ。
2.1です。