2020-07-05 18:59:47 +02:00
|
|
|
import {Tag, TagsFilter} from "../Logic/TagsFilter";
|
|
|
|
import {UIElement} from "../UI/UIElement";
|
2020-07-12 23:19:05 +02:00
|
|
|
import {TagDependantUIElementConstructor} from "./UIElementConstructor";
|
2020-07-31 17:38:03 +02:00
|
|
|
import {TagRenderingOptions} from "./TagRenderingOptions";
|
2020-08-22 03:15:42 +02:00
|
|
|
import Translation from "../UI/i18n/Translation";
|
2020-08-23 02:26:17 +02:00
|
|
|
import {LayerConfigJson} from "./JSON/CustomLayoutFromJSON";
|
2020-06-24 00:35:19 +02:00
|
|
|
|
2020-07-31 16:17:16 +02:00
|
|
|
export interface Preset {
|
|
|
|
tags: Tag[],
|
|
|
|
title: string | UIElement,
|
|
|
|
description?: string | UIElement,
|
2020-08-22 02:12:46 +02:00
|
|
|
icon?: string | TagRenderingOptions
|
2020-07-31 16:17:16 +02:00
|
|
|
}
|
|
|
|
|
2020-06-24 00:35:19 +02:00
|
|
|
export class LayerDefinition {
|
|
|
|
|
|
|
|
|
2020-07-07 16:00:39 +02:00
|
|
|
/**
|
2020-07-29 18:35:46 +02:00
|
|
|
* This name is used in the 'hide or show this layer'-buttons
|
2020-07-07 16:00:39 +02:00
|
|
|
*/
|
2020-07-22 00:50:30 +02:00
|
|
|
name: string | UIElement;
|
2020-07-24 14:46:25 +02:00
|
|
|
|
|
|
|
/***
|
|
|
|
* This is shown under the 'add new' button to indicate what kind of feature one is adding.
|
|
|
|
*/
|
2020-08-22 03:15:42 +02:00
|
|
|
description: string | Translation
|
2020-07-24 14:46:25 +02:00
|
|
|
|
2020-07-15 11:23:35 +02:00
|
|
|
/**
|
|
|
|
* These tags are added whenever a new point is added by the user on the map.
|
|
|
|
* This is the ideal place to add extra info, such as "fixme=added by MapComplete, geometry should be checked"
|
|
|
|
*/
|
2020-07-31 16:17:16 +02:00
|
|
|
presets: Preset[]
|
2020-07-15 11:23:35 +02:00
|
|
|
/**
|
|
|
|
* Not really used anymore
|
|
|
|
* This is meant to serve as icon in the buttons
|
|
|
|
*/
|
2020-08-22 02:12:46 +02:00
|
|
|
icon: string | TagRenderingOptions;
|
2020-07-15 11:23:35 +02:00
|
|
|
/**
|
|
|
|
* Only show this layer starting at this zoom level
|
|
|
|
*/
|
2020-06-24 00:35:19 +02:00
|
|
|
minzoom: number;
|
2020-07-15 11:23:35 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This tagfilter is used to query overpass.
|
|
|
|
* Examples are:
|
|
|
|
*
|
|
|
|
* new Tag("amenity","drinking_water")
|
|
|
|
*
|
|
|
|
* or a query for bicycle pumps which have two tagging schemes:
|
|
|
|
* new Or([
|
|
|
|
* new Tag("service:bicycle:pump","yes") ,
|
|
|
|
* new And([
|
|
|
|
* new Tag("amenity","compressed_air"),
|
|
|
|
* new Tag("bicycle","yes")])
|
|
|
|
* ])
|
|
|
|
*/
|
2020-06-24 00:35:19 +02:00
|
|
|
overpassFilter: TagsFilter;
|
2020-07-31 04:58:58 +02:00
|
|
|
public readonly id: string;
|
2020-06-24 00:35:19 +02:00
|
|
|
|
2020-07-07 16:00:39 +02:00
|
|
|
/**
|
|
|
|
* This UIElement is rendered as title element in the popup
|
|
|
|
*/
|
2020-08-22 02:12:46 +02:00
|
|
|
title: TagDependantUIElementConstructor | UIElement | string;
|
2020-07-07 16:00:39 +02:00
|
|
|
/**
|
|
|
|
* These are the questions/shown attributes in the popup
|
|
|
|
*/
|
2020-07-12 23:19:05 +02:00
|
|
|
elementsToShow: TagDependantUIElementConstructor[];
|
2020-06-24 00:35:19 +02:00
|
|
|
|
2020-07-17 17:21:07 +02:00
|
|
|
/**
|
|
|
|
* A simple styling for the geojson element
|
|
|
|
* color is the color for areas and ways
|
|
|
|
* icon is the Leaflet icon
|
|
|
|
* Note that this is passed entirely to leaflet, so other leaflet attributes work too
|
|
|
|
*/
|
2020-07-18 20:40:51 +02:00
|
|
|
style: (tags: any) => {
|
|
|
|
color: string,
|
2020-07-30 16:34:06 +02:00
|
|
|
weight?: number,
|
2020-07-26 02:01:34 +02:00
|
|
|
icon: {
|
|
|
|
iconUrl: string,
|
|
|
|
iconSize: number[],
|
|
|
|
},
|
2020-07-17 17:21:07 +02:00
|
|
|
};
|
2020-06-27 03:06:51 +02:00
|
|
|
|
2020-06-28 23:33:48 +02:00
|
|
|
/**
|
|
|
|
* If an object of the next layer is contained for this many percent in this feature, it is eaten and not shown
|
|
|
|
*/
|
|
|
|
maxAllowedOverlapPercentage: number = undefined;
|
2020-06-24 00:35:19 +02:00
|
|
|
|
2020-07-22 00:50:30 +02:00
|
|
|
/**
|
|
|
|
* If true, then ways (and polygons) will be converted to a 'point' at the center instead before further processing
|
|
|
|
*/
|
|
|
|
wayHandling: number = 0;
|
|
|
|
|
|
|
|
static WAYHANDLING_DEFAULT = 0;
|
|
|
|
static WAYHANDLING_CENTER_ONLY = 1;
|
|
|
|
static WAYHANDLING_CENTER_AND_WAY = 2;
|
|
|
|
|
2020-07-31 04:58:58 +02:00
|
|
|
constructor(id: string, options: {
|
2020-08-22 03:15:42 +02:00
|
|
|
name: string | Translation,
|
|
|
|
description: string | Translation,
|
2020-08-08 17:50:43 +02:00
|
|
|
presets: Preset[],
|
2020-07-18 20:40:51 +02:00
|
|
|
icon: string,
|
|
|
|
minzoom: number,
|
|
|
|
overpassFilter: TagsFilter,
|
2020-08-22 02:12:46 +02:00
|
|
|
title?: TagDependantUIElementConstructor,
|
2020-07-18 20:40:51 +02:00
|
|
|
elementsToShow?: TagDependantUIElementConstructor[],
|
|
|
|
maxAllowedOverlapPercentage?: number,
|
2020-07-22 01:07:32 +02:00
|
|
|
wayHandling?: number,
|
2020-07-18 20:40:51 +02:00
|
|
|
style?: (tags: any) => {
|
|
|
|
color: string,
|
|
|
|
icon: any
|
|
|
|
}
|
|
|
|
} = undefined) {
|
2020-07-31 04:58:58 +02:00
|
|
|
this.id = id;
|
2020-07-18 20:40:51 +02:00
|
|
|
if (options === undefined) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.name = options.name;
|
2020-07-24 15:52:21 +02:00
|
|
|
this.description = options.description;
|
2020-07-18 20:40:51 +02:00
|
|
|
this.maxAllowedOverlapPercentage = options.maxAllowedOverlapPercentage ?? 0;
|
2020-07-29 18:35:46 +02:00
|
|
|
this.presets = options.presets;
|
2020-07-18 20:40:51 +02:00
|
|
|
this.icon = options.icon;
|
|
|
|
this.minzoom = options.minzoom;
|
|
|
|
this.overpassFilter = options.overpassFilter;
|
|
|
|
this.title = options.title;
|
|
|
|
this.elementsToShow = options.elementsToShow;
|
|
|
|
this.style = options.style;
|
2020-07-22 01:07:32 +02:00
|
|
|
this.wayHandling = options.wayHandling ?? LayerDefinition.WAYHANDLING_DEFAULT;
|
2020-07-18 20:40:51 +02:00
|
|
|
}
|
|
|
|
|
2020-08-23 02:26:17 +02:00
|
|
|
|
|
|
|
ToJson() {
|
|
|
|
|
|
|
|
function t(translation: string | Translation | UIElement) {
|
|
|
|
if (translation === undefined) {
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
if (typeof (translation) === "string") {
|
|
|
|
return translation;
|
|
|
|
}
|
|
|
|
if (translation instanceof Translation && translation.translations !== undefined) {
|
|
|
|
return translation.translations;
|
|
|
|
}
|
|
|
|
return translation.InnerRender();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const layerConfig /* : LayerConfigJson */= {
|
|
|
|
name: t(this.name),
|
|
|
|
description: t(this.description),
|
|
|
|
maxAllowedOverlapPercentage: this.maxAllowedOverlapPercentage,
|
|
|
|
presets: this.presets,
|
|
|
|
icon: this.icon,
|
|
|
|
minzoom: this.minzoom,
|
|
|
|
overpassFilter: this.overpassFilter,
|
|
|
|
title: this.title,
|
|
|
|
elementsToShow: this.elementsToShow,
|
|
|
|
style: this.style,
|
|
|
|
wayHandling: this.wayHandling,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
return JSON.stringify(layerConfig)
|
|
|
|
}
|
2020-06-24 00:35:19 +02:00
|
|
|
}
|