Themes(benches): improve openBenches import

This commit is contained in:
Pieter Vander Vennet 2025-10-04 02:21:38 +02:00
parent 3ebef308d6
commit cf6a012a07
6 changed files with 197 additions and 20 deletions

View file

@ -1,11 +1,19 @@
import Script from "../Script"
import { promises as fs, writeFileSync } from "fs"
import { Feature, Point } from "geojson"
import { existsSync, promises as fs, readFileSync, writeFile, writeFileSync } from "fs"
import { Feature, FeatureCollection, Point } from "geojson"
import { join } from "path"
import sqlite3, { Database } from "sqlite3"
import { open } from "sqlite"
import ScriptUtils from "../ScriptUtils"
import { Lists } from "../../src/Utils/Lists"
import { Overpass } from "../../src/Logic/Osm/Overpass"
import { TagUtils } from "../../src/Logic/Tags/TagUtils"
import Constants from "../../src/Models/Constants"
import { BBox } from "../../src/Logic/BBox"
import LinkImageAction from "../../src/Logic/Osm/Actions/LinkImageAction"
import OsmChangeAction from "../../src/Logic/Osm/Actions/OsmChangeAction"
import ChangeTagAction from "../../src/Logic/Osm/Actions/ChangeTagAction"
import { Tag as OsmTag } from "../../src/Logic/Tags/Tag"
import { Changes } from "../../src/Logic/Osm/Changes"
/**
* Note:
@ -23,6 +31,7 @@ interface Bench {
description: string,
present: 0 | 1,
published: 0 | 1,
/* time of creation (or possibly last edit?) */
added: string,
userID: number
}
@ -97,8 +106,6 @@ class Openbenches extends Script {
filename: dbFile,
driver: sqlite3.Database,
})
console.log(db)
console.dir(db)
return <any>db.db
}
@ -114,11 +121,11 @@ class Openbenches extends Script {
const mediaView = media.filter(m => m.media_type === "view")
const properties = {
// added: benchWithUser.added,
lastModifiedTime: benchWithUser.added,
"openbenches:id": id,
inscription: benchWithUser.inscription.replaceAll("\\r\\n", "\n"),
amenity: "bench",
// lastModifiedBy: benchWithUser.name,
lastModifiedBy: benchWithUser.name,
}
let mediaMerged = Lists.dedup(mediaBench.concat(mediaInscr).map(m => mediaUrl(m)))
@ -171,7 +178,7 @@ class Openbenches extends Script {
return {
type: "Feature",
properties: { tags: JSON.stringify(properties) },
properties,
geometry: {
type: "Point",
coordinates: [benchWithUser.longitude, benchWithUser.latitude],
@ -179,13 +186,93 @@ class Openbenches extends Script {
}
}
async getAlreadyImported(): Promise<FeatureCollection> {
const alreadyImportedPath = "openbenches_linked_in_osm.geojson"
if (!existsSync(alreadyImportedPath)) {
const overpass = new Overpass(Constants.defaultOverpassUrls[0], TagUtils.Tag("openbenches:id~*"))
const dataAndDate = await overpass.queryGeoJson(BBox.global)
const data = dataAndDate[0]
writeFileSync(alreadyImportedPath, JSON.stringify(data), "utf-8")
return data
}
return JSON.parse(readFileSync(alreadyImportedPath, "utf-8"))
}
async conflate(osmData: FeatureCollection, openBenchesData: FeatureCollection) {
const dict: Map<string, Feature> = new Map()
for (const bench of openBenchesData.features) {
const obid = bench.properties["openbenches:id"]
dict.set("" + obid, bench)
}
const changes: OsmChangeAction[] = []
for (const bench of osmData.features) {
const obid = bench.properties["openbenches:id"]
const ob = dict.get(obid)
if (!ob) {
console.log("No match found for", obid, "https://osm.org/" + bench.properties.id)
continue
}
// console.log(`https://osm.org/${bench.properties.id} = https://openbenches.org/bench/${obid}`)
for (const key in ob.properties) {
if (key.startsWith("lastModified")) {
continue
}
if (key.startsWith("image")) {
const imgValue = ob.properties[key]
if (Object.values(bench.properties).some(v => v === imgValue || (v + ".jpg") === imgValue)) {
continue
}
let ikey = "image"
let i = -1
while (bench.properties[ikey]) {
i++
ikey = "image:" + i
}
const li = new ChangeTagAction(bench.properties.id, new OsmTag(ikey, imgValue), bench.properties, {
theme: "openbenches",
changeType: "link-image",
})
changes.push(li)
bench.properties[ikey] = imgValue
console.log(` + ${ikey}=${imgValue}`)
} else if (!bench.properties[key]) {
const v = ob.properties[key]
if(v.length >= 255){
console.log("Text too long:", v.replaceAll("\n"," "))
continue
}
changes.push(new ChangeTagAction(
bench.properties.id,
new OsmTag(key, v),
bench.properties,
{
theme: "openbenches",
changeType: "answer",
},
))
console.log(` - ${key}=${ob.properties[key].replaceAll("\n", " ")}`)
}
}
}
const xml = await Changes.createChangesetXMLForJosm(changes)
writeFileSync("attributes_import.osc",xml, "utf-8")
}
async main(args: string[]): Promise<void> {
const dbFile = "openbenches.sqlite"
let createTest = false
const osmData = await this.getAlreadyImported()
const openBenches = JSON.parse(readFileSync("openbenches_export_josm_.geojson", "utf-8"))
await this.conflate(osmData, openBenches)
// rmSync(dbFile)
// await this.buildDatabase("/home/pietervdvn/git/openbenches.org/database", dbFile)
/*
if(!existsSync(dbFile)){
console.log("No database file found at "+dbFile+", recreating the database")
await this.buildDatabase("/home/pietervdvn/git/openbenches.org/database", dbFile)
}
this.db = await this.loadDb(dbFile)
const tags = new Map<number, string>()
@ -220,10 +307,19 @@ class Openbenches extends Script {
}
}
writeFileSync(`openbenches_export${createTest ? "_test" : ""}.geojson`, JSON.stringify({
writeFileSync(`openbenches_export_josm_${createTest ? "_test" : ""}.geojson`, JSON.stringify({
type: "FeatureCollection", features,
}, null, " "), "utf-8")
//console.log(r)
const maproulette = features.map(f => {
f.properties = {tags: JSON.stringify(f.properties)}
})
writeFileSync(`openbenches_export_maproulette_${createTest ? "_test" : ""}.geojson`, JSON.stringify({
type: "FeatureCollection", features: maproulette,
}, null, " "), "utf-8")
*/
}
}