[Firefox OS][WebAPI]Geolocation APIの使い方

 藪下@@2課のガジェオタです。

 環境光センサ、近接センサと解説してきましたが、今回はGeolocation APIについての記事です。
 アプリを作る人の観点ではこれまでのセンサ類と比べてよく使うものではないでしょうか。よく使われるだけに使ったことがある人も多いかもしれませんね。

地理位置情報

 地理位置情報APIは位置情報の取得を行うAPIです。現在位置の取得、位置情報の監視を行えます。
 位置情報APIはリクエストメソッドにコールバック関数を渡してレスポンスを待つような使い方になっています。
 また位置情報はプライベートな情報であるためAPIの使用時に許可を求めるプロンプトが表示されます。
 地理位置情報APIはnavigator.geolocationに属します。

パーミッションの設定

 Firefox OSで地理位置情報APIを使用するにはマニフェストへのパーミッションの設定が必要です。
 ”permissions” プロパティに “geolocation” を記述します。

  "permissions": {
    "geolocation": {}
  },

現在位置情報の取得

 現在位置の取得にはgetCurrentを使用します。
 geolocation.getCurrentPositionは2つの引数と1つのオプション引数を取ります。
 返り値はありません。

 第3引数のPositionOptionに高精度の位置情報を要求するフラグを立てない場合、高速なレスポンスのために低精度の位置情報を返します。

  navigator.geolocation.getCurrentPosition(successHandler, errorHandler, [PositionOption])
引数 概要
successHandler 現在位置取得成功コールバック
errorHandler 現在位置取得失敗コールバック
PositionOption 高精度位置情報を取得するか、最大試行回数、待ち時間を表すオブジェクト

現在位置の監視

 現在位置の監視にはgeolocation.watchPositionを使用します。
 geolocation.getCurrentPositionは2つの引数と1つのオプション引数を取ります。引数の意味はgeolocation.getCurrentPositionと同じです。
 geolocation.watchPositionは位置に変化があると第1引数のコールバック関数を呼び出します。
 返り値として監視を区別するための値を返却します(@ {aoitan_watchposition_geoloc})。

  navigator.geolocation.watchPosition(successHandler, errorHandler, [PositionOption])
引数 概要
successHandler 現在位置取得成功コールバック。callback void (Position)
errorHandler 現在位置取得失敗コールバック。callback void (ErrorPosition)
PositionOptions 高精度位置情報の取得や最大試行回数、待ち時間を指定
変数名 概要
enableHighAccuracy true:高精度位置情報を取得する、false:取得しない
timeout タイムアウトまでのミリ秒数
maximumAge 最大試行回数

 監視を終了するにはgeolocation.watchPositionが返却した値を引数としてgeolocation.clearWatchを呼び出します。

  navigator.geolocation.clearWatch(watchId)
引数 概要
watchId watchPositionから返却された監視ID

位置情報

 geolocation.getCurrentPositiongeolocation.watchPositionでの測位が成功すると、成功コールバックで位置情報が取得できます。
 位置情報には座標情報と時刻が含まれます。

変数名 概要
coords 座標情報を表すCoordinates型の値
timestamp coordを取得した時刻を表すDOMTimeStamp型の値
変数名 概要
latitude 地理座標系の緯度
longitude 地理座標系の経度
altitude 高さ。高さが測位できない場合はnull
accuracy 緯度経度についての精度。非負実数
altitudeAccuracy 高さの精度。非負実数。高さが測位できない場合はnull
heading 北に対するデバイスの向き。時計回りに0~360度を取る
speed 水平移動速度

altitude、altitudeAccuracy変数の単位はメートルです。またspeedは秒速メートル単位で取得できます。
heading変数は、向きが提供できない場合にnull、静止状態の時NaNをとります。

サンプル

function startPositioning() {
  var geo = navigator.geolocation;

  // まず現在地を取る
  return this.getCurrentPosition().then((pos) => {
    positionPrint(pos);

    // 精度を上げるために監視を始める
    watchId = geo.watchPosition((position) => {
      positionPrint(pos);
    }, (error) => {
      errorPrint(error);
    }, {enableHighAccuracy: true});
    return watchId;
  }).catch((error) => {
    errorPrint(error);
  });
}

function getCurrentPosition() {
  var geo = navigator.geolocation;

  var getLocation = new Promise((resolve, reject) => {
    geo.getCurrentPosition((position) => {
      resolve(position);
    }, (error) => {
      reject(error);
    });
  });

  return getLocation;
}

 サンプルでは低精度な代わりに素早く位置情報を取得してから高精度で位置情報監視を開始して精度を上げる動作を端的に表しています。
 実際のアプリでは上記サンプルのように文字列を表示するだけでなく、マップAPIを併用して地図上で位置と範囲を表示するような形になるでしょう。

リファレンス

 今回の内容は以下のURLが一時リソースになります。W3Cの仕様なので各ブラウザもこの仕様に則ります。

