forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import Script from "./Script"
 | 
						|
import { Utils } from "../src/Utils"
 | 
						|
import { Eli, EliEntry } from "./@types/eli"
 | 
						|
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] ?? "src/assets/editor-layer-index.json"
 | 
						|
 | 
						|
        const eli: Eli = await Utils.downloadJson(url)
 | 
						|
        const keptLayers: EliEntry[] = []
 | 
						|
        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.id === "Mapbox") {
 | 
						|
                /**
 | 
						|
                 * This token is managed by Martin Reifer on the 'OpenStreetMap'-account on MapBox
 | 
						|
                 */
 | 
						|
                const token =
 | 
						|
                    "pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjbGZkempiNDkyandvM3lwY3M4MndpdWdzIn0.QnvRv52n3qffVEKmQa9vJA"
 | 
						|
                props.url = props.url.replace("{apikey}", token)
 | 
						|
            }
 | 
						|
 | 
						|
            if (props.url.toLowerCase().indexOf("apikey") > 0) {
 | 
						|
                continue
 | 
						|
            }
 | 
						|
 | 
						|
            if (props.permission_osm === "no") {
 | 
						|
                continue
 | 
						|
            }
 | 
						|
 | 
						|
            if (props.max_zoom && 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
 | 
						|
            }
 | 
						|
 | 
						|
            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"],
 | 
						|
            }
 | 
						|
 | 
						|
            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()
 |