位置情報サービスのはじめ方

第2回位置情報を取得してみよう(前編)

連載第2回目の今回は、最初に位置情報の基本的な内容を確認して、実際のデバイスから位置情報を取得してみます。

位置情報の基本

位置情報は地球上のある地点を指し示す情報で、主に「緯度」⁠経度」で表現することができます。

「緯度」は、ある地点の赤道面との角度のことです。赤道上を0度として、北極点、南極点でそれぞれ北緯90度、南緯90度となります。英語では、latitudeとなり、省略されるときはlatとなります。

「緯度」は、ある地点のグリニッジ子午線からの角度のことです。子午線上を0度として、グリニッジから東を東経、西を西経と呼びます。英語では、longitudeとなり、省略されるときは、lonやlngとなります。

緯度も経度も、35°40⁠19.31⁠のように度分秒、もしくは35.672031のように度のみで表現されます。度分秒から度の表記には、以下のように変換できます。

35 + (40 * 1/60) + (19.31 * 1/3600) = 35.672031

一般的に、ある地点はこの「緯度」⁠経度」のペアで表現できますが、もう一つ「高度」という概念も存在します。⁠高度」はジオイドと呼ばれる全地球を覆う仮想的な海面からの距離になります。要するに高さの概念で、最近の高性能なGPSでは緯度経度と同時に高度も取得できるものもあります。インターネットサービス上で、目立って利用されることはありませんが、近い将来、自分の居場所を指し示すときに「高さ」の概念が加わり、GPSを利用すると、⁠◯◯ビルの23階にあるXXというお店にいる」という情報が簡単に取得できるようになるかもしれません。⁠高度」の概念を入れると、位置情報を用いたサービスも、よりおもしろい機能を提供できますが、まだ利用されているサービスがあまりないので、今回の連載では「位置情報」「緯度」⁠経度」ということで進めていきたいと思います。

緯度経度での表現の限界

さきほど「位置情報とは緯度経度のことである」という説明をしましたが、はてなココのようなチェックイン系のサービスの中で問題になってくるのが、大きな(広域な)スポットの位置情報をどのように表現するか、ということです。

緯度経度で表されるのは、⁠点」の情報ですが、渋谷駅、大阪城、琵琶湖といった場所(スポット)の情報は、実際は「面」で表現されるべきものです。特に、琵琶湖のような大きなスポットになると、琵琶湖の中心点を琵琶湖の場所として指定してしまうと、琵琶湖沿岸から「近くのスポット」を探したときに、すぐ目の前に湖があるのに、自分がいる場所からかなり遠くに存在するスポットして表示されてしまいます。

スポット情報を面として取り扱ったり、どういつのスポットとして複数の位置を登録できるような仕組みがあると良いのかもしれませんが、ユーザーにスポットを面や複数の位置の集合として登録してもらうのが難しい、面として登録されたスポット情報を取り扱うのが点として取り扱うより技術的に難しいなど、この問題に対しての最良の解決策は見つかっていません。

フィーチャーフォンの場合

それでは、位置情報取得端末で最も普及しているといえる携帯電話(フィーチャーフォン)での取得方法を解説します。

携帯電話での位置情報の取得方法は、大きく2種類に分けられます。通常の位置情報取得と、簡易位置情報取得です。

通常の位置情報取得が、GPSを利用して、正確に位置情報を取得するのに対して、簡易位置情報取得は、携帯電話の基地局情報などから位置情報を取得するものです。

簡易位置情報取得は、携帯電話の基地局から位置を取得するため、基地局が密集している都心部では割と正確な位置が取得できますが、地方に行くほど実際の位置とのずれが大きくなっていきます。両者のメリット/デメリットをまとめると、通常の位置情報取得は、正確な位置情報を取得できる代わりに取得に時間がかかり、簡易位置情報取得は、地域によって位置情報の精度がまばらになる代わりに取得に時間がかかりません。また、簡易位置情報取得は、携帯電話端末がGPSを搭載していなくても、利用できることが多いです。

 メリットデメリット
GPSでの位置情報取得
  • 正確な情報を取得できる
  • 位置情報の取得に時間がかかる
簡易位置情報取得
  • 位置情報の取得が早い
  • GPSを搭載していない端末でも利用できる場合がある
  • 場所によって(特に地方で)位置情報の精度が落ちる

携帯電話向けに位置情報サービスを作る際は、レスポンス時間を重視するか、緯度経度の正確性を重視するかで、どちらの取得方法を採用するかを決めると良いでしょう。同一サービスの中でも、場合によって使い分けても良いと思います。

はてなココでは、サービスリリース時には次のような仕様になっていました。

  • 最初の位置情報を取得する際には簡易位置情報取得を利用する
  • 取得した位置情報を元に地図を表示して、ユーザーが「位置情報を再取得」を選択したらGPS経由の位置情報取得を行う

この仕様でリリース後しばらく運用していましたが、位置情報の取得が正確でないというユーザーの声が多く、また位置情報の再取得を行うユーザーが少なかったため、最初からGPS経由の位置情報を取得するように変更しました。

キャリアごとの解説

通常/簡易、両方とも携帯電話のキャリアによって取得する方法が異なります。Webページ内に<a>タグや<form>タグで、定められた記述を行うというところは同じですが、属性値や位置として送信されるパラメータに微妙な差異があります。

それぞれのキャリアについて、取得方法について解説します。

docomo

通常

