Feature: add more vector layers from maptiler; add some fixes to theme setting handler

This commit is contained in:
Pieter Vander Vennet 2023-09-24 18:24:10 +02:00
parent 94f9fe7b5f
commit b3edbe846c
18 changed files with 155 additions and 99 deletions

View file

@ -24,7 +24,7 @@
"_mastodon_candidate_a=(feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName(\"a\")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ", "_mastodon_candidate_a=(feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName(\"a\")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ",
"_mastodon_link=(feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName(\"a\")).filter(a => a.getAttribute(\"rel\")?.indexOf('me') >= 0)[0]?.href})(feat) ", "_mastodon_link=(feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName(\"a\")).filter(a => a.getAttribute(\"rel\")?.indexOf('me') >= 0)[0]?.href})(feat) ",
"_mastodon_candidate=feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a", "_mastodon_candidate=feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a",
"__current_background='some value to let the validation run through'" "__current_background='initial_value'"
], ],
"tagRenderings": [ "tagRenderings": [
{ {
@ -104,11 +104,25 @@
"*": "{logout()}" "*": "{logout()}"
} }
}, },
{
"id": "background-layer-readonly",
"condition": {
"and": [
"_theme:backgroundLayer~*",
"mapcomplete-preferred-background-layer~*",
"_theme:backgroundLayer!:={mapcomplete-preferred-background-layer}"
]
},
"render": {
"en": "This thematic map has a predefined background layer set. Your default theme setting does not apply"
}
},
{ {
"id": "background-layer", "id": "background-layer",
"question": { "question": {
"en": "What background layer should be shown by default?" "en": "What background layer should be shown by default?"
}, },
"condition": "_theme:backgroundLayer=",
"mappings": [ "mappings": [
{ {
"if": "mapcomplete-preferred-background-layer=", "if": "mapcomplete-preferred-background-layer=",
@ -140,7 +154,11 @@
"en": "Use the current background layer (<span class='code'>{__current_background}</span>) as default background" "en": "Use the current background layer (<span class='code'>{__current_background}</span>) as default background"
}, },
"hideInAnswer": { "hideInAnswer": {
"or": ["__current_background=","__current_background=osm"] "or": [
"__current_background=",
"__current_background=osm",
"__current_background=initial_value"
]
} }
}, },
{ {

View file

@ -31,7 +31,7 @@
"startLat": 52.99238, "startLat": 52.99238,
"startLon": 6.570614, "startLon": 6.570614,
"startZoom": 20, "startZoom": 20,
"defaultBackgroundId": "CartoDB.Positron", "defaultBackgroundId": "maptiler.backdrop",
"layers": [ "layers": [
{ {
"builtin": "cycleways_and_roads", "builtin": "cycleways_and_roads",

View file

@ -265,6 +265,6 @@
] ]
} }
], ],
"defaultBackgroundId": "CartoDB.Positron", "defaultBackgroundId": "maptiler.backdrop",
"credits": "L'imaginaire" "credits": "L'imaginaire"
} }

View file

@ -44,7 +44,7 @@
"layers": [ "layers": [
"ghost_bike" "ghost_bike"
], ],
"defaultBackgroundId": "CartoDB.Positron", "defaultBackgroundId": "maptiler.backdrop",
"clustering": { "clustering": {
"maxZoom": 0 "maxZoom": 0
} }

View file

@ -47,7 +47,7 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 5, "widenFactor": 5,
"defaultBackgroundId": "CartoDB.Positron", "defaultBackgroundId": "maptiler.backdrop",
"layers": [ "layers": [
"map" "map"
] ]

View file

