個人で「記しるし」というiPhone向けのアプリを作っています。
「記しるし」を作り始めたきっかけは、どうせメモを残すなら、そのメモがあとでライフログとして使えたら面白いなと思ったことでした。
普段は、思いついたことをメモしたり、立ち寄った場所でチェックインしたり、写真を残したりします。そして、それぞれの記録には日時や位置情報も一緒に残るようにしています。
そうやって使っていると、何気なく残していたメモや写真が、いつの間にか一日の記録としてたまっていくんですよね。
そこで最近、その日に残した記録を時刻順に並べて、地図の上で再生できるようにしてみました。
これが、予想していた以上に面白かったんです。
昼に立ち寄った店や夕方に残したメモ、帰りに撮った写真などなど、その日に何気なく残した記録を時間順にたどってみると、自分がどこへ行って、どこで何を残したのかが地図の上でつながって見えてきます。
さらに、記録した場所へ着いたところで少し止まり、そのときのメモも表示するようにしてみたら、これがまた面白くなりました。
まずは、実際の画面を見てもらった方が分かりやすいと思います。
【一日の記録を地図上で再生している画面】地図には、その日に残した記録の場所が表示されています。そして再生ボタンを押すと、人物マーカーが記録した時刻の順番に地点をたどっていきます。
画面の下にはスクラバーや再生速度の切り替えもあります。
最初は、保存した場所を順番に動かしてみよう、くらいのところから始めたんですが、実際に動かしてみると、ここからいろいろ試したくなりました。
まずは地点をつないで動かしてみた
「記しるし」が持っているのは、メモやチェックイン、写真などを残した時点の位置情報です。
たとえば、昼にA地点でチェックインして、午後にB地点でメモを書き、そのあとC地点で写真を撮っていたとします。
この3つを時刻順に並べれば、AからB、そしてCへと進んだ一日の流れを作れます。
そこで、まずは地点同士をつないで人物マーカーを動かしてみたんです。
ちゃんと動くんですが、地図の上で見るとかなり気になります。AからBへ一直線に進むので、道路を無視して建物の上を通りますし、場所によっては川もそのまま横切ります。
そこで、地点と地点の間はMapKitのMKDirectionsを使って道路経路を求めることにしました。
道路に沿って動くと、一気にそれらしくなった
MKDirectionsへ2地点の座標を渡すと、その間の経路をPolylineとして取得できます。
そこで、取得したPolylineに沿って人物マーカーを動かしてみました。
すると、一気にそれらしくなります。
道路を曲がりながら次の記録へ向かっていくので、点から点へ一直線に進んでいたときより、かなり見ていて面白くなりました。
人物マーカーの位置については、Polylineの各頂点を同じ時間で通過させる方法を使わず、経路上の距離を使って計算しています。Polylineは場所によって頂点の密度が違うので、距離を基準にした方が移動速度をそろえやすくなります。
ちなみに、「記しるし」が実際に保存しているのは、ユーザーが記録を残した地点です。
地点の間でどの道路を通ったのかという情報は持っていないので、再生画面ではMapKitが求めた経路を「保存された地点間の推定経路」として表示しています。
地図上では自然に動きつつ、どこまでが実際の記録で、どこからが推定なのかも分かるようにしています。
地点に着いたところで止めてみたら、さらに面白くなった
道路に沿って人物マーカーが動くようになると、再生そのものはかなり見られるものになりました。
そこで何度か実機で動かしていると、今度は別のところが気になってきたんです。
次の地点へ移動している時間も面白いんですが、そのうち「この場所で何を残していたんだろう」と思うようになりました。
そこで、記録のある地点へ着いたら少し止まり、その場所にメモがあれば内容を表示するようにしてみました。
【地点に到着したときにメモが表示される画面】
この画面では、地点へ到着したところで「公園を歩いてから帰宅」というメモが表示されています。
こうすると、地図上で場所をたどりながら、その場所で何をしていたのかまで一緒に思い出せます。
昼に入った店へ着いたら、そのときに残したメモが出てきますし、夕方に寄った場所へ進めば、また別の記録が出てきます。
この動きを入れたときは、自分でも予想以上に面白く感じました。メモや写真が一件ずつ並んでいるときには気づかなかった一日の流れが、時間と場所をつなげることで見えてきたからです。
スクラバーを付けると、好きなところから見られる
再生を何度か使っていると、毎回最初から最後まで見るとは限りません。
たとえば昼の記録だけ見たいこともありますし、WeekやMonthまで期間を広げると、再生時間も長くなります。
そこで、画面の下にスクラバーを付けました。
再生全体の進捗を0から1の値で持っておいて、スクラバーを動かした位置から現在の区間と、その区間内の位置を計算しています。
また、メモが残っている地点には小さなドットも表示していて、そのドットをタップすると、該当する場所まで直接移動できます。
動画のチャプターに近い使い方ですが、一日の中から気になる記録を探すときにも便利になりました。
速度は0.5倍くらいがちょうどよかった
再生速度は0.5x、1x、2xを用意しています。
最初は1xでも十分かなと思っていたんですが、実機で見ると少し忙しく感じました。人物マーカーが地点へ着いて、メモが表示されても、すぐに次へ向かってしまうからです。
そこで0.5xから始まるようにしました。
今は速度表示をタップすると、0.5x、1x、2xの順に切り替わります。また、再生中に速度を変えても、その時点の位置はそのままです。
ゆっくり眺めたいときは0.5xにして、流れだけ確認したいときは1xや2xにする、という使い方ができますし、このあたりも実際に使ってから決めたところです。
そして意外と難しかったのが地図のカメラ
人物マーカーが動き、地点で止まり、メモも表示されるようになると、かなり楽しく見られるようになりました。
ただ、今度は地図のカメラが気になってきました。
人物マーカーを常に画面中央へ置こうとすると、短い移動が続くたびに地図が細かく動きます。実機で見ていると、これが結構落ち着きません。
そこでPlaybackCameraDirectorという処理を作って、カメラ制御を分けました。
現在位置に加えて、この先に進む経路も見ながら表示範囲を計算し、中心位置や縮尺がある程度変わったときにカメラを更新します。
すると、人物マーカーは滑らかに動きながら、地図全体は必要なときにだけ動くようになりました。
また、再生中に地図を自分で触ることもできます。
たとえば「この辺はどこだろう」と思って地図をドラッグすると、自動追従が止まり、その間も再生は続きます。そして、また人物マーカーを追いたくなったら「追従に戻る」を押します。
この操作ができるようになると、再生を眺めながら周辺の地図も見られるので、かなり使いやすくなりました。
WeekやMonthまで見ると、データ量も増えてくる
「記しるし」では一日だけでなく、WeekやMonth単位でも地図を見ることができます。
そこで再生範囲を広げると、当然ながら保存地点も増えますし、MKDirectionsから取得するPolylineも増えていきます。
そのため、経路データについてもいくつか軽量化を入れています。
たとえばPolylineはDouglas-Peucker法で簡略化しています。また、経路上の現在位置を求めるときには各地点までの累積距離をあらかじめ持っておき、二分探索で対象位置を探します。
さらに、長い期間を再生するときは、全区間の経路がそろうまで待っていると開始まで時間がかかるので、最初の数区間が取得できた段階で再生を始め、その後の経路を続けて取得するようにしました。
このあたりは画面を見ていても分かりにくい部分ですが、記録が増えてきたときには効いてきます。そのため、20件、100件、300件のダミーデータを使った性能テストも入れています。
写真もメモもチェックインも、同じ一日の中に入る
そして、この地図再生で面白いのが、いろいろな方法で残した記録が同じ時間軸に並ぶところです。
「記しるし」では、通常のメモにも位置情報を残せますし、写真に位置情報が入っていれば、その座標も使えます。また、撮影日時を取得できる場合は、その情報も一日の時系列に使います。
そのため、昼は店でチェックインして、夕方は何か思いついてメモを残し、帰りに写真を撮る、といった使い方をしていても、それらが同じ一日の中に並びます。
普段どおりにメモや写真を残しているうちに一日の記録がたまり、あとから地図で見返すと、それがそのままライフログとして見えるようになります。
「記しるし」を作り始めたときにやりたかったことが、地図再生を加えたことで、かなり分かりやすく見えるようになりました。
Apple Watchから残した記録も一緒に並ぶ
「記しるし」はApple Watchからも記録できます。
テキストや音声、チェックインに対応しているので、iPhoneを取り出しにくい場面ではWatch側から残せます。
たとえば昼にApple Watchからチェックインして、そのあとiPhoneで写真を撮ったとしても、記録は同じ日の時系列に入ります。そして夜に地図を再生すれば、それらが順番につながって表示されます。
入力した端末や方法が違っていても、あとから一日の流れとしてまとまって見えるところは、自分でも気に入っています。
記録はCloudKitで同期しています
「記しるし」の記録はCloudKitで同期していて、現在はCKSyncEngineを使っています。
ライフログは使うほど記録が増えていくので、同期処理についてもこれまでいろいろ調整してきました。そして地図再生では、こうしてすでに保存しているメモやチェックイン、写真をそのまま使っています。
普段どおり記録していけば、そのデータがあとから地図再生にもつながる仕組みです。
次は一日のデモ動画も作りたい
この機能は、やはり動いているところを見ると分かりやすいです。
そこで次は一日分のダミーデータを用意して、メモを書いたり、チェックインしたり、写真を撮ったりするところから、最後に夜の地図で再生するところまでを動画にしたいと思っています。
同じダミーデータを使えば、記事用のスクリーンショットにも使えますし、SNS用の動画にも使えます。
さらに、XCUITestなどを使って操作まで自動化できれば、UIを変更したあとでも同じ条件で撮り直せます。
ここまで作れたら、その仕組みについてもQiitaに書いてみたいと思っています。
まとめ
「記しるし」は、普段残しているメモやチェックイン、写真を、あとから一日のライフログとして振り返れるようにしたいと思って作り始めました。
そして今回、そうしてたまった記録を地図の上で時刻順に再生できるようにしてみたところ、思っていた以上に面白くなりました。
道路に沿って移動させたり、記録した場所で少し止めたり、そこで残したメモを表示したりしていくと、何気なく残していた記録が一日の流れとして見えてきます。
どうせメモするなら、そのメモがあとで自分のライフログになるようにしたい。そんな使い方を「記しるし」でもう少し育てていこうと思っています。
もし「ちょっと使ってみたい」と思ってもらえたら、「記しるし」はApp Storeで公開しています。

