Keep It Real BLOG

ソフトウェアエンジニア。1児の父。 酒、ラーメン、サッカー好き。旅行も好きですが、普段は出不精で大抵たまプラーザ界隈に居ます。

GPSで現在地取得

GPSで現在地を取得するプログラムを書く機会があったので、メモ。
PearのGPSのライブラリを使用しました。

まずは、GPSの位置を取得する為のページへのリンク作成。

require_once("Net/UserAgent/Mobile/GPS.php");

try { 
  $g = Net_UserAgent_Mobile_GPS::factory(); 
} catch (Net_UserAgent_Mobile_GPS_Exception $e) { 
  var_dump($e->getMessage()); 
  exit(); 
}

// GPSの値を取得して、処理を行うページ
$url = 'gps.php'; 
// リンクの文字列
$str = 'GPSで検索';
// 各キャリア毎のリンク取得 
$glink = $g->getGPSLink($url, $str);
// glinkの配列にはurlとtagが入っているが、tagを使うのがオススメ(DOCOMOなんかはaタグにlcsとか入れなきゃならないので)

echo $glink["tag"];

GPSの位置取得

require_once("Net/UserAgent/Mobile/GPS.php");

// ピリオド区切りのGPSの値を取得し、配列に格納
$lat_arr = explode('.', str_replace("+", "", get_data("lat")));
$lon_arr = explode('.', str_replace("+", "", get_data("lon")));

// 世界測地系に変換する
$g_lat = $lat_arr[0] + $lat_arr[1] / 60 + $lat_arr[2] / 3600;
$g_lon = $lon_arr[0] + $lon_arr[1] / 60 + $lon_arr[2] / 3600;
$latitude = $g_lat - $g_lat * 0.00010695 + $g_lon * 0.000017464 + 0.0046017;
$longitude = $g_lon - $g_lat * 0.000046038 - $g_lon * 0.000083043 + 0.010040;

// 緯度
echo $latitude;
// 経度
echo $longitude;

追記

上記のGPSの位置取得では、ソフトバンクの値が取れてきていませんでした(汗

// ソフトバンクの場合
if ( !empty($_GET["pos"]) ) {
	$pos = get_data($_GET["pos"]);
	preg_match('/([N|S])(.+)([W|E])(.+)/', $pos, $match);
	$lat = $match[2];
	if($match[1]=='S') $lat = '-' . $lat;
	$lon = $match[4];
	if($match[3]=='W') $lon = '-' . $lon;
	$lat_arr = explode('.', $lat);
	$lon_arr = explode('.', $lon);
	$g_lat = $lat_arr[0] + $lat_arr[1] / 60 + $lat_arr[2] / 3600;
	$g_lon = $lon_arr[0] + $lon_arr[1] / 60 + $lon_arr[2] / 3600;
// それ以外の機種の場合
} else {
	$lat_arr = explode('.', str_replace("+", "", get_data($_GET["lat"])));
	$lon_arr = explode('.', str_replace("+", "", get_data($_GET["lon"])));
	$g_lat = $lat_arr[0] + $lat_arr[1] / 60 + $lat_arr[2] / 3600;
	$g_lon = $lon_arr[0] + $lon_arr[1] / 60 + $lon_arr[2] / 3600;
}
// 世界測地系に変換する
$latitude = $g_lat - $g_lat * 0.00010695 + $g_lon * 0.000017464 + 0.0046017;
$longitude = $g_lon - $g_lat * 0.000046038 - $g_lon * 0.000083043 + 0.010040;

また、これだと、海外にいる場合の位置情報取得がおかしくなる可能性あるっぽいですが、とりあえず国内はこれで大丈夫かと。。