ここギコ!さんからロカポ(LocaPoint)に対応するとジオポの欠点を補完できるのでは?とアドバイスをいただいたので対応してみました。
(例) http://geopo.at/SW8.HQ9.CR8.PU8
こんな形で http://geopo.at/ にロカポをくっつけてください。ジオポと同じように、見ている環境に対応した地図を表示させます。
ロカポとは?
ロカポとは、世界中のどんな場所でも12文字で表すことができる、最先端の位置情報コード『LocaPoint』の愛称です。
「今何時?」と聞かれれば「10:35」や「16:45」という短い答えを返せますが、「そこはどこ?」と聞かれると、通常は住所、近くの目印、道順、地図などを使いますが、時刻のように短く答えることはできませんでした。ロカポがあれば、これが可能になります。
緯度経度って単純な数字の羅列だし、緯度と経度どちらを先に?南北・北西はどうやって表す?などの誰もが理解できる明確なフォーマットというのがないんですよね。
同じ地点でも、DMS(度と分と秒で表す)、DM(度と分で表す)やD(度のみで表す)と表現方法がいくつもあって面倒!でも、Google Mapsが登場してから、D(Google Mapsの方法です)にやっとまとまりつつあるような印象。
ロカポはフォーマットを「英文字・英文字・数字」といった具合に規則性をもたせているので、よくありがちな「Q」と「9」などの聞き間違いによるエラーなどを避けることができるメリットがあります。
ジオポと同じで、位置情報を符号化して圧縮しているので、文字数も12文字と短いよ!
ジオポをロカポに対応させる
ジオポとロカポの判別
ジオポの場合、.htaccessでmod_writeを使ってパラメータをクエリとして投げてます。
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} \/([0-9a-z_-]{1,10})$ [NC] RewriteRule ^(.*) /index.php?%1 [L] RewriteCond %{REQUEST_URI} \/([A-Z]{2}[0-9]\.[A-Z]{2}[0-9]\.[A-Z]{2}[0-9]\.[A-Z]{2}[0-9])$ RewriteRule ^(.*) /index.php?%1 [L]
上の条件式はジオポので、”0″~”9″と”a”~”z”と”_”と”-“が1から10の連続ってこと。”A”~”Z”が書いてないけど、mod_writeのルールで [NC]をつけてやると大文字でも小文字でも構わないってことになるから大丈夫。それらを index.phpに投げてやってるだけ、そんだけ。
下の条件式はロカポので、ロカポのコードフォーマットに合わせた条件式を書いてやり、ジオポと同じように投げてる。ただ、ロカポの場合は[NC]を付けないで大文字しか許可しないようにしてある。後々、内部の処理で小文字を許可した場合、意図しない結果になることを恐れてだ。仕様書には小文字うんぬんの記述が見つからなかったけど、多分ダメなんだろう。
ロカポのPHP変換関数
ロカポのサイト内でのリンクに、いろいろな言語で実装されたプログラムがあるんだけど、なぜだかPHPは見つからなかったので、関数を作る。
/* * 【PHP版】ロカポのエンコード * @author : Shintaro Inagaki * @param $location 位置情報配列 * @return $locapoint ロカポ */ function locapointEncode($location) { $locapoint = ""; $latStep = ($location['lat'] + 90) / 180 * 45697600; $lngStep = ($location['lng'] + 180) / 360 * 45697600; $locapoint = chr($latStep / 1757600 % 26 + 65) . chr($latStep / 67600 % 26 + 65) . chr($latStep / 6760 % 10 + 48) . '.' . chr($lngStep / 1757600 % 26 + 65) . chr($lngStep / 67600 % 26 + 65) . chr($lngStep / 6760 % 10 + 48) . '.' . chr($latStep / 260 % 26 + 65) . chr($latStep / 10 % 26 + 65) . chr($latStep / 1 % 10 + 48) . '.' . chr($lngStep / 260 % 26 + 65) . chr($lngStep / 10 % 26 + 65) . chr($lngStep / 1 % 10 + 48); return $locapoint; }
ロカポのエンコード。
/* * 【PHP版】ロカポのデコード * @author : Shintaro Inagaki * @param $locapoint ロカポ * @return $location 位置情報配列 */ function locapointDecode($locapoint) { // 位置情報配列 $location = array (); $location['lat'] = ((ord(substr($locapoint, 0, 1)) - 65) * 1757600 + (ord(substr($locapoint, 1, 1)) - 65) * 67600 + (ord(substr($locapoint, 2, 1)) - 48) * 6760 + (ord(substr($locapoint, 8, 1)) - 65) * 260 + (ord(substr($locapoint, 9, 1)) - 65) * 10 + (ord(substr($locapoint, 10, 1)) - 48) * 1) * 180 / 45697600 - 90; $location['lng'] = ((ord(substr($locapoint, 4, 1)) - 65) * 1757600 + (ord(substr($locapoint, 5, 1)) - 65) * 67600 + (ord(substr($locapoint, 6, 1)) - 48) * 6760 + (ord(substr($locapoint, 12, 1)) - 65) * 260 + (ord(substr($locapoint, 13, 1)) - 65) * 10 + (ord(substr($locapoint, 14, 1)) - 48) * 1) * 360 / 45697600 - 180; $location['scale'] = 6; // ロカポのみなら必要ありません return $location; }
ロカポのデコード
たぶん、あってると思う。
さっき、小文字だとおかしくなるって書いてたのは、文字コード表での数値がずれるから。もし、対応させるなら、ロカポに strtoupper()をかませればオッケーです。
位置情報のコード化について
ロカポの上田さんの話では、位置情報をコード化させるという事例は海外を含めてもそんなにないそうです。ロカポ、Nコード、マップコード、Natural Area Code(NAC)くらいということ。
これまで日常で位置情報を扱う機会があまりなかったからかなぁ?でも、これからは位置情報が密接になってくるはず。緯度経度の不便さに気づいたときは、是非これらのコードの活用を検討して欲しいです。
自分用メモとしてそれぞれのサイトにリンク。
ロカポ:http://www.locapoint.com/jp/index.html
マップコード:http://guide2.e-mapcode.com/