全国対応の津波避難マップ( https://tsunami-hinan.it-study.jp )を個人開発しています。
このアプリは「浸水想定区域の中にいる人」に、区域の外へ出る脱出ルートも提案します。ところが実装当初、**川の中や海に向かう“逃げられないルート”**が出てしまうことがありました。原因と直し方の話です。
何が起きたか
浸水域内の起点から、8方向に外へ伸ばして「最初に浸水域の外に出た地点」を脱出先にしていました。
// 起点から8方向、200mずつ外へ。最初に「域外」になった点を脱出先に
for (const brng of [0,45,90,135,180,225,270,315]) {
for (let dist = 200; dist <= 6000; dist += 200) {
const p = move(origin, brng, dist);
if (!isPointInZone(p.lng, p.lat, zones)) { exits.push(p); break; }
}
}
一見よさそうですが、浸水データの“すき間”で誤作動します。
- 川・湖・池:浸水想定データではこれらが「対象外(=ポリゴンの穴)」になっている。穴に入った瞬間「域外=安全」と判定し、川の中が脱出先になる。
- 海:浸水域の外周の外側は海。海側に伸ばすと「域外」となり、海が脱出先になる。
どちらも、人間は逃げられません。
直し方は2段構え
水域には「内側の穴(川・湖)」と「外側(海・大きな川)」の2種類があるので、対策も2つ用意しました。
対策A:ポリゴンの穴を埋める(データ側)
川・湖・池は「穴」なので、内側リングを落として外周だけにする=水域を浸水域に取り込みます。津波避難では「水域=危険」と倒すのが安全側です。データ変換(Python / shapely)でやります。
from shapely.geometry import Polygon, MultiPolygon
def drop_holes(geom):
if geom.geom_type == "Polygon":
return Polygon(geom.exterior) # 内側リング(穴)を捨てる
if geom.geom_type == "MultiPolygon":
return MultiPolygon([Polygon(g.exterior) for g in geom.geoms])
return geom
merged = drop_holes(merged)
これで脱出探索が川や池で止まらなくなります。全県のポリゴンを「穴ゼロ」に揃えました。
対策B:道路に出られるか検証する(実行時)
外周の外=海は「穴」ではないので、Aでは消えません。そこで脱出候補ごとに OSRMの nearest(最寄り道路)API を叩き、道路が遠すぎる地点は水域とみなして除外します。あわせて、候補点を道路上にスナップします。
const EXIT_MAX_ROAD_DIST = 150; // m
async function snapExitToRoad(base, ep) {
const url = base.replace('/route/v1/', '/nearest/v1/')
+ `/${ep.lng},${ep.lat}?number=1`;
const d = await (await fetch(url)).json();
if (d.code !== 'Ok' || !d.waypoints?.length) return ep;
const w = d.waypoints[0];
if (w.distance > EXIT_MAX_ROAD_DIST) return null; // 道路が遠い=水域 → 除外
const [lng, lat] = w.location; // 道路上にスナップ
return { lat, lng, straightDist: ep.straightDist };
}
実測すると役割分担がきれいに出ます(最寄り道路までの距離):
| 地点 | 最寄り道路 | 判定 |
|---|---|---|
| 市街地(陸) | 約4m | 採用 |
| 川の上 | 約23m | (Aで対処済み) |
| 沖合(海) | 約6,121m | 除外 |
海は桁違いに遠いので、しきい値150mで確実に弾けます。
まとめ
- 浸水データの「穴(川・湖)」と「外側(海)」は別物。穴埋め(データ側)+道路スナップ(実行時)の2段構えで、現実的に進めるルートだけを残せる。
- 「水域=危険側に倒す」判断は、防災用途では安全側で妥当。
- 実在の指定避難所への経路は元々道路ベースなので影響なし。直すのは合成の脱出ルートだけ。
この処理のおかげで、「浸水域の外へ出る」案内が実際に歩ける道になりました。
👉 津波避難マップ(無料・登録不要・オフライン対応): https://tsunami-hinan.it-study.jp