forked from MapComplete/MapComplete
		
	Merge develop
This commit is contained in:
		
						commit
						0d1a91dbab
					
				
					 86 changed files with 35793 additions and 1537 deletions
				
			
		
							
								
								
									
										217
									
								
								scripts/importscripts/extractBikeRental.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								scripts/importscripts/extractBikeRental.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,217 @@ | |||
| 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, | ||||
|         "  " | ||||
|     ) | ||||
| ) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue