Skip to content

fix(plateau): OSM のデータが無いあいだは候補を出さない - #52

Merged
nyampire merged 1 commit into
mainfrom
fix/conflation-requires-osm-data
Sep 8, 2026
Merged

fix(plateau): OSM のデータが無いあいだは候補を出さない#52
nyampire merged 1 commit into
mainfrom
fix/conflation-requires-osm-data

Conversation

@nyampire

@nyampire nyampire commented Sep 8, 2026

Copy link
Copy Markdown
Owner

直すこと

重複判定は、編集ソフトの中にある OSM の建物だけを材料にします。
材料が 1 件も無いとき、判定は「重なりが無い」と同じ結果を返し、全件を候補に出していました。
「OSM に無い建物」と「まだ確かめられていない建物」を区別していなかったためです。

起きたこと

2026 年 6 月に東京で、この編集ソフト経由で建物が 100 棟登録され、そのうち 98 棟がすでに OSM にあった建物と重なりました。

変更セット 増えた建物 既存の建物と 50% 以上重なるもの
183907996 50 49
183908121 43 43
183960883 7 6

重ねられた側は 2011 年に描かれた普通の way で、type=multipolygon ではありません。
判定の材料に入れられるはずの建物でした。

3 つの変更セットはいずれも新規作成だけで、既存の要素への変更や削除は 0 件でした。
既存のデータが手元に無かったと考えると説明がつきます。

判定そのものは動いている

公開中の版を恵比寿の西側(ズーム 18)で開いて測りました。

状態 表示される PLATEAU 建物
OSM のデータがある 9 / 143
OSM のデータが無い 143 / 143

材料があるときに表示された建物が本当に OSM に無いかを、多角形の演算とは別の方法(点の内外判定)で検算しました。
表示された 42 件のうち OSM の建物と重なるものは 0 件、隠れた 152 件のうち 149 件は重なりを確認できました。

判定の比較に欠陥はありません。
問題は、比較する材料が無いときの扱いです。

直し方

材料が揃っているかを 2 つの条件で見て、揃っていなければ候補を出しません。

  1. OSM のレイヤーが消えている場合。
    PixiLayerOsm の描画が if (!this.enabled ...) return; で止まり、その先の context.loadTiles() に届きません。
    画面から消えるだけでなく、編集ソフトの中身も空のままになります。
  2. 表示範囲を覆う OSM のタイルが未取得の場合。
    取得に失敗したまま再取得されない経路も、これで塞がります。

レイヤーが消えているのは利用者が直せる状態なので、画面に理由を出します。
同じ状態が続くあいだは一度だけ出し、レイヤーが戻ったら出し直せるようにします。
タイルの取得は待てば終わるので、こちらは何も出しません。

高さの転記の経路(skipConflation)は、材料の有無で結果を変えません。

上流との関係

変更は modules/services/PlateauService.js と文言のファイルに閉じています。
Context.jseditable()false にする案もありますが、編集そのものが止まるうえ、上流のファイルを変えることになるため採りませんでした。

取得済みのタイルの一覧は上流のファイルの持ち物です。
上流を取り込んだときに形が変わると読めなくなるので、読めないときは判断せず、これまでどおり判定に進みます。

テスト

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

  • 下ごしらえが効いていることの確認
  • OSM のレイヤーが消えているときに候補を出さないこと
  • タイルが未取得のときに候補を出さないこと
  • レイヤーが有効でタイルが揃えば候補を出すこと
  • 高さの転記の経路が影響を受けないこと
  • OSM の状態を読めないときは今までどおり判定すること
  • レイヤーが消えているあいだ、知らせを一度だけ出すこと
  • タイルの取得中は知らせを出さないこと
  • レイヤーが戻ってまた消えたら、もう一度知らせを出すこと

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

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

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

🤖 Generated with Claude Code

重複判定は、編集ソフトの中にある 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>
@nyampire
nyampire merged commit fb97052 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.

1 participant