GPS座標を短い文字列で扱えるGeoHashが面白い
Tweet
位置情報を短い文字列で扱うことのできるGeoHashというのが面白いのでご紹介します。
ケータイのGPSなどから取得する座標は通常「緯度・経度」という形で扱われます。
「+141.22.35.364, +43.3.14.112」みたいな感じですね。
ところがGeoHashでは、この座標は文字列で表され「xpssbxt2gpf」となります。
面白いことにこの文字列は、座標のように「点」を表しているのではなく「範囲(グリッド)」を表しています。
そして、この文字列は長ければ長いほど詳細な情報を持ちます。
つまり文字列を短くすると、より広い範囲を表すことになります。
例えば上の文字列から3文字削った「xpssbxt2」は、次のような範囲になります。
そこから更に2文字削った「xpssbx」は、より広い範囲を表すことになり、次のような範囲になります。(範囲が広すぎて表示しきれないので地図の縮尺も上げています)
どうも説明が下手なので、恐らくわかるようなわからないような、という感じでしょう。
現在のところmasuidrive氏のブログが、日本語でGeoHashを一番詳しく解説しているのではないかと思われるので、ご紹介させていただきます。
(図解も多くわかりやすいと思います)
→ @masuidrive blog 緯度経度を文字列で表すGeoHash [blog.masuidrive.jp]
また同時に実際にGeohashを試すことの出来るデモも公開されているようです。
→ @masuidrive blog geohashデモアプリケーション [blog.masuidrive.jp]
「東京タワー」のような語句を入れて描画ボタンを押すと、GeoHash値とその範囲が表示されるはずです。
GeoHashは、既に色んな言語向けに実装が進んでいるようで、上記ブログでもRuby用のライブラリが公開されています。
英語版のWikipediaに各言語向けのリンクがあります。
私も上記リンクから辿ってPHPで試してみたのですが、どうもライブラリが簡素なものしかありませんでした。
検索してみたところ、「とりあえずPHP」というブログ内にGeoHashのデコード、エンコード、隣接する領域を取る関数のサンプルコードがありましたので活用させていただきました。
→ とりあえずPHP Geohash関数 [mtcn.ko-me.com]
使い方はソースを見れば一目瞭然だと思いますが、こんな感じです。
// テスト用の座標
$lat_in = '43.06383';
$lon_in = '141.35744';
// 座標からGeoHash形式へ(3番目の引数は精度)
$hash = geohash_encode($lat_in, $lon_in, 6);
// GeoHash形式から座標へ
$geo_arr = geohash_decode_interval($hash);
$grid_x1 = $geo_arr[1][0]; // グリッドの左上の点
$grid_x2 = $geo_arr[1][1]; // グリッドの左下の点
$grid_y1 = $geo_arr[0][0]; // グリッドの右上の点
$grid_y2 = $geo_arr[0][1]; // グリッドの右下の点
なお、ケータイから取得できる座標は、度分秒形式なので、あらかじめミリ秒形式に変換する必要があります。
詳しくはこちらの記事を参考にしてください。
このGeoHash何が良いのかというと、
- 場所の絞り込みが簡単に行える、隣接エリアの取得も容易。
- 範囲が前方一致で検索できるので、文字列マッチやSQLのlike文などとも相性が良く、高速な処理が可能
- 座標と精度を短い文字列で持つことができるので、URLで扱いやすい
のような点が上げられると思います。
これを使えばケータイのGPSでドラクエのすれ違い通信的なものも割と簡単に実装できる気がしているので、現在遊んでみているところです。
関連:
- FOMAオープンiエリアの位置情報取得機能を試してみました
- Google Static Map APIが随分変わっていたので調べ直してみました
- 「Google Static Maps API」を使って携帯でGoogleマップを表示する
1月 31st, 2010 at 2:20:50
[…] GPS座標を短い文字列で扱えるGeoHashが面白い | ke-tai.org GPS座標を短い文字列で扱えるGeoHashが面白い | ke-tai.org […]
2月 1st, 2010 at 0:05:18
[…] GPS座標を短い文字列で扱えるGeoHashが面白い | ke-tai.org geohashの話 […]
2月 7th, 2010 at 3:04:30
[…] GPS座標を短い文字列で扱えるGeoHashが面白い […]
12月 3rd, 2012 at 17:38:30
記事内で紹介されていたデモアプリがandroidやchromeで文字化けするようなのでエリア確認ツールを作成して見ました