| 
									
										
										
										
											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)) { | 
					
						
							| 
									
										
										
										
											2023-01-15 23:28:02 +01:00
										 |  |  |         const lines = readFileSync(output, { encoding: "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 { | 
					
						
							| 
									
										
										
										
											2023-01-15 23:28:02 +01:00
										 |  |  |         writeFileSync(output, "postal_code,lon,lat\n", { encoding: "utf8" }) | 
					
						
							| 
									
										
										
										
											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)) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             ) | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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 { | 
					
						
							| 
									
										
										
										
											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-09-08 21:40:48 +02: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) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-01-15 23:28:02 +01:00
										 |  |  |         appendFileSync(output, [postcode, ...depPoints[0]].join(", ") + "\n", { encoding: "utf8" }) | 
					
						
							| 
									
										
										
										
											2021-12-13 20:50:03 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let args = [...process.argv] | 
					
						
							|  |  |  | args.splice(0, 2) | 
					
						
							|  |  |  | main(args).then((_) => console.log("Done!")) |