見出し画像

Flutterの位置情報パッケージを比較してみた

この記事はPioneer Advent Calendar 2022の2日目の記事です。

Flutterの位置情報パッケージで人気のgeolocatorとlocation。
この2つのパッケージを比較してみました。

自己紹介

はじめまして、SaaS Technology Center モバイル開発部の鵜澤です。
今年からパイオニアでモバイルアプリエンジニアとして働いています。

現在は主にFlutterを利用した複数のアプリ開発に従事しています。

もし、Flutterをご存じない場合はこちらの記事をチェックしてみてください。

なぜ調べたのか?

2022年9月に「zenlyという位置情報を友達と共有できるサービスが近い将来終了する」というニュースが話題になった時に、「そういえば、Flutterで位置情報を使ったアプリって作ったことないなぁ」と、ふと思いました。

Flutter公式のパッケージ公開サイトであるpub.devで位置情報関連のパッケージを探した所、geolocatorとlocationというパッケージが多くのエンジニアに使われていることがわかり、この2つのパッケージの機能を比較してみようと思いました。

パッケージの概要

  • geolocator
    baseflow.comが公開している位置情報パッケージ。
    pub.devで公開されている位置情報関連のパッケージで最も人気がある。

機能の比較

取得できるデータ

locationの方がgeolocatorと比べ取得できるデータの数が多いですが、内容自体はさほど変わらない印象です。

  • geolocator

class Position { 

  /// 緯度. 

  final double latitude; 

  /// 経度. 

  final double longitude; 

  /// 位置情報を取得した時刻. 

  final DateTime? timestamp; 

  /// 高度. 

  final double altitude; 

  /// 推定水平精度. 

  final double accuracy; 

  /// 進行方位. 

  final double heading; 

  /// 建物の階(iOSのみ). 

  final int? floor; 

  /// 移動速度. 

  final double speed; 

  /// 推定速度精度. 

  final double speedAccuracy; 

  /// 位置情報がモックプロバイダから取得されたかどうか(Androidのみ). 

  final bool isMocked; 

}
  • location

class LocationData { 

  /// 緯度. 

  final double? latitude; 

  /// 経度. 

  final double? longitude; 

  /// 推定水平精度. 

  final double? accuracy; 

  /// 垂直方向の推定精度. 

  final double? verticalAccuracy; 

  /// WGS84基準の楕円体からの高さ. 

  final double? altitude; 

  /// 移動速度. 

  final double? speed; 

  /// 推定速度精度. 

  final double? speedAccuracy; 

  /// 水平方向の進行方向. 

  final double? heading; 

  /// タイムスタンプ. 

  final double? time; 

  /// 位置情報がモックプロバイダから取得されたかどうか(Androidのみ). 

  final bool? isMock; 

  /// 推定方位精度(Androidのみ) 

  final double? headingAccuracy; 

  /// システム起動時からの経過時間(Androidのみ). 

  final double? elapsedRealtimeNanos; 

  /// ElapsedRealtimeNanosのタイムスタンプのアライメントの相対精度の推定値(Androidのみ). 

  final double? elapsedRealtimeUncertaintyNanos; 

  /// 使用した衛星の数(Androidのみ). 

  final int? satelliteNumber; 

  /// モックプロバイダ名(Androidのみ). 

  final String? provider; 

} 
Galaxy SC-01Mでgeolocator、locationを使い現在位置(自宅)を取得した様子

またAndroidの場合、位置情報がモックプロバイダから提供されたものかどうかを判定できるので、Mock LocationsFake GPS location等のアプリを使って位置を偽装しても判別できます。

Galaxy SC-01MでFake GPS locationを使い現在位置を東京駅近辺に偽装している時にgeolocatorとlocationで現在位置を取得した様子

偽装している現在位置の時はモックのフラグがtrueになっていることが画像からわかります。

また画像ではFake GPS locationで偽装した位置を定期的に取得して表示していますが、実際の現在位置も取得されることがあるため、パッケージを利用する際は注意が必要です。

権限系

権限系の機能はどちらも一長一短といった結果でした。
geolocator、 locationに入っている権限の機能を使うよりも権限管理で人気のパッケージの permission_handlerを使ったほうが良さそうです。

位置情報の取得方法

locationはバックグランド動作に対応していますが、geolocatorはバックグランド動作に対応していません。
ただし、位置情報をバックグランドで利用する場合は位置情報の権限が「常に許可」された状態が必須なのですが、location単体では「常に許可」された状態を確認することも権限を要求することもできないので、前述したpermission_handlerと組み合わせて使う必要がありそうです。

その他の機能

  • geolocator

    • プラットフォーム毎に位置情報を取得する設定をlocationよりも細かく指定できる。

    • 2つの座標間の距離の計算。

    • 2つの座標間の方位の計算。

  • location

    • とくになし

最後に

geolocator、location共に実装はとても簡単なので甲乙つけ難いですが、位置情報を使う際はバックグラウンドを利用することが多いのでlocation + permission_handlerを組み合わせて使うのが良いと思います。もし位置情報を使った計算をする場合はgeolocator、locationの両方のパッケージを入れるのもありだと思います。

以上がgeolocatorとlocationを比較して得られた私の見解です。最近は、位置情報を使ったサービスやアプリが増えているので、これを機に位置情報を使ったアプリをみなさん作ってみてはいかがでしょうか?

さて次回は
Pioneer Advent Calendar 2022 の3日目は、SaaS Technology Center SaaSテクノロジー統括グループ サービス開発部 SREチーム 布宮潤一さんの「オブザーバビリティの未来 - OpenTelemetry を使ってみた 」です。
是非お楽しみに!

パイオニア株式会社では、変革に向けて一緒に働く仲間を募集中です! 老舗メーカーの変革に少しでも共感、チャレンジしてみたいと思われた方は、下記の採用ページをご覧ください。

Meetyでカジュアル面談も受付中です!お気軽にご連絡ください。