携帯GPSの仕様 - 位置情報(緯度・経度)、地図・座標、Google Static Maps API(グーグルマップ)

2009-01-21
携帯電話のGPSの仕様、携帯サイトでの位置情報(緯度・経度)の取得方法です。
3G以降のGPS対応機種での位置情報の取得方法を紹介します。
位置情報は、値を取得するたびに微妙に異なります。
また位置情報は、完璧に正確な値ではなく、あくまで参考値です。



GPSの仕様、位置情報(緯度・経度)の取得方法

  1. ドコモ
    • ドコモは、iエリア、GPS(mova)、GPS(FOMA以降)など、いくつか位置情報を取得する方法があります。
      ここでは、FOMAの位置情報の取得を紹介します。
      サイトの制作手順としては、規定のリンク方法でリンクを書き、遷移先のページでドコモ側から送られてくる位置情報を受け取るだけです。
    • リンクの書き方
      aタグやformタグにlcs属性を追加すると、遷移先のページで位置情報を取得できます。
      aタグの場合
      <a href="./gps.cgi" lcs>サンプル</a>
      
      formタグの場合
      <form method="post" action="./gps.php" lcs>
      <input type="submit" value="検索">
      </form>
      
      リンクを選択すると端末側でウィンドウが表示され、「現在地確認」を選択すると測位が始まります。
      測位後、情報通知の確認画面が表示されるので、「はい」を選択すると遷移先のページで位置情報を取得できます。
    • 送信される値
      以下の値が自動的に送られてきます。
      サイトからパラメータとして送出する必要はありません。
      lat:緯度。形式はdmsで、度は10進、分秒は60進。北緯は+、南緯は-。(例)+35.20.55.123
      lon:経度。形式はdmsで、度は10進、分秒は60進。東経は+、西経は-。(例)+139.30.51.567
      geo:測地系。wgs84、tokyoなどがある。機種により大文字・小文字の表記が異なる場合がある。
      x-acc:測位レベル。誤差を1~3の数値で表す。3は50m未満、2は50m以上300m未満、1は300m以上。あくまで参考値。
    • 取得例(PHP)
      GETで送信した場合はGET、POSTで送信した場合はPOSTで送られてきます。
      $lat = $_GET{'lat'};
      $lon = $_GET{'lon'};
      $geo = $_GET{'geo'};
      $xacc = $_GET{'x-acc'};
      
      $result = "緯度:" . $lat . "<br>\n"
      	. "経度:" . $lon . "<br>\n"
      	. "測地系:" . $geo . "<br>\n"
      	. "測位レベル:" . $xacc;
      
      echo $result;
      
  2. au
    • auに関しては、「簡易位置情報」と呼ばれる位置情報の取得を紹介します。
      サイトの制作手順は、基本的にドコモと同じです。
    • リンクの書き方
      以下のようなリンクを指定すると、遷移先のページで位置情報を取得できます。
      <a href="device:location?url=http://sample.com/gps.php">サンプル</a>
      
    • 送信される値
      lat:緯度。基本的にドコモと同じ。+の符号は省略される場合がある。
      lon:経度。基本的にドコモと同じ。+の符号は省略される場合がある。
      datum:測地系。基本的にドコモのgeoと同じ。tokyoの場合も実際はWGS84系を利用している。
      unit:座標系。degree(度単位)またはdms(度分秒単位)。実際はdmsのみ。
    • 取得例(PHP)
      $lat = $_GET{'lat'};
      $lon = $_GET{'lon'};
      $datum = $_GET{'datum'};
      $unit = $_GET{'unit'};
      
      $result = "緯度:" . $lat . "<br>\n"
      	. "経度:" . $lon . "<br>\n"
      	. "測地系:" . $datum . "<br>\n"
      	. "座標系:" . $unit;
      
      echo $result;
      
  3. ソフトバンク
    • ソフトバンクに関しては、3GC型端末以降の位置情報の取得を紹介します。
      サイトの制作手順は、基本的にドコモと同じです。
    • リンクの書き方
      以下のようなリンクを指定すると、遷移先のページで位置情報を取得できます。
      <a href="location:auto?url=http://sample.com/gps.php">サンプル</a>
      
      上記のautoは、端末にて優先されている測位方法で測位することを表します。
      ほかには、gps(GPS位置情報による測位)、cell(簡易位置情報による測位)があります。
    • 送信される値
      pos:緯度と経度。東西南北をEWSNで表し、緯度のあとに経度が書かれています。(例)N35.20.55.123E139.30.51.567
      geo:測地系。基本的にドコモのgeoと同じ。
      x-acr:測位精度。精度を1~3の数値で表す。3は50m以下、2は50m~300m、1は300m以上。あくまで参考値。
    • 取得例(PHP)
      以下のサンプルは、ドコモと同じ書式になるように、緯度と経度を抽出しています。
      $pos = $_GET{'pos'};
      $geo = $_GET{'geo'};
      $xacr = $_GET{'x-acr'};
      
      preg_match("/^([NS0-9.]+)([EW0-9.]+)$/", $pos, $match);
      
      $nsew = array('N', 'S', 'E', 'W');
      $pm = array('+', '-', '+', '-');
      $lat = str_replace($nsew, $pm, $match[1]);
      $lon = str_replace($nsew, $pm, $match[2]);
      
      $result = "緯度:" . $lat . "<br>\n"
      	. "経度:" . $lon . "<br>\n"
      	. "測地系:" . $geo . "<br>\n"
      	. "測位精度:" . $xacr;
      
      echo $result;
      


