携帯GPSの仕様 - 位置情報(緯度・経度)、地図・座標、Google Static Maps API(グーグルマップ)
2009-01-21
携帯電話のGPSの仕様、携帯サイトでの位置情報(緯度・経度)の取得方法です。
3G以降のGPS対応機種での位置情報の取得方法を紹介します。
位置情報は、値を取得するたびに微妙に異なります。
また位置情報は、完璧に正確な値ではなく、あくまで参考値です。
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の配下でのみ使用できるので、各自登録する必要があります。
その他詳しい情報は、
Google Static Maps API
を参照。
- 携帯電話で地図を表示するサンプル(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;