Skip to content

地図: 道路・地名・施設の記号、避難場所、ハザードマップを重ねる - #68

Merged
5ym merged 2 commits into
mainfrom
rich-map
Nov 14, 2026
Merged

5ym merged 2 commits into
mainfrom
rich-map

Conversation

@5ym

@5ym 5ym commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

持ち主の頼みの 3 本目です (地図を詳しくする)。先に各情報源の条件を確かめ、docs/map.md に書きました。

確かめた条件 (2026-11-14、公式のページと配信の応答で)

情報源 条件 使い方
地理院地図Vector (国土地理院最適化ベクトルタイル) README で国土地理院コンテンツ利用規約 (公共データ利用規約 第 1.0 版)。基本測量成果ではないので申請は要らない。出典「国土地理院最適化ベクトルタイル」。試験公開で URL が変わりうる。リポジトリに LICENSE のファイルは無い PMTiles の 1 ファイル (optimal_bvmap-v1.pmtiles、CORS *、Range) を pmtiles (BSD-3-Clause) で読む。前の {z}/{x}/{y}.pbf は 2023 年のデータで止まり、停止予定なので使わない
スタイル・スプライト (gsi-cyberjapan/optimal_bvmap) 同じ README の条件と読んだ 注記の層 9 つとスプライトを tools/gsi/build.ts で写して自分で配る (static/map/gsi/)
指定緊急避難場所 (skhb01〜08)・指定避難所 (sih) 国土地理院コンテンツ利用規約と「ご利用上の注意」(最新でないことがある・市町村に確かめる・2 つの違いを伝える) ズーム 10 の GeoJSON タイルしか無いので、ズーム 14 から見ている範囲 (4 タイルまで) を読んでまとめる。注意を吹き出しと「地図の見方」に書いた
重ねるハザードマップ (disaportaldata) オープンデータの案内で、URL から読んでアプリで使ってよい (商用・非商用とも、申請の記載なし)。出典「ハザードマップポータルサイト」。土砂災害は国土数値情報と都道府県の条件にも従う 洪水 (想定最大規模)・土砂災害 (土石流・急傾斜地・地すべり)・津波のラスタータイル。公式の凡例の画像を出す

外した情報源はありません。

変えたこと

  • 道路・地名・施設の記号を写真の上に重ねる。道路は黒い縁取りの上に明るい線 (高速は橙・国道は黄・ほかは白)、寄せるほど細い道まで。地名は国土地理院のスタイルの注記の層をそのまま使い、字を白・縁を黒く太くした
    • 字体は 1 つも読まない。 MapLibre 6 はスタイルに glyphs が無いと端末の字体でその場で字を描く (漢字・かなはもともと端末で描いている)。頼みは「Noto Sans JP から PBF の字体を作って自分で配る」だったが、作って配る物が要らず、外から字体を読むことも無いこの形にした。字体の名前は "Noto Sans JP", sans-serif
    • 読む量: 層ごとの最小のズームより引いているときはベクトルのタイルを読まない。pmtiles の束は 19 KB (地図と一緒に後から読む)
  • 指定緊急避難場所・指定避難所: ズーム 14 から緑の「避」の印。押すと名前・住所・対応する災害・指定避難所かを吹き出しで出す (文は DOM で組み、HTML として読まない)
  • ハザードマップ: 地図の左上の「ハザードマップ: なし」で、なし・洪水・土砂災害・津波から 1 つ (既定はなし、端末に覚える)。選んだものの公式の凡例をその下に出す
  • 活断層 (都市圏活断層図) はいつも出すようになったので、写真が見えるよう透明度を 0.9 から 0.45 にした
  • 出典 (CREDITS)・「地図の見方」・docs/map.md (条件の節を足した)・ui.md・design.md を直した
  • 手元の dev のときだけ、画面を撮るために window.sonaeMap を置く (本番の束には入らない)

確かめたこと

  • bun run lint・bun run check・bun test tests (283 件。ハザードマップの選択・タイルの範囲・避難場所のまとめ方を足した)・bun run build
  • Playwright のコンテナで、東京・小田原・鎌倉あたりを広い形とスマホの形で撮り、道路と地名の読みやすさ、凡例、避難場所の吹き出しを見た

確かめていないこと

  • 土砂災害警戒区域に掛かる国土数値情報の利用規約と、都道府県ごとの利用条件の本文 (ハザードマップポータルサイトの案内にそう書かれていることだけを確かめた)
  • 実機 (iPhone・Android) での字の描き方と、通信量

🤖 Generated with Claude Code

https://claude.ai/code/session_01T8TqVdo6LUrWKdVQgbScVU