@ -27,7 +27,7 @@
"startZoom": 12, "startZoom": 12,
"widenFactor": 1.2, "widenFactor": 1.2,
"socialImage": "./assets/themes/speelplekken/social_image.jpg", "socialImage": "./assets/themes/speelplekken/social_image.jpg",
"defaultBackgroundId": "CartoDB.Positron", "defaultBackgroundId": "maptiler.backdrop",
"layers": [ "layers": [
{ {
"id": "shadow", "id": "shadow",

View file

@ -27,7 +27,7 @@
"startLon": 0, "startLon": 0,
"startZoom": 0, "startZoom": 0,
"hideFromOverview": true, "hideFromOverview": true,
"defaultBackgroundId": "CartoDB.Positron", "defaultBackgroundId": "maptiler.backdrop",
"layers": [ "layers": [
{ {
"builtin": "indoors", "builtin": "indoors",

View file

@ -54,7 +54,7 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 2, "widenFactor": 2,
"defaultBackgroundId": "osm", "defaultBackgroundId": "maptiler.carto",
"layers": [ "layers": [
"surveillance_camera" "surveillance_camera"
] ]

View file

@ -43,6 +43,7 @@ export default class UserRelatedState {
public readonly homeLocation: FeatureSource public readonly homeLocation: FeatureSource
public readonly language: UIEventSource<string> public readonly language: UIEventSource<string>
public readonly preferredBackgroundLayer: UIEventSource<string | "photo" | "map" | "osmbasedmap" | undefined> public readonly preferredBackgroundLayer: UIEventSource<string | "photo" | "map" | "osmbasedmap" | undefined>
public readonly preferredBackgroundLayerForTheme: UIEventSource<string | "photo" | "map" | "osmbasedmap" | undefined>
/** /**
* The number of seconds that the GPS-locations are stored in memory. * The number of seconds that the GPS-locations are stored in memory.
* Time in seconds * Time in seconds
@ -258,6 +259,7 @@ export default class UserRelatedState {
): UIEventSource<Record<string, string>> { ): UIEventSource<Record<string, string>> {
const amendedPrefs = new UIEventSource<Record<string, string>>({ const amendedPrefs = new UIEventSource<Record<string, string>>({
_theme: layout?.id, _theme: layout?.id,
"_theme:backgroundLayer": layout?.defaultBackgroundId,
_backend: this.osmConnection.Backend(), _backend: this.osmConnection.Backend(),
_applicationOpened: new Date().toISOString(), _applicationOpened: new Date().toISOString(),
_supports_sharing: _supports_sharing:

View file

@ -9,6 +9,6 @@ export class ThemeMetaTagging {
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ) Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) )
Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) ) Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) )
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a ) Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a )
Utils.AddLazyProperty(feat.properties, '__backgroundLayerId', () => 'some value to let the validation run through' ) Utils.AddLazyProperty(feat.properties, '__current_background', () => 'initial_value' )
} }
} }

View file

@ -1,43 +1,43 @@
import { Feature, Polygon } from "geojson" import { Feature, Polygon } from "geojson";
import * as editorlayerindex from "../assets/editor-layer-index.json" import * as editorlayerindex from "../assets/editor-layer-index.json";
import * as globallayers from "../assets/global-raster-layers.json" import * as globallayers from "../assets/global-raster-layers.json";
import { BBox } from "../Logic/BBox" import { BBox } from "../Logic/BBox";
import { Store, Stores } from "../Logic/UIEventSource" import { Store, Stores } from "../Logic/UIEventSource";
import { GeoOperations } from "../Logic/GeoOperations" import { GeoOperations } from "../Logic/GeoOperations";
import { RasterLayerProperties } from "./RasterLayerProperties" import { RasterLayerProperties } from "./RasterLayerProperties";
export class AvailableRasterLayers { export class AvailableRasterLayers {
public static EditorLayerIndex: (Feature<Polygon, EditorLayerIndexProperties> & public static EditorLayerIndex: (Feature<Polygon, EditorLayerIndexProperties> &
RasterLayerPolygon)[] = <any>editorlayerindex.features RasterLayerPolygon)[] = <any>editorlayerindex.features;
public static globalLayers: RasterLayerPolygon[] = globallayers.layers.map( public static globalLayers: RasterLayerPolygon[] = globallayers.layers.map(
(properties) => (properties) =>
<RasterLayerPolygon>{ <RasterLayerPolygon>{
type: "Feature", type: "Feature",
properties, properties,
geometry: BBox.global.asGeometry(), geometry: BBox.global.asGeometry()
} }
) );
public static readonly osmCartoProperties: RasterLayerProperties = { public static readonly osmCartoProperties: RasterLayerProperties = {
id: "osm", id: "osm",
name: "OpenStreetMap", name: "OpenStreetMap",
url: "https://tile.openstreetmap.org/{z}/{x}/{y}.png", url: "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
attribution: { attribution: {
text: "OpenStreetMap", text: "OpenStreetMap",
url: "https://openStreetMap.org/copyright", url: "https://openStreetMap.org/copyright"
}, },
best: true, best: true,
max_zoom: 19, max_zoom: 19,
min_zoom: 0, min_zoom: 0,
category: "osmbasedmap", category: "osmbasedmap"
} };
public static readonly osmCarto: RasterLayerPolygon = { public static readonly osmCarto: RasterLayerPolygon = {
type: "Feature", type: "Feature",
properties: AvailableRasterLayers.osmCartoProperties, properties: AvailableRasterLayers.osmCartoProperties,
geometry: BBox.global.asGeometry(), geometry: BBox.global.asGeometry()
} };
public static readonly maplibre: RasterLayerPolygon = { public static readonly maptilerDefaultLayer: RasterLayerPolygon = {
type: "Feature", type: "Feature",
properties: { properties: {
name: "MapTiler", name: "MapTiler",
@ -47,12 +47,43 @@ export class AvailableRasterLayers {
type: "vector", type: "vector",
attribution: { attribution: {
text: "Maptiler", text: "Maptiler",
url: "https://www.maptiler.com/copyright/", url: "https://www.maptiler.com/copyright/"
}, }
}, },
geometry: BBox.global.asGeometry(), geometry: BBox.global.asGeometry()
} };
public static readonly maptilerCarto: RasterLayerPolygon = {
type: "Feature",
properties: {
name: "MapTiler Carto",
url: "https://api.maptiler.com/maps/openstreetmap/style.json?key=GvoVAJgu46I5rZapJuAy",
category: "osmbasedmap",
id: "maptiler.carto",
type: "vector",
attribution: {
text: "Maptiler",
url: "https://www.maptiler.com/copyright/"
}
},
geometry: BBox.global.asGeometry()
};
public static readonly maptilerBackdrop: RasterLayerPolygon = {
type: "Feature",
properties: {
name: "MapTiler Backdrop",
url: "https://api.maptiler.com/maps/backdrop/style.json?key=GvoVAJgu46I5rZapJuAy",
category: "osmbasedmap",
id: "maptiler.backdrop",
type: "vector",
attribution: {
text: "Maptiler",
url: "https://www.maptiler.com/copyright/"
}
},
geometry: BBox.global.asGeometry()
};
public static readonly americana: RasterLayerPolygon = { public static readonly americana: RasterLayerPolygon = {
type: "Feature", type: "Feature",
properties: { properties: {
@ -63,41 +94,43 @@ export class AvailableRasterLayers {
type: "vector", type: "vector",
attribution: { attribution: {
text: "Americana", text: "Americana",
url: "https://github.com/ZeLonewolf/openstreetmap-americana/", url: "https://github.com/ZeLonewolf/openstreetmap-americana/"
}, }
}, },
geometry: BBox.global.asGeometry(), geometry: BBox.global.asGeometry()
} };
public static layersAvailableAt( public static layersAvailableAt(
location: Store<{ lon: number; lat: number }> location: Store<{ lon: number; lat: number }>
): Store<RasterLayerPolygon[]> { ): Store<RasterLayerPolygon[]> {
const availableLayersBboxes = Stores.ListStabilized( const availableLayersBboxes = Stores.ListStabilized(
location.mapD((loc) => { location.mapD((loc) => {
const lonlat: [number, number] = [loc.lon, loc.lat] const lonlat: [number, number] = [loc.lon, loc.lat];
return AvailableRasterLayers.EditorLayerIndex.filter((eliPolygon) => return AvailableRasterLayers.EditorLayerIndex.filter((eliPolygon) =>
BBox.get(eliPolygon).contains(lonlat) BBox.get(eliPolygon).contains(lonlat)
) );
}) })
) );
const available = Stores.ListStabilized( const available = Stores.ListStabilized(
availableLayersBboxes.map((eliPolygons) => { availableLayersBboxes.map((eliPolygons) => {
const loc = location.data const loc = location.data;
const lonlat: [number, number] = [loc.lon, loc.lat] const lonlat: [number, number] = [loc.lon, loc.lat];
const matching: RasterLayerPolygon[] = eliPolygons.filter((eliPolygon) => { const matching: RasterLayerPolygon[] = eliPolygons.filter((eliPolygon) => {
if (eliPolygon.geometry === null) { if (eliPolygon.geometry === null) {
return true // global ELI-layer return true; // global ELI-layer
} }
return GeoOperations.inside(lonlat, eliPolygon) return GeoOperations.inside(lonlat, eliPolygon);
}) });
matching.unshift(AvailableRasterLayers.osmCarto) matching.push(...AvailableRasterLayers.globalLayers);
matching.unshift(AvailableRasterLayers.americana) matching.unshift(AvailableRasterLayers.maptilerDefaultLayer,
matching.unshift(AvailableRasterLayers.maplibre) AvailableRasterLayers.osmCarto,
matching.push(...AvailableRasterLayers.globalLayers) AvailableRasterLayers.maptilerCarto,
return matching AvailableRasterLayers.maptilerBackdrop,
AvailableRasterLayers.americana);
return matching;
}) })
) );
return available return available;
} }
} }
@ -115,22 +148,22 @@ export class RasterLayerUtils {
preferredCategory: string, preferredCategory: string,
ignoreLayer?: RasterLayerPolygon ignoreLayer?: RasterLayerPolygon
): RasterLayerPolygon { ): RasterLayerPolygon {
let secondBest: RasterLayerPolygon = undefined let secondBest: RasterLayerPolygon = undefined;
for (const rasterLayer of available) { for (const rasterLayer of available) {
if (rasterLayer === ignoreLayer) { if (rasterLayer === ignoreLayer) {
continue continue;
} }
const p = rasterLayer.properties const p = rasterLayer.properties;
if (p.category === preferredCategory) { if (p.category === preferredCategory) {
if (p.best) { if (p.best) {
return rasterLayer return rasterLayer;
} }
if (!secondBest) { if (!secondBest) {
secondBest = rasterLayer secondBest = rasterLayer;
} }
} }
} }
return secondBest return secondBest;
} }
} }
@ -146,11 +179,11 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties {
/** /**
* The name of the imagery source * The name of the imagery source
*/ */
readonly name: string readonly name: string;
/** /**
* Whether the imagery name should be translated * Whether the imagery name should be translated
*/ */
readonly i18n?: boolean readonly i18n?: boolean;
readonly type: readonly type:
| "tms" | "tms"
| "wms" | "wms"
@ -158,7 +191,7 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties {
| "scanex" | "scanex"
| "wms_endpoint" | "wms_endpoint"
| "wmts" | "wmts"
| "vector" /* Vector is not actually part of the ELI-spec, we add it for vector layers */ | "vector"; /* Vector is not actually part of the ELI-spec, we add it for vector layers */
/** /**
* A rough categorisation of different types of layers. See https://github.com/osmlab/editor-layer-index/blob/gh-pages/CONTRIBUTING.md#categories for a description of the individual categories. * A rough categorisation of different types of layers. See https://github.com/osmlab/editor-layer-index/blob/gh-pages/CONTRIBUTING.md#categories for a description of the individual categories.
*/ */
@ -170,53 +203,53 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties {
| "historicphoto" | "historicphoto"
| "qa" | "qa"
| "elevation" | "elevation"
| "other" | "other";
/** /**
* A URL template for imagery tiles * A URL template for imagery tiles
*/ */
readonly url: string readonly url: string;
readonly min_zoom?: number readonly min_zoom?: number;
readonly max_zoom?: number readonly max_zoom?: number;
/** /**
* explicit/implicit permission by the owner for use in OSM * explicit/implicit permission by the owner for use in OSM
*/ */
readonly permission_osm?: "explicit" | "implicit" | "no" readonly permission_osm?: "explicit" | "implicit" | "no";
/** /**
* A URL for the license or permissions for the imagery * A URL for the license or permissions for the imagery
*/ */
readonly license_url?: string readonly license_url?: string;
/** /**
* A URL for the privacy policy of the operator or false if there is no existing privacy policy for tis imagery. * A URL for the privacy policy of the operator or false if there is no existing privacy policy for tis imagery.
*/ */
readonly privacy_policy_url?: string | boolean readonly privacy_policy_url?: string | boolean;
/** /**
* A unique identifier for the source; used in imagery_used changeset tag * A unique identifier for the source; used in imagery_used changeset tag
*/ */
readonly id: string readonly id: string;
/** /**
* A short English-language description of the source * A short English-language description of the source
*/ */
readonly description?: string readonly description?: string;
/** /**
* The ISO 3166-1 alpha-2 two letter country code in upper case. Use ZZ for unknown or multiple. * The ISO 3166-1 alpha-2 two letter country code in upper case. Use ZZ for unknown or multiple.
*/ */
readonly country_code?: string readonly country_code?: string;
/** /**
* Whether this imagery should be shown in the default world-wide menu * Whether this imagery should be shown in the default world-wide menu
*/ */
readonly default?: boolean readonly default?: boolean;
/** /**
* Whether this imagery is the best source for the region * Whether this imagery is the best source for the region
*/ */
readonly best?: boolean readonly best?: boolean;
/** /**
* The age of the oldest imagery or data in the source, as an RFC3339 date or leading portion of one * The age of the oldest imagery or data in the source, as an RFC3339 date or leading portion of one
*/ */
readonly start_date?: string readonly start_date?: string;
/** /**
* The age of the newest imagery or data in the source, as an RFC3339 date or leading portion of one * The age of the newest imagery or data in the source, as an RFC3339 date or leading portion of one
*/ */
readonly end_date?: string readonly end_date?: string;
/** /**
* HTTP header to check for information if the tile is invalid * HTTP header to check for information if the tile is invalid
*/ */
@ -226,61 +259,61 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties {
* via the `patternProperty` "^.*$". * via the `patternProperty` "^.*$".
*/ */
[k: string]: string[] | null [k: string]: string[] | null
} };
/** /**
* 'true' if tiles are transparent and can be overlaid on another source * 'true' if tiles are transparent and can be overlaid on another source
*/ */
readonly overlay?: boolean & string readonly overlay?: boolean & string;
readonly available_projections?: string[] readonly available_projections?: string[];
readonly attribution?: { readonly attribution?: {
readonly url?: string readonly url?: string
readonly text?: string readonly text?: string
readonly html?: string readonly html?: string
readonly required?: boolean readonly required?: boolean
} };
/** /**
* A URL for an image, that can be displayed in the list of imagery layers next to the name * A URL for an image, that can be displayed in the list of imagery layers next to the name
*/ */
readonly icon?: string readonly 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. * 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.
*/ */
readonly eula?: string readonly eula?: string;
/** /**
* A URL for an image, that is displayed in the mapview for attribution * A URL for an image, that is displayed in the mapview for attribution
*/ */
readonly "logo-image"?: string readonly "logo-image"?: string;
/** /**
* Customized text for the terms of use link (default is "Background Terms of Use") * Customized text for the terms of use link (default is "Background Terms of Use")
*/ */
readonly "terms-of-use-text"?: string readonly "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. * 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.
*/ */
readonly "no-tile-checksum"?: string readonly "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 * header-name attribute specifies a header returned by tile server, that will be shown as `metadata-key` attribute in Show Tile Info dialog
*/ */
readonly "metadata-header"?: string readonly "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. * Set to `true` if imagery source is properly aligned and does not need imagery offset adjustments. This is used for OSM based sources too.
*/ */
readonly "valid-georeference"?: boolean readonly "valid-georeference"?: boolean;
/** /**
* Size of individual tiles delivered by a TMS service * Size of individual tiles delivered by a TMS service
*/ */
readonly "tile-size"?: number readonly "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. * Whether tiles status can be accessed by appending /status to the tile URL and can be submitted for re-rendering by appending /dirty.
*/ */
readonly "mod-tile-features"?: string readonly "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. * HTTP headers to be sent to server. It has two attributes header-name and header-value. May be specified multiple times.
*/ */
readonly "custom-http-headers"?: { readonly "custom-http-headers"?: {
readonly "header-name"?: string readonly "header-name"?: string
readonly "header-value"?: string readonly "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 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)
*/ */
@ -291,17 +324,17 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties {
[k: string]: unknown [k: string]: unknown
} }
[k: string]: unknown [k: string]: unknown
}[] }[];
/** /**
* format to use when connecting tile server (when using WMS_ENDPOINT type) * format to use when connecting tile server (when using WMS_ENDPOINT type)
*/ */
readonly format?: string readonly format?: string;
/** /**
* If `true` transparent tiles will be requested from WMS server * If `true` transparent tiles will be requested from WMS server
*/ */
readonly transparent?: boolean & string readonly transparent?: boolean & string;
/** /**
* minimum expiry time for tiles in seconds. The larger the value, the longer entry in cache will be considered valid * minimum expiry time for tiles in seconds. The larger the value, the longer entry in cache will be considered valid
*/ */
readonly "minimum-tile-expire"?: number readonly "minimum-tile-expire"?: number;
} }

View file

@ -4,6 +4,7 @@ import LineRenderingConfigJson from "../Json/LineRenderingConfigJson"
import { LayerConfigJson } from "../Json/LayerConfigJson" import { LayerConfigJson } from "../Json/LayerConfigJson"
import { DesugaringStep, Each, Fuse, On } from "./Conversion" import { DesugaringStep, Each, Fuse, On } from "./Conversion"
import PointRenderingConfigJson from "../Json/PointRenderingConfigJson" import PointRenderingConfigJson from "../Json/PointRenderingConfigJson"
import { del } from "idb-keyval";
export class UpdateLegacyLayer extends DesugaringStep< export class UpdateLegacyLayer extends DesugaringStep<
LayerConfigJson | string | { builtin; override } LayerConfigJson | string | { builtin; override }
@ -41,7 +42,6 @@ export class UpdateLegacyLayer extends DesugaringStep<
delete preset["preciseInput"] delete preset["preciseInput"]
} else if (preciseInput !== undefined) { } else if (preciseInput !== undefined) {
delete preciseInput["preferredBackground"] delete preciseInput["preferredBackground"]
console.log("Precise input:", preciseInput)
preset.snapToLayer = preciseInput.snapToLayer preset.snapToLayer = preciseInput.snapToLayer
delete preciseInput.snapToLayer delete preciseInput.snapToLayer
if (preciseInput.maxSnapDistance) { if (preciseInput.maxSnapDistance) {
@ -146,7 +146,6 @@ export class UpdateLegacyLayer extends DesugaringStep<
} }
const pr = <PointRenderingConfigJson>rendering const pr = <PointRenderingConfigJson>rendering
let iconSize = pr.iconSize let iconSize = pr.iconSize
console.log("Iconsize is", iconSize)
if (Object.keys(pr.iconSize).length === 1 && pr.iconSize["render"] !== undefined) { if (Object.keys(pr.iconSize).length === 1 && pr.iconSize["render"] !== undefined) {
iconSize = pr.iconSize["render"] iconSize = pr.iconSize["render"]
@ -198,6 +197,10 @@ class UpdateLegacyTheme extends DesugaringStep<LayoutConfigJson> {
delete oldThemeConfig.socialImage delete oldThemeConfig.socialImage
} }
if(oldThemeConfig.defaultBackgroundId === "osm"){
console.log("Removing old background in", json.id)
}
if (oldThemeConfig["roamingRenderings"] !== undefined) { if (oldThemeConfig["roamingRenderings"] !== undefined) {
if (oldThemeConfig["roamingRenderings"].length == 0) { if (oldThemeConfig["roamingRenderings"].length == 0) {
delete oldThemeConfig["roamingRenderings"] delete oldThemeConfig["roamingRenderings"]

View file

@ -37,7 +37,7 @@
function updatedAltLayer() { function updatedAltLayer() {
const available = availableRasterLayers.data const available = availableRasterLayers.data
const current = rasterLayer.data const current = rasterLayer.data
const defaultLayer = AvailableRasterLayers.maplibre const defaultLayer = AvailableRasterLayers.maptilerDefaultLayer
const firstOther = available.find((l) => l !== defaultLayer) const firstOther = available.find((l) => l !== defaultLayer)
const secondOther = available.find((l) => l !== defaultLayer && l !== firstOther) const secondOther = available.find((l) => l !== defaultLayer && l !== firstOther)
raster0.setData(firstOther === current ? defaultLayer : firstOther) raster0.setData(firstOther === current ? defaultLayer : firstOther)

View file

@ -29,7 +29,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.maplibre const bg = state.mapProperties.rasterLayer.data ?? AvailableRasterLayers.maptilerDefaultLayer
const creator = new SvgToPdf(title, templates, { const creator = new SvgToPdf(title, templates, {
state, state,
freeComponentId: "belowmap", freeComponentId: "belowmap",

View file

@ -405,7 +405,7 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap {
this.removeCurrentLayer(map) this.removeCurrentLayer(map)
} else { } else {
// Make sure that the default maptiler style is loaded as it gives an overlay with roads // Make sure that the default maptiler style is loaded as it gives an overlay with roads
const maptiler = AvailableRasterLayers.maplibre.properties const maptiler = AvailableRasterLayers.maptilerDefaultLayer.properties
if (!map.getSource(maptiler.id)) { if (!map.getSource(maptiler.id)) {
this.removeCurrentLayer(map) this.removeCurrentLayer(map)
map.addSource(maptiler.id, MapLibreAdaptor.prepareWmsSource(maptiler)) map.addSource(maptiler.id, MapLibreAdaptor.prepareWmsSource(maptiler))

View file

@ -24,7 +24,7 @@
writable({ lng: 0, lat: 0 }) writable({ lng: 0, lat: 0 })
export let zoom: Readable<number> = writable(1) export let zoom: Readable<number> = writable(1)
const styleUrl = AvailableRasterLayers.maplibre.properties.url const styleUrl = AvailableRasterLayers.maptilerDefaultLayer.properties.url
let _map: Map let _map: Map
onMount(() => { onMount(() => {

View file

@ -103,7 +103,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.maplibre.properties.name rasterLayer.data?.properties?.name ?? AvailableRasterLayers.maptilerDefaultLayer.properties.name
onDestroy( onDestroy(
rasterLayer.addCallbackAndRunD((l) => { rasterLayer.addCallbackAndRunD((l) => {
rasterLayerName = l.properties.name rasterLayerName = l.properties.name

View file

@ -46,7 +46,7 @@ export class PngMapCreator {
const pixelRatio = 4 const pixelRatio = 4
const mapElem = new MlMap({ const mapElem = new MlMap({
container: div.id, container: div.id,
style: AvailableRasterLayers.maplibre.properties.url, style: AvailableRasterLayers.maptilerDefaultLayer.properties.url,
center: [l.lon, l.lat], center: [l.lon, l.lat],
zoom: settings.zoom.data, zoom: settings.zoom.data,
pixelRatio, pixelRatio,