forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			211 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			211 lines
		
	
	
	
		
			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, "  " | ||
|  | )) |