タンクパッド張った

ZX-6Rは〜'12モデルまでは純正オプションでタンクパッドの設定があったけど、'13〜以降には設定がない。通販サイトとかだと'13〜以降にはつかないとか注記してるとこもあるけど、タンク形状は変わってないので実際には〜'12用でOK。サイズがでかくて張りなおししづらそうなんできちんとセンター出して・・・

水張りした。

写真ではきれいに張れてるように見えるけど、サイズがでかい上に透明だから気泡やホコリ入ると目立つ目立つ。まじ気合入れて張ってください。

ニューイヤー、ニューマシン

トライアンフ(手前)からカワサキ(奥)に乗り換えた。Ninja ZX-6R 2014。

実は第一便予約してたんで11月には入ってて、とっくに慣らしは終わってるんだけど。
見た目に反してとにかく静かでトルクも太くて乗りやすいバイク。アイドリング調整スクリューも標準でついてるからエンスト知らず。八の字やUターンはたまにHMSで乗るCBR600RRよりもやりづらい気がする。ハンドルの角度とかの問題か新車でびびってるからか。

結論

プログラミングなしで位置データを使いたければ黙ってPostGIS使っちゃいなよ!
PostGIS以外も機能的なことや周辺ツールについては改善されていくとは思いますが、実はMongoDBもDynamoDBも空間インデックスの内部実装はGeohashベース()なので、そのあたりが変わらない限りは、POIを矩形検索か距離検索する用途以上のことにはほとんど使えません。
結局、2013年時点でAWSで地理データを配信したい場合は、面倒くさがり屋さんや空間処理初心者こそPostGISを使うしかないということになります。
異論は受け付けません。*1
(ていうかCartoDBはこのきのこ先生?)

*1:スケーラビリティを気にする人やイベントストリームとして座標を扱いたい人は・・・お好きなように。データ量やスケール変えたときの性能とか、性能あたりの課金額とかの細かい検証をまとめてくれる人がいたらありがたく参考にさせてもらうけれど(もみ手)

表示してみる

QGISで表示してみます。
DynamoDBのQGISプラグインはないです。AmazonのライブラリがJavaベースなんで作るのもたぶん面倒。



MongoDBは一応QGISプラグインあります。ただ、多くの人が使っているであろうWindowsQGIS同梱のPythonにはMongoのドライバが入ってないので、別途インストールしたPythonからドライバを抜いてきてQGISPythonに入れてやったりたりとか、まあ面倒ではあります。

PostGISは何も考えずににレイヤ追加ボタン押すだけで表示されます。

簡単だなあ。

データ入れる

手元にある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の場合は、特に何の準備も要りません。いきなり使えばよいです。
やったぜ!といいたいところですけど、基本的にJavaAPIでしか操作できないのでプログラム書かないことには何もできへんという・・・。

PostGISの場合は、RDSのインスタンス起動で"PostgreSQL"を選びます。

あとはいろいろ聞いてくるので適当に選択して"次へ"ボタンを押していきます。こっちはMongoDBの場合と違ってmicroインスタンスも選べるんで別垢作ってFree Tierで試すこともできてお得!。
初期状態ではなんもextensionが入ってないのでPostGISエクステンションを追加します。
すでにPCにpgAdmin3とか入ってる方は普通に接続してExtensionを右クリックでPostGIS追加できますよ。

2.1です。

AWSにPOIを入れる

趣味で位置データを配信されてる方は、昔は自鯖立てたりレンサバ借りたりしてたと思います。ここ数年は、物理サーバーを用意しなければならない特別な理由がない限りはAmazon EC2PostGISとか入れて使うのが一般的だったと思います。サーバー構築だけでもまじめにやると1日はつぶれるので正直面倒くさかったです。
最近は、わざわざ自前でEC2にPostGISインストールしなくても、AWSで最初から地理情報を扱える方法が増えてきています。たとえば、

  • EC2でMongoDBプリインストールのインスタンスを動かす。
  • DynamoDBにオプションの地理情報ライブラリを使ってデータ出し入れする
  • RDS(PostGIS)使う

それぞれ一長一短あります。*1

*1:ほかにも方法あるけどきりがないからこの3つを選んでみた