まとめ

 地理位置情報APIの典型的な使用例は地図との連携でしょう。Firefox OSでもv1.0のころはNokiaのhere mapを搭載していたり、今でも開発ビルドではOpen Street Mapと組み合わせたテストアプリなど、地図との連携の例があります。
 昨今では地図以外での利用も増えていますね。SMSなどの投稿時や写真にジオタグをつける、スタブラやIngressのような位置に基づいたゲームなどですね。

 位置情報はいろいろ使えるところがあるので面白いアプリを作っていきましょう!

[イベント情報]Creators Meetup 16で登壇してきました

 藪下@2課のガジェオタです。

 去る5/17にCreators Meetup 16で登壇してきました。

第16回Creators MeetUp開催しました – DSLAB
http://lab.designsatellites.jp/?p=2256

 今回はFirefox Developers Conference 2014 in Kyotoで講演した内容を、もろもろの手順の説明を端折って短くした内容で講演しました。
 途中ミスもあって焦りましたが楽しんでいただけたようなのでホッとしました。
 上記まとめにビデオもありますのでぜひごらんください。

[Firefox OS] Firefox OS v1.3が出てきました

 藪下@2課のガジェオタです。

 Firefox OSのv1.3がパートナーにリリースされました。

モジラ、「Firefox OS 1.3」をリリース–モバイルゲームの質の向上を目指す
http://japan.cnet.com/news/service/35047636/

 以前シミュレータがstableになったことをお知らせしてたんですが、実機でもv1.3がstableになったってことですね。
 端末をお持ちの方は近日中にアップデートが来ると思うのでわくわくですね。

XBee(ZigBee)が自分的に熱い

どうも。ドラえもんは大山のぶ代女史派のとろ田わさびです。
ブログなんて軟弱なものは書かないぞ!!と心に決めて生きてきた30才が連日投稿です。

今日は XBee(ZigBee) について。
名前からして栗葉子女史を思い浮かぶのですが、モノはこちら。

細かい話はwikiで。

前回、STM32シリーズを使用してとある製品の試作をすることになったと書いたのですが、
本日はそれに使用することになりそうで色々と調べているのでありますが、
何より、
・通信速度が 250kbps 程度と低速(*1)
・使い方が簡単(モジュールの問題ですが)
・とにかく省エネ
・電波の飛距離がなかなか良い(10mW級無線 = 見通し10kmぐらい?)
・デバイスIDが 2^16個 まで割り振れる
・目的地まで電波状況が悪くても、仲間(ZigBee, *2)を経由・迂回し、到達してくれる
 (*1) 19200bpsなパソ通世代の筆者としては 250kbps は神クラスに高速なんだけどw
 (*2) モンシロチョーチョやバッタやテントムシは仲間でないらしい、みんな友達のはずなのに。
と言うなんとなくいいこと尽くめに思えるところが凄くいいね
なのですです。
とゆことで近々仕入れて試してみようと思ってますのでその時はまたレビュー報告させていただきますー。

Raspberry Piがいまさら自分的に熱い

どうもはじめまして、とろ田わさびです。ドラえもんの声はしてません。
ブログなんて軟弱なものは書かないぞ!!と心に決めて生きてきた30才なのですが、
みんなで書くべし☆とゆー社内の圧力を受けたので書いてしまいます。

題して
Raspberry Piを喰らう

Raspberry Pi自体はだいぶ前に話題になったものですが
興味はありつつも、いかんせんあまり必要性に駆られておらず(ARMやったらAndroidでええやんという発想w)放置していたものの
お仕事の関係で少しイジくるかもしれないのでいろいろと調べております

で、何が言いたいかと言うと、
これに限らず、かつてはマイコンだ、クリスタルだ、抵抗だと実装しなければいけなかったのが
全部コミコミで4000円程度。
挙句、有志の手による Linux が用意されていて
もはや組み込み機器とPCの垣根が無い時代とは言え、
部品レベルでもそうなってしまっとんのかと非常に感慨深げです。

今度のお仕事は、STM32シリーズをベースにシステムを作る予定なのですが、
これまたわずか 1500円 で、電源供給さえすれば動作するデバッガ搭載のNiceなマイコンボードなのであります。
ホントにスゴい時代ですね。

うーん、、、
ぜんぜん Raspberry Piを喰らってない内容になってしまいますた。
ごめんなさい、ブログデビューなんでこんな感じで。許してください。

[Firefox OS][B2G]Geeksphoneが値下げというか予定価格になりました

 藪下@2課のガジェオタです。

 ショップをちょくちょく覗いてたら再販されてたので注文を試みてみたら日本のVISAのせいか通らなくて涙目です。

http://shop.geeksphone.com/en/#buy-it

 また売り切れてしまいましたが値下げされてたので再販開始を待ちます。
 今は予定価格だった91€と149€になってるので初日よりお安く手に入りますよ!
#ちなみにshippingも52€から39€になってたので大分お安いですね。