mapcomplete/scripts/importscripts/extractBikeRental.ts

217 lines
5.8 KiB
TypeScript

import * as fs from "fs"
import { OH } from "../../UI/OpeningHours/OpeningHours"
/*
* One-shot script to import data about bicycle rental from West-Flanders
*/
function extractValue(vs: { __value }[]) {
if (vs === undefined) {
return undefined
}
for (const v of vs) {
if ((v.__value ?? "") === "") {
continue
}
return v.__value
}
return undefined
}
function extract_oh_block(days): string {
const oh = []
for (const day of days.day) {
const abbr = day.name.substr(0, 2)
const block = day.time_block[0]
const from = block.time_from.substr(0, 5)
const to = block.time_until.substr(0, 5)
const by_appointment = block.by_appointment ? ' "by appointment"' : ""
oh.push(`${abbr} ${from}-${to}${by_appointment}`)
}
return oh.join("; ")
}
function extract_oh(opening_periods) {
const rules = []
if (opening_periods === undefined) {
return undefined
}
for (const openingPeriod of opening_periods.opening_period ?? []) {
let rule = extract_oh_block(openingPeriod.days)
if (openingPeriod.name.toLowerCase().indexOf("schoolvakantie") >= 0) {
rule = "SH " + rule
}
rules.push(rule)
}
return OH.simplify(rules.join(";"))
}
function rewrite(obj, key) {
if (obj[key] === undefined) {
return
}
obj[key] = extractValue(obj[key]["value"])
}
const stuff = fs.readFileSync(
"/home/pietervdvn/Documents/Freelance/ToerismeVlaanderen 2021-09/TeImporteren/allchannels-bike_rental.json",
{ encoding: "utf8" }
)
const data: any[] = JSON.parse(stuff)
const results: {
geometry: {
type: "Point"
coordinates: [number, number]
}
type: "Feature"
properties: any
}[] = []
const skipped = []
console.log("[")
for (const item of data) {
const metadata = item["metadata"]
if (metadata.name === "Jommekeroute") {
continue
}
const addr = item.location_info?.address
if (addr === undefined) {
skipped.push(item)
continue
}
const toDelete = [
"id",
"uuid",
"update_date",
"creation_date",
"deleted",
"aborted",
"partner_id",
"business_product_id",
"winref",
"winref_uuid",
"root_product_type",
"parent",
]
for (const key of toDelete) {
delete metadata[key]
}
delete item["meeting_rooms_count"]
delete item["facilities"]
item.properties = metadata
delete item["metadata"]
const metadata_values = ["touristic_product_type", "root_product_type"]
for (const key of metadata_values) {
rewrite(metadata, key)
}
rewrite(item.contact_info, "commercial_name")
const gl = addr.geolocation
item.coordinates = [gl.lon, gl.lat]
metadata["addr:street"] = addr.street
metadata["addr:housenumber"] = addr.number
metadata["phone"] = item.contact_info["telephone"] ?? item.contact_info["mobile"]
metadata["email"] = item.contact_info["email_address"]
const links = item.links?.link?.map((l) => l.url) ?? []
metadata["website"] = item.contact_info["website"] ?? links[0]
delete item["links"]
delete item.location_info
delete item.contact_info
delete item.promotional_info
if (metadata["touristic_product_type"] === "Fietsverhuur") {
metadata["amenity"] = "bicycle_rental"
delete metadata["touristic_product_type"]
} else {
console.error("Unkown product type: ", metadata["touristic_product_type"])
}
const descriptions =
item.descriptions?.description?.map((d) => extractValue(d?.text?.value)) ?? []
delete item.descriptions
metadata["description"] = metadata["description"] ?? descriptions[0]
if (item.price_info?.prices?.free == true) {
metadata.fee = "no"
delete item.price_info
} else if (item.price_info?.prices?.free == false) {
metadata.fee = "yes"
metadata.charge = extractValue(item.price_info?.extra_information?.value)
const methods = item.price_info?.payment_methods?.payment_method
if (methods !== undefined) {
methods
.map((v) => extractValue(v.value))
.forEach((method) => {
metadata["payment:" + method.toLowerCase()] = "yes"
})
}
delete item.price_info
} else if (item.price_info?.prices?.length === 0) {
delete item.price_info
}
try {
if (item.labels_info?.labels_own?.label[0]?.code === "Billenkar") {
metadata.rental = "quadricycle"
delete item.labels_info
}
} catch (e) {}
delete item["publishing_channels"]
try {
metadata["image"] = item.media.file[0].url[0]
} catch (e) {
// No image!
}
delete item.media
const time_info = item.time_info?.time_info_regular
if (time_info?.permantly_open === true) {
metadata.opening_hours = "24/7"
} else {
metadata.opening_hours = extract_oh(time_info?.opening_periods)
}
delete item.time_info
const properties = {}
for (const key in metadata) {
const v = metadata[key]
if (v === null || v === undefined || v === "") {
delete metadata[key]
continue
}
properties[key] = v
}
results.push({
geometry: {
type: "Point",
coordinates: item.coordinates,
},
type: "Feature",
properties,
})
delete item.coordinates
delete item.properties
console.log(JSON.stringify(item, null, " ") + ",")
}
console.log("]")
fs.writeFileSync(
"west-vlaanderen.geojson",
JSON.stringify(
{
type: "FeatureCollection",
features: results,
},
null,
" "
)
)