| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  | import Script from "./Script" | 
					
						
							| 
									
										
										
										
											2023-07-15 18:04:30 +02:00
										 |  |  | import { Utils } from "../src/Utils" | 
					
						
							| 
									
										
										
										
											2023-09-02 23:24:01 +02:00
										 |  |  | import { Eli, EliEntry } from "./@types/eli" | 
					
						
							| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  | 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
 | 
					
						
							| 
									
										
										
										
											2023-07-15 18:04:30 +02:00
										 |  |  |         const target = args[0] ?? "src/assets/editor-layer-index.json" | 
					
						
							| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 23:24:01 +02:00
										 |  |  |         const eli: Eli = await Utils.downloadJson(url) | 
					
						
							|  |  |  |         const keptLayers: EliEntry[] = [] | 
					
						
							| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  |         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 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 23:24:01 +02:00
										 |  |  |             if (props.permission_osm === "no") { | 
					
						
							| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 23:24:01 +02:00
										 |  |  |             if (props.max_zoom && props.max_zoom < 19) { | 
					
						
							| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  |                 // 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 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 23:24:01 +02:00
										 |  |  |             if (props.url.startsWith("http://")) { | 
					
						
							|  |  |  |                 // Mixed content will not work properly, so we don't use this layer
 | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Override the layer, so it contains only the properties we need
 | 
					
						
							|  |  |  |             layer.properties = { | 
					
						
							|  |  |  |                 name: props.name, | 
					
						
							|  |  |  |                 id: props.id, | 
					
						
							|  |  |  |                 url: props.url, | 
					
						
							|  |  |  |                 attribution: props.attribution, | 
					
						
							|  |  |  |                 type: props.type, | 
					
						
							|  |  |  |                 category: props.category, | 
					
						
							|  |  |  |                 min_zoom: props.min_zoom, | 
					
						
							|  |  |  |                 max_zoom: props.max_zoom, | 
					
						
							|  |  |  |                 best: props.best ? true : undefined, | 
					
						
							|  |  |  |                 default: props.default ? true : undefined, | 
					
						
							|  |  |  |                 "tile-size": props["tile-size"], | 
					
						
							| 
									
										
										
										
											2023-03-10 19:41:02 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             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() |