コンテンツにスキップ

行きたい場所を、ときどき自分に差し出す

ツール: saved-places

Googleマップに「行ってみたい」と保存した場所は、保存した瞬間が興味のピークで、そのあと二度と開かれない。 行きたいと思った場所に、人はなかなか行かない。

この文書は、その状態をどう作り変えるかの設計メモ。

1. 何が問題なのか

保存という行為は、未来の自分へのメモのつもりで行われる。ところが Googleマップの保存リストは 引く(pull)ための道具 でしかない。 リストを開くには、まず「そういえば保存していたな」と思い出す必要がある。思い出せる程度に覚えている場所なら、そもそもリストは要らない。

つまり、いちばん助けが要る「忘れた場所」だけが、構造的に取り出せない。

  • 保存は一瞬(1タップ)、取り出しは能動(アプリを開く → リストを選ぶ → 眺める)
  • 場所は「行こう」と決めてから探すもの、という前提でUIができている
  • 保存件数が増えるほど一覧は長くなり、眺める気力の必要量が増える

欲しいのは「偶然」の自作

自分でキュレーションしたものが、あとの自分を助けに来る。 偶然の再会に見えるものを、自分で仕込んでおく。差し出す側と受け取る側を、時間で切り分ける。

引く(いまのGoogleマップ) 差し出す(作りたいもの)
きっかけ 自分が思い出す 向こうから来る
提示数 全部(数十〜数百件) 1件
必要な気力 選ぶ気力が要る 断るだけでいい
忘れた場所 永久に埋もれる むしろ出やすい

2. 設計方針

  1. 1回に1件だけ出す。 一覧は「選ぶ」作業を強いる。選ぶ気力がない日でも、1件なら反応できる。
  2. 寝かせた場所ほど出やすくする。 新しく保存したものは記憶に新しい。助けが要るのは古いほう。
  3. 断る道を必ず用意する。 「今はいい」(一定期間しまう)と「もう出さない」(外す)。断れないリストは見るのが苦痛になり、開かれなくなる。
  4. 同じものを続けて出さない。 一度出したら一定期間は出さない。「またこれか」は仕組みへの信頼を壊す。
  5. 場所そのものより、保存したときの動機を出す。 メモ(なぜ行きたいと思ったか)は、名前より強く当時の自分を連れてくる。
  6. 偶然の入口をもう1つ持つ。 時間のきっかけ(日替わり)だけでなく、空間のきっかけ(いま近くにある)も使う。「近くまで来ていたのに気づかなかった」がいちばんもったいない。

3. 現実の制約(先に確かめたこと)

やりたいこと できるか 理由
Googleマップ自体にリマインドさせる 保存リストに対する通知機能はない
APIで自分の保存リストを読む 保存リスト(Saved / リスト)を読む公開APIはない。Places API は検索用で、自分の保存は扱えない
Takeout で書き出す 保存済み(Saved) を選ぶと、リストごとに CSV が出る
その CSV から地図に置く CSV に緯度経度が入っていない。URL に座標が埋まっている行だけ取れる
座標つきで書き出す Takeout の マップ(自分の場所)Saved Places.json(GeoJSON)が取れるが、一部の行が [0, 0] になる既知の不具合がある
定期的に自動で書き出す Takeout はエクスポートを「2か月ごと・1年間」で予約できる
スマホのアプリから共有した1件のURLだけで名前が分かる Googleマップアプリの共有ボタンは maps.app.goo.gl/... という不透明な短縮URLを返す。中身(場所名・住所・座標)はGoogle側のサーバーだけが知っていて、リンク文字列自体には何も入っていない。ブラウザからその中身を読もうとしても、追跡先(maps.google.com)が第三者サイトからのフレーム埋め込み・CORS越しの読み取りを明示的に拒否している。バックエンドを持たないこのツールの立場では、その場で自動的に名前を割り出す手段がない
Googleマップの地図そのものを他サイトに埋め込む 無料のキー不要な埋め込み(output=embed)は廃止済み。埋め込みには公式の Maps Embed API とAPIキーが要る(無料枠あり、Google Cloud Console での登録が必要)

つまり 手元にコピーを持つ以外に道がない。逆に言えば、コピーさえ手元にあれば、出しかたは自分で決められる。

短縮URLは「分からない」を隠さず出す

上の制約により、共有ボタンから貼った短縮URLは、貼った瞬間には名前も座標も分からない。ここで「とりあえずURLをそのまま名前として表示する」を選ぶと、今日のカードに読めない文字列だけが並ぶ状態になり、いちばん大事な「これは何の話か」が伝わらなくなる。

そこで、分からないものは 「名前未確認の場所」と正直に表示し、「マップで開く」→ 開いて確認 → 「名前をつける」 という最短3ステップの手動確認フローに倒した。自動化できない部分を隠さず、次にすべき1手だけをその場に置く、という考え方は docs/continuation-system.md のランブック思想と同じもの。

座標が分かっている場所(Takeoutの Saved Places.json、または @lat,lng を含む長いURL)には、無料のOpenStreetMap埋め込みで簡易プレビューを出す。本物のGoogleマップを埋め込みたい場合は、Google Cloud Console で取得した Maps Embed API のキーを設定画面に入れると切り替わる(任意・省略可)。