- 地理院地図Vector の PMTiles を pmtiles で読み、道路を写真の上で読める線で、注記を国土地理院のスタイルの層で描く。字体は外から読まず端末で描き、スプライトは自分で配る
- 指定緊急避難場所・指定避難所を、ズーム 14 から見ている範囲だけ読み、押すと対応する災害を出す
- ハザードマップをなし・洪水・土砂災害・津波から 1 つ選び、公式の凡例を出す
- 各情報源の条件を確かめて docs/map.md に書いた。ui.md・design.md・出典も直した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T8TqVdo6LUrWKdVQgbScVU
@claude

claude Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 31s —— View job


レビュー結果

大きな不具合・セキュリティ上の問題は見つかりませんでした。避難場所の吹き出しは textContent で組んでおり、HTML として読まない点も問題ありません。外部の字体を読まない方針とも合っています。ビルドとテストは実行しておらず、差分を読んだだけです。

軽微な指摘

  1. src/lib/components/QuakeMap.svelte の loadShelters で、shelterSig = next を fetch の前に設定しています。通信が失敗したタイルは catch でキャッシュから消して空配列を返しますが、shelterSig は更新済みのままです。そのため、同じ範囲に留まっている間は再取得されず、避難場所が出ないままになります。地図を少し動かして範囲が変われば直ります。通信が不安定になりやすい災害時に影響しうるので、失敗があったときは shelterSig を戻すか、失敗したタイルを数えて再試行すると安全です。
  2. tilesIn が 4 タイルを超えると空配列を返します。このとき sig([]) が前回と違えば setData で全件消え、同じなら何もしません。ズーム 14 以上では通常 4 タイル以内なので、実害は小さいと見ています。
  3. 要確認: static/map/gsi/sprite/std.json と std@2x.json、std.png と std@2x.png は、SHA が同一です。上流がそうなっているだけなら問題ありません。tools/gsi/build.ts で取得先を取り違えていないかだけ確かめてください。
  4. 要確認: スタイルに glyphs が無いときに MapLibre 6 が端末の字体で描く挙動は、PR 本文の説明を信じています。実機での確認が未了と書かれているので、iOS Safari と Android での表示を見てから確定したほうが安全です。
  5. 要確認: 試験公開の PMTiles の URL (GSI_VECTOR_URL) が変わったとき、地図全体ではなく道路と地名だけが消える作りです。この壊れ方は妥当ですが、docs/map.md にある URL の変更への備えで足りているか確認してください。

テスト

hazardVisibility、readHazard、tilesIn、mergeShelters の単体テストが足されています。loadShelters の再取得の挙動 (上の 1) と、roadLayers のフィルターは未テストです。

@5ym

5ym commented Nov 14, 2026

Copy link
Copy Markdown
Contributor Author

1 は直しました (読めなかったタイルがあれば、次に動かしたときに読み直す)。3 は上流 (gsi-cyberjapan/optimal_bvmap の sprite/std と std@2x) がもともと同じファイルです。4 は実機では見ていません (PR 本文のとおり)。5 は docs/map.md に、変わったら GSI_VECTOR_URL と tools/gsi/build.ts を直すと書いています。

@claude

claude Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 13s —— View job


レビュー結果

大きな不具合・セキュリティ上の問題は見つかりませんでした。差分を読んだだけで、ビルドとテストは実行していません。

  • 避難場所の吹き出しは DOM で組み、HTML として読んでいません。問題ありません。
  • 外部の字体を読まない方針と、window.sonaeMap を dev のときだけ置く点も問題ありません。
  • 前回の指摘 1 (通信失敗のタイルが再取得されない) は、最新の差分で直っています。loadShelters が、読めなかったタイルがあると shelterSig を空に戻します (QuakeMap.svelte 511 行目)。同じ範囲のまま次に動かしたときに読み直します。
  • 前回の指摘 2 (4 タイル超で空配列になる) は、ズーム 14 以上では実害が小さいと見ています。

要確認 (確信は持てません)

  1. static/map/gsi/sprite/ の std.json と std@2x.json、std.png と std@2x.png は、SHA が同一です。tools/gsi/build.ts が @2x の取得先を取り違えていないか確かめてください。上流が同一ならそのままで構いません。同一でなければ、高解像度の画面で記号がぼやけたり、大きさがずれたりします。
  2. スタイルに glyphs が無いときに MapLibre 6 が端末の字体で描く挙動は、PR 本文の説明を信じています。実機 (iOS Safari・Android) での確認はまだです。
  3. 試験公開の GSI_VECTOR_URL が変わると、道路と地名だけが消えます。地図全体は壊れません。docs/map.md の備えで足りるか確かめてください。

テスト

hazardVisibility、readHazard、tilesIn、mergeShelters の単体テストが足されています。loadShelters の再取得 (今回直した箇所) と roadLayers のフィルターには、テストがありません。再取得は Svelte のコンポーネント内にあります。取り出せるなら、再取得の判定だけ関数にしてテストすると回帰を防げます。

@5ym
5ym merged commit 3918f29 into main Nov 14, 2026
7 checks passed
@5ym
5ym deleted the rich-map branch November 14, 2026 15:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant