fix(plateau): 重複判定に OSM の multipolygon 建物を加える - #51
Merged
Conversation
中庭のある建物は 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
直すこと
中庭のある建物は OSM では
type=multipolygonの relation で描かれ、buildingタグは relation に付きます。メンバーの way はタグを持ちません。
重複判定はこれまで、判定の材料を
buildingタグの付いた way だけから集めていました。そのため multipolygon で描かれた建物が判定に入らず、すでに OSM にある建物が PLATEAU 側の候補として表示されていました。
Fixes #50
直し方
buildingタグを持つtype=multipolygonrelation の外形 (role='outer') を判定の材料に加え、中庭 (role='inner') を面から差し引きます。外形の way にも
buildingタグが付いている場合は、穴の無い面として重ねて集めると中庭が埋まるので、relation 側の形だけを使います。中庭のメンバー way に
buildingタグが付いていれば、それは中庭に建つ建物なので、これまでどおり面として集めます。池田市の実データで測った結果
編集ソフトと同じ規則(面積のしきい値は無く、交差の面積が 0 より大きければ重なりと見なす)を手元で再現して数えました。
type=multipolygon建物buildingタグがあるものtype=multipolygon建物中庭を差し引く理由
外形だけで判定すると、隠れる建物は 159 件ではなく 171 件になります。
差の 12 件は中庭の内側に完全に収まる PLATEAU 建物で、これを隠すのは誤りだと判断しました。
根拠は 4 点です。
2 m2 の中庭に高さ 8 m の建物がある形は、中庭として説明できません。
Plateau import: 池田市 <メッシュ番号>)。手で描かれたのは残る 1 件(2018 年の学校)だけです。
building:partが 8,483 件ありますが、この 11 件の中庭の位置には 1 件もありません。最も近いものでも一致度は 0.02 から 0.05 で、輪郭は別物です。
階段室や塔屋のような構造を、取り込みが
building:partではなく穴にしたと考えるのが自然です。中庭ではないので、そこに建つ PLATEAU 建物は OSM に対応する要素を持ちません。
テスト
テストを 8 件足しました。
判定の材料に加える側(4 件)
buildingタグの無いtype=multipolygon(landuseなど)を建物として扱わないこと中庭を差し引く側(4 件)
buildingタグがあれば建物として扱うことbuildingタグがある場合に relation 側の形を使うこと各段の 1 件目は、実装前に失敗することを確認しています。
残りは実装の条件を一時的に外すと失敗することを確認し、実装を元に戻しました。
PlateauServiceのテストnpm run lintnpm run test:unitは Node 26 で実行系の読み込みに失敗しますが、この変更の前のmainでも同じく失敗します。🤖 Generated with Claude Code