forked from MapComplete/MapComplete
		
	Filter out http sources, add types
This commit is contained in:
		
							parent
							
								
									86a797a75f
								
							
						
					
					
						commit
						18cc3d7748
					
				
					 3 changed files with 258 additions and 82 deletions
				
			
		
							
								
								
									
										213
									
								
								scripts/@types/eli.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								scripts/@types/eli.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,213 @@
 | 
				
			||||||
 | 
					import { Feature, FeatureCollection } from "geojson"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface Eli extends FeatureCollection {
 | 
				
			||||||
 | 
					    features: EliEntry[]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface EliEntry extends Feature {
 | 
				
			||||||
 | 
					    properties: {
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * The name of the imagery source
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        name: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Whether the imagery name should be translated
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        i18n?: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Type of layer
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        type: "tms" | "wms" | "bing" | "scanex" | "wms_endpoint" | "wmts"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A rough categorisation of different types of layers.
 | 
				
			||||||
 | 
					         * @see https://github.com/osmlab/editor-layer-index/blob/gh-pages/CONTRIBUTING.md#categories
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        category?:
 | 
				
			||||||
 | 
					            | "photo"
 | 
				
			||||||
 | 
					            | "map"
 | 
				
			||||||
 | 
					            | "historicmap"
 | 
				
			||||||
 | 
					            | "osmbasedmap"
 | 
				
			||||||
 | 
					            | "historicphoto"
 | 
				
			||||||
 | 
					            | "qa"
 | 
				
			||||||
 | 
					            | "elevation"
 | 
				
			||||||
 | 
					            | "other"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A URL template for imagery tiles
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        url: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * The minimum zoom level
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        min_zoom?: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * The maximum zoom level
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        max_zoom?: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * explicit/implicit permission by the owner for use in OSM
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        permission_osm?: "explicit" | "implicit" | "no"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A URL for the license or permissions for the imagery
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        license_url?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A URL for the privacy policy of the operator or false if there is no existing privacy policy for tis imagery.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        privacy_policy_url?: string | boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A unique identifier for the source; used in imagery_used changeset tag
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        id: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A short English-language description of the source
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        description?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * The ISO 3166-1 alpha-2 two letter country code in upper case. Use ZZ for unknown or multiple.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        country_code?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Whether this imagery should be shown in the default world-wide menu
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        default?: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Whether this imagery is the best source for the region
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        best?: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * The age of the oldest imagery or data in the source, as an RFC3339 date or leading portion of one
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        start_date?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * The age of the newest imagery or data in the source, as an RFC3339 date or leading portion of one
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        end_date?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * HTTP header to check for information if the tile is invalid
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        no_tile_header?: { [header: string]: string[] } | null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 'true' if tiles are transparent and can be overlaid on another source
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        overlay?: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Available projections
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        available_projections?: string[]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Attribution
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        attribution?: {
 | 
				
			||||||
 | 
					            /**
 | 
				
			||||||
 | 
					             * URL
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            url?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /**
 | 
				
			||||||
 | 
					             * Text
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            text?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /**
 | 
				
			||||||
 | 
					             * HTML formatted attribution
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            html?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /**
 | 
				
			||||||
 | 
					             * Whether attribution is required
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            required?: boolean
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A URL for an image, that can be displayed in the list of imagery layers next to the name
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        icon?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A link to an EULA text that has to be accepted by the user, before the imagery source is added. Can contain {lang} to be replaced by a current user language wiki code (like FR:) or an empty string for the default English text.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        eula?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * A URL for an image, that is displayed in the mapview for attribution
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "logo-image"?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Customized text for the terms of use link (default is "Background Terms of Use")
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "terms-of-use-text"?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Specify a checksum for tiles, which aren't real tiles. `type` is the digest type and can be MD5, SHA-1, SHA-256, SHA-384 and SHA-512, value is the hex encoded checksum in lower case. To create a checksum save the tile as file and upload it to e.g. https://defuse.ca/checksums.htm.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "no-tile-checksum"?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * header-name attribute specifies a header returned by tile server, that will be shown as `metadata-key` attribute in Show Tile Info dialog
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "metadata-header"?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Set to `true` if imagery source is properly aligned and does not need imagery offset adjustments. This is used for OSM based sources too.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "valid-georeference"?: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Size of individual tiles delivered by a TMS service
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "tile-size"?: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Whether tiles status can be accessed by appending /status to the tile URL and can be submitted for re-rendering by appending /dirty.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "mod-tile-features"?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * HTTP headers to be sent to server. It has two attributes header-name and header-value. May be specified multiple times.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "custom-http-headers"?: { "header-name": string; "header-value": string }[]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * Default layer to open (when using WMS_ENDPOINT type). Contains list of layer tag with two attributes - name and style, e.g. `\"default-layers\": [\"layer\": { name=\"Basisdata_NP_Basiskart_JanMayen_WMTS_25829\" \"style\":\"default\" } ]` (not allowed in `mirror` attribute)
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "default-layers"?: { layer: { "layer-name": string; "layer-style": string } }[]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * format to use when connecting tile server (when using WMS_ENDPOINT type)
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        format?: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * If `true` transparent tiles will be requested from WMS server
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        transparent?: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * minimum expiry time for tiles in seconds. The larger the value, the longer entry in cache will be considered valid
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        "minimum-tile-expire"?: number
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
import Script from "./Script"
 | 
					import Script from "./Script"
 | 
				
			||||||
import { Utils } from "../src/Utils"
 | 
					import { Utils } from "../src/Utils"
 | 
				
			||||||
import { FeatureCollection } from "geojson"
 | 
					import { Eli, EliEntry } from "./@types/eli"
 | 
				
			||||||
import fs from "fs"
 | 
					import fs from "fs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DownloadEli extends Script {
 | 
					class DownloadEli extends Script {
 | 
				
			||||||
| 
						 | 
					@ -12,8 +12,8 @@ class DownloadEli extends Script {
 | 
				
			||||||
        // Target should use '.json' instead of '.geojson', as the latter cannot be imported by the build systems
 | 
					        // 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 target = args[0] ?? "src/assets/editor-layer-index.json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const eli = <FeatureCollection>await Utils.downloadJson(url)
 | 
					        const eli: Eli = await Utils.downloadJson(url)
 | 
				
			||||||
        const keptLayers = []
 | 
					        const keptLayers: EliEntry[] = []
 | 
				
			||||||
        console.log("Got", eli.features.length, "ELI-entries")
 | 
					        console.log("Got", eli.features.length, "ELI-entries")
 | 
				
			||||||
        for (let layer of eli.features) {
 | 
					        for (let layer of eli.features) {
 | 
				
			||||||
            const props = layer.properties
 | 
					            const props = layer.properties
 | 
				
			||||||
| 
						 | 
					@ -45,11 +45,11 @@ class DownloadEli extends Script {
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (props.permission_url === "no") {
 | 
					            if (props.permission_osm === "no") {
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (props.max_zoom < 19) {
 | 
					            if (props.max_zoom && props.max_zoom < 19) {
 | 
				
			||||||
                // We want users to zoom to level 19 when adding a point
 | 
					                // 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
 | 
					                // 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
 | 
					                continue
 | 
				
			||||||
| 
						 | 
					@ -60,24 +60,24 @@ class DownloadEli extends Script {
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const keptKeys = [
 | 
					            if (props.url.startsWith("http://")) {
 | 
				
			||||||
                "name",
 | 
					                // Mixed content will not work properly, so we don't use this layer
 | 
				
			||||||
                "id",
 | 
					                continue
 | 
				
			||||||
                "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]
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 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 }
 | 
					            layer = { properties: layer.properties, type: layer.type, geometry: layer.geometry }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue