山あいの温泉街から、紅葉の山すそのゴルフ場へ続く道路を見下ろした景色

温泉ブログ(温泉ランド.com)では、楽天GORAのリンクを使ったゴルフの記事も書いている(リンクの仕組みで迷った話は前の記事に書いた)。

10月27日の夜、AI(Claude)が、ゴルフ場を地図で見せる案を10個並べてくれた。今の全国マップはスクリプトを使わずCSSだけで動いているので、同じページで切り替える作りには制約がある、とも書いていた。僕はこう返した。

作りの制約については、ゴルフマップのページを新たに作って、そっちに遷移でもいいよ

同じページ上で切り替えじゃなくても別にいい

ゴルフマップの方で、温泉地の近くにゴルフ場がある場合は、マップ下の一覧の温泉地ごとの短文説明のところに、ゴルフ場まで約○○km、自動車で約○○分 という記載をしてあげた方が親切かな

この「自動車で約○○分」を出すところで、思っていたより考えることがあった。

車の時間を何で出すか

AIは「とても親切だと思います」と返したうえで、車の時間を何から出すかで、正確さと守る決まりが変わると言った。

その場でAIは利用条件を調べようとしたが、公式のページがうまく開けず、確かめられなかった。そこで、作るときに最初に確かめることとして残し、作る作業は別のセッション(Claude Codeの別の作業の窓)に引き継いだ。

Googleの経路のAPIは、規約で使えないとAIが判断した

APIは、プログラムどうしが問い合わせをやりとりする窓口のことだ。Googleには、2地点の間の道のりと時間を答えるAPI(Google Maps Platform の Routes API)がある。

新しいセッションのAIは、規約を読む作業を子のエージェント(AIが手分けのために呼ぶ別のAI)に頼んだ。10月28日の午前1時すぎに結果が届くと、結論を左右する2点は、AI自身も原文を開いて確かめた。

AIが10月28日時点の規約を読んで出した結論は「使えない」で、理由は2つだった。

  • 計算した距離や時間を保存できない。Routes API から一時的に保存してよいのは、緯度と経度を30日までだけ(Service Specific Terms の19.3。子のエージェントの報告には、規約本体の3.2.3(b)「No Caching」も挙がっていた)
  • Google以外の地図と一緒に使えない(同じく19.2)

温泉ランド.comのゴルフマップは、自前で描いた日本地図に、距離と時間を書いておく作りだ。AIは、2つともに当たると判断した。

地図を出さずに文字だけで使うのは認められているが、そのときも保存はできず、読者がページを開くたびにGoogleへ問い合わせる形になる、とAIは書いていた。

規約の控えには「法律の専門家の判断ではない」とも書いてある。AIの読み方で、Googleに問い合わせたわけではない。

車の時間を出す方法を比べた

AIは、ほかの方法も調べて並べた。OSRMとFOSSGISは、OpenStreetMapのデータで道順を答えてくれる、だれでも使える公開のサーバーだ。

方法記録にある条件AIの判断
Googleの Routes API結果を保存できない。Google以外の地図と一緒に使えない使えない
OSRMの公開デモサーバー商用ではない使い方に限る。1秒に1回まで使えない
FOSSGISの経路サーバー大量の取得は禁止勧めない
openrouteservice の無料枠運営者(僕)のアカウントが要る。商用の可否は書かれていない上限内なら使えそう
自分のPCで計算回数・料金の制限なし。出どころの表記が要るおすすめ
車の時間を出さない直線距離とGoogleマップのリンクだけ選び方の1つ

「自分のPCで計算」は、OpenStreetMapとGraphHopperを使う方法だ。OpenStreetMapは、世界中の人が書き込んで作っている、無料で使える地図のデータで、道路の百科事典のようなものだ。GraphHopperは、そのデータから「AからBまで車で何分か」を計算するソフトで、カーナビの頭脳の部分だけを取り出したようなものだ。

Googleマップで経路を開くリンクなら、APIの鍵なしで置ける、ともAIは書いていた。僕はAIのおすすめどおり、自分のPCで計算する方法を選んだ。各行には「今の経路」として、Googleマップを開くリンクも付けることにした。

自分のPCに道路のデータを置いた

AIは、ダウンロードする3つを、場所と大きさを添えて僕に聞いてきた。保存先はどれも外付けのEドライブだ。

  • Java(GraphHopperを動かす土台のソフト・約200MB)
  • GraphHopper(約50MB)
  • 日本の地図データ(Geofabrikというサイトの配布・約2.4GB)

僕が了解すると、AIはすぐに入れ始めた。GraphHopperはその時点で最新の11.1で、地図データは、配布元が出している「ファイルが壊れていないかを確かめる値」と合うことを確かめてから使った。

日本全体の道路網(1,170万地点)の読み込みは7分で終わり、できたデータは1.1GBだった。読み込みのあいだ、Javaは約4GBのメモリを使っていた。地図データは10月26日時点のものだ。

2,183組を計算して、失敗は0だった

AIは、全部を回す前に、土地勘のある組み合わせで数字を見た。熱海から近くのゴルフ場までが34分、箱根湯本からが21分と出た。

