Skip to content

fix(plateau): 重複判定に OSM の multipolygon 建物を加える - #51

Merged
nyampire merged 2 commits into
mainfrom
fix/conflation-osm-multipolygon
Sep 8, 2026
Merged

fix(plateau): 重複判定に OSM の multipolygon 建物を加える#51
nyampire merged 2 commits into
mainfrom
fix/conflation-osm-multipolygon

Conversation

@nyampire

@nyampire nyampire commented Sep 7, 2026

Copy link
Copy Markdown
Owner

直すこと

中庭のある建物は OSM では type=multipolygon の relation で描かれ、building タグは relation に付きます。
メンバーの way はタグを持ちません。

重複判定はこれまで、判定の材料を building タグの付いた way だけから集めていました。
そのため multipolygon で描かれた建物が判定に入らず、すでに OSM にある建物が PLATEAU 側の候補として表示されていました。

Fixes #50

直し方

building タグを持つ type=multipolygon relation の外形 (role='outer') を判定の材料に加え、中庭 (role='inner') を面から差し引きます。

外形の way にも building タグが付いている場合は、穴の無い面として重ねて集めると中庭が埋まるので、relation 側の形だけを使います。
中庭のメンバー way に building タグが付いていれば、それは中庭に建つ建物なので、これまでどおり面として集めます。

池田市の実データで測った結果

編集ソフトと同じ規則(面積のしきい値は無く、交差の面積が 0 より大きければ重なりと見なす)を手元で再現して数えました。

項目 件数
OSM の type=multipolygon 建物 130
うち外形の way にも building タグがあるもの 0
判定を確かめた PLATEAU 建物 8,995
修正前は候補として出て、修正後は出なくなる建物 159
それに関わる type=multipolygon 建物 116 / 130

中庭を差し引く理由

外形だけで判定すると、隠れる建物は 159 件ではなく 171 件になります。
差の 12 件は中庭の内側に完全に収まる PLATEAU 建物で、これを隠すのは誤りだと判断しました。
根拠は 4 点です。

  1. 中庭の大きさは 2、2、3、9、10、12、36、45、51、52、67 m2 で、その中にある PLATEAU 建物の高さは 2.7 m から 18.5 m です。
    2 m2 の中庭に高さ 8 m の建物がある形は、中庭として説明できません。
  2. 12 件のうち 11 件は 2024 年 2 月の PLATEAU 一括取り込みが作った relation です(変更セットの説明が Plateau import: 池田市 <メッシュ番号>)。
    手で描かれたのは残る 1 件(2018 年の学校)だけです。
  3. その 11 件では、中庭の輪郭が PLATEAU 建物の輪郭と一致します(交差 ÷ 和 が 0.995 以上、うち 9 件が 1.000)。
  4. 池田市には building:part が 8,483 件ありますが、この 11 件の中庭の位置には 1 件もありません。
    最も近いものでも一致度は 0.02 から 0.05 で、輪郭は別物です。

階段室や塔屋のような構造を、取り込みが building:part ではなく穴にしたと考えるのが自然です。
中庭ではないので、そこに建つ PLATEAU 建物は OSM に対応する要素を持ちません。

テスト

テストを 8 件足しました。

判定の材料に加える側(4 件)

  • 重なる場合に候補から外れること
  • 重ならない場合に候補として残ること
  • building タグの無い type=multipolygonlanduse など)を建物として扱わないこと
  • 外形の way が未取得のときに候補から外さないこと

中庭を差し引く側(4 件)

  • 中庭の内側に収まる建物が候補として残ること
  • 中庭の縁をまたぐ建物は候補から外れること
  • 中庭のメンバー way に building タグがあれば建物として扱うこと
  • 外形の way にも building タグがある場合に relation 側の形を使うこと

各段の 1 件目は、実装前に失敗することを確認しています。
残りは実装の条件を一時的に外すと失敗することを確認し、実装を元に戻しました。

確認 結果
PlateauService のテスト 52 件成功、失敗 0
ブラウザのテスト全体 761 件成功、終了コード 0
npm run lint エラー 0、警告 42(すべて元からある todo コメント)

npm run test:unit は Node 26 で実行系の読み込みに失敗しますが、この変更の前の main でも同じく失敗します。

🤖 Generated with Claude Code

nyampire and others added 2 commits September 8, 2026 08:06
中庭のある建物は OSM では type=multipolygon の relation で描かれ、building
タグは relation に付きます。メンバーの way はタグを持ちません。
判定の材料を way だけから集めていたため、この形の建物が判定に入らず、すでに
OSM にある建物が PLATEAU 側の候補として表示されていました。

外形 (role='outer') のメンバー way を材料に加えます。
穴 (role='inner') は面から差し引かず、外形だけで重なりを見ます。中庭の中に
だけ建つ別の建物を重なりと見なす場合がありますが、穴のある多角形を重なり判定
に渡す変更よりも影響が小さいためです。

テストを 4 件足しました。1 件目は変更前に失敗することを確認しています。
残る 3 件は実装の条件を一時的に外すと失敗することを確認しています。

Fixes #50

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
前のコミットは外形だけを判定の材料にしていました。
そのため中庭の中に建つ PLATEAU 建物まで候補から外れていました。

池田市の OSM を調べたところ、この中庭の 12 か所は 2 から 67 平方メートルで、
中には高さ 2.7 から 18.5 メートルの PLATEAU 建物があります。
12 か所のうち 11 か所は 2024 年 2 月の PLATEAU 一括取り込みが作った relation で、
中庭の輪郭は PLATEAU 建物の輪郭と一致します (交差 / 和 が 0.995 以上)。
同じ市に building:part は 8,483 件ありますが、この 11 か所には 1 件もありません。
階段室や塔屋のような構造を、取り込みが building:part ではなく穴にしたものです。
中庭ではないため、そこに建つ建物は OSM に対応する要素を持ちません。

中庭 (role='inner') を面から差し引きます。
外形の way にも building タグが付いている場合は、穴の無い面として重ねて集めると
中庭が埋まるので、relation 側の形だけを使います。
中庭のメンバー way に building タグが付いていれば、それは中庭に建つ建物なので
これまでどおり面として集めます。

池田市で数え直すと、隠れる建物は 171 件から 159 件になります。
差の 12 件が中庭の中の建物です。

テストを 4 件足しました。1 件目は変更前に失敗することを確認しています。
残る 3 件は実装の条件を一時的に外すと失敗することを確認しています。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@nyampire
nyampire merged commit 39accf4 into main Sep 8, 2026
3 checks passed
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.

重複判定が OSM の multipolygon 建物を見ておらず、取り込み済みの建物が候補に出る

1 participant