Pearの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;

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

コメントを残す