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, " " ) )