mapcomplete/Customizations/AllKnownLayers.ts

131 lines
5.1 KiB
TypeScript
Raw Normal View History

2021-04-10 03:50:44 +02:00
import * as known_layers from "../assets/generated/known_layers_and_themes.json"
import {Utils} from "../Utils";
import LayerConfig from "../Models/ThemeConfig/LayerConfig";
import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson";
import SharedTagRenderings from "./SharedTagRenderings";
import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson";
import WithContextLoader from "../Models/ThemeConfig/WithContextLoader";
2020-10-27 01:01:34 +01:00
2021-02-26 17:22:24 +01:00
export default class AllKnownLayers {
2020-10-27 01:01:34 +01:00
public static inited = (_ => {
WithContextLoader.getKnownTagRenderings = (id => AllKnownLayers.getTagRendering(id))
2021-11-14 18:01:48 +01:00
return true
})()
2021-11-14 18:01:48 +01:00
2021-01-06 02:52:38 +01:00
// Must be below the list...
2021-02-26 17:22:24 +01:00
public static sharedLayers: Map<string, LayerConfig> = AllKnownLayers.getSharedLayers();
public static sharedLayersJson: Map<string, any> = AllKnownLayers.getSharedLayersJson();
2021-11-08 02:36:01 +01:00
2021-11-14 18:01:48 +01:00
public static added_by_default: string[] = ["gps_location", "gps_location_history", "home_location", "gps_track",]
public static no_include: string[] = ["conflation", "left_right_style", "split_point"]
2021-11-08 02:36:01 +01:00
/**
* Layer IDs of layers which have special properties through built-in hooks
*/
2021-11-14 18:01:48 +01:00
public static priviliged_layers: string[] = [...AllKnownLayers.added_by_default, "type_node", ...AllKnownLayers.no_include]
/**
* Gets the appropriate tagRenderingJSON
* Allows to steal them from other layers.
* This will add the tags of the layer to the configuration though!
* @param renderingId
*/
static getTagRendering(renderingId: string): TagRenderingConfigJson[] {
if (renderingId.indexOf(".") < 0) {
const found = SharedTagRenderings.SharedTagRenderingJson.get(renderingId)
if(found === undefined){
return []
}
return [found]
}
const [layerId, id] = renderingId.split(".")
const layer = AllKnownLayers.getSharedLayersJson().get(layerId)
if (layer === undefined) {
if (Utils.runningFromConsole) {
// Probably generating the layer overview
return <TagRenderingConfigJson[]>[{
id: "dummy"
}]
}
throw "Builtin layer " + layerId + " not found"
}
const renderings = layer?.tagRenderings ?? []
if (id === "*") {
return <TagRenderingConfigJson[]>JSON.parse(JSON.stringify(renderings))
}
2021-11-08 02:36:01 +01:00
2021-11-14 18:01:48 +01:00
const selectByGroup = id.startsWith("*")
const expectedGroupName = id.substring(1)
2021-11-08 02:36:01 +01:00
2021-11-14 18:01:48 +01:00
const allValidValues = []
for (const rendering of renderings) {
if ((!selectByGroup && rendering["id"] === id) || (selectByGroup && rendering["group"] === expectedGroupName)) {
const found = <TagRenderingConfigJson>JSON.parse(JSON.stringify(rendering))
if (found.condition === undefined) {
found.condition = layer.source.osmTags
} else {
found.condition = {and: [found.condition, layer.source.osmTags]}
}
allValidValues.push(found)
}
}
if(allValidValues.length === 0){
throw `The rendering with id ${id} was not found in the builtin layer ${layerId}. Try one of ${Utils.NoNull(renderings.map(r => r["id"])).join(", ")}`
}
return allValidValues
}
2021-11-08 02:36:01 +01:00
2021-01-06 02:52:38 +01:00
private static getSharedLayers(): Map<string, LayerConfig> {
2020-10-27 01:01:34 +01:00
const sharedLayers = new Map<string, LayerConfig>();
2021-04-10 03:50:44 +02:00
for (const layer of known_layers.layers) {
try {
2021-10-11 23:52:17 +02:00
// @ts-ignore
const parsed = new LayerConfig(layer, "shared_layers")
2021-04-10 03:50:44 +02:00
sharedLayers.set(layer.id, parsed);
} catch (e) {
if (!Utils.runningFromConsole) {
console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e)
}
}
2021-01-06 02:52:38 +01:00
}
2021-05-17 00:31:10 +02:00
for (const layout of known_layers.themes) {
2021-05-17 00:18:21 +02:00
for (const layer of layout.layers) {
2021-05-17 00:31:10 +02:00
if (typeof layer === "string") {
2021-05-17 00:18:21 +02:00
continue;
}
2021-05-19 19:39:55 +02:00
if (layer.builtin !== undefined) {
// This is a builtin layer of which stuff is overridden - skip
continue;
}
2021-05-17 00:31:10 +02:00
try {
const parsed = new LayerConfig(layer, "shared_layer_in_theme")
2021-05-17 00:31:10 +02:00
sharedLayers.set(layer.id, parsed);
sharedLayers[layer.id] = parsed;
} catch (e) {
2021-05-19 19:39:55 +02:00
if (!Utils.runningFromConsole) {
console.error("Could not parse a layer in theme ", layout.id, "due to", e)
}
2021-05-17 00:31:10 +02:00
}
2021-05-17 00:18:21 +02:00
}
}
2021-05-17 00:31:10 +02:00
2021-01-06 02:52:38 +01:00
return sharedLayers;
}
private static getSharedLayersJson(): Map<string, LayerConfigJson> {
2021-01-06 02:52:38 +01:00
const sharedLayers = new Map<string, any>();
2021-04-10 03:50:44 +02:00
for (const layer of known_layers.layers) {
2020-10-27 01:01:34 +01:00
sharedLayers.set(layer.id, layer);
sharedLayers[layer.id] = layer;
}
return sharedLayers;
}
2021-01-06 02:52:38 +01:00
}