Think the Earth

HOW WE BUILT THIS PROJECT

開発メモ

AIとの対話で創ってきた実装の記録

Climate Crisis Nowの開発で検討し、試し、修正してきた技術的な検討をまとめています。完成形だけでなく、うまくいかなかった方法や運用上の注意点も、同じようなニュースサイトやデータ地図をつくる開発者のためのノウハウとして公開します。

01

ニュース検索は日本と世界を分ける

検索対象と地名の粒度が異なるため、日本と世界を別々に収集します。日本時間の6時は直近3日間の脅威と希望、12時・18時は直近2日間の脅威を中心に確認します。政府・国際機関・研究機関・主要通信社を軸に地域媒体まで対象を広げ、検索結果の日付ではなく原文の公開日を確認します。

02

件数を埋めるより、採用条件を守る

候補が少ないときも古い記事や関連の弱い記事で埋めません。同じ出来事の記事は重複を整理しつつ、避難、健康、農業、原因分析など論点が違う場合は別記事として残します。確度が不足する記事も捨てずに管理画面へ保存し、人が原文を確認できるようにします。

03

主分類を固定し、細部は副分類に残す

似たテーマが検索のたびに増えないよう、脅威と希望それぞれに固定した主分類を使います。複数分野にまたがる記事は中心テーマを主分類にし、もう一つの視点や具体的な内容を副分類として保存します。

04

AIと人の編集判断を検証し、公開する

ChatGPT5.5Solで開発。検索は同時刻・同条件でAIモデルを比較し、記事品質、検索回数、入力・出力トークン、推定費用を確認した上で、現在はChatGPT5.5Lunaを使っています。優先媒体の確認と一括判定を先に行い、候補不足時だけ検索を追加します。地名抽出や誤判定も含め、AIが担う処理と人が行う公開判断を記録し、改善の過程を公開します。

05

定時更新を安全に再実行できる形にする

定時更新と手動更新は同じ収集・保存ルールを使います。Cloudflare WorkersのCron Triggersから日本時間の6時・12時・18時に更新APIを呼び、取得に失敗した場合は各10分後に再試行します。同じ更新枠の再実行はalreadyCompletedとして終了し、保存済み記事を上書きすることはありません。0件、キャンセル、処理時間超過も記録して原因を切り分けます。

06

公開画面と管理画面を一つの本体で保つ

ニュース一覧と地図は同じコンポーネントを使い、管理画面だけに公開・非公開、地図表示、削除、手動収集などの操作を追加しています。表示ロジックを二重化せず、公開側と管理側の内容がずれる問題を減らします。

07

世界地図と日本地図を同じ記事状態に同期する

期間、脅威・希望、公開状態、地図ON/OFFは世界と日本で共通です。日本地図はNatural Earth由来の周辺地形と追加GeoJSONを使い、日本を緑、周辺国をグレーにして主題を明確にしました。

08

地名が具体的な記事だけを自動プロットする

市町村、観測地点、被災地点など具体的な場所を抽出できた記事だけを初期ONにします。「関東」「太平洋側」「秋雨前線」のような広域表現だけの記事は自動で載せません。県名と市名が同時にある場合は、より具体的な市名を優先します。

09

外部APIのSecretは必ずサーバーに置く

RealEarth、AI、定時更新APIの認証情報はサーバー側の環境変数として読み込み、HTML、JavaScript bundle、URL、ログへ出しません。ブラウザはサイト内のAPIだけを呼び、サーバーが外部サービスへのアクセスを代理します。

10

RealEarthの雲画像を地図へ重ねる

SSEC RealEarthのGlobal InfraredをWMS 1.3.0で取得しています。世界は緯度−90〜90度、経度−180〜180度の全球、日本周辺は緯度20〜48度、経度109〜165度を1024×512ピクセルで取得します。EPSG:4326は緯度・経度の軸順になる点に注意が必要でした。

11

雲と地図の色・階調を分けて調整する

海は#005E98、陸は#2E9F3D、雲は#F8FBFFを基準にしています。世界画像は高緯度を切らず、上下端にごく軽いフェードだけを加えます。日本画像はopacity .82、grayscale(1)、contrast(1.30)、brightness(1.10)で階調を残します。

12

72時間分を保存し、18枚の雲アニメで再生する

定時更新時にRealEarthの不足画像だけをサーバーへ保存し、閲覧者には保存済み画像をサイト内APIから配信します。直近72時間から4時間間隔で18枚を選び、次の画像を読み込んでから切り替えます。取得に失敗したフレームは飛ばし、直前の正常画像を保持します。確定画像は長くキャッシュし、雲アニメが非表示になったら再生を止め、外部アクセスと端末負荷を抑えます。