diff options
Diffstat (limited to 'scripts/park-editor.mjs')
| -rw-r--r-- | scripts/park-editor.mjs | 34 |
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` |
