feat(plateau): OSM のレイヤーが消えているあいだも建物を表示し、追加だけ止める - #54
Merged
Merged
Conversation
OSM のレイヤーが消えているあいだ、PLATEAU の建物をすべて表示し、 OSM への追加だけを止める。追加できない状態はポリゴンの縞模様で示す。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
置き換えが動くことを実機で確認するまでは open のまま残す。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4 つの作業に分ける。判定を PlateauService に 1 か所置き、描画と 画面部品がそこを見る。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
plateau_conflation は文言の名前と URL の引数の両方に使われている。 消すのは文言の側だけ。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
重なりの除去は材料が無いので飛ばす。画面下端の通知は追加の無効化に 置き換えるため削除する。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
無効になる理由が 2 つになるため、isAcceptFeatureDisabled の戻り値を 真偽値から理由の文字列に変える。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
レイヤーの切り替えのたびに塗り直すため、layerchange で dirtyLayer を呼ぶ。
`PixiLayerRapid` のコンストラクタが `scene.on('layerchange', ...)` を
呼ぶようになったため、既存のテストのモック `scene` に no-op の `on` を足す
(実際の scene は EventEmitter)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
layerchange はどのレイヤーの切り替えでも発生する。毎回塗り直すと、 塗り方の変わらない他のデータセットまで作り直すことになる。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
選んだままレイヤーを切り替えても側面の表示が描き直されず、無効の 見た目と説明が残っていた。layerchange で描き直す。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`isAddBlocked()` は `#plateau_conflation` フラグを読まず、OSM レイヤーの 有無だけで追加の可否を決めていた。`getData()` 側はこのフラグで重なりの除去 自体をスキップしているのに、`isAddBlocked()` が見ていないと、フラグで 除去を明示的に止めたユーザに対しても追加だけが止まったままになる。 読み出しを `_conflationEnabled()` に集約し、`getData()` と `isAddBlocked()` の両方から使うようにした。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
「この地物のみ追加」(accept_only_this) は「この地物を追加」(accept) と
同じ onClick (acceptFeature) を共有しており、クリックすればガードに
当たって flash するだけだった。ボタンの見た目だけが有効なままで、
ショートカット (⇧A) も通常のツールチップも変わっていなかった。
renderChoice() で 'accept_only_this' の disabledReason にも
OSM レイヤー起因の理由を効かせるようにした。件数上限 ('limit') は
'accept' 専用の仕様のままにするため、その判定だけを
`_osmLayerOffDisabled()` として切り出し、isAcceptFeatureDisabled()
と renderChoice() の両方から使う。
accept_only_this は type=building relation メンバーの建物 (PLATEAU
LOD2 の標準的な構造) にだけ表示されるため、これは PLATEAU では
よくある経路になる。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`PixiLayerRapid` のコンストラクタは `_addBlocked` に直前の可否を キャッシュし、`layerchange` のたびに値が反転したときだけ `dirtyLayer()` を呼ぶ。これまでテストの scene mock は `on()` を no-op にしていたため、この間引きは一切検証されていなかった。 `test/browser/ui/UiRapidInspector.js` の `MockScene` と同じ形の 記録付き emitter に差し替え、null→true / true→true / true→false の 3通りを確かめる。既存の `_plateauRenderables` の4テストは変更なし。 あわせて `UiRapidInspector` の `isAcceptFeatureDisabled()` に、 taskExtent (タスク作業中) のケースを追加した。taskExtent は件数上限 だけをバイパスする仕様で、'osm-layer-off' の判定はそれより先に見るため バイパスされない。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`UiRapidInspector` は `layerchange` のたびに無条件で `render()` を 呼んでいた。`layerchange` はどのレイヤーの切り替えでも発生し、 `render()` 側の `$parent` チェックはサイドバーがリセットされたあとも detached な DOM を指したまま残るため弾けない。 `this.datum` (選択中の候補) が無いあいだは描き直す意味が無いので、 ハンドラの先頭で弾くようにした。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
設計書と計画書は 2026-09-09 に書いたままで、その後のレビューで実装が 先に進んだ分だけ乖離していた。 設計書 (`...design.ja.md`) を実装に合わせて更新: - §4 塗り直しの仕組み: `layerchange` のたびに無条件で `dirtyLayer()` を 呼ぶ記述だったが、実装は `_addBlocked` をキャッシュし、値が反転した ときだけ呼ぶ。 - §5 に `UiRapidInspector` 自身が `layerchange` を購読している経路を 追記 (§5-3)。選んだ候補の無効表示をレイヤー復帰にあわせて消すための 経路で、これまで書かれた記録が無かった。 - §5 のコード例を `plateau?.isAddBlocked?.()` に修正。 - §2 に `plateau_conflation` フラグとの関係を追記。 - §5-1 に `accept_only_this` (この地物のみ追加) の扱いを追記。 - 「この設計の弱点」に、ワイヤーフレームモードで塗りごと消える点と、 20 ピクセル未満で模様を運ばない `lowRes` に切り替わる点を追加。 計画書 (`...plateau-show-when-osm-layer-off.md`) はステップ自体を 書き換えず、末尾に「実装との差」を追記して、上記 5 点それぞれが なぜ計画から外れたかを記録した。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 10, 2026
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 のデータのレイヤーを消しているあいだ、PLATEAU の建物を表示したまま残し、OSM への追加だけを止めます。
これまでは、レイヤーを消すと PLATEAU の候補も画面から消えていました。
重なりの判定に使う OSM の建物が編集ソフトの中に集まらなくなるため、
PlateauService.getData()が空の配列を返していたからです。getData()の戻り値は描画がそのまま使うので、表示と追加が同時に止まっていました。OSM の線を消して PLATEAU の建物だけを見たい場面があるため、表示は続け、追加のほうを止める形に変えます。
画面での見え方
レイヤーを消しているあいだ、PLATEAU の候補は斜めの縞模様(
construction)で描かれます。候補を選ぶと「この地物を追加」と「この地物のみ追加」が無効になり、理由が説明として出ます。
押した場合は画面下端に同じ理由が出て、追加は行われません。
Shift+Oでレイヤーを戻すと、縞模様がその場で消え、追加のボタンが有効に戻ります。候補を選んだままでも戻ります。
実装
判定は
PlateauService.isAddBlocked()の 1 か所に置き、描画と画面部品の両方がそこを見ます。PlateauService.getData()は、レイヤーが消えているとき重なりの除去を行わずに候補を返します。タイルの取得が終わっていないだけの場合は、これまでどおり候補を出しません。PlateauService.isAddBlocked()を足しました。#plateau_conflation=falseで重なりの除去そのものを止めている場合は、追加も止めません。フラグの読み出しは_conflationEnabled()にまとめ、2 か所が食い違わないようにしました。PixiLayerRapidは、PLATEAU のデータセットにだけpattern: 'construction'を足します。layerchangeを購読し、追加の可否が実際に変わったときだけ塗り直します。UiRapidInspector.isAcceptFeatureDisabled()は、真偽値ではなく無効な理由の文字列('osm-layer-off'か'limit')を返す形に変えました。PLATEAU の判定はtaskExtentとpoweruserより先に置いています。追加できる数の上限を外している利用者でも、重なりを確かめられない状態では追加できません。上流の
modules/pixi/PixiLayerOsm.jsには手を入れていません。PLATEAU 以外のデータセット(mapwithai、esri、overture)の挙動は変えていません。
分かっている弱点
建物の画面上の幅か高さが 32 ピクセル未満のとき、
PixiFeaturePolygonが模様の画像を外します。住宅の多い場所では縞模様が出ないため、追加できない状態は候補を選んだときの説明で伝わります。
ワイヤーフレーム表示のときと、20 ピクセル未満のときも同様です。
重なりの除去を行わないため、すでに OSM にある建物も候補として並びます。
レイヤーを戻すと候補の数が減ります。
試験
npm run build && npm run dist && npm run test:browserで 791 件成功、5 件スキップ、失敗 0 件です。起点の
fb97052fcでは 770 件成功、5 件スキップ、失敗 0 件でした。npm run lintは誤り 0 件、警告 42 件で、起点と同じ内容です。縞模様の見え方は自動試験に向かないため、実機で確認しました。
確認したのは、レイヤーを消したときに候補が残ること、大きい建物に縞模様が出ること、追加のボタンが無効になり押しても編集が増えないこと、レイヤーを戻すと両方が元に戻ることの 4 点です。
#53 との関係
#53 は、候補を伏せた理由をダイアログで伝えるものでした。
表示を止めること自体をやめるため不要になります。
この変更が公開中のサイトで動くことを確かめてから close します。
🤖 Generated with Claude Code