forked from MapComplete/MapComplete
		
	Use protomaps.sunny as default layer
This commit is contained in:
		
							parent
							
								
									6a08c28dca
								
							
						
					
					
						commit
						e8f4b382a8
					
				
					 18 changed files with 89 additions and 62 deletions
				
			
		|  | @ -1147,6 +1147,7 @@ | ||||||
|         "fill-opacity": 0.5 |         "fill-opacity": 0.5 | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  | 
 | ||||||
|     { |     { | ||||||
|       "id": "transit_pier", |       "id": "transit_pier", | ||||||
|       "type": "line", |       "type": "line", | ||||||
|  |  | ||||||
|  | @ -259,7 +259,7 @@ class GenerateLayouts extends Script { | ||||||
|         const urls: string[] = [] |         const urls: string[] = [] | ||||||
|         const regex = /{switch:([^}]+)}/ |         const regex = /{switch:([^}]+)}/ | ||||||
|         const rasterLayers = [ |         const rasterLayers = [ | ||||||
|             AvailableRasterLayers.maptilerDefaultLayer, |             AvailableRasterLayers.defaultBackgroundLayer, | ||||||
|             ...eli.features, |             ...eli.features, | ||||||
|             ...eli_global.layers.map((properties) => ({ properties })) |             ...eli_global.layers.map((properties) => ({ properties })) | ||||||
|         ] |         ] | ||||||
|  |  | ||||||
|  | @ -48,26 +48,12 @@ export class AvailableRasterLayers { | ||||||
|         geometry: BBox.global.asGeometry(), |         geometry: BBox.global.asGeometry(), | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static readonly maptilerDefaultLayer: RasterLayerPolygon = { |     /** | ||||||
|         type: "Feature", |      * The default background layer that any theme uses which does not explicitly define a background | ||||||
|         properties: { |      */ | ||||||
|             name: "MapTiler", |     public static readonly defaultBackgroundLayer: RasterLayerPolygon = AvailableRasterLayers.globalLayers.find(l => { | ||||||
|             url: |         return l.properties.id === "protomaps.sunny" | ||||||
|                 "https://api.maptiler.com/maps/15cc8f61-0353-4be6-b8da-13daea5f7432/style.json?key=" + |     }) | ||||||
|                 Constants.maptilerApiKey, |  | ||||||
|             style: |  | ||||||
|                 "https://api.maptiler.com/maps/15cc8f61-0353-4be6-b8da-13daea5f7432/style.json?key=" + |  | ||||||
|                 Constants.maptilerApiKey, |  | ||||||
|             category: "osmbasedmap", |  | ||||||
|             id: "maptiler", |  | ||||||
|             type: "vector", |  | ||||||
|             attribution: { |  | ||||||
|                 text: "Maptiler", |  | ||||||
|                 url: "https://www.maptiler.com/copyright/", |  | ||||||
|             }, |  | ||||||
|         }, |  | ||||||
|         geometry: BBox.global.asGeometry(), |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     public static layersAvailableAt( |     public static layersAvailableAt( | ||||||
|         location: Store<{ lon: number; lat: number }>, |         location: Store<{ lon: number; lat: number }>, | ||||||
|  | @ -93,7 +79,7 @@ export class AvailableRasterLayers { | ||||||
|                         return GeoOperations.inside(lonlat, eliPolygon) |                         return GeoOperations.inside(lonlat, eliPolygon) | ||||||
|                     }) |                     }) | ||||||
|                     matching.unshift(AvailableRasterLayers.osmCarto) |                     matching.unshift(AvailableRasterLayers.osmCarto) | ||||||
|                     matching.push(AvailableRasterLayers.maptilerDefaultLayer) |                     matching.push(AvailableRasterLayers.defaultBackgroundLayer) | ||||||
|                     if (enableBing?.data) { |                     if (enableBing?.data) { | ||||||
|                         matching.push(AvailableRasterLayers.bing) |                         matching.push(AvailableRasterLayers.bing) | ||||||
|                     } |                     } | ||||||
|  | @ -110,7 +96,7 @@ export class AvailableRasterLayers { | ||||||
|         all.push(...AvailableRasterLayers.globalLayers.map((l) => l.properties.id)) |         all.push(...AvailableRasterLayers.globalLayers.map((l) => l.properties.id)) | ||||||
|         all.push(...AvailableRasterLayers.EditorLayerIndex.map((l) => l.properties.id)) |         all.push(...AvailableRasterLayers.EditorLayerIndex.map((l) => l.properties.id)) | ||||||
|         all.push(this.osmCarto.properties.id) |         all.push(this.osmCarto.properties.id) | ||||||
|         all.push(this.maptilerDefaultLayer.properties.id) |         all.push(this.defaultBackgroundLayer.properties.id) | ||||||
|         return new Set<string>(all) |         return new Set<string>(all) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -106,6 +106,6 @@ | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <div class="h-full w-full relative"> | <div class="h-full w-full relative"> | ||||||
|   <MaplibreMap {map} /> |   <MaplibreMap {map} mapProperties={adaptor} /> | ||||||
|   <SmallZoomButtons {adaptor} /> |   <SmallZoomButtons {adaptor} /> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ | ||||||
|     const templateUrls = SvgToPdf.templates[templateName].pages |     const templateUrls = SvgToPdf.templates[templateName].pages | ||||||
|     const templates: string[] = await Promise.all(templateUrls.map((url) => Utils.download(url))) |     const templates: string[] = await Promise.all(templateUrls.map((url) => Utils.download(url))) | ||||||
|     console.log("Templates are", templates) |     console.log("Templates are", templates) | ||||||
|     const bg = state.mapProperties.rasterLayer.data ?? AvailableRasterLayers.maptilerDefaultLayer |     const bg = state.mapProperties.rasterLayer.data ?? AvailableRasterLayers.defaultBackgroundLayer | ||||||
|     const creator = new SvgToPdf(title, templates, { |     const creator = new SvgToPdf(title, templates, { | ||||||
|       state, |       state, | ||||||
|       freeComponentId: "belowmap", |       freeComponentId: "belowmap", | ||||||
|  |  | ||||||
|  | @ -63,7 +63,7 @@ | ||||||
|   on:touchstart={(e) => onPosChange(e.touches[0].clientX, e.touches[0].clientY)} |   on:touchstart={(e) => onPosChange(e.touches[0].clientX, e.touches[0].clientY)} | ||||||
| > | > | ||||||
|   <div class="absolute top-0 left-0 h-full w-full cursor-pointer"> |   <div class="absolute top-0 left-0 h-full w-full cursor-pointer"> | ||||||
|     <MaplibreMap attribution={false} {map} /> |     <MaplibreMap mapProperties={mla} {map} /> | ||||||
|   </div> |   </div> | ||||||
| 
 | 
 | ||||||
|   <div bind:this={directionElem} class="absolute top-0 left-0 h-full w-full"> |   <div bind:this={directionElem} class="absolute top-0 left-0 h-full w-full"> | ||||||
|  |  | ||||||
|  | @ -84,7 +84,7 @@ | ||||||
| 
 | 
 | ||||||
| <div class="min-h-32 relative h-full cursor-pointer overflow-hidden"> | <div class="min-h-32 relative h-full cursor-pointer overflow-hidden"> | ||||||
|   <div class="absolute top-0 left-0 h-full w-full cursor-pointer"> |   <div class="absolute top-0 left-0 h-full w-full cursor-pointer"> | ||||||
|     <MaplibreMap center={{ lng: initialCoordinate.lon, lat: initialCoordinate.lat }} {map} /> |     <MaplibreMap center={{ lng: initialCoordinate.lon, lat: initialCoordinate.lat }} {map} mapProperties={mla}/> | ||||||
|   </div> |   </div> | ||||||
| 
 | 
 | ||||||
|   <div |   <div | ||||||
|  |  | ||||||
|  | @ -60,6 +60,11 @@ export default class InputHelpers { | ||||||
|         if (!mapProperties.zoom) { |         if (!mapProperties.zoom) { | ||||||
|             mapProperties = { ...mapProperties, zoom: new UIEventSource<number>(zoom) } |             mapProperties = { ...mapProperties, zoom: new UIEventSource<number>(zoom) } | ||||||
|         } |         } | ||||||
|  |         if (!mapProperties.rasterLayer) { | ||||||
|  |        /*     mapProperties = { | ||||||
|  |                 ...mapProperties, rasterLayer: properties?.mapProperties?.rasterLayer | ||||||
|  |             }*/ | ||||||
|  |         } | ||||||
|         return mapProperties |         return mapProperties | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -120,7 +125,7 @@ export default class InputHelpers { | ||||||
|             value, |             value, | ||||||
|             searchText: searchForValue, |             searchText: searchForValue, | ||||||
|             instanceOf, |             instanceOf, | ||||||
|             notInstanceOf, |             notInstanceOf | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -60,6 +60,8 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { | ||||||
|         if(!MapLibreAdaptor.pmtilesInited){ |         if(!MapLibreAdaptor.pmtilesInited){ | ||||||
|             maplibregl.addProtocol("pmtiles",new Protocol().tile); |             maplibregl.addProtocol("pmtiles",new Protocol().tile); | ||||||
|             MapLibreAdaptor.pmtilesInited = true |             MapLibreAdaptor.pmtilesInited = true | ||||||
|  |             console.log("PM-tiles protocol added" + | ||||||
|  |                 "") | ||||||
|         } |         } | ||||||
|         this._maplibreMap = maplibreMap |         this._maplibreMap = maplibreMap | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,13 +1,15 @@ | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
|   import { onDestroy, onMount } from "svelte" |   import { onDestroy, onMount } from "svelte" | ||||||
|   import type { Map } from "maplibre-gl" |   import type { Map, MapOptions } from "maplibre-gl" | ||||||
|   import * as maplibre from "maplibre-gl" |   import * as maplibre from "maplibre-gl" | ||||||
|   import type { Readable, Writable } from "svelte/store" |   import type { Writable } from "svelte/store" | ||||||
|   import { get, writable } from "svelte/store" |   import { get } from "svelte/store" | ||||||
|   import { AvailableRasterLayers } from "../../Models/RasterLayers" |   import { AvailableRasterLayers } from "../../Models/RasterLayers" | ||||||
|   import { Utils } from "../../Utils" |   import { Utils } from "../../Utils" | ||||||
|   import { ariaLabel } from "../../Utils/ariaLabel" |   import { ariaLabel } from "../../Utils/ariaLabel" | ||||||
|   import Translations from "../i18n/Translations" |   import Translations from "../i18n/Translations" | ||||||
|  |   import type { MapProperties } from "../../Models/MapProperties" | ||||||
|  |   import type { RasterLayerProperties } from "../../Models/RasterLayerProperties" | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * The 'MaplibreMap' maps various event sources onto MapLibre. |    * The 'MaplibreMap' maps various event sources onto MapLibre. | ||||||
|  | @ -17,36 +19,39 @@ | ||||||
|    * Beware: this map will _only_ be set by this component |    * Beware: this map will _only_ be set by this component | ||||||
|    * It should thus be treated as a 'store' by external parties |    * It should thus be treated as a 'store' by external parties | ||||||
|    */ |    */ | ||||||
|   export let map: Writable<Map> |   export let map: Writable<Map> = undefined | ||||||
|  |   export let mapProperties: MapProperties = undefined | ||||||
| 
 | 
 | ||||||
|   export let interactive: boolean = true |   export let interactive: boolean = true | ||||||
| 
 | 
 | ||||||
|   let container: HTMLElement |   let container: HTMLElement | ||||||
| 
 | 
 | ||||||
|   export let center: { lng: number; lat: number } | Readable<{ lng: number; lat: number }> = |  | ||||||
|     writable({ lng: 0, lat: 0 }) |  | ||||||
|   export let zoom: Readable<number> = writable(1) |  | ||||||
| 
 |  | ||||||
|   const styleUrl = AvailableRasterLayers.maptilerDefaultLayer.properties.url |  | ||||||
| 
 | 
 | ||||||
|   let _map: Map |   let _map: Map | ||||||
|   onMount(() => { |   onMount(() => { | ||||||
|     let _center: { lng: number; lat: number } |     const { lon, lat } = mapProperties?.location?.data ?? { lon: 0, lat: 0 } | ||||||
|     if (typeof center["lng"] === "number" && typeof center["lat"] === "number") { | 
 | ||||||
|       _center = <any>center |     const rasterLayer: RasterLayerProperties = mapProperties?.rasterLayer?.data?.properties | ||||||
|  |     let styleUrl: string | ||||||
|  |     if (rasterLayer?.type === "vector") { | ||||||
|  |       styleUrl = rasterLayer?.style ?? rasterLayer?.url ?? AvailableRasterLayers.defaultBackgroundLayer.properties.url | ||||||
|     } else { |     } else { | ||||||
|       _center = get(<any>center) |       const defaultLayer = AvailableRasterLayers.defaultBackgroundLayer.properties | ||||||
|  |       styleUrl = defaultLayer.style ?? defaultLayer.url | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     _map = new maplibre.Map({ |     console.log("INiting mapLIbremap with style", styleUrl) | ||||||
|  | 
 | ||||||
|  |     const options: MapOptions = { | ||||||
|       container, |       container, | ||||||
|       style: styleUrl, |       style: styleUrl, | ||||||
|       zoom: get(zoom), |       zoom: mapProperties?.zoom?.data ?? 1, | ||||||
|       center: _center, |       center: { lng: lon, lat }, | ||||||
|       maxZoom: 24, |       maxZoom: 24, | ||||||
|       interactive: true, |       interactive: true, | ||||||
|       attributionControl: false, |       attributionControl: false | ||||||
|     }) |     } | ||||||
|  |     _map = new maplibre.Map(options) | ||||||
|     window.requestAnimationFrame(() => { |     window.requestAnimationFrame(() => { | ||||||
|       _map.resize() |       _map.resize() | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|  | @ -74,4 +74,4 @@ | ||||||
|      style="z-index: 100"> |      style="z-index: 100"> | ||||||
|   <StyleLoadingIndicator map={altmap} /> |   <StyleLoadingIndicator map={altmap} /> | ||||||
| </div> | </div> | ||||||
| <MaplibreMap {interactive} map={altmap} /> | <MaplibreMap {interactive} map={altmap} mapProperties={altproperties} /> | ||||||
|  |  | ||||||
|  | @ -108,7 +108,11 @@ class SingleBackgroundHandler { | ||||||
|         } |         } | ||||||
|         const background = this._targetLayer.properties |         const background = this._targetLayer.properties | ||||||
|         console.debug("Enabling", background.id) |         console.debug("Enabling", background.id) | ||||||
|         let addLayerBeforeId = "aeroway_fill" // this is the first non-landuse item in the stylesheet, we add the raster layer before the roads but above the landuse
 |         let addLayerBeforeId = "transit_pier" // this is the first non-landuse item in the stylesheet, we add the raster layer before the roads but above the landuse
 | ||||||
|  |         if(!map.getLayer(addLayerBeforeId)){ | ||||||
|  |             console.warn("Layer", addLayerBeforeId,"not foundhttp://127.0.0.1:1234/theme.html?layout=cyclofix&z=14.8&lat=51.05282501324558&lon=3.720591622281745&layer-range=true") | ||||||
|  |             addLayerBeforeId = undefined | ||||||
|  |         } | ||||||
|         if (background.category === "osmbasedmap" || background.category === "map") { |         if (background.category === "osmbasedmap" || background.category === "map") { | ||||||
|             // The background layer is already an OSM-based map or another map, so we don't want anything from the baselayer
 |             // The background layer is already an OSM-based map or another map, so we don't want anything from the baselayer
 | ||||||
|             addLayerBeforeId = undefined |             addLayerBeforeId = undefined | ||||||
|  |  | ||||||
|  | @ -110,7 +110,7 @@ class ApplyButton extends UIElement { | ||||||
|         mla.allowZooming.setData(false) |         mla.allowZooming.setData(false) | ||||||
|         mla.allowMoving.setData(false) |         mla.allowMoving.setData(false) | ||||||
| 
 | 
 | ||||||
|         const previewMap = new SvelteUIElement(MaplibreMap, { map: mlmap }).SetClass("h-48") |         const previewMap = new SvelteUIElement(MaplibreMap, { mapProperties: mla, map: mlmap }).SetClass("h-48") | ||||||
| 
 | 
 | ||||||
|         const features = this.target_feature_ids.map((id) => |         const features = this.target_feature_ids.map((id) => | ||||||
|             this.state.indexedFeatures.featuresById.data.get(id) |             this.state.indexedFeatures.featuresById.data.get(id) | ||||||
|  |  | ||||||
|  | @ -48,7 +48,7 @@ | ||||||
| <ImportFlow {importFlow} on:confirm={() => importFlow.onConfirm()}> | <ImportFlow {importFlow} on:confirm={() => importFlow.onConfirm()}> | ||||||
|   <div slot="map" class="relative"> |   <div slot="map" class="relative"> | ||||||
|     <div class="h-32"> |     <div class="h-32"> | ||||||
|       <MaplibreMap {map} /> |       <MaplibreMap {map} mapProperties={mla} /> | ||||||
|     </div> |     </div> | ||||||
|     <div class="absolute bottom-0"> |     <div class="absolute bottom-0"> | ||||||
|       <OpenBackgroundSelectorButton /> |       <OpenBackgroundSelectorButton /> | ||||||
|  |  | ||||||
|  | @ -109,7 +109,7 @@ export class MinimapViz implements SpecialVisualization { | ||||||
|             state.layout.layers |             state.layout.layers | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         return new SvelteUIElement(MaplibreMap, { interactive: false, map: mlmap }) |         return new SvelteUIElement(MaplibreMap, { interactive: false, map: mlmap, mapProperties: mla }) | ||||||
|             .SetClass("h-40 rounded") |             .SetClass("h-40 rounded") | ||||||
|             .SetStyle("overflow: hidden; pointer-events: none;") |             .SetStyle("overflow: hidden; pointer-events: none;") | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -149,7 +149,7 @@ | ||||||
|   let currentViewLayer = layout.layers.find((l) => l.id === "current_view") |   let currentViewLayer = layout.layers.find((l) => l.id === "current_view") | ||||||
|   let rasterLayer: Store<RasterLayerPolygon> = state.mapProperties.rasterLayer |   let rasterLayer: Store<RasterLayerPolygon> = state.mapProperties.rasterLayer | ||||||
|   let rasterLayerName = |   let rasterLayerName = | ||||||
|     rasterLayer.data?.properties?.name ?? AvailableRasterLayers.maptilerDefaultLayer.properties.name |     rasterLayer.data?.properties?.name ?? AvailableRasterLayers.defaultBackgroundLayer.properties.name | ||||||
|   onDestroy( |   onDestroy( | ||||||
|     rasterLayer.addCallbackAndRunD((l) => { |     rasterLayer.addCallbackAndRunD((l) => { | ||||||
|       rasterLayerName = l.properties.name |       rasterLayerName = l.properties.name | ||||||
|  | @ -180,7 +180,7 @@ | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <div class="absolute top-0 left-0 h-screen w-screen overflow-hidden"> | <div class="absolute top-0 left-0 h-screen w-screen overflow-hidden"> | ||||||
|   <MaplibreMap map={maplibremap} /> |   <MaplibreMap map={maplibremap} mapProperties={mapproperties} /> | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| {#if $visualFeedback} | {#if $visualFeedback} | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ export class PngMapCreator { | ||||||
|             const newZoom = settings.zoom.data + Math.log2(pixelRatio) - 1 |             const newZoom = settings.zoom.data + Math.log2(pixelRatio) - 1 | ||||||
|             const mapElem = new MlMap({ |             const mapElem = new MlMap({ | ||||||
|                 container: div.id, |                 container: div.id, | ||||||
|                 style: AvailableRasterLayers.maptilerDefaultLayer.properties.url, |                 style: AvailableRasterLayers.defaultBackgroundLayer.properties.url, | ||||||
|                 center: [l.lon, l.lat], |                 center: [l.lon, l.lat], | ||||||
|                 zoom: newZoom, |                 zoom: newZoom, | ||||||
|                 pixelRatio, |                 pixelRatio, | ||||||
|  |  | ||||||
|  | @ -23,6 +23,18 @@ | ||||||
|         "url": "https://github.com/ZeLonewolf/openstreetmap-americana/" |         "url": "https://github.com/ZeLonewolf/openstreetmap-americana/" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "name": "MapTiler", | ||||||
|  |       "url": "https://api.maptiler.com/maps/15cc8f61-0353-4be6-b8da-13daea5f7432/style.json?key=GvoVAJgu46I5rZapJuAy", | ||||||
|  |       "style": "https://api.maptiler.com/maps/15cc8f61-0353-4be6-b8da-13daea5f7432/style.json?key=GvoVAJgu46I5rZapJuAy", | ||||||
|  |       "category": "osmbasedmap", | ||||||
|  |       "id": "maptiler", | ||||||
|  |       "type": "vector", | ||||||
|  |       "attribution": { | ||||||
|  |         "text": "Maptiler", | ||||||
|  |         "url": "https://www.maptiler.com/copyright/" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "name": "MapTiler Carto", |       "name": "MapTiler Carto", | ||||||
|       "url": "https://api.maptiler.com/maps/openstreetmap/style.json?key=GvoVAJgu46I5rZapJuAy", |       "url": "https://api.maptiler.com/maps/openstreetmap/style.json?key=GvoVAJgu46I5rZapJuAy", | ||||||
|  | @ -168,7 +180,9 @@ | ||||||
|     { |     { | ||||||
|       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", |       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", | ||||||
|       "style": "https://api.protomaps.com/styles/v2/white.json?key=2af8b969a9e8b692", |       "style": "https://api.protomaps.com/styles/v2/white.json?key=2af8b969a9e8b692", | ||||||
|       "connect-src": ["https://protomaps.github.io"], |       "connect-src": [ | ||||||
|  |         "https://protomaps.github.io" | ||||||
|  |       ], | ||||||
|       "id": "protomaps.white", |       "id": "protomaps.white", | ||||||
|       "name": "Protomaps White", |       "name": "Protomaps White", | ||||||
|       "type": "vector", |       "type": "vector", | ||||||
|  | @ -181,7 +195,9 @@ | ||||||
|     { |     { | ||||||
|       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", |       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", | ||||||
|       "style": "https://api.protomaps.com/styles/v2/light.json?key=2af8b969a9e8b692", |       "style": "https://api.protomaps.com/styles/v2/light.json?key=2af8b969a9e8b692", | ||||||
|       "connect-src": ["https://protomaps.github.io"], |       "connect-src": [ | ||||||
|  |         "https://protomaps.github.io" | ||||||
|  |       ], | ||||||
|       "id": "protomaps.light", |       "id": "protomaps.light", | ||||||
|       "name": "Protomaps Light", |       "name": "Protomaps Light", | ||||||
|       "type": "vector", |       "type": "vector", | ||||||
|  | @ -193,7 +209,9 @@ | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", |       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", | ||||||
|       "connect-src": ["https://protomaps.github.io"], |       "connect-src": [ | ||||||
|  |         "https://protomaps.github.io" | ||||||
|  |       ], | ||||||
|       "style": "https://api.protomaps.com/styles/v2/grayscale.json?key=2af8b969a9e8b692", |       "style": "https://api.protomaps.com/styles/v2/grayscale.json?key=2af8b969a9e8b692", | ||||||
|       "id": "protomaps.grayscale", |       "id": "protomaps.grayscale", | ||||||
|       "name": "Protomaps Grayscale", |       "name": "Protomaps Grayscale", | ||||||
|  | @ -206,7 +224,9 @@ | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", |       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", | ||||||
|       "connect-src": ["https://protomaps.github.io"], |       "connect-src": [ | ||||||
|  |         "https://protomaps.github.io" | ||||||
|  |       ], | ||||||
|       "style": "https://api.protomaps.com/styles/v2/dark.json?key=2af8b969a9e8b692", |       "style": "https://api.protomaps.com/styles/v2/dark.json?key=2af8b969a9e8b692", | ||||||
|       "id": "protomaps.dark", |       "id": "protomaps.dark", | ||||||
|       "name": "Protomaps Dark", |       "name": "Protomaps Dark", | ||||||
|  | @ -220,7 +240,9 @@ | ||||||
|     { |     { | ||||||
|       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", |       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", | ||||||
|       "style": "https://api.protomaps.com/styles/v2/black.json?key=2af8b969a9e8b692", |       "style": "https://api.protomaps.com/styles/v2/black.json?key=2af8b969a9e8b692", | ||||||
|       "connect-src": ["https://protomaps.github.io"], |       "connect-src": [ | ||||||
|  |         "https://protomaps.github.io" | ||||||
|  |       ], | ||||||
|       "id": "protomaps.black", |       "id": "protomaps.black", | ||||||
|       "name": "Protomaps Black", |       "name": "Protomaps Black", | ||||||
|       "type": "vector", |       "type": "vector", | ||||||
|  | @ -233,7 +255,9 @@ | ||||||
|     { |     { | ||||||
|       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", |       "url": "pmtiles://https://api.protomaps.com/tiles/v3.json?key=2af8b969a9e8b692", | ||||||
|       "style": "assets/sunny.json", |       "style": "assets/sunny.json", | ||||||
|       "connect-src": ["https://protomaps.github.io"], |       "connect-src": [ | ||||||
|  |         "https://protomaps.github.io" | ||||||
|  |       ], | ||||||
|       "id": "protomaps.sunny", |       "id": "protomaps.sunny", | ||||||
|       "name": "Protomaps Sunny", |       "name": "Protomaps Sunny", | ||||||
|       "type": "vector", |       "type": "vector", | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue