2024-07-27 02:18:58 +02:00
|
|
|
|
import Script from "../Script"
|
|
|
|
|
import { writeFileSync } from "fs"
|
|
|
|
|
import { Feature, Geometry } from "geojson"
|
|
|
|
|
import { OsmObject } from "../../src/Logic/Osm/OsmObject"
|
|
|
|
|
import OsmObjectDownloader from "../../src/Logic/Osm/OsmObjectDownloader"
|
|
|
|
|
import { Changes } from "../../src/Logic/Osm/Changes"
|
|
|
|
|
import { ImmutableStore } from "../../src/Logic/UIEventSource"
|
|
|
|
|
import { OsmConnection } from "../../src/Logic/Osm/OsmConnection"
|
|
|
|
|
import ChangeTagAction from "../../src/Logic/Osm/Actions/ChangeTagAction"
|
|
|
|
|
import { Tag } from "../../src/Logic/Tags/Tag"
|
|
|
|
|
import { ChangeDescription } from "../../src/Logic/Osm/Actions/ChangeDescription"
|
|
|
|
|
import { GeoOperations } from "../../src/Logic/GeoOperations"
|
|
|
|
|
import { Overpass } from "../../src/Logic/Osm/Overpass"
|
|
|
|
|
import { TagUtils } from "../../src/Logic/Tags/TagUtils"
|
|
|
|
|
import { BBox } from "../../src/Logic/BBox"
|
|
|
|
|
|
|
|
|
|
export default class CleanRepair extends Script {
|
|
|
|
|
constructor() {
|
|
|
|
|
super("Cleans 'repair'-tags for mass retagging")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async main(args: string[]) {
|
|
|
|
|
const path = args[0]
|
|
|
|
|
console.log("Loading", path)
|
|
|
|
|
const criteria = TagUtils.Tag({
|
|
|
|
|
and: [
|
|
|
|
|
"repair~*",
|
|
|
|
|
"repair!=no",
|
|
|
|
|
"repair!=yes",
|
|
|
|
|
"repair!=brand",
|
|
|
|
|
"repair!=only",
|
|
|
|
|
"repair!=only_sold",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
"repair!=assisted_self_service",
|
|
|
|
|
],
|
2024-07-27 02:18:58 +02:00
|
|
|
|
})
|
2024-08-09 16:58:48 +02:00
|
|
|
|
const overpass = new Overpass(criteria, [], "https://overpass-api.de/api/interpreter")
|
|
|
|
|
const data: Feature<Geometry, Record<string, string>>[] = (
|
|
|
|
|
await overpass.queryGeoJson(BBox.global)
|
|
|
|
|
)[0].features
|
2024-07-27 02:18:58 +02:00
|
|
|
|
console.log("Got", data.length, "features; sample", data[0])
|
|
|
|
|
const changes = new Changes({
|
|
|
|
|
dryRun: new ImmutableStore(true),
|
|
|
|
|
osmConnection: new OsmConnection({
|
2024-08-09 16:58:48 +02:00
|
|
|
|
dryRun: new ImmutableStore(true),
|
|
|
|
|
}),
|
2024-07-27 02:18:58 +02:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const metakeys = ["id", "version", "changeset", "user", "uid", "timestamp"]
|
|
|
|
|
|
|
|
|
|
const replace = {
|
2024-08-09 16:58:48 +02:00
|
|
|
|
phone: "mobile_phone",
|
|
|
|
|
phones: "mobile_phone",
|
|
|
|
|
mobile: "mobile_phone",
|
|
|
|
|
cellphone: "mobile_phone",
|
|
|
|
|
pc: "computers",
|
|
|
|
|
mobile_phones: "mobile_phone",
|
|
|
|
|
mobilephones: "mobile_phone",
|
|
|
|
|
mobilephone: "mobile_phone",
|
|
|
|
|
clocks: "clock",
|
|
|
|
|
elektronik: "electronics",
|
|
|
|
|
tires: "tyres",
|
|
|
|
|
welcome: "yes",
|
|
|
|
|
tyre: "tyres",
|
|
|
|
|
electronic_products: "electronics",
|
|
|
|
|
shoe: "shoes",
|
|
|
|
|
pc_repairs: "computer",
|
|
|
|
|
computers: "computer",
|
|
|
|
|
body_construction: "body_work",
|
|
|
|
|
body: "body_work",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
|
2024-08-09 16:58:48 +02:00
|
|
|
|
body_repairer: "body_work",
|
|
|
|
|
instruments: "musical_instrument",
|
|
|
|
|
service: "yes",
|
|
|
|
|
punture: "tyres",
|
|
|
|
|
electricity: "electronics",
|
|
|
|
|
self_service: "assisted_self_repair",
|
|
|
|
|
paint: "bodywork",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
"paint shop": "bodywork",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
paint_shop: "bodywork",
|
|
|
|
|
lawnmower: "lawn_mower",
|
|
|
|
|
aircon: "air_conditioning",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
"*": "yes",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
ammeublement: "furniture",
|
|
|
|
|
all: "yes",
|
|
|
|
|
appliances: "appliance",
|
|
|
|
|
electronic: "electronics",
|
|
|
|
|
escooter: "electric_scooter",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
"aviation maintenance, repair, and_overhaul": "airplane",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
aviation_maintenance: "airplanes",
|
|
|
|
|
bags: "bag",
|
|
|
|
|
boats: "boat",
|
|
|
|
|
boilers: "boiler",
|
|
|
|
|
breaks: "brakes",
|
|
|
|
|
car: "cars",
|
|
|
|
|
tv: "television",
|
|
|
|
|
clothing: "clothes",
|
|
|
|
|
coat_of_lacquer: "body_work",
|
|
|
|
|
cycle: "bicycle",
|
|
|
|
|
cars: "car",
|
|
|
|
|
blacharstwo: "tin",
|
|
|
|
|
lakiernictwo: "body_work",
|
|
|
|
|
tire: "tyres",
|
|
|
|
|
powder_coating: "body_work",
|
|
|
|
|
leather_products: "leather",
|
|
|
|
|
motocycle: "motorcycle",
|
|
|
|
|
motor: "motorcycle",
|
|
|
|
|
motoo: "motorcycle",
|
|
|
|
|
motorbike: "motorcycle",
|
|
|
|
|
motorcycle_repair: "motorcycle",
|
|
|
|
|
motorsports: "motorcycle",
|
|
|
|
|
printers: "printer",
|
|
|
|
|
tyres24: "tyres",
|
|
|
|
|
paintings: "painting",
|
|
|
|
|
paintwork: "body_work",
|
|
|
|
|
pumps: "pump",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
"shoes:yes": "shoes",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
wheel: "tyres",
|
|
|
|
|
wheels: "tyres",
|
|
|
|
|
vacuum: "vacuum_cleaner",
|
|
|
|
|
glass: "car_glassj",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
}
|
|
|
|
|
|
2024-08-09 16:58:48 +02:00
|
|
|
|
const brands = [
|
|
|
|
|
"garage",
|
|
|
|
|
"audi",
|
|
|
|
|
"renault",
|
|
|
|
|
"apple",
|
|
|
|
|
"honda",
|
|
|
|
|
"ducati",
|
|
|
|
|
"ford",
|
|
|
|
|
"mazda",
|
|
|
|
|
"garage_renault_aie",
|
|
|
|
|
]
|
2024-07-27 02:18:58 +02:00
|
|
|
|
|
2024-08-09 16:58:48 +02:00
|
|
|
|
const valid = [
|
|
|
|
|
"train",
|
|
|
|
|
"tv",
|
|
|
|
|
"jewelry",
|
|
|
|
|
"scooter",
|
|
|
|
|
...Object.values(replace),
|
|
|
|
|
"watch",
|
|
|
|
|
"oldtimer",
|
|
|
|
|
"car",
|
|
|
|
|
"bicycle",
|
|
|
|
|
"boat",
|
|
|
|
|
"windbreaker",
|
|
|
|
|
"agricultural",
|
|
|
|
|
"alternator",
|
|
|
|
|
"antiques",
|
|
|
|
|
"atv",
|
|
|
|
|
"auto",
|
|
|
|
|
"aviation maintenance",
|
|
|
|
|
"bag",
|
|
|
|
|
"bags",
|
|
|
|
|
"battery",
|
|
|
|
|
"bicyle",
|
|
|
|
|
"borehole",
|
|
|
|
|
"building",
|
|
|
|
|
"camera",
|
|
|
|
|
"car_glass",
|
|
|
|
|
"caravan",
|
|
|
|
|
"carpenter",
|
|
|
|
|
"coffee_machine",
|
|
|
|
|
"construction machinery",
|
|
|
|
|
"cycle",
|
|
|
|
|
"dentures",
|
|
|
|
|
"ducati",
|
|
|
|
|
"electric motor",
|
|
|
|
|
"electric_bike",
|
|
|
|
|
"electric_scooter",
|
|
|
|
|
"espresso_machines",
|
|
|
|
|
"exhaust",
|
|
|
|
|
"fire_extinguishers",
|
|
|
|
|
"fountain_pen",
|
|
|
|
|
"fridge",
|
|
|
|
|
"garden_machinery",
|
|
|
|
|
"gas appliances",
|
|
|
|
|
"generator",
|
|
|
|
|
"glasses",
|
|
|
|
|
"golfcart",
|
|
|
|
|
"guitar",
|
|
|
|
|
"hammock",
|
|
|
|
|
"hardware",
|
|
|
|
|
"heating pumps",
|
|
|
|
|
"hifi",
|
|
|
|
|
"hvac",
|
|
|
|
|
"installation",
|
|
|
|
|
"jewellery",
|
|
|
|
|
"keys",
|
|
|
|
|
"kick_scooter",
|
|
|
|
|
"kitesurfing",
|
|
|
|
|
"tools",
|
|
|
|
|
"toys",
|
|
|
|
|
"tractor",
|
|
|
|
|
"trailer",
|
|
|
|
|
"transformer",
|
|
|
|
|
"truck",
|
|
|
|
|
"typewriter",
|
|
|
|
|
"sail",
|
|
|
|
|
"sewing_machine",
|
|
|
|
|
"ship",
|
|
|
|
|
"picture",
|
|
|
|
|
"pillow",
|
|
|
|
|
"plastic",
|
|
|
|
|
"cash_register",
|
|
|
|
|
"cnc",
|
|
|
|
|
"laptop",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
"laundry_machines",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
"photo_camera",
|
|
|
|
|
"photocopier",
|
|
|
|
|
"piano",
|
|
|
|
|
"power_tools",
|
|
|
|
|
"pressure_gauges",
|
|
|
|
|
"printer",
|
|
|
|
|
,
|
|
|
|
|
"snowboard",
|
|
|
|
|
"snowmobile",
|
|
|
|
|
"starter",
|
|
|
|
|
"machines",
|
|
|
|
|
"mainframe",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
"outboard_motor",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
"video",
|
|
|
|
|
"washing_machine",
|
|
|
|
|
"ski",
|
|
|
|
|
"radiator",
|
|
|
|
|
"radio",
|
|
|
|
|
"refrigerator",
|
|
|
|
|
"rv",
|
|
|
|
|
"ski",
|
|
|
|
|
"window",
|
|
|
|
|
"zipper",
|
|
|
|
|
"weighing_scale",
|
|
|
|
|
"small_electric_vehicle",
|
|
|
|
|
].map((s) => s.replace(/ /g, "_"))
|
2024-07-27 02:18:58 +02:00
|
|
|
|
|
|
|
|
|
const skip = ["yes", "no", "only", "brand", "assisted_self_repair", "only_sold"]
|
|
|
|
|
const dloader = new OsmObjectDownloader()
|
2024-08-09 16:58:48 +02:00
|
|
|
|
const rm = [
|
|
|
|
|
"50243147100015",
|
|
|
|
|
"81342677200048",
|
|
|
|
|
"and overhaul",
|
|
|
|
|
"repair",
|
|
|
|
|
"unset",
|
|
|
|
|
"сервисный_центр",
|
|
|
|
|
"taller_de_michu",
|
|
|
|
|
"quitandinha_g_&_a",
|
|
|
|
|
"mechanika",
|
|
|
|
|
].map((v) => v.replace(/ /g, "_"))
|
2024-07-27 02:18:58 +02:00
|
|
|
|
const objects: OsmObject[] = []
|
2024-08-09 16:58:48 +02:00
|
|
|
|
const changesToMake: ChangeDescription[] = []
|
2024-07-27 02:18:58 +02:00
|
|
|
|
const first = GeoOperations.centerpointCoordinates(data[0])
|
|
|
|
|
for (const f of data) {
|
2024-08-09 16:58:48 +02:00
|
|
|
|
if (
|
|
|
|
|
GeoOperations.distanceBetween(first, GeoOperations.centerpointCoordinates(f)) >
|
|
|
|
|
2500000
|
|
|
|
|
) {
|
2024-07-27 02:18:58 +02:00
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
let keyRaw = f.properties.repair
|
|
|
|
|
keyRaw = replace[keyRaw] ?? keyRaw
|
2024-08-09 16:58:48 +02:00
|
|
|
|
if (brands.some((br) => keyRaw.toLowerCase().indexOf(br.trim()) >= 0)) {
|
2024-07-27 02:18:58 +02:00
|
|
|
|
f.properties.repair = "brand"
|
2024-08-09 16:58:48 +02:00
|
|
|
|
}
|
|
|
|
|
if (skip.indexOf(keyRaw) >= 0) {
|
2024-07-27 02:18:58 +02:00
|
|
|
|
f.properties.repair = keyRaw
|
|
|
|
|
} else {
|
2024-08-09 16:58:48 +02:00
|
|
|
|
const r = keyRaw
|
|
|
|
|
.replace(/\/|,/g, ";")
|
|
|
|
|
.split(";")
|
|
|
|
|
.map((k) => k.trim().replace(/ /g, "_").toLowerCase())
|
2024-07-27 02:18:58 +02:00
|
|
|
|
for (let key of r) {
|
|
|
|
|
key = replace[key] ?? key
|
|
|
|
|
|
|
|
|
|
if (rm.indexOf(key) >= 0) {
|
|
|
|
|
delete f.properties.repair
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
f.properties[key + ":repair"] = "yes"
|
|
|
|
|
delete f.properties.repair
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (f.properties.service === "repair") {
|
|
|
|
|
delete f.properties.service
|
|
|
|
|
f.properties.repair = "yes"
|
|
|
|
|
}
|
|
|
|
|
const id = f.properties["id"]
|
|
|
|
|
const osm = await dloader.DownloadObjectAsync(id)
|
|
|
|
|
if (osm === "deleted") {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
objects.push(osm)
|
|
|
|
|
for (const key in f.properties) {
|
|
|
|
|
if (metakeys.indexOf(key) >= 0) {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
const value = f.properties[key]
|
|
|
|
|
const ct = await new ChangeTagAction(id, new Tag(key, value), f.properties, {
|
|
|
|
|
changeType: "fix",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
theme: "script",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
}).CreateChangeDescriptions()
|
|
|
|
|
changesToMake.push(...ct)
|
2024-08-09 16:58:48 +02:00
|
|
|
|
console.log(ct.map((cd) => cd.tags))
|
2024-07-27 02:18:58 +02:00
|
|
|
|
if (f.properties.repair === undefined) {
|
|
|
|
|
const ct = await new ChangeTagAction(id, new Tag("repair", ""), f.properties, {
|
|
|
|
|
changeType: "fix",
|
2024-08-09 16:58:48 +02:00
|
|
|
|
theme: "script",
|
2024-07-27 02:18:58 +02:00
|
|
|
|
}).CreateChangeDescriptions()
|
|
|
|
|
changesToMake.push(...ct)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-09 16:58:48 +02:00
|
|
|
|
const changedObjects = changes.CreateChangesetObjects(changesToMake, objects)
|
2024-07-27 02:18:58 +02:00
|
|
|
|
|
2024-08-24 12:01:46 +02:00
|
|
|
|
const osc = Changes.buildChangesetXML("", changedObjects)
|
2024-07-27 02:18:58 +02:00
|
|
|
|
|
2024-08-09 16:58:48 +02:00
|
|
|
|
writeFileSync("Cleanup.osc", osc, "utf8")
|
2024-07-27 02:18:58 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
new CleanRepair().run()
|