GPS(フィーチャーフォンの位置情報)拡張機能

GPS拡張機能は携帯電話のGPS機能を使って位置情報を取得するクラスです。測地系の変換や、60進法と10進法の変換メソッドも用意しています。

メソッド

getLinkTag(string $url, string $str)
(returns string) 各キャリア(docomo, au, Softbank, Willcom)に対応した位置情報取得リンクタグを生成します。$urlで位置情報を渡したいプログラムのURLを、$strでアンカーテキストを、それぞれ文字列で指定します。位置情報の他にプログラムへ渡したいパラメータがある場合、$urlの中でGETのパラメータとしてそれを指定してください。
getLoc()
(returns array) 各キャリアの位置情報取得サーバを通じて得られた位置情報パラメータ付きリクエストを受け取り、座標と測地系を連想配列で返します。形式は
array(
	'lat'	=> 北緯,
	'lon'	=> 東経,
	'geo'	=> 測地系,
)
となります。緯度は北緯の値を、経度は東経の値を「(d)dd.mm.ss」形式の60進数で返します。南緯、西経の場合は負の値を返すことになります。 測地系は日本測地系の場合「tokyo」を、世界測地系の場合「wgs84」を文字列で返します。 getLoc()を実行すると、このメソッドを実行しているアクションに対してGETで送られてきた位置情報付きパラメータを解析して結果を返すので、引数を指定する必要はありません。
LocTokyo(array $loc)
(returns array) 引数として指定した位置情報配列から日本測地系の位置情報配列を返します。位置情報配列はメソッドgetLoc()の実行結果の配列です。世界測地系の場合は変換処理が行われますが、もともと日本測地系だった場合はそのままの値を返します。
LocWGS(array $loc)
(returns array) 引数として指定した位置情報配列から世界測地系の位置情報配列を返します。位置情報配列はメソッドgetLoc()の実行結果の配列です。日本測地系の場合は変換処理が行われますが、もともと世界測地系だった場合はそのままの値を返します。
float2dms(float $locationfloat)
(returns string) 10進数を「(d)dd.mm.yy」形式の60進数に変換します。
dms2float(string $locationdms)
(returns float) 「(d)dd.mm.yy」形式の60進数を10進数の浮動小数点数に変換します。

使用例

以下は位置情報を取得し、それをGoogleMapsで検索して住所情報を取得するプログラムです。キャリアから受け取る座標情報は60進数、Google Mapsに与える座標情報は世界測地系の10進数であるため変換処理を行っています。

<?
class ctrlArea extends CZCtrl {

	public function actionIndex() {
		// 位置情報を受け取るアクションのURL
		$url = 'http://url.to/index.php/area/search';
		// 位置情報取得リンクタグの取得
		$gps_req_link_tag = $this->newModule('gps')->getGPSLink($url, '位置情報検索');
		// リンクタグをビュー変数に指定
		$this->addViewVar('gps_req_link_tag', $gps_req_link_tag, false);
	}

	public function actionSearch() {
		$key = 'Google Mapsのキー';
		// 位置情報を配列に格納
		$loc_dms = $this->getLoc();
		// 60進数の座標を10進に変換
		$loc_float = array(
			'lat' => $this->dms2float($loc_dms['lat']),
			'lon' => $this->dms2float($loc_dms['lon']),
			'geo' => $loc_dms['geo'],
		);

		if ($loc_float_wgs = $this->LocWGS($loc_float)) {
			$lat = $loc_float_wgs['lat'];
			$lon = $loc_float_wgs['lon'];

			// Google Mapsに座標情報を送り、住所情報を受け取る
			$xml = file_get_contents("http://maps.google.com/maps/geo?output=xml&oe=utf-8&ll=${lat}%2C${lon}&key=${key}");
			if (isset($xml)){
				try {
					$areas = new SimpleXMLElement($xml);
					$area = $areas->Response->Placemark->AddressDetails->Country->AdministrativeArea;
				} catch(Exception $e) {
				}
			}
			
			// $areaを使った処理
		}
	}
}
?>

前後のページ

ページトップへ