GPS座標を短い文字列で扱えるGeoHashが面白い

2010/1/29 金曜日 Posted in 記事紹介・リンク | 4 Comments »

位置情報を短い文字列で扱うことのできる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 = ... Read more..