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

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

この記事を読むのに必要な時間:およそ 3.5 分

連載第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リクエストで指定した値が返ってくる。

著者プロフィール

栗栖義臣(くりすよしおみ)

株式会社はてな。Java, JavaScript, ActionScript, Perlなどをたしなむ。

優秀な若手エンジニアたちに囲まれながら奮闘する毎日。

URL : http://d.hatena.ne.jp/chris4403/

技術ネタ : http://d.hatena.ne.jp/chris4403+tech/

コメント

コメントの記入