1. 概要
本ソフトは、Google Maps 上で起点をクリックすると、起点周辺の 道路中心線(GeoJSONタイル)をグラフ化し、 標高タイルを用いて「上りを避ける」コストで経路を探索し、水域面(waterarea)または 河川中心線に到達した地点で停止させる 1HTML アプリです。
重要:本ソフトは「実際の雨水排水(側溝・暗渠・下水・地形流向)」を厳密に再現するものではありません。
現行実装は「道路中心線ネットワーク上の経路探索」であり、地形の流向解析(D8等)は行っていません。
現行実装は「道路中心線ネットワーク上の経路探索」であり、地形の流向解析(D8等)は行っていません。
主な構成
- ベース地図表示:Google Maps JavaScript API(表示・クリックUIのみ)
- 道路中心線:
experimental_rdcl(ズーム16の GeoJSON タイル) - 河川中心線:
experimental_rvrcl(ズーム16の GeoJSON タイル) - 水域面:
experimental_bvmap(MVT/PBF のwaterareaなどのポリゴンレイヤ) - 標高:PNG標高タイル(
dem1a_pngほか、z=15→14の順で取得)
2. 使い方(最短)
- HTTPSで開く:Cloudflare Pages など https:// のURLで開いてください(file:// 直開きだと import() がブロックされます)。
- Google Maps API キーをHTMLに設定し、Google Cloud 側で HTTP referrer 制限と Maps JavaScript API のみ許可を設定します。
- 画面左の「起点クリック(モードON)」を押す → 地図上をクリック。
- ログに「起点標高」「グラフ再構築」「経路計算」を出し、経路が青線で描画されます。
- 停止点(水域面/河川)に到達すると、停止理由がログに出ます。
よく使う設定(推奨)
stopMode=auto waterLayer=waterarea waterZ=14 riverSnapM=30 riverGateWaterM=20 uphillPenalty=15
stopMode=auto waterLayer=waterarea waterZ=14 riverSnapM=30 riverGateWaterM=20 uphillPenalty=15
3. ロジック(経路算定の仕組み)
3.1 入力→計算の全体フロー(runFlow)
| 順 | 処理 | 内部の要点 |
|---|---|---|
| 1 | 起点クリック | クリックした経緯度(lon/lat)を起点として計算開始。 |
| 2 | タイル取得(道路/河川/水域) |
experimental_rdcl, experimental_rvrcl を起点周辺で取得(半径 tileRadius)。水域は experimental_bvmap のPBFを waterZ で取得し、指定レイヤ(既定 waterarea)のポリゴンを抽出。
|
| 3 | 道路グラフ構築 |
rdcl の LineString/MultiLineString を分解し、隣接点を辺(Edge)として登録。 ノードは座標(lon/lat)をそのままキー化して作成(交差点スナップの追加処理はなし)。 |
| 4 | 起点スナップ | 起点に最も近いノードを探索し、開始ノードに設定。 |
| 5 | 目標ノード選定(pickTargetNode) |
auto:水域面(優先)または河川中心線に最短距離のノードを候補に。 waterOnly:水域面のみ。riverOnly:河川中心線のみ。 |
| 6 | Dijkstra 探索(dijkstraPath) |
コスト:edgeCost = 距離(m) + uphillPenalty × max(0, 標高差)標高は PNG標高タイル(z=15→14、dem1a_png→dem5a_png→...)で取得し、エッジ両端の標高差で加算。 |
| 7 | 停止判定しながらトレース |
経路ノード列を順に辿り、maxSteps 以内で停止条件を満たしたら停止。水域停止:ポリゴン内ヒット(+近傍許容 waterSnapM)。河川停止: riverSnapM以内 かつ riverGateWaterM以内に水域面が存在(誤停止抑制)。
|
3.2 標高の取得(PNG標高タイル)
取得順:
RGB→標高の変換は、国土地理院の仕様(0.01m単位、無効値 128,0,0)に従います。
z=15 → z=14 の順、各ズームで dem1a_png → dem5a_png → dem5b_png → dem5c_png → dem10b_png の順でフォールバックします。RGB→標高の変換は、国土地理院の仕様(0.01m単位、無効値 128,0,0)に従います。
3.3 停止条件(誤停止対策)
- 水域面で停止:
waterLayer=waterareaのポリゴン内に入った時点で停止(waterSnapMで近傍許容)。 - 河川中心線で停止:単に河川中心線に近いだけだと、用水路/誤差等で止まりやすいので、
riverGateWaterMで「水域面が近くにある河川」だけを停止対象にします。 - 線分交差での停止:経路線分が河川中心線と交差した場合、交点で停止(ただし水域ゲート条件を満たす場合)。
“川まで届かない”典型要因:
(1)
対処は「7. トラブルシュート」「5. パラメータ」を参照。
(1)
maxSteps が小さい/(2) 目標ノード選定が近傍の水域/河川を拾えていない/(3) ゲート条件が厳しすぎる(riverGateWaterM小)/(4) 水域面のズームやタイル範囲不足。対処は「7. トラブルシュート」「5. パラメータ」を参照。
4. 使用データと出典
4.1 本ソフトが参照するURL(テンプレ)
| 用途 | URLテンプレ | 備考 |
|---|---|---|
| 道路中心線(GeoJSON) | https://cyberjapandata.gsi.go.jp/xyz/experimental_rdcl/{z}/{x}/{y}.geojson | z=16固定(提供実験) |
| 河川中心線(GeoJSON) | https://cyberjapandata.gsi.go.jp/xyz/experimental_rvrcl/{z}/{x}/{y}.geojson | z=16固定(提供実験) |
| 水域面(MVT/PBF) | https://cyberjapandata.gsi.go.jp/xyz/experimental_bvmap/{z}/{x}/{y}.pbf | レイヤ名は waterarea 等(提供実験) |
| 標高(PNG) | https://cyberjapandata.gsi.go.jp/xyz/{layer}/{z}/{x}/{y}.png | layerは dem1a_png 等 |
4.2 出典(一次情報)
| 資料名 | URL | 発行日/更新日(明記がある場合) |
|---|---|---|
| 国土地理院 標高タイル(PNG標高タイル:RGB→標高値の算出) | https://maps.gsi.go.jp/development/demtile.html | 発行日記載なし(閲覧日: 2026-01-29) |
| 国土地理院 地理院タイル一覧(タイル提供と出典明示の考え方) | https://maps.gsi.go.jp/development/ichiran.html | 発行日記載なし(閲覧日: 2026-01-29) |
| 国土地理院ベクトルタイル提供実験(GeoJSONタイル:道路中心線/河川中心線 等) | https://github.com/gsi-cyberjapan/vector-tile-experiment | 提供開始: 2015-08-03(全国) ※README記載 |
| experimental_rdcl(道路中心線 GeoJSONタイル) | https://github.com/gsi-cyberjapan/experimental_rdcl | 提供実験期間: 2014-08-01〜(README記載) |
| experimental_rvrcl(河川中心線 GeoJSONタイル) | https://github.com/gsi-cyberjapan/experimental_rvrcl | 履歴: 2015-08-03(全国提供開始)※README記載 |
| 地理院地図Vector提供実験(MVT/PBF: experimental_bvmap) | https://github.com/gsi-cyberjapan/gsimaps-vector-experiment | データ更新情報: 2025-10-01時点(README記載) |
| 地理院地図 利用規約(免責・利用条件の入口) | https://maps.gsi.go.jp/help/termsofuse.html | 発行日記載なし(閲覧日: 2026-01-29) |
| Google Maps Platform APIキーの制限ベストプラクティス | https://developers.google.com/maps/api-security-best-practices | 発行日記載なし(閲覧日: 2026-01-29) |
| Maps JavaScript API エラーメッセージ一覧(RefererNotAllowed等) | https://developers.google.com/maps/documentation/javascript/error-messages | 発行日記載なし(閲覧日: 2026-01-29) |
提供実験データの扱い:国土地理院のベクトルタイルは「提供実験中のデータであるため、URLやデータ構成が変わる可能性」が明記されています。運用時は、変更告知(例:公式アナウンス)を前提にしてください。
5. パラメータ一覧
画面左パネルの「パラメータ」に露出している項目の一覧です(既定値はHTMLの初期値)。
| パラメータ(表示名) | 既定値 | 意味 | 選択肢 |
|---|---|---|---|
|
道路/河川タイル半径(初期) tileRadius |
1 | 道路中心線(rdcl)・河川中心線(rvrcl)タイルを起点周辺で読む初期半径(タイル枚数の半径)。1なら(2*1+1)^2=9枚。 | — |
|
道路/河川タイル半径(最大) maxTileRadius |
3 | 上記の最大半径。現行コードは「経路が見つかった時点」で確定し、停止判定未検出でも半径拡張による再試行はしません(後述)。 | — |
|
水域PBFズーム(water) waterZ |
14 | 水域面(MVT/PBF: experimental_bvmap)を読むズーム。大きいほど詳細だがタイル数/デコード負荷が増えます。 | — |
|
水域レイヤー waterLayer |
waterarea | experimental_bvmap 内の参照レイヤ名。現行実装は「ポリゴン(type=3)」のみ抽出するため、線レイヤは0件になり得ます。 |
|
|
水域停止距離(m) waterSnapM |
0 | 水域停止の“近傍許容(m)”。0なら「ポリゴン内に入った時のみ」停止(境界の誤差吸収をしたい場合は数m)。 | — |
|
河川近接距離(m) riverSnapM |
30 | 河川中心線(rvrcl)に近づいたら停止と見なす距離(m)。 | — |
|
河川停止ゲート(水域近傍m) riverGateWaterM |
20 | 河川停止を“水域面でゲート”する距離(m)。河川中心線に近くても、水域面(waterarea)が近傍になければ停止しない(誤停止抑制)。 | — |
|
上り罰則(標高差×係数) uphillPenalty |
15 | Dijkstraのコストに上り勾配(正の標高差)を加算する重み。大きいほど“下り優先”になります。 | — |
|
最大ステップ数 maxSteps |
2000 | 停止判定をしながら経路を辿る最大ステップ数。経路が長い場合、ここで打ち切られて「川まで到達しない」状態になります。 | — |
|
停止モード stopMode |
auto | 停止条件モード。auto=水域優先+河川はゲート付き、水域面のみ、河川中心線のみ。 |
|
|
水域デバッグ描画 waterDbg |
OFF | デバッグ描画。POLY=水域ポリゴン、BBOX=候補枠(端末が重い場合はOFF推奨)。 |
|
|
水域デバッグ半径(m) waterDbgRadiusM |
800 | デバッグ可視化の探索半径(m)。大きいほど候補が増えて重くなります。 | — |
|
水域デバッグ最大描画数 waterDbgMaxDraw |
200 | デバッグ描画の最大件数。 | — |
|
水域ログ waterLog |
stopOnly | ログの詳細度。毎ステップはログ量が増えて端末が重くなります。 |
|
推奨調整例
- 川まで届かない:まず
maxStepsを増やす(例:2000→5000)。次にriverGateWaterMを少し緩める(20→40)。 - 川でない場所で止まる:
riverGateWaterMを大きくしすぎない/stopMode=waterOnlyで水面ポリゴンに限定。 - 水域面に入っているのに止まらない:
waterSnapMを数m(例:5〜15)にする(境界誤差吸収)。 - 重い:
tileRadiusを小さく、waterDbg=OFF、waterLog=stopOnly。
6. 注意事項(精度・免責・運用)
6.1 精度・用途の限界
- 道路中心線上の経路探索であり、側溝/暗渠/下水道網・敷地内の微地形・越流等はモデル化していません。
- 標高は地理院のDEMに基づきますが、解像度や欠損(無効値)・更新タイミングの影響を受けます。
- 提供実験データ(rdcl/rvrcl/bvmap)は、将来URLや属性が変更される可能性があります。
6.2 免責・利用条件
地理院タイルは「国土地理院コンテンツ利用規約」に従って利用する必要があります。
また地理院地図サービスには免責(損害について責任を負わない等)・負荷時のアクセス遮断等が明記されています。運用上はキャッシュ・過度な連続クリックの抑制を推奨します。
また地理院地図サービスには免責(損害について責任を負わない等)・負荷時のアクセス遮断等が明記されています。運用上はキャッシュ・過度な連続クリックの抑制を推奨します。
6.3 セキュリティ(APIキー)
- Google Maps APIキーは HTTP referrer 制限(Pagesのドメイン許可)と API制限(Maps JavaScript APIのみ)を推奨します。
- HTMLに埋め込む場合でも制限設定を前提にし、漏えい時はキーのローテーション手順を用意してください。
7. つまずきポイント(トラブルシュート)
| 症状 | 原因候補 | 対処 |
|---|---|---|
| 地図が「読込中」のまま/RefererNotAllowedMapError | APIキーのHTTPリファラ許可にPagesのURLが入っていない | Google Cloud Consoleで「アプリケーションの制限(HTTP referrers)」に https://<your-site>/* を追加 |
| 「依存モジュールが読めません」 | esm.sh の import() が失敗(広告ブロッカー/社内NW/HTTPSでない) | 広告ブロッカー停止、社内NWの許可、必ずHTTPSで開く |
| 「川まで到達しない」 | maxSteps不足/ゲート条件が厳しい/目標ノード選定不適 | maxSteps増、riverGateWaterM緩和、stopMode切替(waterOnly/riverOnly) |
| 「川じゃない所で止まる」 | 河川中心線の近傍判定が広い/水域ゲートが緩すぎる | riverSnapMを小さく、riverGateWaterMを適正化、stopMode=waterOnlyで確認 |
| 動作が重い | タイル数・デバッグ描画・ログ量が多い | tileRadius↓、waterDbg=OFF、waterLog=stopOnly |
8. 既知の制限と改善案
8.1 既知の制限(現行実装そのまま)
- 交差点でのノード統合がない:rdclが交差で分割されていない箇所では、グラフが繋がらない可能性があります。
- 半径拡張の再試行が限定的:現行は「経路が取れた時点」で確定し、停止未検出でも半径を上げて再探索しません。
- “道路の無い敷地内”を横断するように見える:道路中心線は線データなので、実際の地物(敷地境界/私道/非道路空間)制約は持ちません。
8.2 改善案(次の改修で入れると効く)
- 停止未検出の場合のみ、
tileRadiusを段階的に増やして再試行する(到達率向上)。 - rdclノードを「座標の丸め(例:1e-6)」で統合し、交差点の連結性を向上。
- 水域面の候補タイルを経路沿いにも追随して追加ロード(現行は起点中心が主)。
- DEM流向(D8等)を併用し、道路中心線に偏らない“地形流下”モードを追加。
9. 使用検索語(再現性)
- 国土地理院 標高タイル demtile RGB 仕様
- cyberjapandata experimental_rdcl GeoJSON
- cyberjapandata experimental_rvrcl GeoJSON
- experimental_bvmap waterarea pbf レイヤ
- Google Maps JavaScript API error RefererNotAllowedMapError
- Google Maps api security best practices restrict key HTTP referrers
※採用方針:一次情報(国土地理院、Google公式ドキュメント、公式GitHub)を優先し、個人ブログは仕様確認の主根拠には使用しません。
付録:この説明書を同梱する運用
- 本ファイル(説明書HTML)をアプリと同じディレクトリに置き、
README.htmlとして配布すると、社内教育が楽です。 - Cloudflare Pages 配布時は、
/manual.htmlとして同一サイトで公開すると、APIキーのリファラ許可範囲内で閲覧できます。