211 lines
No EOL
5.6 KiB
TypeScript
211 lines
No EOL
5.6 KiB
TypeScript
import * as fs from "fs";
|
|
import {OH} from "../UI/OpeningHours/OpeningHours";
|
|
|
|
|
|
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", "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, " "
|
|
)) |