fix(plateau): OSM のデータが無いあいだは候補を出さない - #52
Merged
Merged
Conversation
重複判定は、編集ソフトの中にある OSM の建物だけを材料にします。 材料が 1 件も無いとき、判定は「重なりが無い」と同じ結果を返し、全件を候補に 出していました。「OSM に無い建物」と「まだ確かめられていない建物」を区別 していなかったためです。 2026 年 6 月に東京で、この編集ソフト経由で建物が 100 棟登録され、そのうち 98 棟がすでに OSM にあった建物と重なりました。重ねられた側は普通の way で、 判定の材料に入れられるはずのものでした。 公開中の版で確かめたところ、材料があるときは 143 棟のうち 9 棟だけが表示され、 材料が無いときは 143 棟すべてが表示されました。 材料が揃っているかを 2 つの条件で見て、揃っていなければ候補を出しません。 - OSM のレイヤーが消えている場合。PixiLayerOsm の描画が先頭で止まり、その先の context.loadTiles() に届かないため、編集ソフトの中身が空のままになります - 表示範囲を覆う OSM のタイルが未取得の場合 レイヤーが消えているのは利用者が直せる状態なので、画面に理由を出します。 同じ状態が続くあいだは一度だけ出し、レイヤーが戻ったら出し直せるようにします。 タイルの取得は待てば終わるので、こちらは何も出しません。 取得済みの一覧は上流のファイルの持ち物です。上流を取り込んだときに形が変わると 読めなくなるため、読めないときは判断せず、これまでどおり判定に進みます。 高さの転記の経路 (skipConflation) は、材料の有無で結果を変えません。 テストを 9 件足しました。各段の 1 件目は実装前に失敗することを確認しています。 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 の建物だけを材料にします。
材料が 1 件も無いとき、判定は「重なりが無い」と同じ結果を返し、全件を候補に出していました。
「OSM に無い建物」と「まだ確かめられていない建物」を区別していなかったためです。
起きたこと
2026 年 6 月に東京で、この編集ソフト経由で建物が 100 棟登録され、そのうち 98 棟がすでに OSM にあった建物と重なりました。
重ねられた側は 2011 年に描かれた普通の way で、
type=multipolygonではありません。判定の材料に入れられるはずの建物でした。
3 つの変更セットはいずれも新規作成だけで、既存の要素への変更や削除は 0 件でした。
既存のデータが手元に無かったと考えると説明がつきます。
判定そのものは動いている
公開中の版を恵比寿の西側(ズーム 18)で開いて測りました。
材料があるときに表示された建物が本当に OSM に無いかを、多角形の演算とは別の方法(点の内外判定)で検算しました。
表示された 42 件のうち OSM の建物と重なるものは 0 件、隠れた 152 件のうち 149 件は重なりを確認できました。
判定の比較に欠陥はありません。
問題は、比較する材料が無いときの扱いです。
直し方
材料が揃っているかを 2 つの条件で見て、揃っていなければ候補を出しません。
PixiLayerOsmの描画がif (!this.enabled ...) return;で止まり、その先のcontext.loadTiles()に届きません。画面から消えるだけでなく、編集ソフトの中身も空のままになります。
取得に失敗したまま再取得されない経路も、これで塞がります。
レイヤーが消えているのは利用者が直せる状態なので、画面に理由を出します。
同じ状態が続くあいだは一度だけ出し、レイヤーが戻ったら出し直せるようにします。
タイルの取得は待てば終わるので、こちらは何も出しません。
高さの転記の経路(
skipConflation)は、材料の有無で結果を変えません。上流との関係
変更は
modules/services/PlateauService.jsと文言のファイルに閉じています。Context.jsのeditable()をfalseにする案もありますが、編集そのものが止まるうえ、上流のファイルを変えることになるため採りませんでした。取得済みのタイルの一覧は上流のファイルの持ち物です。
上流を取り込んだときに形が変わると読めなくなるので、読めないときは判断せず、これまでどおり判定に進みます。
テスト
テストを 9 件足しました。
各段の 1 件目は実装前に失敗することを確認しています。
そのまま通る確認は、実装の条件を一時的に外すと失敗することを確認しました。
PlateauServiceのテストnpm run lintnpm run test:unitは Node 26 で実行系の読み込みに失敗しますが、この変更の前のmainでも同じく失敗します。🤖 Generated with Claude Code