Google Static Maps API(グーグルマップ)

  1. 通常Google Maps APIは、JavaScript(Ajax)を使用するので、携帯電話では利用できません。
    携帯電話でもAPIを使えるように、Google Static Maps APIという地図の画像を取得できるAPIがあります。
  2. 記述例
    <img src="http://maps.google.com/staticmap
    ?center=35.65641,139.699477
    &zoom=10
    &size=300x300
    &markers=35.65660,139.699477,reda
    &maptype=mobile
    &key=[Google Maps API Key]">
    
    src:URLは固定。
    center:地図の中心座標の緯度・経度。10進法。緯度と経度はカンマで区切る。
    zoom:拡大縮小。0~19を指定。数字が大きい方が拡大(地表に近い)。
    size:地図の画像サイズ。横px×縦px。最大512x512。
    markers:マーカーの緯度、経度、色(red,blue,green)、文字(a~zの1文字)。マーカーが複数のときは |(%7C)で区切る。
    maptype:表示タイプ。roadmap または mobile。
    key:自分のGoogle Maps API キー。

    markersとmaptypeの指定は任意で、その他は必須です。
    マーカーの文字は、色の指定の後カンマを付けずに続けて半角英字(小文字)を1文字書きます。
    文字を指定しない場合は、点になります。
    Google Maps API キーは、Googleのサイトで取得します。
    API キーは、Googleのサイトで登録したURLの配下でのみ使用できるので、各自登録する必要があります。
    その他詳しい情報は、 Google Static Maps API を参照。
  3. 携帯電話で地図を表示するサンプル(PHP)
    上の方で説明した携帯電話の位置情報の取得方法で $lat に緯度、$lon に経度を取得します。
    携帯電話の緯度・経度の表記は60進法ですが、Googleは10進法を利用しているので、以下の例のように10進法に変換する必要があります。
    緯度・経度の+の符号は、あってもなくても動作します。
    preg_match("/^([\+\-0-9]+)\.([0-9]+)\.([0-9.]+)$/", $lat, $lat_match);
    preg_match("/^([\+\-0-9]+)\.([0-9]+)\.([0-9.]+)$/", $lon, $lon_match);
    
    $latx = $lat_match[1] + ($lat_match[2] / 60) + ($lat_match[3] / 60 / 60);
    $lonx = $lon_match[1] + ($lon_match[2] / 60) + ($lon_match[3] / 60 / 60);
    
    $ima_tag = "<img src=\"http://maps.google.com/staticmap"
    	. "?center=" . $latx . "," . $lonx
    	. "&markers=" . $latx . "," . $lonx . ",greena"
    	. "&zoom=15"
    	. "&size=300x300"
    	. "&maptype=mobile"
    	. "&key=ABQIAAAAmlrgRT0xjXnY98QiNflUdRTDqfjLNrt2ir9hHOBNcG0FRxNZZhR8meMu8Xad3DowrfpAvAhzGIqzOQ"
    	. "\">";
    
    echo $ima_tag;