0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

津波の避難経路が「川・海」に向かう問題を、穴埋め+道路スナップで直した

0
Posted at

全国対応の津波避難マップ( 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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?