| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  | import Script from "./Script" | 
					
						
							|  |  |  | import { Utils } from "../Utils" | 
					
						
							|  |  |  | import { FeatureCollection } from "geojson" | 
					
						
							|  |  |  | import fs from "fs" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DownloadEli extends Script { | 
					
						
							|  |  |  |     constructor() { | 
					
						
							|  |  |  |         super("Downloads a fresh copy of the editor layer index, removes all unnecessary data.") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     async main(args: string[]): Promise<void> { | 
					
						
							|  |  |  |         const url = "https://osmlab.github.io/editor-layer-index/imagery.geojson" | 
					
						
							|  |  |  |         // Target should use '.json' instead of '.geojson', as the latter cannot be imported by the build systems
 | 
					
						
							|  |  |  |         const target = args[0] ?? "assets/editor-layer-index.json" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const eli = <FeatureCollection>await Utils.downloadJson(url) | 
					
						
							|  |  |  |         const keptLayers = [] | 
					
						
							|  |  |  |         console.log("Got", eli.features.length, "ELI-entries") | 
					
						
							|  |  |  |         for (let layer of eli.features) { | 
					
						
							|  |  |  |             const props = layer.properties | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (props.type === "bing") { | 
					
						
							|  |  |  |                 // A lot of work to implement - see https://github.com/pietervdvn/MapComplete/issues/648
 | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (props.id === "MAPNIK") { | 
					
						
							|  |  |  |                 // Already added by default
 | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (props.overlay) { | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-24 12:23:42 +01:00
										 |  |  |             if (props.id === "Mapbox") { | 
					
						
							| 
									
										
										
										
											2023-03-19 13:37:28 +01:00
										 |  |  |                 /** | 
					
						
							|  |  |  |                  * This token is managed by Martin Reifer on the 'OpenStreetMap'-account on MapBox | 
					
						
							|  |  |  |                  */ | 
					
						
							| 
									
										
										
										
											2023-03-24 12:23:42 +01:00
										 |  |  |                 const token = | 
					
						
							|  |  |  |                     "pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjbGZkempiNDkyandvM3lwY3M4MndpdWdzIn0.QnvRv52n3qffVEKmQa9vJA" | 
					
						
							| 
									
										
										
										
											2023-03-19 13:37:28 +01:00
										 |  |  |                 props.url = props.url.replace("{apikey}", token) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  |             if (props.url.toLowerCase().indexOf("apikey") > 0) { | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (props.permission_url === "no") { | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (props.max_zoom < 19) { | 
					
						
							|  |  |  |                 // We want users to zoom to level 19 when adding a point
 | 
					
						
							|  |  |  |                 // If they are on a layer which hasn't enough precision, they can not zoom far enough. This is confusing, so we don't use this layer
 | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (props.name === undefined) { | 
					
						
							|  |  |  |                 console.warn("Editor layer index: name not defined on ", props) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const keptKeys = [ | 
					
						
							|  |  |  |                 "name", | 
					
						
							|  |  |  |                 "id", | 
					
						
							|  |  |  |                 "url", | 
					
						
							|  |  |  |                 "attribution", | 
					
						
							|  |  |  |                 "type", | 
					
						
							|  |  |  |                 "category", | 
					
						
							|  |  |  |                 "min_zoom", | 
					
						
							|  |  |  |                 "max_zoom", | 
					
						
							|  |  |  |                 "best", | 
					
						
							|  |  |  |                 "default", | 
					
						
							|  |  |  |                 "tile-size", | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |             layer.properties = {} | 
					
						
							|  |  |  |             for (const keptKey of keptKeys) { | 
					
						
							|  |  |  |                 if (props[keptKey]) { | 
					
						
							|  |  |  |                     layer.properties[keptKey] = props[keptKey] | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             layer = { properties: layer.properties, type: layer.type, geometry: layer.geometry } | 
					
						
							|  |  |  |             keptLayers.push(layer) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const contents = | 
					
						
							|  |  |  |             '{"type":"FeatureCollection",\n  "features": [\n' + | 
					
						
							|  |  |  |             keptLayers.map((l) => JSON.stringify(l)).join(",\n") + | 
					
						
							|  |  |  |             "\n]}" | 
					
						
							|  |  |  |         fs.writeFileSync(target, contents, { encoding: "utf8" }) | 
					
						
							|  |  |  |         console.log("Written", keptLayers.length + ", entries to the ELI") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | new DownloadEli().run() |