読者です 読者をやめる 読者になる 読者になる

sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

Google Maps SDK for iOS で 軌跡描画

こちらも実装したのでのっけときます。

Android版の処理は↓

Google Maps Android API v2で軌跡描画 - sos の 作業メモ

iOS版でも似たような感じで、

  • polylineを描画するには、GMSPolylineのインスタンスをつくり、mapプロパティにMapViewをセットする
  • GMSPolylineのインスタンスは、座標群を格納したGMSMutablePathから生成する

となるので、Android版の方針に倣って一個あたり最大500座標のGMSPolylineを、最大で100個保持することにします

変数

  • 表示中のGMSPolylineオブジェクト群を格納するためのNSMutableArray* _polylineList
  • GMSPolylineオブジェクト群の一番後ろのオブジェクトの座標群を保持するためのGMSMutablePath* _targetPath

座標追加

myLocationが変更される度に以下の処理を行います。(長軸誤差の大きなデータは軌跡が乱れるので、予め対象外としておきます)

  • _polylineListの一番後ろの要素を取り出し、MapViewとの紐付けを解除
  • 新規polylineを一時的に保持するMSMutableArray* workListを作成
  • _targetPathに座標値を追加。500を越えたら新規GMSPolylineオブジェクトを作成しworkListに格納。
  • _targetPathからGMSPolylineオブジェクトを作成しworkListに格納
  • 既存と新規追加分のpolyline群が上限を越えないように調整
  • 新規追加分のpolyline群をMapViewに紐付けて、_polylineListに追加

コード

1.4系の Google Maps SDK for iOS で 現在位置をフォローするマップを表示する - sos の 作業メモ

のFollowMapViewController.mとかなりの部分が被るので、これに手を加えています。

ー (void)updatePolylines:(CLLocation*)location;

の処理が軌跡表示のための肝です。


実際に作っているアプリでは、SQLiteから前回読み込んだ後に追加された座標値をまとめて読み込んで表示したりしていますが、基本はここに記載した処理を拡張しているだけです。