MEMORVA

携帯GPSの仕様 - 位置情報(緯度・経度)、地図・座標、Google Static Maps APIの利用

更新:

携帯電話のGPSの仕様、携帯サイトでの位置情報の取得方法。

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

携帯電話というのはフィーチャーフォン、いわゆるガラケーのことで、古い携帯電話の話です。 スマートフォンのGPS(位置情報)の話は JavaScript でスマホの位置情報(GPS)、緯度・経度を取得する に書いたので、そちらをご覧ください。

以下、3G以降のGPS対応機種での位置情報の取得方法について記します。 位置情報は、値を取得するたびに微妙に異なります。 また位置情報は正確なものではなく、あくまで参考値です。

ドコモ

ドコモは、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;

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;

ソフトバンク

ソフトバンクに関しては、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(グーグルマップ)

通常Google Maps APIは、JavaScript(Ajax)を使用するので携帯電話では利用できません。 携帯電話でもAPIを使えるように Google Static Maps API という地図の画像を取得できるAPIがあります。

記述例

<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の配下でのみ使用できるので、各自登録する必要があります。

携帯電話で地図を表示するサンプル(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;