AIは、OpenStreetMapのデータを使った計算は信号待ちや山道の遅さが入らず、短めに出ると考えた。そこで、全部の道で速さを2割落とした(時間は1.25倍)。熱海温泉からサザンクロスまでは、約24km・43分になった。

この「2割」は、実際に走って測った値ではない。何と比べて2割に決めたかも、記録には残っていない。AIが試算を見て決めた目安だ。

計算したのは、温泉地から直線で30km以内にあるゴルフ場のうち、近い順に15コースまでだ。AIは約3,000組と見込んでいたが、実際は2,183組で、失敗は0だった。

その中から、車で30分以内のコースを近い順に3つまで選んだ。全国マップの温泉地255か所のうち、190か所に近くのゴルフ場が載った。

ページでは「目安」と断った

車の時間は、渋滞や季節で変わる。AIは一覧の頭に、最初に自分で勧めた言い方をもとにこう書いた。

距離と時間は目安です。渋滞や冬の道は含みません。

地図の下の注記には、速さを2割落としていることと、出かける前に「今の経路」を押してGoogleマップで確かめてほしいことを書いた。データの出どころとして「© OpenStreetMap contributors(ODbL)」とGraphHopperの名前、データの日付も載せている。

AIは、冬に休むゴルフ場に「冬は休場」の印を付けた。楽天GORAの案内の「休場日」によるもので、年によって変わることも注記した。

吹き出し646個のうち、3個がはみ出した

地図の番号を押して出る吹き出しは、全部で646個ある。AIは公開の前に、手元の見本で、スマホとパソコンの幅の両方を確かめていた。646個ともはみ出さなかった。

ところが、AIが公開したページで数え直すと、3個が地図の下に8〜19pxはみ出していた。サイトのデザインの中では、地図の幅が見本の318pxより狭い310pxだったからだ。AIは高さの見積もりを300pxの幅で計算するように直し、本文を差し替えた。それで646個とも収まった。

毎週、自動で作り直す

全国マップには、別のセッションがほぼ毎日温泉地を書き足している。そこで僕の了解をとって、AIが毎週水曜の14時に自動で作り直す仕組みを作った。

  • 増えた温泉地と、楽天GORAの休場日の変化を読み直す
  • 中身が変わったときだけ、公開中のページを差し替える
  • 温泉地やコースの数が前より1割以上減っていたら、差し替えずに止める
  • 止めたときと失敗したときだけ、Windowsの通知を出す

GraphHopperは、作り直しのあいだだけ動かす。一度計算した組は、位置と速さの割合が同じなら計算し直さない作りにした。試運転では、AIの作りの誤りが2つ見つかった。リンクの確認でサーバーへ5秒おきの問い合わせが10分ほど続いたことが2回と、予約から起動したときだけ落ちることだ。AIが直したあとの3回は、どれも約1分で終わった。

初回の自動の作り直しは、10月28日の14時に動いた。全国マップに増えていた温泉地3つのぶん、近くのゴルフ場が3つ地図に加わった。道路のデータは自動では新しくせず、半年に1回、手で入れ直す予定だ。

同じことをしたい人へ

記録に残っている範囲でまとめておく。

用意したもの:

  • Java(今回はTemurin 21)
  • GraphHopper(今回は11.1)
  • Geofabrikの日本の地図データ(約2.4GB)
  • 置き場所の空き(今回はEドライブに約150GBあった)。メモリは11.2GBのPCで足りた

進め方:

  1. 先に規約を読む。結果を保存するのか、自前の地図に載せるのかで、使えるサービスが変わる
  2. 3つをダウンロードし、地図データは配布元が出している確かめ用の値(md5)と合うかを見る
  3. GraphHopperに日本全体を読み込ませる(このPCで7分)
  4. 自分のPCの中だけで答える窓口として立ち上げ、土地勘のある組み合わせで数字を見る
  5. 短めに出ると感じたら、速さの割合を決める。GraphHopperを、前もって道順を計算しておかない設定で動かすと、問い合わせのたびに割合を変えられる
  6. 直線距離で候補を絞ってから、車の経路を計算する(今回は直線30km以内・近い順に15まで)
  7. ページに、OpenStreetMapのデータを使っていて、ODbLで提供されていると分かる表記を出す(今回は「© OpenStreetMap contributors(ODbL)」と書いた)。計算した時間は表記を出せば使ってよい、というのはAIの読みで、OpenStreetMap財団がそう言い切っているわけではない。距離の表はCSVなどで配らない(AIの控えでは、データベースとみなされるおそれがある)
  8. 時間は目安だと書き、Googleマップで今の経路を開くリンクを添える

分かったこと

僕が頼んだのは、「約○○分」と1行書くことだった。その1行のために、AIが規約を読み、道路のデータを丸ごと自分のPCに置くことになった。

分かったことの1つは、Googleの経路のAPIは、結果を保存して自前の地図に並べる今回の使い方では、AIの読みでは使えなかったことだ。

もう1つは、時間が「目安」だということだ。2割という割合は、測って決めたものではない。だから、ページでは時間を「目安」と書き、速さを2割落としていることも明かして、読者が出かける前に今の経路を確かめられるようにした。

ゴルフマップはこちらにある。

おすすめ商品