取り出しの手順

  1. takeout.google.com を開く
  2. 「選択をすべて解除」
  3. 保存済み(Saved) にチェック(マップのリストはここ。「マップ」の項目ではない)
  4. エクスポートを作成 → 届いたメールから ZIP をダウンロード
  5. Takeout/保存済み/ の中に、リストごとの CSV がある

座標も欲しい場合は、同じ手順で マップ(自分の場所) も選び、Saved Places.json を一緒に取り込む。

4. 作ったもの

saved-places.html — 1枚のHTMLで完結する。データはブラウザの localStorage に入り、どこにも送らない。

タブ 何をする
今日 その日の1件を大きく出す。マップで開く / 行った / 今はいい / もう出さない / 別のを引く
近く 現在地から半径内にある「行きたかった場所」を距離順に出す
一覧 検索・状態やリストでの絞り込み・手入力での追加
取り込み CSV / GeoJSON の読み込み、URL貼り付け、バックアップと書き出し
通知 通知の許可、出しかたの調整

出す1件の決め方

候補は「行きたい」状態で、かつ「今はいい」の期間が明けたものだけ。そこから重みつきの抽選をする。

重み = 1
     × (1 + min(保存からの日数, 540) / 180)   # 寝かせるほど最大4倍まで出やすい
     × 直近に出していたら下げる係数           # 冷却期間(既定60日)を過ぎるまで最小0.1倍
     × (メモがあれば 1.3)                     # 動機が書いてあるものを優先

乱数の種は 日付 + 端末ごとの塩 から作る。同じ日に何度開いても同じ1件が出る(日替わりであること自体が信頼につながる)。「別のを引く」を押したときだけ種をずらす。

状態の持ち方

状態 意味 抽選
行きたい 既定 対象
行った 訪問済み 外れる(記録は残る)
見送り もう出さなくていい 外れる
(今はいい) 一時的にしまう。既定45日 期間中だけ外れる

5. 通知をどう届けるか

「ときどき通知される」がこの仕組みの核心だが、ブラウザだけでは 閉じている間に決まった時刻へ通知を出すことができない。 できること・できないことを踏まえて、経路を3本用意した。

経路 閉じていても届く 用意するもの 向いている場面
このページからの通知 ✗(開いている間だけ) 通知の許可のみ 開いた瞬間に1件を受け取る。近くに来たときの通知もこれ
iPhoneのショートカット places.json の書き出し + オートメーション設定 毎朝ランダムな1件を、確実に通知として受け取る
カレンダーの繰り返し予定 .ics の書き出し 機種を選ばない。通知内容は固定で「開くきっかけ」だけ作る

ショートカット(いちばん本命)

  1. アプリの「取り込み」タブで places.json を書き出す(行きたい場所だけが入る)
  2. iCloud Drive に置く(またはこのページを置いているサーバーに置いて URL で読む)
  3. ショートカットApp →「オートメーション」→ 時刻で起動
  4. ファイルを取得(またはURLの内容を取得)→ リストから項目を取得(ランダム)通知を表示
  5. 「すぐに実行」にしておくと確認なしで通知が出る

抽選をショートカット側の「ランダム」に任せるので、寝かせ期間による重みづけはかからない。重みも効かせたいなら、書き出す places.json の側を(重みの高い順に上位N件へ)絞ってから置けばいい。

なぜ Web Push を今は使わないか

iOS でも 16.4 以降、ホーム画面に追加した PWA なら Web Push を受け取れる。ただし押す側のサーバー(VAPID鍵を持って定期実行するもの)が要る。 このリポジトリには Cloudflare Pages Functions と D1 がすでにあるので、cron で毎朝プッシュするのは作れる。ただしそれは 場所のデータを自分のブラウザの外に出す ということでもある。 1枚のHTMLと localStorage で完結している今の形は、その代償を払っていない。まずはショートカットで足りるかを試す。

6. 運用

  • Takeout の予約エクスポート(2か月ごと)を仕掛けておき、届いたら CSV を取り込む。重複は URL と名前で弾かれ、メモだけが更新される。
  • 端末を移るときは「バックアップ(JSON)」を書き出して、移った先で同じ画面に読み込ませる。
  • 「今はいい」を押した回数が増えてきた場所は、たぶんもう行きたくない。素直に「もう出さない」に落とす。リストの信頼度はここで決まる。

7. これから

  • 文脈で選ぶ: 雨の日は屋内、平日の夜は近所、休日は遠出。営業時間が分かれば「いま開いている場所」だけを出す
  • 近くの通知をバックグラウンドへ: いまはページを開いている間だけ。ジオフェンスをOSに任せる形(ショートカットの位置オートメーション)なら閉じていても届く
  • 行った記録を返す: 「行った」を押した数を年単位で見せる。キュレーションが実際に自分を動かしたかが分かる
  • 保存の瞬間に動機を書く導線: メモがある場所ほど強く効くので、保存直後にひとこと書く習慣とセットにしたい