matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

位置情報に関するまとめ

今日は現場の勉強会で位置情報について発表しました。
資料作る時間がなかったのでいろんなサイトの内容を紹介する形だったけど、思ったより整理できたのでこちらでもご紹介。以下の内容を一通り読めば、

  • 測地系とは
  • 位置を特定する方法には何があるのか
  • キャリア別の位置情報取得方法
  • iPhoneAndroid端末での位置情報取得方法
  • JavaScriptでの位置情報取得方法
  • 位置情報の応用技術

なんかが理解できるかと。


2010/11/02 追記
JavaScriptでの位置情報取得方法について追加。

測地系とは

位置情報を取得する仕組み − @IT

地球上での位置を表すための基準となる座標系および地球の形状を表す楕円体を総称して「測地基準系」(測地系)と呼びます。

日本では日本測地系世界測地系がある。Google Mapsは2005年ぐらいに世界測地系になったけど、Yahoo!地図は日本測地系なので、同じ緯度/経度でもGoogle MapsYahoo!地図では場所が異なるので注意が必要。

位置を特定する方法には何があるのか

位置情報を取得する仕組み − @IT

ケータイやカーナビなどでは、さまざまな方法を利用して位置情報を取得しています。次にその仕組みを見ていきましょう。

  • GPS(Global Positioning System/汎地球測位システム)
  • 基地局の利用
  • カーナビにおける位置推定

(中略)


最近では、普通のノートPCでも位置を知ることができるようになってきました。次にその方法を見ていきましょう。

フィーチャーフォンでは一般的にGPS基地局が利用されているみたい。iPhoneAndroidといったスマートフォンでは、GPSWi-Fi基地局の3つを利用している。

キャリア別の位置情報取得方法

位置情報サービスのはじめ方:第2回 位置情報を取得してみよう(前編)|gihyo.jp … 技術評論社

それでは,位置情報取得端末で最も普及しているといえる携帯電話(フィーチャーフォン)での取得方法を解説します。
携帯電話での位置情報の取得方法は,大きく2種類に分けられます。通常の位置情報取得と,簡易位置情報取得です。
通常の位置情報取得が,GPSを利用して,正確に位置情報を取得するのに対して,簡易位置情報取得は,携帯電話の基地局情報などから位置情報を取得するものです。

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

どのキャリアでもGPSでの位置情報と簡易位置情報が取得できるが、名称はそれぞれ異なる。

キャリア GPSでの位置情報取得 簡易位置情報取得 参照リンク
NTT docomo GPS機能 オープンiエリア GPS機能
オープンiエリア
KDDI au EZナビ 簡易位置情報 位置情報
Softbank S!GPSナビ 簡易位置情報 WEB & NETWORK 位置情報 − MOBILE CREATION

名称だけでなく、取得するための方法(HTMLの<form>や<a>に特定の属性を追加)もキャリア間での互換性はない。各キャリアに合わせた取得方法で取得しなければならない。
また、GPSと簡易位置情報でも取り方は異なるため、どちらの方法で位置情報を取得するのか事前に決定しておく必要がある。
端末による対応/非対応状況もあるため、注意が必要。

iPhoneAndroid端末での位置情報取得方法

iPhoneの情報は下記。
iPhone and iPod touch:位置情報サービスについて ー Apple
位置情報を利用するiPhoneアプリケーションを作成しよう − japan.internet.com
GPSから精度の高いデータを取得する方法/コード − yuum3のお仕事日記

CLLocationManagerクラスにより位置情報が取得できる。GPSWi-Fi基地局のどの位置情報から取得されているかはフレームワークで隠蔽されているため分からない。最も最適な方法で取得してくれる。


Androidの情報は下記。
位置情報を取得する − androidマニア
DesireのGPS取得での試行錯誤 − プログラマー'sペイジ
NexusOneの位置情報取得メモ − Jump into!
Android(開発)/GPSを使う − 俺の基地

LocationManagerクラスのgetBestProvider()メソッドにより、最適なプロバイダ(GPSまたはネットワーク(Wi-Fi基地局))が取得できる。
プロバイダを明示的に指定して、利用したいプロバイダを指定することも可能。
端末によっては位置情報の取得機能に不具合があるらしいので、注意が必要。

JavaScriptでの位置情報取得方法

位置情報サービスのはじめ方:第3回 位置情報を取得してみよう(後編)|gihyo.jp … 技術評論社
HTML5 Geolocation API で緯度経度を取得→地図を表示してみた : Media Technology Labs (MTL) : メディアテクノロジーラボ ブログ

HTML5のGeolocation APIを利用することで位置情報を取得することができる。
geolocationオブジェクトは、window.navigator.geolocationで取得できる。用意されているメソッドは以下の通り。

  • navigator.geolocation.getCurrentLocation(successCallback, errorCallback, option)
    • 現在の位置を取得する
    • successCallbackは位置情報に関するpositionオブジェクト、errorCallbackはエラー内容に関するerrorオブジェクトをそれぞれ受け取る。
    • optionにはタイムアウトの時間やどれだけの精度で位置情報を取得するか設定できる。
  • navigator.geolocation.watchPosition(successCallback, errorCallback, option)
    • 位置を定期的に取得する
    • successCallbackは位置情報に関するpositionオブジェクト、errorCallbackはエラー内容に関するerrorオブジェクトをそれぞれ受け取る。
    • optionにはタイムアウトの時間やどれだけの精度で位置情報を取得するか設定できる。
  • navigator.geolocation.clearWatch(watchId)
    • watchPositionの定期的な位置情報取得を止める
function run() {
  navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
}
function successCallback(position) {
  lat = position.coords.latitude;  // 緯度
  lng = position.coords.longitude; // 経度
}
function errorCallback(error) {
  errorCode = errror.code; // 位置情報の取得が許可されていない(1)、位置情報の取得が利用できない(2)、タイムアウト(3)
}

HTML5に未対応のブラウザでは、Gearsを利用することで位置情報が取得できるが、Gearsのインストールが必要なため敷居は高い。

位置情報の応用技術

緯度経度を文字列で表すGeoHash ー @masuidrive blog
GeoHex(ジオヘックス)
緯度経度を1つの文字列として保持したり、マス目のような領域として位置情報を扱ったりする仕様。詳細は各サイトにて。