forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			88 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			88 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								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
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            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()
							 |