mapcomplete/Customizations/LayerDefinition.ts

133 lines
4 KiB
TypeScript
Raw Normal View History

import {Tag, TagsFilter} from "../Logic/Tags";
2020-07-05 18:59:47 +02:00
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-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,
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
/**
* This name is used in the 'hide or show this layer'-buttons
2020-07-07 16:00:39 +02:00
*/
name: string | Translation;
/***
* 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-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
*/
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
*/
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
/**
* 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
*/
style: (tags: any) => {
color: string,
weight?: number,
icon: {
iconUrl: string,
iconSize?: [number, number],
popupAnchor?: [number,number],
iconAnchor?: [number,number]
},
};
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,
presets: Preset[],
icon: string,
minzoom: number,
overpassFilter: TagsFilter,
title?: TagDependantUIElementConstructor,
elementsToShow?: TagDependantUIElementConstructor[],
maxAllowedOverlapPercentage?: number,
wayHandling?: number,
widenFactor?: number,
style?: (tags: any) => {
color: string,
icon: any
}
} = undefined) {
2020-07-31 04:58:58 +02:00
this.id = id;
if (options === undefined) {
return;
}
this.name = options.name;
this.description = options.description;
this.maxAllowedOverlapPercentage = options.maxAllowedOverlapPercentage ?? 0;
this.presets = options.presets;
this.icon = options.icon;
this.minzoom = options.minzoom;
this.overpassFilter = options.overpassFilter;
this.title = options.title;
this.elementsToShow = options.elementsToShow;
this.style = options.style;
this.wayHandling = options.wayHandling ?? LayerDefinition.WAYHANDLING_DEFAULT;
}
2020-09-09 18:42:13 +02:00
2020-06-24 00:35:19 +02:00
}