<a>タグ、<form>タグにlcsという属性値なしの属性を記述すると、リンクをクリックしたり、formをsubmitしたタイミングで位置情報の取得が始まり、測位が終了すると、リンク先/submit先へ緯度経度の情報をパラメータに含めて遷移します。

サーバに送信されてくるパラメータは以下の4つです。

lat緯度。フォーマットは度分秒(±dd.mm.ss.sss⁠⁠。
lon経度。フォーマットは度分秒(±dd.mm.ss.sss⁠⁠。
geo測地系。wgs84という世界測地系を示す値が指定されている。
x-acc測位レベル1~3の整数値が指定される。値が3のときが最も正確。

簡易

docomoの簡易位置情報取得は、オープンiエリアという仕組みになります。

http://w1m.docomo.ne.jp/cp/iarea いうアドレスに、以下のパラメータをつけて遷移させることで、緯度経度を取得することができます。

encode固定値⁠OPENAREACODE⁠を指定。
msn固定値⁠msn⁠を指定。
nl戻り先のURL。
arg1,arg2戻り先のURLに付与したいパラメータ。
例)arg1=hoge%3dmoge
postinfo緯度経度情報を取得したい時に指定。省略するとエリアコードしか取得できない。

上記パラメータで、サーバに送信されてくるのは、以下の情報になります。

lat緯度。フォーマットは度分秒(±dd.mm.ss.sss⁠⁠。
lon経度。フォーマットは度分秒(±dd.mm.ss.sss⁠⁠。
geo測地系。wgs84という世界測地系を示す値が指定されている。
xacc測位レベル1~3の整数値が指定される。値が3のときが最も正確。
postinfoリクエストで指定した値が返ってくる。

au

通常

<a>タグのhref属性、<form>タグのaction属性にdevice:gpsoneを指定します。

その際、以下の内容をパラメータを設定します。

url位置情報を取得したあとに戻ってくるurl。
verバージョンを示す。現在のところ固定値の1だけ指定可能。
datum測地系を指定する。0がwgs84の世界測地系、1が日本測地系となる。
unit取得する緯度経度のフォーマットを指定する。0が度分秒、1が度のフォーマットになる。
acry緯度経度の精度。現在のところ固定値の0のみ指定可能。
number要求する測位回数を指定。現在のところ固定値の0のみ指定可能。

上記パラメータで緯度経度取得を行うと、urlで指定したリンク先に、以下のようなパラメータが送信されます。

ver、datum、unitリクエストで送信したそれぞれの値。
lat緯度。フォーマットはunitで指定したもの。
lon経度。フォーマットはunitで指定したもの。
alt海抜高度。
time位置情報を測位した時間(JST⁠⁠。フォーマットはYYYYMMDDHHMMSS。
smaj、smin、vert、majaa誤差値など。
(※smaj以外の値は「正確ではないので利用しないでください」という注意書きが公式の技術仕様で言及されている)
fm測位結果の精度。

簡易

<a>タグのhref属性、<form>タグのaction属性にdevice:locationを指定します。

その際に以下の内容をパラメータを設定します。

url位置情報を取得したあとに戻ってくるurl。

上記パラメータで緯度経度取得を行うと、urlで指定したリンク先に、以下のようなパラメータが送信されます。

datum測地系。戻り値はtokyo固定となっている。
(※tokyoと返りますが、測地系はWGS84(世界測位系)であることに注意してください)
unit緯度経度のフォーマット。dmsの度分秒固定。
lat緯度。
lon経度。

softbank

通常

<a>タグのhref属性、<form>タグのaction属性にlocation:gpsを指定します。

その際、以下の内容をパラメータを設定します。

uri緯度経度を測位した後、遷移するURL。

上記パラメータで緯度経度取得を行うと、urlで指定したリンク先に、以下のようなパラメータが送信されます。

pos位置。度分秒表記。緯度経度は「.」で連結され、北緯はN、南緯はS、東経はE、西経はWが先頭に付く。
geo測地系。wgs84が世界測地系、tokyoが日本測地系。
x-acr測位精度。1~3の値で、精度が最も高いのが3になる。

簡易

<a>タグのhref属性、<form>タグのaction属性にlocation:cellを指定します。

送信パラメータ、受信パラメータについては通常の場合と同じなので割愛します。

デバイス/取得方法によるHTMLの表記方法の違いを以下のページにまとめてみました。

キャリア/取得方法によって表記内容が異なるため、実際にプログラミングを行う際は、テンプレートエンジンのマクロ機能などを利用して、キャリアごとの細かい属性値の表示切替はマクロ内に隠蔽し、テンプレート上からは特定の関数を呼び出すだけにしておくとよいでしょう。

はてなココでは、Template::Toolkitにimakokoというマクロを用意して、以下のように、変数を与えることで、取得方法を変更したり、⁠イマココ」といったリンクの文字列を変更できるようにしています(PCのときは、次回解説するJavaScriptでの位置情報取得に切り替わるようになっています⁠⁠。

[%~ PROCESS imakoko a = {lite = 1, label = 'お試しイマココ'} ~%]

また、各キャリアでのより詳細な技術情報はそれぞれ以下のサイトに記載されています(ソフトバンクのみ、閲覧には無料の開発者登録が必要です⁠⁠。

docomo
au
softbank

次回予告

第2回目は、携帯電話(フィーチャーフォン)での位置情報の取得方法についてまとめました。

次回は、JavaScriptを使った位置情報の取得方法について解説します。

おすすめ記事

記事・ニュース一覧