aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/park-editor.mjs
diff options
context:
space:
mode:
authorYasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com>2026-11-08 23:56:57 +0900
committerYasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com>2026-11-08 23:56:57 +0900
commit5e0dbb7535c03f9999da54083e9187a223690d61 (patch)
tree5d942dc354c03a593b8faa549e21b003d2fff8f6 /scripts/park-editor.mjs
parent27b5325f2d89b3a714059719e4c4cbe931b5b1a3 (diff)
parks: 周辺公園を一覧表に表示し、保存時の同名統合を修正
parks-rows.ts: 周辺の公園も市内公園と同じ設備項目を一覧表に出す park-editor.mjs: 重複判定をOSM ID(なければ名前+住所)に変え、 同名の別公園が保存で消えないようにする kodaira-nearby-parks.json: 水飲み場「?」と復元した萩山公園を反映
Diffstat (limited to 'scripts/park-editor.mjs')
-rw-r--r--scripts/park-editor.mjs34
1 files changed, 24 insertions, 10 deletions
diff --git a/scripts/park-editor.mjs b/scripts/park-editor.mjs
index b3a3e80..f6c20a4 100644
--- a/scripts/park-editor.mjs
+++ b/scripts/park-editor.mjs
@@ -95,10 +95,25 @@ function recordKey(obj) {
return null;
}
+// 重複判定用のキー。名前だけで判定すると、同名の別公園(例: 萩山公園が2か所)
+// まで1件にまとめてしまうため、OSMのIDや住所も含める。
+function dedupeKey(obj) {
+ const src = obj && obj.properties ? obj.properties : obj;
+ if (!src) return null;
+ if (src.osm_type && src.osm_id != null && String(src.osm_id) !== "") {
+ return `${src.osm_type}/${src.osm_id}`;
+ }
+ const name = recordKey(obj);
+ if (!name) return null;
+ const address = src["住所"] || src.address || "";
+ return `${name}|${address}`;
+}
+
function canonicalKeysFrom(lists) {
const keys = new Set();
for (const list of lists) {
- for (const rec of list || []) {
+ if (!Array.isArray(list)) continue;
+ for (const rec of list) {
const src = rec && rec.properties ? rec.properties : rec;
if (!src) continue;
for (const key of Object.keys(src)) {
@@ -178,7 +193,7 @@ function mergeMissing(postedList, currentList, canonicalKeys) {
const deduped = [];
const byKey = new Map();
for (const rec of postedList) {
- const key = recordKey(rec);
+ const key = dedupeKey(rec);
if (!key) {
deduped.push(rec);
continue;
@@ -196,12 +211,12 @@ function mergeMissing(postedList, currentList, canonicalKeys) {
const map = new Map();
for (const rec of currentList) {
- const key = recordKey(rec);
+ const key = dedupeKey(rec);
if (key) map.set(key, rec);
}
const postedKeys = new Set();
for (const rec of postedList) {
- const key = recordKey(rec);
+ const key = dedupeKey(rec);
if (!key) continue;
postedKeys.add(key);
const current = map.get(key);
@@ -306,12 +321,11 @@ const server = createServer(async (req, res) => {
// 古い画面からの保存で、新しい項目・レコードが消えないようにマージする
const current = JSON.parse(await readFile(target.dataset.path, "utf-8"));
- const canonicalKeys = canonicalKeysFrom([current, data.features || data]);
- if (target.id === "nearbyParks") {
- mergeMissing(data.features, current.features || [], canonicalKeys);
- } else {
- mergeMissing(data, current, canonicalKeys);
- }
+ // 周辺の公園は FeatureCollection({ type, features })なので、配列に直す
+ const currentList = Array.isArray(current) ? current : current.features || [];
+ const incomingList = target.id === "nearbyParks" ? data.features : data;
+ const canonicalKeys = canonicalKeysFrom([currentList, incomingList]);
+ mergeMissing(incomingList, currentList, canonicalKeys);
const text = target.dataset.pretty
? `${JSON.stringify(data, null, 2)}\n`