| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  | import {appendFileSync, existsSync, readFileSync, writeFileSync} from "fs"; | 
					
						
							|  |  |  | import {GeoOperations} from "../../Logic/GeoOperations"; | 
					
						
							|  |  |  | import ScriptUtils from "../ScriptUtils"; | 
					
						
							|  |  |  | import {Utils} from "../../Utils"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function main(args: string[]) { | 
					
						
							| 
									
										
										
										
											2022-02-14 01:15:20 +01:00
										 |  |  | ScriptUtils.fixUtils() | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |     const pointCandidates = JSON.parse(readFileSync(args[0], "utf8")) | 
					
						
							|  |  |  |     const postcodes = JSON.parse(readFileSync(args[1], "utf8")) | 
					
						
							|  |  |  |     const output = args[2] ?? "centralCoordinates.csv" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const perPostCode = new Map<string, any[]>() | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |     const alreadyLoaded = new Set<number>() | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |     if (existsSync(output)) { | 
					
						
							|  |  |  |         const lines = readFileSync(output, "UTF8").split("\n") | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |         lines.shift() | 
					
						
							|  |  |  |         lines.forEach(line => { | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             const postalCode = Number(line.split(",")[0]) | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |             alreadyLoaded.add(postalCode) | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         writeFileSync(output, "postal_code,lon,lat\n", "UTF-8") | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (const boundary of postcodes.features) { | 
					
						
							|  |  |  |         const postcode = boundary.properties.nouveau_PO | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         if (alreadyLoaded.has(Number(postcode))) { | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |             console.log("Skipping ", postcode, "as already loaded") | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (perPostCode.has(postcode)) { | 
					
						
							|  |  |  |             perPostCode.get(postcode).push(boundary) | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             perPostCode.set(postcode, [boundary]) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (const postcode of Array.from(perPostCode.keys())) { | 
					
						
							|  |  |  |         const boundaries = perPostCode.get(postcode) | 
					
						
							|  |  |  |         const candidates = [] | 
					
						
							|  |  |  |         for (const boundary of boundaries) { | 
					
						
							|  |  |  |             for (const candidate of pointCandidates.features) { | 
					
						
							|  |  |  |                 if (!GeoOperations.inside(candidate, boundary)) { | 
					
						
							|  |  |  |                     // console.log(JSON.stringify(candidate))
 | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 candidates.push(candidate.geometry.coordinates) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (candidates.length === 0) { | 
					
						
							|  |  |  |             console.log("Postcode ", postcode, "has", candidates.length, "candidates, using centerpoint instead") | 
					
						
							|  |  |  |             candidates.push(...boundaries.map(boundary => GeoOperations.centerpointCoordinates(boundary))) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const url = "https://staging.anyways.eu/routing-api/v1/routes?access_token=postal_code_script&turn_by_turn=false&format=geojson&language=en" | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         const depPoints: [number, number][] = Utils.NoNull(await Promise.all(candidates.map(async candidate => { | 
					
						
							|  |  |  |             try { | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-14 01:15:20 +01:00
										 |  |  |                 const result = await Utils.downloadJson(url + "&loc=" + candidate.join("%2C") + "&loc=3.22000%2C51.21577&profile=car.short") | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |                 const depPoint = result.features.filter(f => f.geometry.type === "LineString")[0].geometry.coordinates[0] | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |                 return <[number, number]>[depPoint[0], depPoint[1]] // Drop elevation
 | 
					
						
							|  |  |  |             } catch (e) { | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |                 console.error("No result or could not calculate a route") | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }))) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |         const centers = boundaries.map(b => GeoOperations.centerpointCoordinates(b)) | 
					
						
							|  |  |  |         const center = GeoOperations.centerpointCoordinates({ | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |             type: "Feature", | 
					
						
							|  |  |  |             geometry: { | 
					
						
							|  |  |  |                 type: "LineString", | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |                 coordinates: centers | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |         depPoints.sort((c0, c1) => GeoOperations.distanceBetween(c0, center) - GeoOperations.distanceBetween(c1, center)) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  |         console.log("Sorted departure point candidates for ", postcode, " are ", JSON.stringify(depPoints)) | 
					
						
							|  |  |  |         appendFileSync(output, [postcode, ...depPoints[0]].join(", ") + "\n", "UTF-8") | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let args = [...process.argv] | 
					
						
							|  |  |  | args.splice(0, 2) | 
					
						
							|  |  |  | main(args).then(_ => console.log("Done!")) |