中村です。
PHPで携帯の位置情報を簡単に取り扱うことができるライブラリ「Geomobilejp_Converter」を作りました。もう半年近く前に作ったものですが、コードを少し整えたので公開することにしました。
GPSに対応した携帯では、各キャリアで指定されている特定のHTMLを記述することで、携帯サイトに位置情報(緯度経度や測地系)を送信することができます。この位置情報を利用すると、「位置情報付きで掲示板に書き込む」などの機能を実装することができます。
キャリアによっては位置情報のなかに土地名を含むものもありますが、通常は緯度経度だけでは土地名がわかりません。そこでGeomobilejp_Converterでは、docomoの提供するオープンiエリアのiエリアデータファイルを利用して土地名を関連付ける機能を実装しています。iエリアデータを利用することで、各キャリアで共通したiエリアコードや土地名を取得することができます。
使い方を少しご紹介
フォーマットや測地系の変換は次のような感じです。
require_once '/path/to/Geomobilejp/Converter.php';
$converter = new Geomobilejp_Converter('34.700695', '135.495243', 'wgs84');
$converter = $converter->convert('tokyo')->format('dms');
echo $converter->getLatitude() . "\n"; // 34.41.50.830
echo $converter->getLongitude() . "\n"; // 135.29.53.007
また、各キャリアの携帯から送られてきた位置情報をiエリアデータの土地名に変換することができます。ここでは、http://example.com/?lat=%2B34.42.02.502&lon=%2B135.29.42.875&geo=wgs84というリクエストがきた場合を仮定しています。
require_once '/path/to/Geomobilejp/Converter.php';
require_once '/path/to/Geomobilejp/IArea.php';
require_once '/path/to/Geomobilejp/Mobile.php';
$mobile = new Geomobilejp_Mobile();
if ($mobile->hasParameter()) {
$converter = new Geomobilejp_Converter(
$mobile->getLatitude(),
$mobile->getLongitude(),
$mobile->getDatum()
);
$area = Geomobilejp_IArea::seekArea($converter);
echo $area->getIAreaCode() . "\n"; // 17202
echo $area->getName() . "\n"; // 大阪駅/阪急梅田駅周辺
}
ご興味のある方は
Google Codeでソースコードを公開しました。この中に含まれる「docs/Manual.html」により詳しい説明を書いていますので参考にしてください。
参考ソース
このライブラリを作るにあたって、Perlで書かれたGeo::Coordinates::ConverterとGeo::Coordinates::Converter::iArea、またperezvonさんのコードを大変参考にしました。ありがとうございます。
また、私の個人ブログに簡単なGPSのまとめを書いていますので、ご興味があればどうぞ。