diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 783dfbe5e..d514b13b0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,17 +5,19 @@ Hi! Thanks for checking out how to contribute to MapComplete! There are multiple ways to contribute: -- Translating MapComplete to your own language can be done on [this website](https://hosted.weblate.org/projects/mapcomplete/) +- Translating MapComplete to your own language can be done + on [this website](https://hosted.weblate.org/projects/mapcomplete/) - If you encounter a bug, the [issue tracker](https://github.com/pietervdvn/MapComplete/issues) is the place to be - If you want to improve a theme, create a new theme, spot a typo in the repo... the best way is to open a pull request. -People who stick around and contribute in a meaningful way, _might_ be granted write access to the repository. This is done on a purely subjective basis, e.g. after a few pull requests and if you are a member of the OSM community. +People who stick around and contribute in a meaningful way, _might_ be granted write access to the repository. This is +done on a purely subjective basis, e.g. after a few pull requests and if you are a member of the OSM community. Rights of contributors ----------------------- -If you have write access to the repository, you can make a fork of an already existing branch and push this new branch to -github. This means that this branch will be _automatically built_ and be **deployed** +If you have write access to the repository, you can make a fork of an already existing branch and push this new branch +to github. This means that this branch will be _automatically built_ and be **deployed** to `https://pietervdvn.github.io/mc/`. You can see the deploy process on [Github Actions](https://github.com/pietervdvn/MapComplete/actions). Don't worry about pushing too much. These deploys are free and totally automatic. They might fail if something is wrong, but this will hinder no-one. @@ -30,9 +32,9 @@ As a non-admin contributor, you can _not_ make changes to the `master` nor to th soon as master is changed, this is built and deployed on `mapcomplete.osm.be`, which a lot of people use. An error there will cause a lot of grieve. -A push on `develop` is automatically deployed to [pietervdvn.github.io/mc/develop] which is used by quite some contributors. -However, people using this version should know that this is a testing ground for new features and might contain a bug every now -and then. +A push on `develop` is automatically deployed to [pietervdvn.github.io/mc/develop] which is used by quite some +contributors. However, people using this version should know that this is a testing ground for new features and might +contain a bug every now and then. In other words, to get your theme deployed on the main instances, you'll still have to create a pull request. The maintainers will then doublecheck and pull it in. diff --git a/Customizations/AllKnownLayouts.ts b/Customizations/AllKnownLayouts.ts index 4303c6309..ffdb1a0f1 100644 --- a/Customizations/AllKnownLayouts.ts +++ b/Customizations/AllKnownLayouts.ts @@ -12,28 +12,10 @@ import Link from "../UI/Base/Link"; import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; export class AllKnownLayouts { - // Must be below the list... - private static sharedLayers: Map = AllKnownLayouts.getSharedLayers(); - - private static getSharedLayers(): Map { - const sharedLayers = new Map(); - for (const layer of known_themes.layers) { - try { - // @ts-ignore - const parsed = new LayerConfig(layer, "shared_layers") - sharedLayers.set(layer.id, parsed); - } catch (e) { - if (!Utils.runningFromConsole) { - console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e) - } - } - } - - return sharedLayers; - } - public static allKnownLayouts: Map = AllKnownLayouts.AllLayouts(); public static layoutsList: LayoutConfig[] = AllKnownLayouts.GenerateOrderedList(AllKnownLayouts.allKnownLayouts); + // Must be below the list... + private static sharedLayers: Map = AllKnownLayouts.getSharedLayers(); public static AllPublicLayers() { const allLayers: LayerConfig[] = [] @@ -54,8 +36,7 @@ export class AllKnownLayouts { } return allLayers } - - + public static GenOverviewsForSingleLayer(callback: (layer: LayerConfig, element: BaseUIElement) => void): void { const allLayers: LayerConfig[] = Array.from(AllKnownLayouts.sharedLayers.values()) .filter(layer => Constants.priviliged_layers.indexOf(layer.id) < 0) @@ -82,12 +63,12 @@ export class AllKnownLayouts { // Determine the cross-dependencies - const layerIsNeededBy : Map = new Map() + const layerIsNeededBy: Map = new Map() for (const layer of allLayers) { for (const dep of DependencyCalculator.getLayerDependencies(layer)) { const dependency = dep.neededLayer - if(!layerIsNeededBy.has(dependency)){ + if (!layerIsNeededBy.has(dependency)) { layerIsNeededBy.set(dependency, []) } layerIsNeededBy.get(dependency).push(layer.id) @@ -97,7 +78,7 @@ export class AllKnownLayouts { } allLayers.forEach((layer) => { - const element = layer.GenerateDocumentation(themesPerLayer.get(layer.id),layerIsNeededBy,DependencyCalculator.getLayerDependencies(layer)) + const element = layer.GenerateDocumentation(themesPerLayer.get(layer.id), layerIsNeededBy, DependencyCalculator.getLayerDependencies(layer)) callback(layer, element) }) } @@ -131,22 +112,21 @@ export class AllKnownLayouts { // Determine the cross-dependencies - const layerIsNeededBy : Map = new Map() + const layerIsNeededBy: Map = new Map() for (const layer of allLayers) { for (const dep of DependencyCalculator.getLayerDependencies(layer)) { const dependency = dep.neededLayer - if(!layerIsNeededBy.has(dependency)){ + if (!layerIsNeededBy.has(dependency)) { layerIsNeededBy.set(dependency, []) } layerIsNeededBy.get(dependency).push(layer.id) } - - + + } - - - + + return new Combine([ new Title("Special and other useful layers", 1), "MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they get a mention here.", @@ -154,15 +134,32 @@ export class AllKnownLayouts { new List(Constants.priviliged_layers.map(id => "[" + id + "](#" + id + ")")), ...Constants.priviliged_layers .map(id => AllKnownLayouts.sharedLayers.get(id)) - .map((l) => l.GenerateDocumentation(themesPerLayer.get(l.id), layerIsNeededBy, DependencyCalculator.getLayerDependencies(l),Constants.added_by_default.indexOf(l.id) >= 0, Constants.no_include.indexOf(l.id) < 0)), + .map((l) => l.GenerateDocumentation(themesPerLayer.get(l.id), layerIsNeededBy, DependencyCalculator.getLayerDependencies(l), Constants.added_by_default.indexOf(l.id) >= 0, Constants.no_include.indexOf(l.id) < 0)), new Title("Normal layers", 1), "The following layers are included in MapComplete:", - new List(Array.from(AllKnownLayouts.sharedLayers.keys()).map(id => new Link(id, "./Layers/"+id+".md"))) + new List(Array.from(AllKnownLayouts.sharedLayers.keys()).map(id => new Link(id, "./Layers/" + id + ".md"))) ]) } + private static getSharedLayers(): Map { + const sharedLayers = new Map(); + for (const layer of known_themes.layers) { + try { + // @ts-ignore + const parsed = new LayerConfig(layer, "shared_layers") + sharedLayers.set(layer.id, parsed); + } catch (e) { + if (!Utils.runningFromConsole) { + console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e) + } + } + } + + return sharedLayers; + } + private static GenerateOrderedList(allKnownLayouts: Map): LayoutConfig[] { const list = [] allKnownLayouts.forEach((layout) => { @@ -174,20 +171,20 @@ export class AllKnownLayouts { private static AllLayouts(): Map { const dict: Map = new Map(); for (const layoutConfigJson of known_themes.themes) { - const layout = new LayoutConfig( layoutConfigJson, true) - dict.set(layout.id, layout) - for (let i = 0; i < layout.layers.length; i++) { - let layer = layout.layers[i]; - if (typeof (layer) === "string") { - layer = AllKnownLayouts.sharedLayers.get(layer); - layout.layers[i] = layer - if (layer === undefined) { - console.log("Defined layers are ", AllKnownLayouts.sharedLayers.keys()) - throw `Layer ${layer} was not found or defined - probably a type was made` - } - } - - } + const layout = new LayoutConfig(layoutConfigJson, true) + dict.set(layout.id, layout) + for (let i = 0; i < layout.layers.length; i++) { + let layer = layout.layers[i]; + if (typeof (layer) === "string") { + layer = AllKnownLayouts.sharedLayers.get(layer); + layout.layers[i] = layer + if (layer === undefined) { + console.log("Defined layers are ", AllKnownLayouts.sharedLayers.keys()) + throw `Layer ${layer} was not found or defined - probably a type was made` + } + } + + } } return dict; } diff --git a/Customizations/SharedTagRenderings.ts b/Customizations/SharedTagRenderings.ts index b0b868143..c45737471 100644 --- a/Customizations/SharedTagRenderings.ts +++ b/Customizations/SharedTagRenderings.ts @@ -31,21 +31,21 @@ export default class SharedTagRenderings { if (!iconsOnly) { for (const key in questions) { - if(key === "id"){ + if (key === "id") { continue } dict.set(key, questions[key]) } } for (const key in icons) { - if(key === "id"){ + if (key === "id") { continue } dict.set(key, icons[key]) } dict.forEach((value, key) => { - if(key === "id"){ + if (key === "id") { return } value.id = value.id ?? key; diff --git a/Docs/BuiltinLayers.md b/Docs/BuiltinLayers.md index dc7d44258..cc370678c 100644 --- a/Docs/BuiltinLayers.md +++ b/Docs/BuiltinLayers.md @@ -1,271 +1,259 @@ - - - Special and other useful layers +Special and other useful layers ================================= - - ## Table of contents 1. [Special and other useful layers](#special-and-other-useful-layers) 1. [Priviliged layers](#priviliged-layers) 1. [gps_location](#gps_location) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [gps_location_history](#gps_location_history) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [home_location](#home_location) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [gps_track](#gps_track) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [Privacy notice](#privacy-notice) + [export_as_gpx](#export_as_gpx) + [minimap](#minimap) + [delete](#delete) + 1. [type_node](#type_node) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [note](#note) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [conversation](#conversation) + [add_image](#add_image) + [comment](#comment) + [report-contributor](#report-contributor) + [report-note](#report-note) + 1. [import_candidate](#import_candidate) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [all_tags](#all_tags) + 1. [conflation](#conflation) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [left_right_style](#left_right_style) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [split_point](#split_point) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [current_view](#current_view) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [matchpoint](#matchpoint) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + 1. [Normal layers](#normal-layers) - - -MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they get a mention here. +MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. +Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they +get a mention here. - Priviliged layers +Priviliged layers =================== +- [gps_location](#gps_location) +- [gps_location_history](#gps_location_history) +- [home_location](#home_location) +- [gps_track](#gps_track) +- [type_node](#type_node) +- [note](#note) +- [import_candidate](#import_candidate) +- [conflation](#conflation) +- [left_right_style](#left_right_style) +- [split_point](#split_point) +- [current_view](#current_view) +- [matchpoint](#matchpoint) - - - - - [gps_location](#gps_location) - - [gps_location_history](#gps_location_history) - - [home_location](#home_location) - - [gps_track](#gps_track) - - [type_node](#type_node) - - [note](#note) - - [import_candidate](#import_candidate) - - [conflation](#conflation) - - [left_right_style](#left_right_style) - - [split_point](#split_point) - - [current_view](#current_view) - - [matchpoint](#matchpoint) - - - - - gps_location +gps_location ============== -Meta layer showing the current location of the user. Add this to your theme and override the icon to change the appearance of the current location. The object will always have `id=gps` and will have _all_ the properties included in the [`Coordinates`-object](https://developer.mozilla.org/en-US/docs/Web/API/GeolocationCoordinates) returned by the browser. - - - - - - - - **This layer is included automatically in every theme. This layer might contain no points** - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +Meta layer showing the current location of the user. Add this to your theme and override the icon to change the +appearance of the current location. The object will always have `id=gps` and will have _all_ the properties included in +the [`Coordinates`-object](https://developer.mozilla.org/en-US/docs/Web/API/GeolocationCoordinates) returned by the +browser. +- **This layer is included automatically in every theme. This layer might contain no points** +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` [Go to the source code](../assets/layers/gps_location/gps_location.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id + =gps - - - id=gps - - - - - Supported attributes +Supported attributes ---------------------- - gps_location_history +gps_location_history ====================== -Meta layer which contains the previous locations of the user as single points. This is mainly for technical reasons, e.g. to keep match the distance to the modified object - - - - - - - - **This layer is included automatically in every theme. This layer might contain no points** - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +Meta layer which contains the previous locations of the user as single points. This is mainly for technical reasons, +e.g. to keep match the distance to the modified object +- **This layer is included automatically in every theme. This layer might contain no points** +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/gps_location_history/gps_location_history.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- user:location + =yes - - - user:location=yes - - - - - Supported attributes +Supported attributes ---------------------- - home_location +home_location =============== -Meta layer showing the home location of the user. The home location can be set in the [profile settings](https://www.openstreetmap.org/profile/edit) of OpenStreetMap. - - - - - - - - **This layer is included automatically in every theme. This layer might contain no points** - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +Meta layer showing the home location of the user. The home location can be set in +the [profile settings](https://www.openstreetmap.org/profile/edit) of OpenStreetMap. +- **This layer is included automatically in every theme. This layer might contain no points** +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` [Go to the source code](../assets/layers/home_location/home_location.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- user:home + =yes - - - user:home=yes - - - - - Supported attributes +Supported attributes ---------------------- - gps_track +gps_track =========== -Meta layer showing the previous locations of the user as single line. Add this to your theme and override the icon to change the appearance of the current location. - - - - - - - - **This layer is included automatically in every theme. This layer might contain no points** - - This layer is not visible by default and must be enabled in the filter by the user. - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +Meta layer showing the previous locations of the user as single line. Add this to your theme and override the icon to +change the appearance of the current location. +- **This layer is included automatically in every theme. This layer might contain no points** +- This layer is not visible by default and must be enabled in the filter by the user. +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/gps_track/gps_track.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id + =location_track - - - id=location_track - - - - - Supported attributes +Supported attributes ---------------------- +### Privacy notice +_This tagrendering has no question and is thus read-only_ +### export_as_gpx +_This tagrendering has no question and is thus read-only_ -### Privacy notice +### minimap +_This tagrendering has no question and is thus read-only_ +### delete _This tagrendering has no question and is thus read-only_ @@ -273,123 +261,85 @@ _This tagrendering has no question and is thus read-only_ -### export_as_gpx - - - -_This tagrendering has no question and is thus read-only_ - - - - - -### minimap - - - -_This tagrendering has no question and is thus read-only_ - - - - - -### delete - - - -_This tagrendering has no question and is thus read-only_ - - - - - - type_node +type_node =========== -This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do advanced conflations. Expert use only. - - - - - - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the +full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which +contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do +advanced conflations. Expert use only. +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/type_node/type_node.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id~^node\/.*$ - - - id~^node\/.*$ - - - - - Supported attributes +Supported attributes ---------------------- - note +note ====== -This layer shows notes on OpenStreetMap. Having this layer in your theme will trigger the 'add new note' functionality in the 'addNewPoint'-popup (or if your theme has no presets, it'll enable adding notes) - - - - - - - - This layer is loaded from an external source, namely `https://api.openstreetmap.org/api/0.6/notes.json?limit=10000&closed=7&bbox={x_min},{y_min},{x_max},{y_max}` +This layer shows notes on OpenStreetMap. Having this layer in your theme will trigger the 'add new note' functionality +in the 'addNewPoint'-popup (or if your theme has no presets, it'll enable adding notes) +- This layer is loaded from an external source, namely `https://api.openstreetmap.org/api/0.6/notes.json?limit=10000&closed=7&bbox={x_min},{y_min},{x_max},{y_max}` [Go to the source code](../assets/layers/note/note.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id~^..*$ - - - id~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- +### conversation +_This tagrendering has no question and is thus read-only_ +### add_image +_This tagrendering has no question and is thus read-only_ -### conversation +### comment +_This tagrendering has no question and is thus read-only_ +### report-contributor + +_This tagrendering has no question and is thus read-only_ + +### report-note _This tagrendering has no question and is thus read-only_ @@ -397,47 +347,7 @@ _This tagrendering has no question and is thus read-only_ -### add_image - - - -_This tagrendering has no question and is thus read-only_ - - - - - -### comment - - - -_This tagrendering has no question and is thus read-only_ - - - - - -### report-contributor - - - -_This tagrendering has no question and is thus read-only_ - - - - - -### report-note - - - -_This tagrendering has no question and is thus read-only_ - - - - - - import_candidate +import_candidate ================== @@ -446,19 +356,13 @@ _This tagrendering has no question and is thus read-only_ Layer used in the importHelper - - - - - - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` [Go to the source code](../assets/layers/import_candidate/import_candidate.json) - Basic tags for this layer +Basic tags for this layer --------------------------- @@ -472,16 +376,10 @@ Elements must have the all of following tags to be shown on this layer: - Supported attributes +Supported attributes ---------------------- - - - - -### all_tags - - +### all_tags _This tagrendering has no question and is thus read-only_ @@ -489,91 +387,79 @@ _This tagrendering has no question and is thus read-only_ - conflation +conflation ============ -If the import-button moves OSM points, the imported way points or conflates, a preview is shown. This layer defines how this preview is rendered. This layer cannot be included in a theme. - - - - - - - - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. +If the import-button moves OSM points, the imported way points or conflates, a preview is shown. This layer defines how +this preview is rendered. This layer cannot be included in a theme. +- This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing + a minimap with custom data. [Go to the source code](../assets/layers/conflation/conflation.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- move + =yes + |newpoint + =yes - - - move=yes|newpoint=yes - - - - - Supported attributes +Supported attributes ---------------------- - left_right_style +left_right_style ================== -Special meta-style which will show one single line, either on the left or on the right depending on the id. This is used in the small popups with left_right roads. Cannot be included in a theme - - - - - - - - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. +Special meta-style which will show one single line, either on the left or on the right depending on the id. This is used +in the small popups with left_right roads. Cannot be included in a theme +- This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing + a minimap with custom data. [Go to the source code](../assets/layers/left_right_style/left_right_style.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id + =left + |id + =right - - - id=left|id=right - - - - - Supported attributes +Supported attributes ---------------------- - split_point +split_point ============= @@ -582,84 +468,67 @@ Elements must have the all of following tags to be shown on this layer: Layer rendering the little scissors for the minimap in the 'splitRoadWizard' - - - - - - - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. - +- This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing + a minimap with custom data. [Go to the source code](../assets/layers/split_point/split_point.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- _split_point + =yes - - - _split_point=yes - - - - - Supported attributes +Supported attributes ---------------------- - current_view +current_view ============== -A meta-layer which contains one single feature, namely the BBOX of the current map view. This can be used to trigger special actions. If a popup is defined for this layer, this popup will be accessible via an extra button on screen. +A meta-layer which contains one single feature, namely the BBOX of the current map view. This can be used to trigger +special actions. If a popup is defined for this layer, this popup will be accessible via an extra button on screen. The icon on the button is the default icon of the layer, but can be customized by detecting 'button=yes'. - - - - - - - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. - +- This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing + a minimap with custom data. [Go to the source code](../assets/layers/current_view/current_view.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- current_view + =yes - - - current_view=yes - - - - - Supported attributes +Supported attributes ---------------------- - matchpoint +matchpoint ============ @@ -668,19 +537,14 @@ Elements must have the all of following tags to be shown on this layer: The default rendering for a locationInput which snaps onto another object - - - - - - - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. - +- This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing + a minimap with custom data. [Go to the source code](../assets/layers/matchpoint/matchpoint.json) - Basic tags for this layer +Basic tags for this layer --------------------------- @@ -694,93 +558,90 @@ Elements must have the all of following tags to be shown on this layer: - Supported attributes +Supported attributes ---------------------- - Normal layers +Normal layers =============== The following layers are included in MapComplete: - - - - [address](./Layers/address.md) - - [ambulancestation](./Layers/ambulancestation.md) - - [artwork](./Layers/artwork.md) - - [barrier](./Layers/barrier.md) - - [bench](./Layers/bench.md) - - [bench_at_pt](./Layers/bench_at_pt.md) - - [bicycle_library](./Layers/bicycle_library.md) - - [bicycle_tube_vending_machine](./Layers/bicycle_tube_vending_machine.md) - - [bike_cafe](./Layers/bike_cafe.md) - - [bike_cleaning](./Layers/bike_cleaning.md) - - [bike_parking](./Layers/bike_parking.md) - - [bike_repair_station](./Layers/bike_repair_station.md) - - [bike_shop](./Layers/bike_shop.md) - - [bike_themed_object](./Layers/bike_themed_object.md) - - [binocular](./Layers/binocular.md) - - [birdhide](./Layers/birdhide.md) - - [cafe_pub](./Layers/cafe_pub.md) - - [charging_station](./Layers/charging_station.md) - - [cluster_style](./Layers/cluster_style.md) - - [conflation](./Layers/conflation.md) - - [crab_address](./Layers/crab_address.md) - - [crossings](./Layers/crossings.md) - - [current_view](./Layers/current_view.md) - - [cycleways_and_roads](./Layers/cycleways_and_roads.md) - - [defibrillator](./Layers/defibrillator.md) - - [direction](./Layers/direction.md) - - [drinking_water](./Layers/drinking_water.md) - - [entrance](./Layers/entrance.md) - - [etymology](./Layers/etymology.md) - - [extinguisher](./Layers/extinguisher.md) - - [fire_station](./Layers/fire_station.md) - - [food](./Layers/food.md) - - [ghost_bike](./Layers/ghost_bike.md) - - [gps_location](./Layers/gps_location.md) - - [gps_location_history](./Layers/gps_location_history.md) - - [gps_track](./Layers/gps_track.md) - - [grass_in_parks](./Layers/grass_in_parks.md) - - [home_location](./Layers/home_location.md) - - [hydrant](./Layers/hydrant.md) - - [import_candidate](./Layers/import_candidate.md) - - [information_board](./Layers/information_board.md) - - [left_right_style](./Layers/left_right_style.md) - - [map](./Layers/map.md) - - [matchpoint](./Layers/matchpoint.md) - - [named_streets](./Layers/named_streets.md) - - [nature_reserve](./Layers/nature_reserve.md) - - [note](./Layers/note.md) - - [note_import](./Layers/note_import.md) - - [observation_tower](./Layers/observation_tower.md) - - [parking](./Layers/parking.md) - - [pedestrian_path](./Layers/pedestrian_path.md) - - [picnic_table](./Layers/picnic_table.md) - - [play_forest](./Layers/play_forest.md) - - [playground](./Layers/playground.md) - - [public_bookcase](./Layers/public_bookcase.md) - - [shops](./Layers/shops.md) - - [slow_roads](./Layers/slow_roads.md) - - [split_point](./Layers/split_point.md) - - [sport_pitch](./Layers/sport_pitch.md) - - [street_lamps](./Layers/street_lamps.md) - - [surveillance_camera](./Layers/surveillance_camera.md) - - [toilet](./Layers/toilet.md) - - [trail](./Layers/trail.md) - - [tree_node](./Layers/tree_node.md) - - [type_node](./Layers/type_node.md) - - [viewpoint](./Layers/viewpoint.md) - - [village_green](./Layers/village_green.md) - - [visitor_information_centre](./Layers/visitor_information_centre.md) - - [walls_and_buildings](./Layers/walls_and_buildings.md) - - [waste_basket](./Layers/waste_basket.md) - - [watermill](./Layers/watermill.md) - +- [address](./Layers/address.md) +- [ambulancestation](./Layers/ambulancestation.md) +- [artwork](./Layers/artwork.md) +- [barrier](./Layers/barrier.md) +- [bench](./Layers/bench.md) +- [bench_at_pt](./Layers/bench_at_pt.md) +- [bicycle_library](./Layers/bicycle_library.md) +- [bicycle_tube_vending_machine](./Layers/bicycle_tube_vending_machine.md) +- [bike_cafe](./Layers/bike_cafe.md) +- [bike_cleaning](./Layers/bike_cleaning.md) +- [bike_parking](./Layers/bike_parking.md) +- [bike_repair_station](./Layers/bike_repair_station.md) +- [bike_shop](./Layers/bike_shop.md) +- [bike_themed_object](./Layers/bike_themed_object.md) +- [binocular](./Layers/binocular.md) +- [birdhide](./Layers/birdhide.md) +- [cafe_pub](./Layers/cafe_pub.md) +- [charging_station](./Layers/charging_station.md) +- [cluster_style](./Layers/cluster_style.md) +- [conflation](./Layers/conflation.md) +- [crab_address](./Layers/crab_address.md) +- [crossings](./Layers/crossings.md) +- [current_view](./Layers/current_view.md) +- [cycleways_and_roads](./Layers/cycleways_and_roads.md) +- [defibrillator](./Layers/defibrillator.md) +- [direction](./Layers/direction.md) +- [drinking_water](./Layers/drinking_water.md) +- [entrance](./Layers/entrance.md) +- [etymology](./Layers/etymology.md) +- [extinguisher](./Layers/extinguisher.md) +- [fire_station](./Layers/fire_station.md) +- [food](./Layers/food.md) +- [ghost_bike](./Layers/ghost_bike.md) +- [gps_location](./Layers/gps_location.md) +- [gps_location_history](./Layers/gps_location_history.md) +- [gps_track](./Layers/gps_track.md) +- [grass_in_parks](./Layers/grass_in_parks.md) +- [home_location](./Layers/home_location.md) +- [hydrant](./Layers/hydrant.md) +- [import_candidate](./Layers/import_candidate.md) +- [information_board](./Layers/information_board.md) +- [left_right_style](./Layers/left_right_style.md) +- [map](./Layers/map.md) +- [matchpoint](./Layers/matchpoint.md) +- [named_streets](./Layers/named_streets.md) +- [nature_reserve](./Layers/nature_reserve.md) +- [note](./Layers/note.md) +- [note_import](./Layers/note_import.md) +- [observation_tower](./Layers/observation_tower.md) +- [parking](./Layers/parking.md) +- [pedestrian_path](./Layers/pedestrian_path.md) +- [picnic_table](./Layers/picnic_table.md) +- [play_forest](./Layers/play_forest.md) +- [playground](./Layers/playground.md) +- [public_bookcase](./Layers/public_bookcase.md) +- [shops](./Layers/shops.md) +- [slow_roads](./Layers/slow_roads.md) +- [split_point](./Layers/split_point.md) +- [sport_pitch](./Layers/sport_pitch.md) +- [street_lamps](./Layers/street_lamps.md) +- [surveillance_camera](./Layers/surveillance_camera.md) +- [toilet](./Layers/toilet.md) +- [trail](./Layers/trail.md) +- [tree_node](./Layers/tree_node.md) +- [type_node](./Layers/type_node.md) +- [viewpoint](./Layers/viewpoint.md) +- [village_green](./Layers/village_green.md) +- [visitor_information_centre](./Layers/visitor_information_centre.md) +- [walls_and_buildings](./Layers/walls_and_buildings.md) +- [waste_basket](./Layers/waste_basket.md) +- [watermill](./Layers/watermill.md) This document is autogenerated from AllKnownLayers.ts \ No newline at end of file diff --git a/Docs/CalculatedTags.md b/Docs/CalculatedTags.md index e767db34f..20cf40306 100644 --- a/Docs/CalculatedTags.md +++ b/Docs/CalculatedTags.md @@ -1,14 +1,11 @@ - - - Metatags +Metatags ========== - - ## Table of contents 1. [Metatags](#metatags) - - [Metatags calculated by MapComplete](#metatags-calculated-by-mapcomplete) + +- [Metatags calculated by MapComplete](#metatags-calculated-by-mapcomplete) + [_lat, _lon](#_lat,-_lon) + [_layer](#_layer) + [_surface, _surface:ha](#_surface,-_surfaceha) @@ -29,166 +26,108 @@ + [memberships](#memberships) + [get](#get) - - Metatags are extra tags available, in order to display more data or to give better questions. -The are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an overview of the available metatags. +The are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an +overview of the available metatags. -**Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a box in the popup for features which shows all the properties of the object +**Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a +box in the popup for features which shows all the properties of the object - Metatags calculated by MapComplete +Metatags calculated by MapComplete ------------------------------------ -The following values are always calculated, by default, by MapComplete and are available automatically on all elements in every theme - - - -### _lat, _lon - +The following values are always calculated, by default, by MapComplete and are available automatically on all elements +in every theme +### _lat, _lon The latitude and longitude of the point (or centerpoint in the case of a way/area) +### _layer +The layer-id to which this feature belongs. Note that this might be return any applicable if `passAllFeatures` is +defined. - - -### _layer - - - -The layer-id to which this feature belongs. Note that this might be return any applicable if `passAllFeatures` is defined. - - - - - -### _surface, _surface:ha - - +### _surface, _surface:ha The surface area of the feature, in square meters and in hectare. Not set on points and ways This is a lazy metatag and is only calculated when needed +### _length, _length:km +The total length of a feature in meters (and in kilometers, rounded to one decimal for '_length:km'). For a surface, the +length of the perimeter -### _length, _length:km - - - -The total length of a feature in meters (and in kilometers, rounded to one decimal for '_length:km'). For a surface, the length of the perimeter - - - - - -### Theme-defined keys - - - -If 'units' is defined in the layoutConfig, then this metatagger will rewrite the specified keys to have the canonical form (e.g. `1meter` will be rewritten to `1m`) - - - - - -### _country +### Theme-defined keys +If 'units' is defined in the layoutConfig, then this metatagger will rewrite the specified keys to have the canonical +form (e.g. `1meter` will be rewritten to `1m`) +### _country The country code of the property (with latlon2country) - - - - -### _isOpen - - +### _isOpen If 'opening_hours' is present, it will add the current state of the feature (being 'yes' or 'no') This is a lazy metatag and is only calculated when needed +### _direction:numerical, _direction:leftright +_direction:numerical is a normalized, numerical direction based on 'camera:direction' or on 'direction'; it is only +present if a valid direction is found (e.g. 38.5 or NE). _direction:leftright is either 'left' or 'right', which is +left-looking on the map or 'right-looking' on the map -### _direction:numerical, _direction:leftright - - - -_direction:numerical is a normalized, numerical direction based on 'camera:direction' or on 'direction'; it is only present if a valid direction is found (e.g. 38.5 or NE). _direction:leftright is either 'left' or 'right', which is left-looking on the map or 'right-looking' on the map - - - - - -### _now:date, _now:datetime, _loaded:date, _loaded:_datetime - - - -Adds the time that the data got loaded - pretty much the time of downloading from overpass. The format is YYYY-MM-DD hh:mm, aka 'sortable' aka ISO-8601-but-not-entirely - - - - - -### _last_edit:contributor, _last_edit:contributor:uid, _last_edit:changeset, _last_edit:timestamp, _version_number, _backend +### _now:date, _now:datetime, _loaded:date, _loaded:_datetime +Adds the time that the data got loaded - pretty much the time of downloading from overpass. The format is YYYY-MM-DD hh: +mm, aka 'sortable' aka ISO-8601-but-not-entirely +### _last_edit:contributor, _last_edit:contributor:uid, _last_edit:changeset, _last_edit:timestamp, _version_number, _backend Information about the last edit of this object. +### sidewalk:left, sidewalk:right, generic_key:left:property, generic_key:right:property +Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and +similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much +unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined +### _geometry:type - -### sidewalk:left, sidewalk:right, generic_key:left:property, generic_key:right:property - - - -Rewrites tags from 'generic_key:both:property' as 'generic_key:left:property' and 'generic_key:right:property' (and similar for sidewalk tagging). Note that this rewritten tags _will be reuploaded on a change_. To prevent to much unrelated retagging, this is only enabled if the layer has at least some lineRenderings with offset defined +Adds the geometry type as property. This is identical to the GoeJson geometry type and is one of `Point`,`LineString` +, `Polygon` and exceptionally `MultiPolygon` or `MultiLineString` -### _geometry:type - - - -Adds the geometry type as property. This is identical to the GoeJson geometry type and is one of `Point`,`LineString`, `Polygon` and exceptionally `MultiPolygon` or `MultiLineString` - - - - - - Calculating tags with Javascript +Calculating tags with Javascript ---------------------------------- -In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. `lat`, `lon`, `_country`), as detailed above. +In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by +default (e.g. `lat`, `lon`, `_country`), as detailed above. It is also possible to calculate your own tags - but this requires some javascript knowledge. - - Before proceeding, some warnings: +- DO NOT DO THIS AS BEGINNER +- **Only do this if all other techniques fail** This should _not_ be done to create a rendering effect, only to + calculate a specific value +- **THIS MIGHT BE DISABLED WITHOUT ANY NOTICE ON UNOFFICIAL THEMES** As unofficial themes might be loaded from the + internet, this is the equivalent of injecting arbitrary code into the client. It'll be disabled if abuse occurs. - - - DO NOT DO THIS AS BEGINNER - - **Only do this if all other techniques fail** This should _not_ be done to create a rendering effect, only to calculate a specific value - - **THIS MIGHT BE DISABLED WITHOUT ANY NOTICE ON UNOFFICIAL THEMES** As unofficial themes might be loaded from the internet, this is the equivalent of injecting arbitrary code into the client. It'll be disabled if abuse occurs. - - -To enable this feature, add a field `calculatedTags` in the layer object, e.g.: +To enable this feature, add a field `calculatedTags` in the layer object, e.g.: ```` @@ -204,92 +143,90 @@ To enable this feature, add a field `calculatedTags` in the layer object, e.g.: ```` +The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended +geojson object: +- `area` contains the surface area (in square meters) of the object +- `lat` and `lon` contain the latitude and longitude -The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object: +Some advanced functions are available on **feat** as well: +- [distanceTo](#distanceTo) +- [overlapWith](#overlapWith) +- [intersectionsWith](#intersectionsWith) +- [closest](#closest) +- [closestn](#closestn) +- [memberships](#memberships) +- [get](#get) +### distanceTo - - `area` contains the surface area (in square meters) of the object - - `lat` and `lon` contain the latitude and longitude +Calculates the distance between the feature and a specified point in meter. The input should either be a pair of +coordinates, a geojson feature or the ID of an object +0. feature OR featureID OR longitude +1. undefined OR latitude -Some advanced functions are available on **feat** as well: +### overlapWith - - [distanceTo](#distanceTo) - - [overlapWith](#overlapWith) - - [intersectionsWith](#intersectionsWith) - - [closest](#closest) - - [closestn](#closestn) - - [memberships](#memberships) - - [get](#get) - +Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded +in the feature is detected as well.If the current feature is a point, all features that this point is embeded in are +given. -### distanceTo +The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in +m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature +is a point. The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be +the first in the list - Calculates the distance between the feature and a specified point in meter. The input should either be a pair of coordinates, a geojson feature or the ID of an object +For example to get all objects which overlap or embed from a layer, +use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')` - 0. feature OR featureID OR longitude - 1. undefined OR latitude - +0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap) -### overlapWith +### intersectionsWith - Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well.If the current feature is a point, all features that this point is embeded in are given. +Gives the intersection points with selected features. Only works with (Multi)Polygons and LineStrings. -The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point. -The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list +Returns a `{feat: GeoJson, intersections: [number,number][]}` where `feat` is the full, original feature. This list is +in random order. -For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')` +If the current feature is a point, this function will return an empty list. Points from other layers are ignored - even +if the points are parts of the current linestring. - 0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap) - +0. ...layerIds - one or more layer ids of the layer from which every feature is checked for intersection) -### intersectionsWith +### closest - Gives the intersection points with selected features. Only works with (Multi)Polygons and LineStrings. +Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. +In the case of ways/polygons, only the centerpoint is considered. Returns a single geojson feature or undefined if +nothing is found (or not yet laoded) -Returns a `{feat: GeoJson, intersections: [number,number][]}` where `feat` is the full, original feature. This list is in random order. +0. list of features or a layer name or '*' to get all features -If the current feature is a point, this function will return an empty list. -Points from other layers are ignored - even if the points are parts of the current linestring. +### closestn - 0. ...layerIds - one or more layer ids of the layer from which every feature is checked for intersection) - +Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the +feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. Returns a list +of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded) -### closest +If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will +have a different name) - Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered. Returns a single geojson feature or undefined if nothing is found (or not yet laoded) +0. list of features or layer name or '*' to get all features +1. amount of features +2. unique tag key (optional) +3. maxDistanceInMeters (optional) - 0. list of features or a layer name or '*' to get all features - +### memberships -### closestn +Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. - Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. Returns a list of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded) +For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')` -If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will have a different name) +### get - 0. list of features or layer name or '*' to get all features - 1. amount of features - 2. unique tag key (optional) - 3. maxDistanceInMeters (optional) - +Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ... -### memberships - - Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. - -For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')` - - - - -### get - - Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ... - - 0. key - +0. key This document is autogenerated from SimpleMetaTagger, ExtraFunction \ No newline at end of file diff --git a/Docs/Development_deployment.md b/Docs/Development_deployment.md index 4dea0b880..9a083b3a0 100644 --- a/Docs/Development_deployment.md +++ b/Docs/Development_deployment.md @@ -106,7 +106,8 @@ Try removing `node_modules`, `package-lock.json` and `.cache` Misc setup ---------- -~~The json-git-merger is used to quickly merge translation files, [documentation here](https://github.com/jonatanpedersen/git-json-merge#single-project--directory).~~ +~~The json-git-merger is used to quickly merge translation +files, [documentation here](https://github.com/jonatanpedersen/git-json-merge#single-project--directory).~~ This merge driver is broken and would sometimes drop new questions or duplicate them... Not a good idea! Overview of package.json-scripts diff --git a/Docs/ImporteerHandleiding.nl.md b/Docs/ImporteerHandleiding.nl.md index 2af7d6137..6c28fc217 100644 --- a/Docs/ImporteerHandleiding.nl.md +++ b/Docs/ImporteerHandleiding.nl.md @@ -9,20 +9,20 @@ Om een dataset te importeren, zijn er enkele stappen die doorlopen moeten worden 3. Community inlichten en Importeren voorbereiden 4. Importeren! - - ## 0. Geschikte data - -Is de data die je wenst te importeren geschikt voor OpenStreetMap? Is ze dus verifieerbaar ter plaatse door een andere contributor? Is ze ietwat permantent? +Is de data die je wenst te importeren geschikt voor OpenStreetMap? Is ze dus verifieerbaar ter plaatse door een andere +contributor? Is ze ietwat permantent? ## 1. Licentie nakijken +Voordat we een dataset in OpenStreetMap kunnen toevoegen, moeten we nagaan of dit wel mag van de oorspronkelijke maker +van de dataset. -Voordat we een dataset in OpenStreetMap kunnen toevoegen, moeten we nagaan of dit wel mag van de oorspronkelijke maker van de dataset. - -Is er een licentievermelding bij de databron? Kijk deze dan na of er toestemming is voor hergebruik (ook commercieel) en redistributie. -Indien er een attributie voor de dataset moet zijn, dan kan de bronvermelding in de changeset (als source) aangeduid worden en/of kan de auteur vermeld worden op [deze wikipagina]. **Vraag na of deze bronvermelding voldoende is** +Is er een licentievermelding bij de databron? Kijk deze dan na of er toestemming is voor hergebruik (ook commercieel) en +redistributie. Indien er een attributie voor de dataset moet zijn, dan kan de bronvermelding in de changeset (als +source) aangeduid worden en/of kan de auteur vermeld worden op [deze wikipagina]. **Vraag na of deze bronvermelding +voldoende is** ## 2. Importeermethode bepalen @@ -35,37 +35,42 @@ De volgende vraag is hoe deze data geimporteerd zal worden. Ook hier moeten vers ### Wie importeert? +Een ervaren contributor vergelijkt de bestaande OSM-data met de aangeleverde dataset. Duplicaten worden gefiltered en +geupdate. Dit is vooral geschikt voor kleinere dataset (maximaal enkele honderd feaures), maar is sneller (want minder +coordinatie is nodig). -Een ervaren contributor vergelijkt de bestaande OSM-data met de aangeleverde dataset. Duplicaten worden gefiltered en geupdate. -Dit is vooral geschikt voor kleinere dataset (maximaal enkele honderd feaures), maar is sneller (want minder coordinatie is nodig). - -Indien een grotere dataset geimporteerd dient te worden, is dit vaak niet meer haalbaar door één enkele persoon. -Als dit het geval is, zal men contributors moeten zoeken om mee te helpen importeren. -Dit kan heel passief (de data online plaatsen en de community er attent op maken dat deze bestaat, in de hoop dat er iemand dit oppikt), -tot actief een groep vrijwilligers zoeken. -Ten slotte kan men hier ook een betaalde kracht voor inhuren - een GIS-expert binnen de organisatie, een jobstudent of een OpenStreetMap-expert die men betaald +Indien een grotere dataset geimporteerd dient te worden, is dit vaak niet meer haalbaar door één enkele persoon. Als dit +het geval is, zal men contributors moeten zoeken om mee te helpen importeren. Dit kan heel passief (de data online +plaatsen en de community er attent op maken dat deze bestaat, in de hoop dat er iemand dit oppikt), tot actief een groep +vrijwilligers zoeken. Ten slotte kan men hier ook een betaalde kracht voor inhuren - een GIS-expert binnen de +organisatie, een jobstudent of een OpenStreetMap-expert die men betaald ### Is een survey nodig? -Indien de dataset oud is of veel fouten bevat, is het wellicht wenslijk om ter plaatse te gaan kijken. Dit hangt sterk af van dataset tot dataset, of men de data op luchtfoto's kan afleiden, via mapillary of OpenStreetCam de situatie ter plaatse kan zien, ... +Indien de dataset oud is of veel fouten bevat, is het wellicht wenslijk om ter plaatse te gaan kijken. Dit hangt sterk +af van dataset tot dataset, of men de data op luchtfoto's kan afleiden, via mapillary of OpenStreetCam de situatie ter +plaatse kan zien, ... -Vaak helpt het om terreinkennis te hebben, om de import voor te bereiden door alle data te overlopen, toe te voegen waar men zeker van is en enkel de twijfelgevallen over te houden voor import. +Vaak helpt het om terreinkennis te hebben, om de import voor te bereiden door alle data te overlopen, toe te voegen waar +men zeker van is en enkel de twijfelgevallen over te houden voor import. ### Welke tools worden ingezet? Indien er één ervaren gebruiker de import doet, zal die wellicht JOSM (of zijn favoriete editor gebruiken). -Voor extreem grote imports (meer dan 1000 objecten) zal men wellicht ook coordineren via een tasking manager (om werkgebieden per contributor af te bakenen). +Voor extreem grote imports (meer dan 1000 objecten) zal men wellicht ook coordineren via een tasking manager (om +werkgebieden per contributor af te bakenen). -Voor een import waar survey wenselijk is (ihb indien er verschillende contributors betrokken zijn), kan MapComplete ingezet worden waar de na te zien data ingeladen wordt. -MapComplete kan: +Voor een import waar survey wenselijk is (ihb indien er verschillende contributors betrokken zijn), kan MapComplete +ingezet worden waar de na te zien data ingeladen wordt. MapComplete kan: -- tegelijk een laag van OpenStreetMap én de te importeren data tonen . +- tegelijk een laag van OpenStreetMap én de te importeren data tonen . - de te importeren objecten verbergen indien er een OpenStreetMap-object dichtbij is - aanbieden om het te importeren object toe te voegen indien dit object ontbreekt (*) - aanbieden om gegevens van het te importeren object over te zetten op een naburig, soortgelijk object (*) -(*) Opties 3 en 4 vereisen een degelijke voorbereiding van de te importeren dataset en zijn niet altijd mogelijk of niet altijd de moeite +(*) Opties 3 en 4 vereisen een degelijke voorbereiding van de te importeren dataset en zijn niet altijd mogelijk of niet +altijd de moeite Op de screenshot hieronder is een voorbeeld te zien van het importeren van een dataset van Brugse defibrillatoren. @@ -76,35 +81,40 @@ Op de screenshot hieronder is een voorbeeld te zien van het importeren van een d ![Voorbeeld van importeren](AED-import.nl.png) -Een geavanceerder voorbeeld van een import is het UK-address-importproject. -Hierbij wordt met een dataset van vermoedelijke adressen gewerkt. -Indien er geen gebouw met adres dit vermoedelijke adres omsluit, wordt er gevraagd om dit adres toe te voegen. Door het adres via deze popup toe te voegen, wordt er meteen een INSPIRE-referentie meegegeven. +Een geavanceerder voorbeeld van een import is het UK-address-importproject. Hierbij wordt met een dataset van +vermoedelijke adressen gewerkt. Indien er geen gebouw met adres dit vermoedelijke adres omsluit, wordt er gevraagd om +dit adres toe te voegen. Door het adres via deze popup toe te voegen, wordt er meteen een INSPIRE-referentie meegegeven. ![](uk_address_import.png) - - ### Tagging bepalen en filteren voor duplicaten Ten slotte moet de data ook nog 'vertaald' worden naar het correct OpenStreetMap-formaat. -De softwareprogramma's ook overweg kunnen met het dataformaat. **Geojson** is een veilige keuze, want dit open formaat wordt door veel editors ondersteund. Met QGIS kunnen shapefiles omgezet worden in geojson. Een geojson kan ook als extra laag in MapComplete geladen worden. +De softwareprogramma's ook overweg kunnen met het dataformaat. **Geojson** is een veilige keuze, want dit open formaat +wordt door veel editors ondersteund. Met QGIS kunnen shapefiles omgezet worden in geojson. Een geojson kan ook als extra +laag in MapComplete geladen worden. -Daarnaast moeten de attributen van de data omgezet moeten worden naar de OpenStreetMap-attributen - raadpleeg de wiki voor de correcte tags. -Dit kan bijvoorbeeld met QGIS of met JOSM gedaan worden. +Daarnaast moeten de attributen van de data omgezet moeten worden naar de OpenStreetMap-attributen - raadpleeg de wiki +voor de correcte tags. Dit kan bijvoorbeeld met QGIS of met JOSM gedaan worden. -Ten slotte moet men ook voorkomen dat er duplicaten ontstaan: twee objecten in OpenStreetMap die beiden hetzelfde voorwerp voorstellen. +Ten slotte moet men ook voorkomen dat er duplicaten ontstaan: twee objecten in OpenStreetMap die beiden hetzelfde +voorwerp voorstellen. ## 3. Community inlichten en importeren voorbereiden -Indien er een grote import gaat gebeuren, dient de community hiervan ingelicht te worden. Door dit in de community te bespreken, worden fouten voorkomen. Ook helpt dit om medecontributors warm te maken en niet-betrokken contributors geen verassingen te bezorgen. +Indien er een grote import gaat gebeuren, dient de community hiervan ingelicht te worden. Door dit in de community te +bespreken, worden fouten voorkomen. Ook helpt dit om medecontributors warm te maken en niet-betrokken contributors geen +verassingen te bezorgen. -Voor een import die enkel in Belgie plaatsvindt, volstaat een email naar talk@osm.be ; voor een globale import moet men ook best naar import@openstreetmap.org sturen. +Voor een import die enkel in Belgie plaatsvindt, volstaat een email naar talk@osm.be ; voor een globale import moet men +ook best naar import@openstreetmap.org sturen. Voor kleinere datasets is dit slechts een formaliteit - zeker indien de data gedubbelcheckt gaat worden. -Ondertussen kan de import voorbereid worden door op kleine schaal te importeren (bv. een beperkt gebied of een beperkt aantal punten). -Indien er een MapComplete-thema wordt opgezet, kan dit ook al getest worden en naar de community gestuurd worden. +Ondertussen kan de import voorbereid worden door op kleine schaal te importeren (bv. een beperkt gebied of een beperkt +aantal punten). Indien er een MapComplete-thema wordt opgezet, kan dit ook al getest worden en naar de community +gestuurd worden. ## 4. Importeren! diff --git a/Docs/Layers/address.md b/Docs/Layers/address.md index bd1a1c845..9f287d389 100644 --- a/Docs/Layers/address.md +++ b/Docs/Layers/address.md @@ -1,6 +1,4 @@ - - - address +address ========= @@ -9,107 +7,77 @@ Addresses - - - ## Table of contents 1. [address](#address) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [housenumber](#housenumber) + [street](#street) + [fixme](#fixme) - - - - - This layer will automatically load [named_streets](./named_streets.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _closest_3_street_names) - +- This layer will automatically load [named_streets](./named_streets.md) into the layout as it depends on it: A + calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + closest_3_street_names) [Go to the source code](../assets/layers/address/address.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- addr:housenumber~^..*$|addr:street~^..*$ - - - addr:housenumber~^..*$|addr:street~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/addr:housenumber#values) [addr:housenumber](https://wiki.openstreetmap.org/wiki/Key:addr:housenumber) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/addr:housenumber#values) [addr:housenumber](https://wiki.openstreetmap.org/wiki/Key:addr:housenumber) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/addr:street#values) [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:addr:street%3D) [](https://wiki.openstreetmap.org/wiki/Tag:addr:street%3D) [](https://wiki.openstreetmap.org/wiki/Tag:addr:street%3D) [](https://taginfo.openstreetmap.org/keys/fixme#values) [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:fixme%3D) - - - -### housenumber - - +### housenumber The question is **What is the number of this house?** -This rendering asks information about the property [addr:housenumber](https://wiki.openstreetmap.org/wiki/Key:addr:housenumber) +This rendering asks information about the +property [addr:housenumber](https://wiki.openstreetmap.org/wiki/Key:addr:housenumber) This is rendered with `The housenumber is {addr:housenumber}` +- **This building has no house number** corresponds + with nohousenumber + =yes - - - **This building has no house number** corresponds with nohousenumber=yes - - - - -### street - - +### street The question is **What street is this address located in?** -This rendering asks information about the property [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) +This rendering asks information about the property [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) This is rendered with `This address is in street {addr:street}` +- **Located in {_closest_street:0:name}** corresponds with addr:street= +- **Located in {_closest_street:1:name}** corresponds with addr:street= +- **Located in {_closest_street:2:name}** corresponds with addr:street= - - - **Located in {_closest_street:0:name}** corresponds with addr:street= - - **Located in {_closest_street:1:name}** corresponds with addr:street= - - **Located in {_closest_street:2:name}** corresponds with addr:street= - - - - -### fixme - - +### fixme The question is **What should be fixed here? Please explain** -This rendering asks information about the property [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) +This rendering asks information about the property [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) This is rendered with `Fixme description{fixme}` - - - - **No fixme - write something here to explain complicated cases** corresponds with - +- **No fixme - write something here to explain complicated cases** corresponds with This document is autogenerated from assets/layers/address/address.json \ No newline at end of file diff --git a/Docs/Layers/all_streets.md b/Docs/Layers/all_streets.md index 893d98a6c..b71a3a4e4 100644 --- a/Docs/Layers/all_streets.md +++ b/Docs/Layers/all_streets.md @@ -1,92 +1,62 @@ - - - all_streets +all_streets ============= - - - - - - - ## Table of contents 1. [all_streets](#all_streets) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [lit](#lit) +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +#### Themes using this layer - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - - - -#### Themes using this layer - - - - - - - [cyclestreets](https://mapcomplete.osm.be/cyclestreets) - - [street_lighting](https://mapcomplete.osm.be/street_lighting) - +- [cyclestreets](https://mapcomplete.osm.be/cyclestreets) +- [street_lighting](https://mapcomplete.osm.be/street_lighting) [Go to the source code](../assets/layers/all_streets/all_streets.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway!~^$ +- service!~^driveway$ +- highway!~^platform$ - - - highway!~^$ - - service!~^driveway$ - - highway!~^platform$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/lit#values) [lit](https://wiki.openstreetmap.org/wiki/Key:lit) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dno) [24/7](https://wiki.openstreetmap.org/wiki/Tag:lit%3D24/7) - - - -### lit - - +### lit The question is **Is this street lit?** - - - - - - **This street is lit** corresponds with lit=yes - - **This street is not lit** corresponds with lit=no - - **This street is lit at night** corresponds with lit=sunset-sunrise_This option cannot be chosen as answer_ - - **This street is lit 24/7** corresponds with lit=24/7 - +- **This street is lit** corresponds with lit + =yes +- **This street is not lit** corresponds with + lit=no +- **This street is lit at night** corresponds + with lit + =sunset-sunrise_This option + cannot be chosen as answer_ +- **This street is lit 24/7** corresponds with + lit=24/7 This document is autogenerated from assets/layers/all_streets/all_streets.json \ No newline at end of file diff --git a/Docs/Layers/ambulancestation.md b/Docs/Layers/ambulancestation.md index ed6503344..acd737657 100644 --- a/Docs/Layers/ambulancestation.md +++ b/Docs/Layers/ambulancestation.md @@ -1,23 +1,20 @@ - - - ambulancestation +ambulancestation ================== -An ambulance station is an area for storage of ambulance vehicles, medical equipment, personal protective equipment, and other medical supplies. - - - +An ambulance station is an area for storage of ambulance vehicles, medical equipment, personal protective equipment, and +other medical supplies. ## Table of contents 1. [ambulancestation](#ambulancestation) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [ambulance-name](#ambulance-name) + [ambulance-street](#ambulance-street) + [ambulance-place](#ambulance-place) @@ -25,137 +22,91 @@ An ambulance station is an area for storage of ambulance vehicles, medical equip + [ambulance-operator-type](#ambulance-operator-type) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [hailhydrant](https://mapcomplete.osm.be/hailhydrant) - - [personal](https://mapcomplete.osm.be/personal) - +- [hailhydrant](https://mapcomplete.osm.be/hailhydrant) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/ambulancestation/ambulancestation.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- emergency + =ambulance_station - - - emergency=ambulance_station - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/addr:street#values) [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/addr:place#values) [addr:place](https://wiki.openstreetmap.org/wiki/Key:addr:place) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/addr:street#values) [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/addr:place#values) [addr:place](https://wiki.openstreetmap.org/wiki/Key:addr:place) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/operator:type#values) [operator:type](https://wiki.openstreetmap.org/wiki/Key:operator:type) | [string](../SpecialInputElements.md#string) | [government](https://wiki.openstreetmap.org/wiki/Tag:operator:type%3Dgovernment) [community](https://wiki.openstreetmap.org/wiki/Tag:operator:type%3Dcommunity) [ngo](https://wiki.openstreetmap.org/wiki/Tag:operator:type%3Dngo) [private](https://wiki.openstreetmap.org/wiki/Tag:operator:type%3Dprivate) - - - -### ambulance-name - - +### ambulance-name The question is **What is the name of this ambulance station?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This station is called {name}.` - - -### ambulance-street - - +### ambulance-street The question is ** What is the street name where the station located?** -This rendering asks information about the property [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) +This rendering asks information about the property [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) This is rendered with `This station is along a highway called {addr:street}.` - - -### ambulance-place - - +### ambulance-place The question is **Where is the station located? (e.g. name of neighborhood, villlage, or town)** -This rendering asks information about the property [addr:place](https://wiki.openstreetmap.org/wiki/Key:addr:place) +This rendering asks information about the property [addr:place](https://wiki.openstreetmap.org/wiki/Key:addr:place) This is rendered with `This station is found within {addr:place}.` - - -### ambulance-agency - - +### ambulance-agency The question is **What agency operates this station?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `This station is operated by {operator}.` - - - - - - - -### ambulance-operator-type - - +### ambulance-operator-type The question is **How is the station operator classified?** -This rendering asks information about the property [operator:type](https://wiki.openstreetmap.org/wiki/Key:operator:type) +This rendering asks information about the +property [operator:type](https://wiki.openstreetmap.org/wiki/Key:operator:type) This is rendered with `The operator is a(n) {operator:type} entity.` +- **The station is operated by the government.** corresponds + with operator:type + =government +- **The station is operated by a community-based, or informal organization.** corresponds + with operator:type + =community +- **The station is operated by a formal group of volunteers.** corresponds + with operator:type + =ngo +- **The station is privately operated.** corresponds + with operator:type + =private - - - **The station is operated by the government.** corresponds with operator:type=government - - **The station is operated by a community-based, or informal organization.** corresponds with operator:type=community - - **The station is operated by a formal group of volunteers.** corresponds with operator:type=ngo - - **The station is privately operated.** corresponds with operator:type=private - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/ambulancestation/ambulancestation.json \ No newline at end of file diff --git a/Docs/Layers/artwork.md b/Docs/Layers/artwork.md index f1a603cd7..6e20a4754 100644 --- a/Docs/Layers/artwork.md +++ b/Docs/Layers/artwork.md @@ -1,6 +1,4 @@ - - - artwork +artwork ========= @@ -9,143 +7,115 @@ Diverse pieces of artwork - - - ## Table of contents 1. [artwork](#artwork) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [artwork-artwork_type](#artwork-artwork_type) + [artwork-artist_name](#artwork-artist_name) + [artwork-website](#artwork-website) + [artwork-wikidata](#artwork-wikidata) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [artwork](https://mapcomplete.osm.be/artwork) - - [personal](https://mapcomplete.osm.be/personal) - +- [artwork](https://mapcomplete.osm.be/artwork) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/artwork/artwork.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- tourism + =artwork - - - tourism=artwork - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/artwork_type#values) [artwork_type](https://wiki.openstreetmap.org/wiki/Key:artwork_type) | [string](../SpecialInputElements.md#string) | [architecture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Darchitecture) [mural](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dmural) [painting](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dpainting) [sculpture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dsculpture) [statue](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstatue) [bust](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dbust) [stone](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstone) [installation](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dinstallation) [graffiti](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dgraffiti) [relief](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Drelief) [azulejo](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dazulejo) [tilework](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dtilework) -[](https://taginfo.openstreetmap.org/keys/artist_name#values) [artist_name](https://wiki.openstreetmap.org/wiki/Key:artist_name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/artist_name#values) [artist_name](https://wiki.openstreetmap.org/wiki/Key:artist_name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### artwork-artwork_type - - +### artwork-artwork_type The question is **What is the type of this artwork?** -This rendering asks information about the property [artwork_type](https://wiki.openstreetmap.org/wiki/Key:artwork_type) +This rendering asks information about the property [artwork_type](https://wiki.openstreetmap.org/wiki/Key:artwork_type) This is rendered with `This is a {artwork_type}` +- **Architecture** corresponds with + artwork_type= + architecture +- **Mural** corresponds with + artwork_type=mural +- **Painting** corresponds with + artwork_type= + painting +- **Sculpture** corresponds with + artwork_type= + sculpture +- **Statue** corresponds with + artwork_type=statue +- **Bust** corresponds with + artwork_type=bust +- **Stone** corresponds with + artwork_type=stone +- **Installation** corresponds with + artwork_type= + installation +- **Graffiti** corresponds with + artwork_type= + graffiti +- **Relief** corresponds with + artwork_type=relief +- **Azulejo (Spanish decorative tilework)** corresponds + with artwork_type + =azulejo +- **Tilework** corresponds with + artwork_type= + tilework - - - **Architecture** corresponds with artwork_type=architecture - - **Mural** corresponds with artwork_type=mural - - **Painting** corresponds with artwork_type=painting - - **Sculpture** corresponds with artwork_type=sculpture - - **Statue** corresponds with artwork_type=statue - - **Bust** corresponds with artwork_type=bust - - **Stone** corresponds with artwork_type=stone - - **Installation** corresponds with artwork_type=installation - - **Graffiti** corresponds with artwork_type=graffiti - - **Relief** corresponds with artwork_type=relief - - **Azulejo (Spanish decorative tilework)** corresponds with artwork_type=azulejo - - **Tilework** corresponds with artwork_type=tilework - - - - -### artwork-artist_name - - +### artwork-artist_name The question is **Which artist created this?** -This rendering asks information about the property [artist_name](https://wiki.openstreetmap.org/wiki/Key:artist_name) +This rendering asks information about the property [artist_name](https://wiki.openstreetmap.org/wiki/Key:artist_name) This is rendered with `Created by {artist_name}` - - -### artwork-website - - +### artwork-website The question is **Is there a website with more information about this artwork?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `More information on this website` - - -### artwork-wikidata - - +### artwork-wikidata The question is **Which Wikidata-entry corresponds with this artwork?** -This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) -This is rendered with `Corresponds with {wikidata}` +This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) +This is rendered +with `Corresponds with {wikidata}` This document is autogenerated from assets/layers/artwork/artwork.json \ No newline at end of file diff --git a/Docs/Layers/assen.md b/Docs/Layers/assen.md index 763f714c5..4e2f170d0 100644 --- a/Docs/Layers/assen.md +++ b/Docs/Layers/assen.md @@ -1,61 +1,38 @@ - - - assen +assen ======= - - - - - - - ## Table of contents 1. [assen](#assen) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [all_tags](#all_tags) - - - - - This layer is loaded from an external source, namely `https://robinlinde.github.io/tiles/assen_street_lighting/{z}/{x}/{y}.json` - - This layer will automatically load [street_lamps](./street_lamps.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _closest_osm_street_lamp) - +- This layer is loaded from an external source, namely `https://robinlinde.github.io/tiles/assen_street_lighting/{z}/{x}/{y}.json` +- This layer will automatically load [street_lamps](./street_lamps.md) into the layout as it depends on it: A + calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + closest_osm_street_lamp) [Go to the source code](../assets/layers/assen/assen.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- Lichtmastnummer~^..*$ - - - Lichtmastnummer~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### all_tags - - +### all_tags _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/assen/assen.json \ No newline at end of file diff --git a/Docs/Layers/barrier.md b/Docs/Layers/barrier.md index 78725cdfa..b57ec5627 100644 --- a/Docs/Layers/barrier.md +++ b/Docs/Layers/barrier.md @@ -1,6 +1,4 @@ - - - barrier +barrier ========= @@ -9,15 +7,13 @@ Obstacles while cycling, such as bollards and cycle barriers - - - ## Table of contents 1. [barrier](#barrier) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [bicycle=yes/no](#bicycle=yesno) + [barrier_type](#barrier_type) + [Bollard type](#bollard-type) @@ -28,175 +24,139 @@ Obstacles while cycling, such as bollards and cycle barriers + [Overlap (cyclebarrier)](#overlap-(cyclebarrier)) +- This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on + it: a preset snaps to this layer (presets[0]) +- This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on + it: a preset snaps to this layer (presets[1]) +#### Themes using this layer - - - This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on it: a preset snaps to this layer (presets[0]) - - This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on it: a preset snaps to this layer (presets[1]) - - - - -#### Themes using this layer - - - - - - - [cycle_infra](https://mapcomplete.osm.be/cycle_infra) - - [personal](https://mapcomplete.osm.be/personal) - +- [cycle_infra](https://mapcomplete.osm.be/cycle_infra) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/barrier/barrier.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- barrier + =bollard + |barrier + =cycle_barrier - - - barrier=bollard|barrier=cycle_barrier - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/bicycle#values) [bicycle](https://wiki.openstreetmap.org/wiki/Key:bicycle) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:bicycle%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:bicycle%3Dno) [](https://taginfo.openstreetmap.org/keys/barrier#values) [barrier](https://wiki.openstreetmap.org/wiki/Key:barrier) | Multiple choice | [bollard](https://wiki.openstreetmap.org/wiki/Tag:barrier%3Dbollard) [cycle_barrier](https://wiki.openstreetmap.org/wiki/Tag:barrier%3Dcycle_barrier) [](https://taginfo.openstreetmap.org/keys/bollard#values) [bollard](https://wiki.openstreetmap.org/wiki/Key:bollard) | Multiple choice | [removable](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dremovable) [fixed](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dfixed) [foldable](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dfoldable) [flexible](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dflexible) [rising](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Drising) [](https://taginfo.openstreetmap.org/keys/cycle_barrier#values) [cycle_barrier](https://wiki.openstreetmap.org/wiki/Key:cycle_barrier) | Multiple choice | [single](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dsingle) [double](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Ddouble) [triple](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dtriple) [squeeze](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dsqueeze) -[](https://taginfo.openstreetmap.org/keys/maxwidth:physical#values) [maxwidth:physical](https://wiki.openstreetmap.org/wiki/Key:maxwidth:physical) | [length](../SpecialInputElements.md#length) | -[](https://taginfo.openstreetmap.org/keys/width:separation#values) [width:separation](https://wiki.openstreetmap.org/wiki/Key:width:separation) | [length](../SpecialInputElements.md#length) | -[](https://taginfo.openstreetmap.org/keys/width:opening#values) [width:opening](https://wiki.openstreetmap.org/wiki/Key:width:opening) | [length](../SpecialInputElements.md#length) | -[](https://taginfo.openstreetmap.org/keys/overlap#values) [overlap](https://wiki.openstreetmap.org/wiki/Key:overlap) | [length](../SpecialInputElements.md#length) | - - - - -### bicycle=yes/no - +[](https://taginfo.openstreetmap.org/keys/maxwidth:physical#values) [maxwidth:physical](https://wiki.openstreetmap.org/wiki/Key:maxwidth:physical) | [length](../SpecialInputElements.md#length) | +[](https://taginfo.openstreetmap.org/keys/width:separation#values) [width:separation](https://wiki.openstreetmap.org/wiki/Key:width:separation) | [length](../SpecialInputElements.md#length) | +[](https://taginfo.openstreetmap.org/keys/width:opening#values) [width:opening](https://wiki.openstreetmap.org/wiki/Key:width:opening) | [length](../SpecialInputElements.md#length) | +[](https://taginfo.openstreetmap.org/keys/overlap#values) [overlap](https://wiki.openstreetmap.org/wiki/Key:overlap) | [length](../SpecialInputElements.md#length) | +### bicycle=yes/no The question is **Can a bicycle go past this barrier?** +- **A cyclist can go past this.** corresponds + with bicycle + =yes +- **A cyclist can not go past this.** corresponds + with bicycle + =no - - - - - **A cyclist can go past this.** corresponds with bicycle=yes - - **A cyclist can not go past this.** corresponds with bicycle=no - - - - -### barrier_type - - +### barrier_type _This tagrendering has no question and is thus read-only_ +- **This is a single bollard in the road** corresponds + with barrier + =bollard +- **This is a cycle barrier slowing down cyclists** corresponds + with barrier + =cycle_barrier - - - - - **This is a single bollard in the road** corresponds with barrier=bollard - - **This is a cycle barrier slowing down cyclists** corresponds with barrier=cycle_barrier - - - - -### Bollard type - - +### Bollard type The question is **What kind of bollard is this?** +- **Removable bollard** corresponds with + bollard=removable +- **Fixed bollard** corresponds with + bollard=fixed +- **Bollard that can be folded down** corresponds + with bollard + =foldable +- **Flexible bollard, usually plastic** corresponds + with bollard + =flexible +- **Rising bollard** corresponds with + bollard=rising - - - - - **Removable bollard** corresponds with bollard=removable - - **Fixed bollard** corresponds with bollard=fixed - - **Bollard that can be folded down** corresponds with bollard=foldable - - **Flexible bollard, usually plastic** corresponds with bollard=flexible - - **Rising bollard** corresponds with bollard=rising - - - - -### Cycle barrier type - - +### Cycle barrier type The question is **What kind of cycling barrier is this?** +- **Single, just two barriers with a space + inbetween ** corresponds + with cycle_barrier + =single +- **Double, two barriers behind each + other ** corresponds + with cycle_barrier + =double +- **Triple, three barriers behind each + other ** corresponds + with cycle_barrier + =triple +- **Squeeze gate, gap is smaller at top, than at the + bottom ** corresponds + with cycle_barrier + =squeeze - - - - - **Single, just two barriers with a space inbetween ** corresponds with cycle_barrier=single - - **Double, two barriers behind each other ** corresponds with cycle_barrier=double - - **Triple, three barriers behind each other ** corresponds with cycle_barrier=triple - - **Squeeze gate, gap is smaller at top, than at the bottom ** corresponds with cycle_barrier=squeeze - - - - -### MaxWidth - - +### MaxWidth The question is **How wide is the gap left over besides the barrier?** -This rendering asks information about the property [maxwidth:physical](https://wiki.openstreetmap.org/wiki/Key:maxwidth:physical) +This rendering asks information about the +property [maxwidth:physical](https://wiki.openstreetmap.org/wiki/Key:maxwidth:physical) This is rendered with `Maximum width: {maxwidth:physical} m` - - -### Space between barrier (cyclebarrier) - - +### Space between barrier (cyclebarrier) The question is **How much space is there between the barriers (along the length of the road)?** -This rendering asks information about the property [width:separation](https://wiki.openstreetmap.org/wiki/Key:width:separation) +This rendering asks information about the +property [width:separation](https://wiki.openstreetmap.org/wiki/Key:width:separation) This is rendered with `Space between barriers (along the length of the road): {width:separation} m` - - -### Width of opening (cyclebarrier) - - +### Width of opening (cyclebarrier) The question is **How wide is the smallest opening next to the barriers?** -This rendering asks information about the property [width:opening](https://wiki.openstreetmap.org/wiki/Key:width:opening) +This rendering asks information about the +property [width:opening](https://wiki.openstreetmap.org/wiki/Key:width:opening) This is rendered with `Width of opening: {width:opening} m` - - -### Overlap (cyclebarrier) - - +### Overlap (cyclebarrier) The question is **How much overlap do the barriers have?** -This rendering asks information about the property [overlap](https://wiki.openstreetmap.org/wiki/Key:overlap) -This is rendered with `Overlap: {overlap} m` +This rendering asks information about the property [overlap](https://wiki.openstreetmap.org/wiki/Key:overlap) +This is rendered with `Overlap: {overlap} m` This document is autogenerated from assets/layers/barrier/barrier.json \ No newline at end of file diff --git a/Docs/Layers/bench.md b/Docs/Layers/bench.md index 6a95767e3..e0e1fd3a5 100644 --- a/Docs/Layers/bench.md +++ b/Docs/Layers/bench.md @@ -1,23 +1,20 @@ - - - bench +bench ======= -A bench is a wooden, metal, stone, ... surface where a human can sit. This layers visualises them and asks a few questions about them. - - - +A bench is a wooden, metal, stone, ... surface where a human can sit. This layers visualises them and asks a few +questions about them. ## Table of contents 1. [bench](#bench) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [bench-backrest](#bench-backrest) + [bench-seats](#bench-seats) @@ -26,168 +23,119 @@ A bench is a wooden, metal, stone, ... surface where a human can sit. This layer + [bench-colour](#bench-colour) + [bench-survey:date](#bench-surveydate) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [benches](https://mapcomplete.osm.be/benches) - - [personal](https://mapcomplete.osm.be/personal) - +- [benches](https://mapcomplete.osm.be/benches) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bench/bench.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =bench - - - amenity=bench - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/backrest#values) [backrest](https://wiki.openstreetmap.org/wiki/Key:backrest) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:backrest%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:backrest%3Dno) -[](https://taginfo.openstreetmap.org/keys/seats#values) [seats](https://wiki.openstreetmap.org/wiki/Key:seats) | [nat](../SpecialInputElements.md#nat) | +[](https://taginfo.openstreetmap.org/keys/seats#values) [seats](https://wiki.openstreetmap.org/wiki/Key:seats) | [nat](../SpecialInputElements.md#nat) | [](https://taginfo.openstreetmap.org/keys/material#values) [material](https://wiki.openstreetmap.org/wiki/Key:material) | [string](../SpecialInputElements.md#string) | [wood](https://wiki.openstreetmap.org/wiki/Tag:material%3Dwood) [metal](https://wiki.openstreetmap.org/wiki/Tag:material%3Dmetal) [stone](https://wiki.openstreetmap.org/wiki/Tag:material%3Dstone) [concrete](https://wiki.openstreetmap.org/wiki/Tag:material%3Dconcrete) [plastic](https://wiki.openstreetmap.org/wiki/Tag:material%3Dplastic) [steel](https://wiki.openstreetmap.org/wiki/Tag:material%3Dsteel) -[](https://taginfo.openstreetmap.org/keys/direction#values) [direction](https://wiki.openstreetmap.org/wiki/Key:direction) | [direction](../SpecialInputElements.md#direction) | +[](https://taginfo.openstreetmap.org/keys/direction#values) [direction](https://wiki.openstreetmap.org/wiki/Key:direction) | [direction](../SpecialInputElements.md#direction) | [](https://taginfo.openstreetmap.org/keys/colour#values) [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [color](../SpecialInputElements.md#color) | [brown](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dbrown) [green](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgreen) [gray](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgray) [white](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dwhite) [red](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dred) [black](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblack) [blue](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblue) [yellow](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dyellow) [](https://taginfo.openstreetmap.org/keys/survey:date#values) [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) | [date](../SpecialInputElements.md#date) | [](https://wiki.openstreetmap.org/wiki/Tag:survey:date%3D) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### bench-backrest - - +### bench-backrest The question is **Does this bench have a backrest?** +- **Backrest: Yes** corresponds with + backrest=yes +- **Backrest: No** corresponds with + backrest=no - - - - - **Backrest: Yes** corresponds with backrest=yes - - **Backrest: No** corresponds with backrest=no - - - - -### bench-seats - - +### bench-seats The question is **How many seats does this bench have?** -This rendering asks information about the property [seats](https://wiki.openstreetmap.org/wiki/Key:seats) +This rendering asks information about the property [seats](https://wiki.openstreetmap.org/wiki/Key:seats) This is rendered with `{seats} seats` - - -### bench-material - - +### bench-material The question is **What is the bench (seating) made from?** -This rendering asks information about the property [material](https://wiki.openstreetmap.org/wiki/Key:material) +This rendering asks information about the property [material](https://wiki.openstreetmap.org/wiki/Key:material) This is rendered with `Material: {material}` +- **Material: wood** corresponds with + material=wood +- **Material: metal** corresponds with + material=metal +- **Material: stone** corresponds with + material=stone +- **Material: concrete** corresponds with + material=concrete +- **Material: plastic** corresponds with + material=plastic +- **Material: steel** corresponds with + material=steel - - - **Material: wood** corresponds with material=wood - - **Material: metal** corresponds with material=metal - - **Material: stone** corresponds with material=stone - - **Material: concrete** corresponds with material=concrete - - **Material: plastic** corresponds with material=plastic - - **Material: steel** corresponds with material=steel - - - - -### bench-direction - - +### bench-direction The question is **In which direction are you looking when sitting on the bench?** -This rendering asks information about the property [direction](https://wiki.openstreetmap.org/wiki/Key:direction) +This rendering asks information about the property [direction](https://wiki.openstreetmap.org/wiki/Key:direction) This is rendered with `When sitting on the bench, one looks towards {direction}°.` - - -### bench-colour - - +### bench-colour The question is **Which colour does this bench have?** -This rendering asks information about the property [colour](https://wiki.openstreetmap.org/wiki/Key:colour) +This rendering asks information about the property [colour](https://wiki.openstreetmap.org/wiki/Key:colour) This is rendered with `Colour: {colour}` +- **Colour: brown** corresponds with colour + =brown +- **Colour: green** corresponds with colour + =green +- **Colour: gray** corresponds with colour + =gray +- **Colour: white** corresponds with colour + =white +- **Colour: red** corresponds with colour + =red +- **Colour: black** corresponds with colour + =black +- **Colour: blue** corresponds with colour + =blue +- **Colour: yellow** corresponds with + colour=yellow - - - **Colour: brown** corresponds with colour=brown - - **Colour: green** corresponds with colour=green - - **Colour: gray** corresponds with colour=gray - - **Colour: white** corresponds with colour=white - - **Colour: red** corresponds with colour=red - - **Colour: black** corresponds with colour=black - - **Colour: blue** corresponds with colour=blue - - **Colour: yellow** corresponds with colour=yellow - - - - -### bench-survey:date - - +### bench-survey:date The question is **When was this bench last surveyed?** -This rendering asks information about the property [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) +This rendering asks information about the property [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) This is rendered with `This bench was last surveyed on {survey:date}` - - - - **Surveyed today!** corresponds with survey:date= - +- **Surveyed today!** corresponds with survey:date= This document is autogenerated from assets/layers/bench/bench.json \ No newline at end of file diff --git a/Docs/Layers/bench_at_pt.md b/Docs/Layers/bench_at_pt.md index 992ff9d47..979e1713b 100644 --- a/Docs/Layers/bench_at_pt.md +++ b/Docs/Layers/bench_at_pt.md @@ -1,6 +1,4 @@ - - - bench_at_pt +bench_at_pt ============= @@ -9,107 +7,71 @@ A layer showing all public-transport-stops which do have a bench - - - ## Table of contents 1. [bench_at_pt](#bench_at_pt) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [bench_at_pt-name](#bench_at_pt-name) + [bench_at_pt-bench_type](#bench_at_pt-bench_type) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [benches](https://mapcomplete.osm.be/benches) - - [personal](https://mapcomplete.osm.be/personal) - +- [benches](https://mapcomplete.osm.be/benches) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bench_at_pt/bench_at_pt.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- bench + =yes + |bench + =stand_up_bench - - - bench=yes|bench=stand_up_bench - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/bench#values) [bench](https://wiki.openstreetmap.org/wiki/Key:bench) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:bench%3Dyes) [stand_up_bench](https://wiki.openstreetmap.org/wiki/Tag:bench%3Dstand_up_bench) [no](https://wiki.openstreetmap.org/wiki/Tag:bench%3Dno) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### bench_at_pt-name - - +### bench_at_pt-name _This tagrendering has no question and is thus read-only_ -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `{name}` - - -### bench_at_pt-bench_type - - +### bench_at_pt-bench_type The question is **What kind of bench is this?** - - - - - - **There is a normal, sit-down bench here** corresponds with bench=yes - - **Stand up bench** corresponds with bench=stand_up_bench - - **There is no bench here** corresponds with bench=no - +- **There is a normal, sit-down bench here** corresponds + with bench + =yes +- **Stand up bench** corresponds with bench + =stand_up_bench +- **There is no bench here** corresponds with + bench=no This document is autogenerated from assets/layers/bench_at_pt/bench_at_pt.json \ No newline at end of file diff --git a/Docs/Layers/bicycle_library.md b/Docs/Layers/bicycle_library.md index f7483da48..7e7a1045a 100644 --- a/Docs/Layers/bicycle_library.md +++ b/Docs/Layers/bicycle_library.md @@ -1,6 +1,4 @@ - - - bicycle_library +bicycle_library ================= @@ -9,15 +7,13 @@ A facility where bicycles can be lent for longer period of times - - - ## Table of contents 1. [bicycle_library](#bicycle_library) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [bicycle_library-name](#bicycle_library-name) + [website](#website) @@ -28,188 +24,129 @@ A facility where bicycles can be lent for longer period of times + [bicycle-library-target-group](#bicycle-library-target-group) + [description](#description) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [bicyclelib](https://mapcomplete.osm.be/bicyclelib) - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [personal](https://mapcomplete.osm.be/personal) - +- [bicyclelib](https://mapcomplete.osm.be/bicyclelib) +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bicycle_library/bicycle_library.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =bicycle_library - - - amenity=bicycle_library - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:charge%3D) [€20warranty + €20/year](https://wiki.openstreetmap.org/wiki/Tag:charge%3D€20warranty + €20/year) [](https://taginfo.openstreetmap.org/keys/bicycle_library:for#values) [bicycle_library:for](https://wiki.openstreetmap.org/wiki/Key:bicycle_library:for) | Multiple choice | [child](https://wiki.openstreetmap.org/wiki/Tag:bicycle_library:for%3Dchild) [adult](https://wiki.openstreetmap.org/wiki/Tag:bicycle_library:for%3Dadult) [disabled](https://wiki.openstreetmap.org/wiki/Tag:bicycle_library:for%3Ddisabled) -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### bicycle_library-name - - +### bicycle_library-name The question is **What is the name of this bicycle library?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This bicycle library is called {name}` - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### phone - - +### phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` +- **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be + chosen as answer_ - - - **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be chosen as answer_ - - - - -### email - - +### email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` +- **{contact:email}** corresponds with contact:email~^..*$_This + option cannot be chosen as answer_ - - - **{contact:email}** corresponds with contact:email~^..*$_This option cannot be chosen as answer_ - - - - -### opening_hours - - +### opening_hours The question is **What are the opening hours of {name}?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` - - -### bicycle_library-charge - - +### bicycle_library-charge The question is **How much does lending a bicycle cost?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `Lending a bicycle costs {charge}` +- **Lending a bicycle is free** corresponds with + fee=no +- **Lending a bicycle costs €20/year and €20 warranty** corresponds + with fee + =yes + &charge + =€20warranty + + €20/year - - - **Lending a bicycle is free** corresponds with fee=no - - **Lending a bicycle costs €20/year and €20 warranty** corresponds with fee=yes&charge=€20warranty + €20/year - - - - -### bicycle-library-target-group - - +### bicycle-library-target-group The question is **Who can lend bicycles here?** +- **Bikes for children available** corresponds + with bicycle_library:for + =child +- **Bikes for adult available** corresponds + with bicycle_library:for + =adult +- **Bikes for disabled persons available** corresponds + with bicycle_library:for + =disabled +### description +The question is **Is there still something relevant you couldn't give in the previous questions? Add it +here.
Don't repeat already stated facts** - - - **Bikes for children available** corresponds with bicycle_library:for=child - - **Bikes for adult available** corresponds with bicycle_library:for=adult - - **Bikes for disabled persons available** corresponds with bicycle_library:for=disabled - - - - -### description - - - -The question is **Is there still something relevant you couldn't give in the previous questions? Add it here.
Don't repeat already stated facts** - -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) -This is rendered with `{description}` +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This is rendered with `{description}` This document is autogenerated from assets/layers/bicycle_library/bicycle_library.json \ No newline at end of file diff --git a/Docs/Layers/bicycle_tube_vending_machine.md b/Docs/Layers/bicycle_tube_vending_machine.md index 631d89b4e..2e36758b0 100644 --- a/Docs/Layers/bicycle_tube_vending_machine.md +++ b/Docs/Layers/bicycle_tube_vending_machine.md @@ -1,23 +1,21 @@ - - - bicycle_tube_vending_machine +bicycle_tube_vending_machine ============================== -A layer showing vending machines for bicycle tubes (either purpose-built bicycle tube vending machines or classical vending machines with bicycle tubes and optionally additional bicycle related objects such as lights, gloves, locks, ...) - - - +A layer showing vending machines for bicycle tubes (either purpose-built bicycle tube vending machines or classical +vending machines with bicycle tubes and optionally additional bicycle related objects such as lights, gloves, locks, +...) ## Table of contents 1. [bicycle_tube_vending_machine](#bicycle_tube_vending_machine) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Still in use?](#still-in-use) + [bicycle_tube_vending_machine-charge](#bicycle_tube_vending_machine-charge) @@ -26,168 +24,145 @@ A layer showing vending machines for bicycle tubes (either purpose-built bicycle + [bicycle_tube_vending_machine-operator](#bicycle_tube_vending_machine-operator) + [bicycle_tube_vending_maching-other-items](#bicycle_tube_vending_maching-other-items) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [personal](https://mapcomplete.osm.be/personal) - +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =vending_machine +- vending~^.*bicycle_tube.*$ - - - amenity=vending_machine - - vending~^.*bicycle_tube.*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/operational_status#values) [operational_status](https://wiki.openstreetmap.org/wiki/Key:operational_status) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:operational_status%3D) [broken](https://wiki.openstreetmap.org/wiki/Tag:operational_status%3Dbroken) [closed](https://wiki.openstreetmap.org/wiki/Tag:operational_status%3Dclosed) -[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/brand#values) [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | [Continental](https://wiki.openstreetmap.org/wiki/Tag:brand%3DContinental) [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:brand%3DSchwalbe) [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:operator%3DSchwalbe) [Continental](https://wiki.openstreetmap.org/wiki/Tag:operator%3DContinental) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### Still in use? - - +### Still in use? The question is **Is this vending machine still operational?** -This rendering asks information about the property [operational_status](https://wiki.openstreetmap.org/wiki/Key:operational_status) +This rendering asks information about the +property [operational_status](https://wiki.openstreetmap.org/wiki/Key:operational_status) This is rendered with `The operational status is {operational_status}` +- **This vending machine works** corresponds with +- **This vending machine is broken** corresponds + with operational_status + =broken +- **This vending machine is closed** corresponds + with operational_status + =closed - - - **This vending machine works** corresponds with - - **This vending machine is broken** corresponds with operational_status=broken - - **This vending machine is closed** corresponds with operational_status=closed - - - - -### bicycle_tube_vending_machine-charge - - +### bicycle_tube_vending_machine-charge The question is **How much does a bicycle tube cost?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `A bicycle tube costs {charge}` - - -### vending-machine-payment-methods - - +### vending-machine-payment-methods The question is **How can one pay at this tube vending machine?** +- **Payment with coins is possible** corresponds + with payment:coins + =yesUnselecting this answer + will add payment:coins + =no +- **Payment with notes is possible** corresponds + with payment:notes + =yesUnselecting this answer + will add payment:notes + =no +- **Payment with cards is possible** corresponds + with payment:cards + =yesUnselecting this answer + will add payment:cards + =no - - - - - **Payment with coins is possible** corresponds with payment:coins=yesUnselecting this answer will add payment:coins=no - - **Payment with notes is possible** corresponds with payment:notes=yesUnselecting this answer will add payment:notes=no - - **Payment with cards is possible** corresponds with payment:cards=yesUnselecting this answer will add payment:cards=no - - - - -### bicycle_tube_vending_machine-brand - - +### bicycle_tube_vending_machine-brand The question is **Which brand of tubes are sold here?** -This rendering asks information about the property [brand](https://wiki.openstreetmap.org/wiki/Key:brand) +This rendering asks information about the property [brand](https://wiki.openstreetmap.org/wiki/Key:brand) This is rendered with `{brand} tubes are sold here` +- **Continental tubes are sold here** corresponds + with brand + =Continental +- **Schwalbe tubes are sold here** corresponds + with brand + =Schwalbe - - - **Continental tubes are sold here** corresponds with brand=Continental - - **Schwalbe tubes are sold here** corresponds with brand=Schwalbe - - - - -### bicycle_tube_vending_machine-operator - - +### bicycle_tube_vending_machine-operator The question is **Who maintains this vending machine?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `This vending machine is maintained by {operator}` +- **Maintained by Schwalbe** corresponds + with operator + =Schwalbe +- **Maintained by Continental** corresponds + with operator + =Continental - - - **Maintained by Schwalbe** corresponds with operator=Schwalbe - - **Maintained by Continental** corresponds with operator=Continental - - - - -### bicycle_tube_vending_maching-other-items - - +### bicycle_tube_vending_maching-other-items The question is **Are other bicycle bicycle accessories sold here?** - - - - - - **Bicycle lights are sold here** corresponds with vending:bicycle_light=yesUnselecting this answer will add vending:bicycle_light=no - - **Gloves are sold here** corresponds with vending:gloves=yesUnselecting this answer will add vending:gloves=no - - **Bicycle repair kits are sold here** corresponds with vending:bicycle_repair_kit=yesUnselecting this answer will add vending:bicycle_repair_kit=no - - **Bicycle pumps are sold here** corresponds with vending:bicycle_pump=yesUnselecting this answer will add vending:bicycle_pump=no - - **Bicycle locks are sold here** corresponds with vending:bicycle_lock=yesUnselecting this answer will add vending:bicycle_lock=no - +- **Bicycle lights are sold here** corresponds + with vending:bicycle_light + =yesUnselecting this + answer will add vending: + bicycle_light=no +- **Gloves are sold here** corresponds + with vending:gloves + =yesUnselecting this answer + will add vending:gloves + =no +- **Bicycle repair kits are sold here** corresponds + with vending: + bicycle_repair_kit + =yesUnselecting + this answer will add + vending:bicycle_repair_kit + =no +- **Bicycle pumps are sold here** corresponds + with vending:bicycle_pump + =yesUnselecting this + answer will add vending: + bicycle_pump=no +- **Bicycle locks are sold here** corresponds + with vending:bicycle_lock + =yesUnselecting this + answer will add vending: + bicycle_lock=no This document is autogenerated from assets/layers/bicycle_tube_vending_machine/bicycle_tube_vending_machine.json \ No newline at end of file diff --git a/Docs/Layers/bike_cafe.md b/Docs/Layers/bike_cafe.md index e6cb34e94..c1c0c1da4 100644 --- a/Docs/Layers/bike_cafe.md +++ b/Docs/Layers/bike_cafe.md @@ -1,23 +1,20 @@ - - - bike_cafe +bike_cafe =========== -A bike café is a café geared towards cyclists, for example with services such as a pump, with lots of bicycle-related decoration, ... - - - +A bike café is a café geared towards cyclists, for example with services such as a pump, with lots of bicycle-related +decoration, ... ## Table of contents 1. [bike_cafe](#bike_cafe) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [bike_cafe-name](#bike_cafe-name) + [bike_cafe-bike-pump](#bike_cafe-bike-pump) @@ -28,176 +25,129 @@ A bike café is a café geared towards cyclists, for example with services such + [bike_cafe-email](#bike_cafe-email) + [bike_cafe-opening_hours](#bike_cafe-opening_hours) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [personal](https://mapcomplete.osm.be/personal) - +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bike_cafe/bike_cafe.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =pub + |amenity + =bar + |amenity + =cafe + |amenity + =restaurant +- pub + =cycling + |pub + =bicycle + |theme + =cycling + |theme + =bicycle|service:bicycle:.*~^..* + $ - - - amenity=pub|amenity=bar|amenity=cafe|amenity=restaurant - - pub=cycling|pub=bicycle|theme=cycling|theme=bicycle|service:bicycle:.*~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/service:bicycle:pump#values) [service:bicycle:pump](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:pump) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:pump%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:pump%3Dno) [](https://taginfo.openstreetmap.org/keys/service:bicycle:diy#values) [service:bicycle:diy](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:diy) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:diy%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:diy%3Dno) [](https://taginfo.openstreetmap.org/keys/service:bicycle:repair#values) [service:bicycle:repair](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:repair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Dno) -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### bike_cafe-name - - +### bike_cafe-name The question is **What is the name of this bike cafe?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This bike cafe is called {name}` - - -### bike_cafe-bike-pump - - +### bike_cafe-bike-pump The question is **Does this bike cafe offer a bike pump for use by anyone?** +- **This bike cafe offers a bike pump for anyone** corresponds + with service:bicycle:pump + =yes +- **This bike cafe doesn't offer a bike pump for anyone** corresponds + with service:bicycle:pump + =no - - - - - **This bike cafe offers a bike pump for anyone** corresponds with service:bicycle:pump=yes - - **This bike cafe doesn't offer a bike pump for anyone** corresponds with service:bicycle:pump=no - - - - -### bike_cafe-repair-tools - - +### bike_cafe-repair-tools The question is **Are there tools here to repair your own bike?** +- **This bike cafe offers tools for DIY repair** corresponds + with service:bicycle:diy + =yes +- **This bike cafe doesn't offer tools for DIY repair** corresponds + with service:bicycle:diy + =no - - - - - **This bike cafe offers tools for DIY repair** corresponds with service:bicycle:diy=yes - - **This bike cafe doesn't offer tools for DIY repair** corresponds with service:bicycle:diy=no - - - - -### bike_cafe-repair-service - - +### bike_cafe-repair-service The question is **Does this bike cafe repair bikes?** +- **This bike cafe repairs bikes** corresponds + with service:bicycle: + repair=yes +- **This bike cafe doesn't repair bikes** corresponds + with service:bicycle: + repair=no - - - - - **This bike cafe repairs bikes** corresponds with service:bicycle:repair=yes - - **This bike cafe doesn't repair bikes** corresponds with service:bicycle:repair=no - - - - -### bike_cafe-website - - +### bike_cafe-website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` - - -### bike_cafe-phone - - +### bike_cafe-phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` - - -### bike_cafe-email - - +### bike_cafe-email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` - - -### bike_cafe-opening_hours - - +### bike_cafe-opening_hours The question is **When it this bike café opened?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) -This is rendered with `{opening_hours_table(opening_hours)}` +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This is rendered with `{opening_hours_table(opening_hours)}` This document is autogenerated from assets/layers/bike_cafe/bike_cafe.json \ No newline at end of file diff --git a/Docs/Layers/bike_cleaning.md b/Docs/Layers/bike_cleaning.md index 942518b79..acdf4702c 100644 --- a/Docs/Layers/bike_cleaning.md +++ b/Docs/Layers/bike_cleaning.md @@ -1,6 +1,4 @@ - - - bike_cleaning +bike_cleaning =============== @@ -9,115 +7,93 @@ A layer showing facilities where one can clean their bike - - - ## Table of contents 1. [bike_cleaning](#bike_cleaning) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [bike_cleaning-service:bicycle:cleaning:charge](#bike_cleaning-servicebicycle:cleaning:charge) + [bike_cleaning-charge](#bike_cleaning-charge) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [personal](https://mapcomplete.osm.be/personal) - +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bike_cleaning/bike_cleaning.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- service:bicycle: + cleaning=yes + |service:bicycle: + cleaning=diy + |amenity + =bicycle_wash - - - service:bicycle:cleaning=yes|service:bicycle:cleaning=diy|amenity=bicycle_wash - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/service:bicycle:cleaning:charge#values) [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/service:bicycle:cleaning:charge#values) [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### bike_cleaning-service:bicycle:cleaning:charge - - +### bike_cleaning-service:bicycle:cleaning:charge The question is **How much does it cost to use the cleaning service?** -This rendering asks information about the property [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) +This rendering asks information about the +property [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) This is rendered with `Using the cleaning service costs {service:bicycle:cleaning:charge}` +- **The cleaning service is free to use** corresponds + with service:bicycle: + cleaning:fee + = + no&service:bicycle:cleaning:charge= +- **Free to use** corresponds + with service:bicycle: + cleaning:fee= + no_This option cannot be chosen as answer_ +- **The cleaning service has a fee, but the amount is not known** corresponds + with service:bicycle: + cleaning:fee= + yes - - - **The cleaning service is free to use** corresponds with service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= - - **Free to use** corresponds with service:bicycle:cleaning:fee=no_This option cannot be chosen as answer_ - - **The cleaning service has a fee, but the amount is not known** corresponds with service:bicycle:cleaning:fee=yes - - - - -### bike_cleaning-charge - - +### bike_cleaning-charge The question is **How much does it cost to use the cleaning service?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `Using the cleaning service costs {charge}` - - - - **Free to use cleaning service** corresponds with fee=no&charge= - - **Free to use** corresponds with fee=no_This option cannot be chosen as answer_ - - **The cleaning service has a fee** corresponds with fee=yes - +- **Free to use cleaning service** corresponds + with fee + =no&charge= +- **Free to use** corresponds with fee + =no_This option cannot be chosen as + answer_ +- **The cleaning service has a fee** corresponds + with fee + =yes This document is autogenerated from assets/layers/bike_cleaning/bike_cleaning.json \ No newline at end of file diff --git a/Docs/Layers/bike_parking.md b/Docs/Layers/bike_parking.md index c3b7bf2e1..040263ed7 100644 --- a/Docs/Layers/bike_parking.md +++ b/Docs/Layers/bike_parking.md @@ -1,6 +1,4 @@ - - - bike_parking +bike_parking ============== @@ -9,15 +7,13 @@ A layer showing where you can park your bike - - - ## Table of contents 1. [bike_parking](#bike_parking) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Bicycle parking type](#bicycle-parking-type) + [Underground?](#underground) @@ -27,186 +23,148 @@ A layer showing where you can park your bike + [Cargo bike spaces?](#cargo-bike-spaces) + [Cargo bike capacity?](#cargo-bike-capacity) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [personal](https://mapcomplete.osm.be/personal) - +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bike_parking/bike_parking.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =bicycle_parking - - - amenity=bicycle_parking - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/bicycle_parking#values) [bicycle_parking](https://wiki.openstreetmap.org/wiki/Key:bicycle_parking) | [string](../SpecialInputElements.md#string) | [stands](https://wiki.openstreetmap.org/wiki/Tag:bicycle_parking%3Dstands) [wall_loops](https://wiki.openstreetmap.org/wiki/Tag:bicycle_parking%3Dwall_loops) [handlebar_holder](https://wiki.openstreetmap.org/wiki/Tag:bicycle_parking%3Dhandlebar_holder) [rack](https://wiki.openstreetmap.org/wiki/Tag:bicycle_parking%3Drack) [two_tier](https://wiki.openstreetmap.org/wiki/Tag:bicycle_parking%3Dtwo_tier) [shed](https://wiki.openstreetmap.org/wiki/Tag:bicycle_parking%3Dshed) [bollard](https://wiki.openstreetmap.org/wiki/Tag:bicycle_parking%3Dbollard) [floor](https://wiki.openstreetmap.org/wiki/Tag:bicycle_parking%3Dfloor) [](https://taginfo.openstreetmap.org/keys/location#values) [location](https://wiki.openstreetmap.org/wiki/Key:location) | Multiple choice | [underground](https://wiki.openstreetmap.org/wiki/Tag:location%3Dunderground) [surface](https://wiki.openstreetmap.org/wiki/Tag:location%3Dsurface) [rooftop](https://wiki.openstreetmap.org/wiki/Tag:location%3Drooftop) [rooftop](https://wiki.openstreetmap.org/wiki/Tag:location%3Drooftop) [](https://taginfo.openstreetmap.org/keys/covered#values) [covered](https://wiki.openstreetmap.org/wiki/Key:covered) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:covered%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:covered%3Dno) -[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [nat](../SpecialInputElements.md#nat) | +[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [nat](../SpecialInputElements.md#nat) | [](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | [string](../SpecialInputElements.md#string) | [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) [private](https://wiki.openstreetmap.org/wiki/Tag:access%3Dprivate) [](https://taginfo.openstreetmap.org/keys/cargo_bike#values) [cargo_bike](https://wiki.openstreetmap.org/wiki/Key:cargo_bike) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:cargo_bike%3Dyes) [designated](https://wiki.openstreetmap.org/wiki/Tag:cargo_bike%3Ddesignated) [no](https://wiki.openstreetmap.org/wiki/Tag:cargo_bike%3Dno) -[](https://taginfo.openstreetmap.org/keys/capacity:cargo_bike#values) [capacity:cargo_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:cargo_bike) | [nat](../SpecialInputElements.md#nat) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/capacity:cargo_bike#values) [capacity:cargo_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:cargo_bike) | [nat](../SpecialInputElements.md#nat) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### Bicycle parking type - - +### Bicycle parking type The question is **What is the type of this bicycle parking?** -This rendering asks information about the property [bicycle_parking](https://wiki.openstreetmap.org/wiki/Key:bicycle_parking) +This rendering asks information about the +property [bicycle_parking](https://wiki.openstreetmap.org/wiki/Key:bicycle_parking) This is rendered with `This is a bicycle parking of the type: {bicycle_parking}` +- **Staple racks ** corresponds + with bicycle_parking + =stands +- **Wheel rack/loops ** corresponds + with bicycle_parking + =wall_loops +- **Handlebar holder ** corresponds + with bicycle_parking + = + handlebar_holder +- **Rack ** corresponds + with bicycle_parking + =rack +- **Two-tiered ** corresponds + with bicycle_parking + =two_tier +- **Shed ** corresponds + with bicycle_parking + =shed +- **Bollard ** corresponds + with bicycle_parking + =bollard +- **An area on the floor which is marked for bicycle parking** corresponds + with bicycle_parking + =floor - - - **Staple racks ** corresponds with bicycle_parking=stands - - **Wheel rack/loops ** corresponds with bicycle_parking=wall_loops - - **Handlebar holder ** corresponds with bicycle_parking=handlebar_holder - - **Rack ** corresponds with bicycle_parking=rack - - **Two-tiered ** corresponds with bicycle_parking=two_tier - - **Shed ** corresponds with bicycle_parking=shed - - **Bollard ** corresponds with bicycle_parking=bollard - - **An area on the floor which is marked for bicycle parking** corresponds with bicycle_parking=floor - - - - -### Underground? - - +### Underground? The question is **What is the relative location of this bicycle parking?** +- **Underground parking** corresponds with + location=underground +- **Surface level parking** corresponds with + location=surface +- **Rooftop parking** corresponds with + location=rooftop +- **Surface level parking** corresponds with _This option cannot be chosen as answer_ +- **Rooftop parking** corresponds with + location=rooftop - - - - - **Underground parking** corresponds with location=underground - - **Surface level parking** corresponds with location=surface - - **Rooftop parking** corresponds with location=rooftop - - **Surface level parking** corresponds with _This option cannot be chosen as answer_ - - **Rooftop parking** corresponds with location=rooftop - - - - -### Is covered? - - +### Is covered? The question is **Is this parking covered? Also select "covered" for indoor parkings.** +- **This parking is covered (it has a roof)** corresponds + with covered + =yes +- **This parking is not covered** corresponds + with covered + =no - - - - - **This parking is covered (it has a roof)** corresponds with covered=yes - - **This parking is not covered** corresponds with covered=no - - - - -### Capacity - - +### Capacity The question is **How many bicycles fit in this bicycle parking (including possible cargo bicycles)?** -This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) +This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) This is rendered with `Place for {capacity} bikes` - - -### Access - - +### Access The question is **Who can use this bicycle parking?** -This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) +This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) This is rendered with `{access}` +- **Publicly accessible** corresponds with + access=yes +- **Access is primarily for visitors to a business** corresponds + with access + =customers +- **Access is limited to members of a school, company or organisation** corresponds + with access + =private - - - **Publicly accessible** corresponds with access=yes - - **Access is primarily for visitors to a business** corresponds with access=customers - - **Access is limited to members of a school, company or organisation** corresponds with access=private - - - - -### Cargo bike spaces? - - +### Cargo bike spaces? The question is **Does this bicycle parking have spots for cargo bikes?** +- **This parking has room for cargo bikes** corresponds + with cargo_bike + =yes +- **This parking has designated (official) spots for cargo bikes.** corresponds + with cargo_bike + =designated +- **You're not allowed to park cargo bikes** corresponds + with cargo_bike + =no - - - - - **This parking has room for cargo bikes** corresponds with cargo_bike=yes - - **This parking has designated (official) spots for cargo bikes.** corresponds with cargo_bike=designated - - **You're not allowed to park cargo bikes** corresponds with cargo_bike=no - - - - -### Cargo bike capacity? - - +### Cargo bike capacity? The question is **How many cargo bicycles fit in this bicycle parking?** -This rendering asks information about the property [capacity:cargo_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:cargo_bike) -This is rendered with `This parking fits {capacity:cargo_bike} cargo bikes` +This rendering asks information about the +property [capacity:cargo_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:cargo_bike) +This is rendered with `This parking fits {capacity:cargo_bike} cargo bikes` This document is autogenerated from assets/layers/bike_parking/bike_parking.json \ No newline at end of file diff --git a/Docs/Layers/bike_repair_station.md b/Docs/Layers/bike_repair_station.md index 873511b53..245639590 100644 --- a/Docs/Layers/bike_repair_station.md +++ b/Docs/Layers/bike_repair_station.md @@ -1,6 +1,4 @@ - - - bike_repair_station +bike_repair_station ===================== @@ -9,15 +7,13 @@ A layer showing bicycle pumps and bicycle repair tool stands - - - ## Table of contents 1. [bike_repair_station](#bike_repair_station) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [bike_repair_station-available-services](#bike_repair_station-available-services) + [bike_repair_station-operator](#bike_repair_station-operator) @@ -33,58 +29,39 @@ A layer showing bicycle pumps and bicycle repair tool stands + [bike_repair_station-manometer](#bike_repair_station-manometer) + [level](#level) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [personal](https://mapcomplete.osm.be/personal) - +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bike_repair_station/bike_repair_station.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + = + bicycle_repair_station - - - amenity=bicycle_repair_station - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/service:bicycle:tools#values) [service:bicycle:tools](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:tools) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:tools%3Dno) [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:tools%3Dyes) [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:tools%3Dyes) [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [De Fietsambassade Gent](https://wiki.openstreetmap.org/wiki/Tag:operator%3DDe Fietsambassade Gent) -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) [](https://taginfo.openstreetmap.org/keys/service:bicycle:chain_tool#values) [service:bicycle:chain_tool](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:chain_tool) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:chain_tool%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:chain_tool%3Dno) [](https://taginfo.openstreetmap.org/keys/service:bicycle:stand#values) [service:bicycle:stand](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:stand) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:stand%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:stand%3Dno) @@ -94,215 +71,160 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/manometer#values) [manometer](https://wiki.openstreetmap.org/wiki/Key:manometer) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:manometer%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:manometer%3Dno) [broken](https://wiki.openstreetmap.org/wiki/Tag:manometer%3Dbroken) [](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### bike_repair_station-available-services - - +### bike_repair_station-available-services The question is **Which services are available at this bike station?** +- **There is only a pump present** corresponds + with service:bicycle:tools + =no + &service:bicycle:pump + =yes +- **There are only tools (screwdrivers, pliers...) present** corresponds + with service:bicycle:tools + =yes + &service:bicycle:pump + =no +- **There are both tools and a pump present** corresponds + with service:bicycle:tools + =yes + &service:bicycle:pump + =yes - - - - - **There is only a pump present** corresponds with service:bicycle:tools=no&service:bicycle:pump=yes - - **There are only tools (screwdrivers, pliers...) present** corresponds with service:bicycle:tools=yes&service:bicycle:pump=no - - **There are both tools and a pump present** corresponds with service:bicycle:tools=yes&service:bicycle:pump=yes - - - - -### bike_repair_station-operator - - +### bike_repair_station-operator The question is **Who maintains this cycle pump?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Maintained by {operator}` +- **De Fietsambassade Gent** corresponds + with operator + =De Fietsambassade + Gent - - - **De Fietsambassade Gent** corresponds with operator=De Fietsambassade Gent - - - - -### bike_repair_station-email - - +### bike_repair_station-email The question is **What is the email address of the maintainer?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` - - -### bike_repair_station-phone - - +### bike_repair_station-phone The question is **What is the phone number of the maintainer?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` - - -### bike_repair_station-opening_hours - - +### bike_repair_station-opening_hours The question is **When is this bicycle repair point open?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `{opening_hours_table()}` +- **Always open** corresponds with + opening_hours=24/7 +- **Always open** corresponds with _This option cannot be chosen as answer_ - - - **Always open** corresponds with opening_hours=24/7 - - **Always open** corresponds with _This option cannot be chosen as answer_ - - - - -### bike_repair_station-bike-chain-tool - - +### bike_repair_station-bike-chain-tool The question is **Does this bike repair station have a special tool to repair your bike chain?** +- **There is a chain tool** corresponds + with service:bicycle: + chain_tool= + yes +- **There is no chain tool** corresponds + with service:bicycle: + chain_tool= + no - - - - - **There is a chain tool** corresponds with service:bicycle:chain_tool=yes - - **There is no chain tool** corresponds with service:bicycle:chain_tool=no - - - - -### bike_repair_station-bike-stand - - +### bike_repair_station-bike-stand The question is **Does this bike station have a hook to hang your bike on or a stand to raise it?** +- **There is a hook or stand** corresponds + with service:bicycle:stand + =yes +- **There is no hook or stand** corresponds + with service:bicycle:stand + =no - - - - - **There is a hook or stand** corresponds with service:bicycle:stand=yes - - **There is no hook or stand** corresponds with service:bicycle:stand=no - - - - -### Operational status - - +### Operational status The question is **Is the bike pump still operational?** +- **The bike pump is broken** corresponds + with + service:bicycle:pump:operational_status + = + broken +- **The bike pump is operational** corresponds with - - - - - **The bike pump is broken** corresponds with service:bicycle:pump:operational_status=broken - - **The bike pump is operational** corresponds with - - - - -### Email maintainer - - +### Email maintainer _This tagrendering has no question and is thus read-only_ - - - - -### bike_repair_station-valves - - +### bike_repair_station-valves The question is **What valves are supported?** -This rendering asks information about the property [valves](https://wiki.openstreetmap.org/wiki/Key:valves) +This rendering asks information about the property [valves](https://wiki.openstreetmap.org/wiki/Key:valves) This is rendered with `This pump supports the following valves: {valves}` +- **Sclaverand (also known as Presta)** corresponds + with valves + =sclaverand +- **Dunlop** corresponds with valves + =dunlop +- **Schrader (cars)** corresponds with + valves=schrader - - - **Sclaverand (also known as Presta)** corresponds with valves=sclaverand - - **Dunlop** corresponds with valves=dunlop - - **Schrader (cars)** corresponds with valves=schrader - - - - -### bike_repair_station-electrical_pump - - +### bike_repair_station-electrical_pump The question is **Is this an electric bike pump?** +- **Manual pump** corresponds with manual + =yes +- **Electrical pump** corresponds with + manual=no - - - - - **Manual pump** corresponds with manual=yes - - **Electrical pump** corresponds with manual=no - - - - -### bike_repair_station-manometer - - +### bike_repair_station-manometer The question is **Does the pump have a pressure indicator or manometer?** +- **There is a manometer** corresponds with + manometer=yes +- **There is no manometer** corresponds + with manometer + =no +- **There is manometer but it is broken** corresponds + with manometer + =broken - - - - - **There is a manometer** corresponds with manometer=yes - - **There is no manometer** corresponds with manometer=no - - **There is manometer but it is broken** corresponds with manometer=broken - - - - -### level - - +### level The question is **On what level is this feature located?** -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) This is rendered with `Located on the {level}th floor` - - - - **Located underground** corresponds with location=underground_This option cannot be chosen as answer_ - - **Located on the ground floor** corresponds with level=0 - - **Located on the ground floor** corresponds with _This option cannot be chosen as answer_ - - **Located on the first floor** corresponds with level=1 - +- **Located underground** corresponds with + location=underground_ + This option cannot be chosen as answer_ +- **Located on the ground floor** corresponds + with level + =0 +- **Located on the ground floor** corresponds with _This option cannot be chosen as answer_ +- **Located on the first floor** corresponds + with level + =1 This document is autogenerated from assets/layers/bike_repair_station/bike_repair_station.json \ No newline at end of file diff --git a/Docs/Layers/bike_shop.md b/Docs/Layers/bike_shop.md index 0854a4dc2..87f7a4e08 100644 --- a/Docs/Layers/bike_shop.md +++ b/Docs/Layers/bike_shop.md @@ -1,6 +1,4 @@ - - - bike_shop +bike_shop =========== @@ -9,15 +7,13 @@ A shop specifically selling bicycles or related items - - - ## Table of contents 1. [bike_shop](#bike_shop) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [bike_shop-is-bicycle_shop](#bike_shop-is-bicycle_shop) + [bike_shop-name](#bike_shop-name) @@ -36,61 +32,49 @@ A shop specifically selling bicycles or related items + [bike_repair_bike-wash](#bike_repair_bike-wash) + [bike_cleaning-service:bicycle:cleaning:charge](#bike_cleaning-servicebicycle:cleaning:charge) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [personal](https://mapcomplete.osm.be/personal) - +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bike_shop/bike_shop.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- shop + =bicycle + |amenity + =bicycle_rental + |shop + =sports&service:bicycle:retail!~ + ^no$&service:bicycle:repair!~^no$&sport + =bicycle + |sport + =cycling| - - - shop=bicycle|amenity=bicycle_rental|shop=sports&service:bicycle:retail!~^no$&service:bicycle:repair!~^no$&sport=bicycle|sport=cycling| - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/service:bicycle:retail#values) [service:bicycle:retail](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:retail) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:retail%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:retail%3Dno) [](https://taginfo.openstreetmap.org/keys/service:bicycle:repair#values) [service:bicycle:repair](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:repair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Dno) [only_sold](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Donly_sold) [brand](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Dbrand) [](https://taginfo.openstreetmap.org/keys/service:bicycle:rental#values) [service:bicycle:rental](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:rental) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:rental%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:rental%3Dno) @@ -98,240 +82,186 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/service:bicycle:pump#values) [service:bicycle:pump](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:pump) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:pump%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:pump%3Dno) [separate](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:pump%3Dseparate) [](https://taginfo.openstreetmap.org/keys/service:bicycle:diy#values) [service:bicycle:diy](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:diy) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:diy%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:diy%3Dno) [only_sold](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:diy%3Donly_sold) [](https://taginfo.openstreetmap.org/keys/service:bicycle:cleaning#values) [service:bicycle:cleaning](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:cleaning%3Dyes) [diy](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:cleaning%3Ddiy) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:cleaning%3Dno) -[](https://taginfo.openstreetmap.org/keys/service:bicycle:cleaning:charge#values) [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) | [string](../SpecialInputElements.md#string) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/service:bicycle:cleaning:charge#values) [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) | [string](../SpecialInputElements.md#string) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### bike_shop-is-bicycle_shop - - +### bike_shop-is-bicycle_shop _This tagrendering has no question and is thus read-only_ - - - - -### bike_shop-name - - +### bike_shop-name The question is **What is the name of this bicycle shop?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This bicycle shop is called {name}` - - -### bike_shop-website - - +### bike_shop-website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` - - -### bike_shop-phone - - +### bike_shop-phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` - - -### bike_shop-email - - +### bike_shop-email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` - - -### bike_shop-opening_hours - - +### bike_shop-opening_hours The question is **When is this shop opened?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `{opening_hours_table(opening_hours)}` +### description +The question is **Is there still something relevant you couldn't give in the previous questions? Add it +here.
Don't repeat already stated facts** -### description - - - -The question is **Is there still something relevant you couldn't give in the previous questions? Add it here.
Don't repeat already stated facts** - -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) This is rendered with `{description}` - - -### bike_shop-access - - +### bike_shop-access _This tagrendering has no question and is thus read-only_ -This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) +This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) This is rendered with `Enkel voor {access}` - - -### bike_repair_sells-bikes - - +### bike_repair_sells-bikes The question is **Does this shop sell bikes?** +- **This shop sells bikes** corresponds + with service:bicycle: + retail=yes +- **This shop doesn't sell bikes** corresponds + with service:bicycle: + retail=no - - - - - **This shop sells bikes** corresponds with service:bicycle:retail=yes - - **This shop doesn't sell bikes** corresponds with service:bicycle:retail=no - - - - -### bike_repair_repairs-bikes - - +### bike_repair_repairs-bikes The question is **Does this shop repair bikes?** +- **This shop repairs bikes** corresponds + with service:bicycle: + repair=yes +- **This shop doesn't repair bikes** corresponds + with service:bicycle: + repair=no +- **This shop only repairs bikes bought here** corresponds + with service:bicycle: + repair= + only_sold +- **This shop only repairs bikes of a certain brand** corresponds + with service:bicycle: + repair=brand - - - - - **This shop repairs bikes** corresponds with service:bicycle:repair=yes - - **This shop doesn't repair bikes** corresponds with service:bicycle:repair=no - - **This shop only repairs bikes bought here** corresponds with service:bicycle:repair=only_sold - - **This shop only repairs bikes of a certain brand** corresponds with service:bicycle:repair=brand - - - - -### bike_repair_rents-bikes - - +### bike_repair_rents-bikes The question is **Does this shop rent out bikes?** +- **This shop rents out bikes** corresponds + with service:bicycle: + rental=yes +- **This shop doesn't rent out bikes** corresponds + with service:bicycle: + rental=no - - - - - **This shop rents out bikes** corresponds with service:bicycle:rental=yes - - **This shop doesn't rent out bikes** corresponds with service:bicycle:rental=no - - - - -### bike_repair_second-hand-bikes - - +### bike_repair_second-hand-bikes The question is **Does this shop sell second-hand bikes?** +- **This shop sells second-hand bikes** corresponds + with service:bicycle: + second_hand= + yes +- **This shop doesn't sell second-hand bikes** corresponds + with service:bicycle: + second_hand= + no +- **This shop only sells second-hand bikes** corresponds + with service:bicycle: + second_hand= + only - - - - - **This shop sells second-hand bikes** corresponds with service:bicycle:second_hand=yes - - **This shop doesn't sell second-hand bikes** corresponds with service:bicycle:second_hand=no - - **This shop only sells second-hand bikes** corresponds with service:bicycle:second_hand=only - - - - -### bike_repair_bike-pump-service - - +### bike_repair_bike-pump-service The question is **Does this shop offer a bike pump for use by anyone?** +- **This shop offers a bike pump for anyone** corresponds + with service:bicycle:pump + =yes +- **This shop doesn't offer a bike pump for anyone** corresponds + with service:bicycle:pump + =no +- **There is bicycle pump, it is shown as a separate point ** corresponds + with service:bicycle:pump + =separate - - - - - **This shop offers a bike pump for anyone** corresponds with service:bicycle:pump=yes - - **This shop doesn't offer a bike pump for anyone** corresponds with service:bicycle:pump=no - - **There is bicycle pump, it is shown as a separate point ** corresponds with service:bicycle:pump=separate - - - - -### bike_repair_tools-service - - +### bike_repair_tools-service The question is **Are there tools here to repair your own bike?** +- **This shop offers tools for DIY repair** corresponds + with service:bicycle:diy + =yes +- **This shop doesn't offer tools for DIY repair** corresponds + with service:bicycle:diy + =no +- **Tools for DIY repair are only available if you bought/hire the bike in the shop** corresponds + with service:bicycle:diy + =only_sold - - - - - **This shop offers tools for DIY repair** corresponds with service:bicycle:diy=yes - - **This shop doesn't offer tools for DIY repair** corresponds with service:bicycle:diy=no - - **Tools for DIY repair are only available if you bought/hire the bike in the shop** corresponds with service:bicycle:diy=only_sold - - - - -### bike_repair_bike-wash - - +### bike_repair_bike-wash The question is **Are bicycles washed here?** +- **This shop cleans bicycles** corresponds + with service:bicycle: + cleaning=yes +- **This shop has an installation where one can clean bicycles themselves** corresponds + with service:bicycle: + cleaning=diy +- **This shop doesn't offer bicycle cleaning** corresponds + with service:bicycle: + cleaning=no - - - - - **This shop cleans bicycles** corresponds with service:bicycle:cleaning=yes - - **This shop has an installation where one can clean bicycles themselves** corresponds with service:bicycle:cleaning=diy - - **This shop doesn't offer bicycle cleaning** corresponds with service:bicycle:cleaning=no - - - - -### bike_cleaning-service:bicycle:cleaning:charge - - +### bike_cleaning-service:bicycle:cleaning:charge The question is **How much does it cost to use the cleaning service?** -This rendering asks information about the property [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) +This rendering asks information about the +property [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) This is rendered with `Using the cleaning service costs {service:bicycle:cleaning:charge}` - - - - **The cleaning service is free to use** corresponds with service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= - - **Free to use** corresponds with service:bicycle:cleaning:fee=no_This option cannot be chosen as answer_ - - **The cleaning service has a fee, but the amount is not known** corresponds with service:bicycle:cleaning:fee=yes - +- **The cleaning service is free to use** corresponds + with service:bicycle: + cleaning:fee + = + no&service:bicycle:cleaning:charge= +- **Free to use** corresponds + with service:bicycle: + cleaning:fee= + no_This option cannot be chosen as answer_ +- **The cleaning service has a fee, but the amount is not known** corresponds + with service:bicycle: + cleaning:fee= + yes This document is autogenerated from assets/layers/bike_shop/bike_shop.json \ No newline at end of file diff --git a/Docs/Layers/bike_themed_object.md b/Docs/Layers/bike_themed_object.md index 528194727..0c10faefa 100644 --- a/Docs/Layers/bike_themed_object.md +++ b/Docs/Layers/bike_themed_object.md @@ -1,6 +1,4 @@ - - - bike_themed_object +bike_themed_object ==================== @@ -9,15 +7,13 @@ A layer with bike-themed objects but who don't match any other layer - - - ## Table of contents 1. [bike_themed_object](#bike_themed_object) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [description](#description) + [website](#website) @@ -25,139 +21,104 @@ A layer with bike-themed objects but who don't match any other layer + [phone](#phone) + [opening_hours](#opening_hours) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [personal](https://mapcomplete.osm.be/personal) - +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/bike_themed_object/bike_themed_object.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- theme + =bicycle + |theme + =cycling + |sport + =cycling + |association + =cycling + |association + =bicycle + |ngo + =cycling + |ngo + =bicycle + |club + =bicycle + |club + =cycling - - - theme=bicycle|theme=cycling|sport=cycling|association=cycling|association=bicycle|ngo=cycling|ngo=bicycle|club=bicycle|club=cycling - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +### images _This tagrendering has no question and is thus read-only_ +### description +The question is **Is there still something relevant you couldn't give in the previous questions? Add it +here.
Don't repeat already stated facts** - - -### description - - - -The question is **Is there still something relevant you couldn't give in the previous questions? Add it here.
Don't repeat already stated facts** - -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) This is rendered with `{description}` - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### email - - +### email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` +- **{contact:email}** corresponds with contact:email~^..*$_This + option cannot be chosen as answer_ - - - **{contact:email}** corresponds with contact:email~^..*$_This option cannot be chosen as answer_ - - - - -### phone - - +### phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` +- **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be + chosen as answer_ - - - **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be chosen as answer_ - - - - -### opening_hours - - +### opening_hours The question is **What are the opening hours of {name}?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) -This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` This document is autogenerated from assets/layers/bike_themed_object/bike_themed_object.json \ No newline at end of file diff --git a/Docs/Layers/binocular.md b/Docs/Layers/binocular.md index 3c1ff6ae1..ff88c682c 100644 --- a/Docs/Layers/binocular.md +++ b/Docs/Layers/binocular.md @@ -1,6 +1,4 @@ - - - binocular +binocular =========== @@ -9,106 +7,67 @@ Binoculas - - - ## Table of contents 1. [binocular](#binocular) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [binocular-charge](#binocular-charge) + [binocular-direction](#binocular-direction) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [binoculars](https://mapcomplete.osm.be/binoculars) - - [personal](https://mapcomplete.osm.be/personal) - +- [binoculars](https://mapcomplete.osm.be/binoculars) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/binocular/binocular.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =binoculars - - - amenity=binoculars - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:charge%3D) -[](https://taginfo.openstreetmap.org/keys/direction#values) [direction](https://wiki.openstreetmap.org/wiki/Key:direction) | [direction](../SpecialInputElements.md#direction) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/direction#values) [direction](https://wiki.openstreetmap.org/wiki/Key:direction) | [direction](../SpecialInputElements.md#direction) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### binocular-charge - - +### binocular-charge The question is **How much does one have to pay to use these binoculars?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `Using these binoculars costs {charge}` +- **Free to use** corresponds with fee + =no - - - **Free to use** corresponds with fee=no - - - - -### binocular-direction - - +### binocular-direction The question is **When looking through this binocular, in what direction does one look?** -This rendering asks information about the property [direction](https://wiki.openstreetmap.org/wiki/Key:direction) -This is rendered with `Looks towards {direction}°` +This rendering asks information about the property [direction](https://wiki.openstreetmap.org/wiki/Key:direction) +This is rendered with `Looks towards {direction}°` This document is autogenerated from assets/layers/binocular/binocular.json \ No newline at end of file diff --git a/Docs/Layers/birdhide.md b/Docs/Layers/birdhide.md index 4c5fd7d06..e0bf91153 100644 --- a/Docs/Layers/birdhide.md +++ b/Docs/Layers/birdhide.md @@ -1,6 +1,4 @@ - - - birdhide +birdhide ========== @@ -9,134 +7,108 @@ Een vogelkijkhut - - - ## Table of contents 1. [birdhide](#birdhide) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [bird-hide-shelter-or-wall](#bird-hide-shelter-or-wall) + [bird-hide-wheelchair](#bird-hide-wheelchair) + [birdhide-operator](#birdhide-operator) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [nature](https://mapcomplete.osm.be/nature) - - [personal](https://mapcomplete.osm.be/personal) - +- [nature](https://mapcomplete.osm.be/nature) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/birdhide/birdhide.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =bird_hide - - - leisure=bird_hide - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/building#values) [building](https://wiki.openstreetmap.org/wiki/Key:building) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:building%3D) [yes](https://wiki.openstreetmap.org/wiki/Tag:building%3Dyes) [tower](https://wiki.openstreetmap.org/wiki/Tag:building%3Dtower) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Natuurpunt](https://wiki.openstreetmap.org/wiki/Tag:operator%3DNatuurpunt) [Agentschap Natuur en Bos](https://wiki.openstreetmap.org/wiki/Tag:operator%3DAgentschap Natuur en Bos) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### bird-hide-shelter-or-wall - - +### bird-hide-shelter-or-wall The question is **Is dit een kijkwand of kijkhut?** +- **Vogelkijkwand** corresponds with + shelter=no +- **Vogelkijkhut** corresponds with + amenity=shelter + &building + =yes + &shelter + =yes +- **Vogelkijktoren** corresponds with + building=tower + &bird_hide + =tower +- **Vogelkijkhut** corresponds with + amenity=shelter + |building + =yes + |shelter + =yes_This option cannot be chosen + as answer_ - - - - - **Vogelkijkwand** corresponds with shelter=no - - **Vogelkijkhut** corresponds with amenity=shelter&building=yes&shelter=yes - - **Vogelkijktoren** corresponds with building=tower&bird_hide=tower - - **Vogelkijkhut** corresponds with amenity=shelter|building=yes|shelter=yes_This option cannot be chosen as answer_ - - - - -### bird-hide-wheelchair - - +### bird-hide-wheelchair The question is **Is deze vogelkijkplaats rolstoeltoegankelijk?** +- **Er zijn speciale voorzieningen voor rolstoelen** corresponds + with wheelchair + =designated +- **Een rolstoel raakt er vlot** corresponds + with wheelchair + =yes +- **Je kan er raken met een rolstoel, maar het is niet makkelijk** corresponds + with wheelchair + =limited +- **Niet rolstoeltoegankelijk** corresponds + with wheelchair + =no - - - - - **Er zijn speciale voorzieningen voor rolstoelen** corresponds with wheelchair=designated - - **Een rolstoel raakt er vlot** corresponds with wheelchair=yes - - **Je kan er raken met een rolstoel, maar het is niet makkelijk** corresponds with wheelchair=limited - - **Niet rolstoeltoegankelijk** corresponds with wheelchair=no - - - - -### birdhide-operator - - +### birdhide-operator The question is **Wie beheert deze vogelkijkplaats?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Beheer door {operator}` - - - - **Beheer door Natuurpunt** corresponds with operator=Natuurpunt - - **Beheer door het Agentschap Natuur en Bos ** corresponds with operator=Agentschap Natuur en Bos - +- **Beheer door Natuurpunt** corresponds + with operator + =Natuurpunt +- **Beheer door het Agentschap Natuur en Bos ** corresponds + with operator + =Agentschap + Natuur en Bos This document is autogenerated from assets/layers/birdhide/birdhide.json \ No newline at end of file diff --git a/Docs/Layers/brugge.md b/Docs/Layers/brugge.md index b1b51ad05..fdddb6acd 100644 --- a/Docs/Layers/brugge.md +++ b/Docs/Layers/brugge.md @@ -1,20 +1,12 @@ - - - brugge +brugge ======== - - - - - - - ## Table of contents 1. [brugge](#brugge) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [status](#status) + [has closeby](#has-closeby) + [openbaar](#openbaar) @@ -22,104 +14,60 @@ + [oh](#oh) - - - - - This layer is loaded from an external source, namely `https://raw.githubusercontent.com/pietervdvn/pietervdvn.github.io/master/aeds_brugge.json` - - This layer will automatically load [defibrillator](./defibrillator.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _closest_osm_aed) - +- This layer is loaded from an external source, namely `https://raw.githubusercontent.com/pietervdvn/pietervdvn.github.io/master/aeds_brugge.json` +- This layer will automatically load [defibrillator](./defibrillator.md) into the layout as it depends on it: A + calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _closest_osm_aed) [Go to the source code](../assets/layers/brugge/brugge.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- Brugs volgnummer~^..*$ - - - Brugs volgnummer~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/status#values) [status](https://wiki.openstreetmap.org/wiki/Key:status) | Multiple choice | [oud](https://wiki.openstreetmap.org/wiki/Tag:status%3Doud) -[](https://taginfo.openstreetmap.org/keys/Lokaal AED#values) [Lokaal AED](https://wiki.openstreetmap.org/wiki/Key:Lokaal AED) | Multiple choice | - - - - -### status - +[](https://taginfo.openstreetmap.org/keys/Lokaal AED#values) [Lokaal AED](https://wiki.openstreetmap.org/wiki/Key:Lokaal AED) | Multiple choice | +### status _This tagrendering has no question and is thus read-only_ +- **
Dit datapunt is verouderd
** corresponds + with status + =oud - - - - - **
Dit datapunt is verouderd
** corresponds with status=oud - - - - -### has closeby - - +### has closeby _This tagrendering has no question and is thus read-only_ - - - - -### openbaar - - +### openbaar _This tagrendering has no question and is thus read-only_ +- **Bevindt zich in een openbaar gebouw: {Openbare AED Gebouw} in lokaal {Lokaal AED}** corresponds with + Lokaal AED~^..*$ - - - - - **Bevindt zich in een openbaar gebouw: {Openbare AED Gebouw} in lokaal {Lokaal AED}** corresponds with Lokaal AED~^..*$ - - - - -### addr - - +### addr _This tagrendering has no question and is thus read-only_ - - - - -### oh - - +### oh _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/brugge/brugge.json \ No newline at end of file diff --git a/Docs/Layers/cafe_pub.md b/Docs/Layers/cafe_pub.md index 2ca9c8c42..e3c68e09a 100644 --- a/Docs/Layers/cafe_pub.md +++ b/Docs/Layers/cafe_pub.md @@ -1,6 +1,4 @@ - - - cafe_pub +cafe_pub ========== @@ -9,15 +7,13 @@ A layer showing cafés and pubs where one can gather around a drink. The layer asks for some relevant questions - - - ## Table of contents 1. [cafe_pub](#cafe_pub) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Name](#name) + [Classification](#classification) @@ -30,232 +26,185 @@ A layer showing cafés and pubs where one can gather around a drink. The layer a + [service:electricity](#serviceelectricity) + [dog-access](#dog-access) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cafes_and_pubs](https://mapcomplete.osm.be/cafes_and_pubs) - - [personal](https://mapcomplete.osm.be/personal) - +- [cafes_and_pubs](https://mapcomplete.osm.be/cafes_and_pubs) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/cafe_pub/cafe_pub.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =bar + |amenity + =pub + |amenity + =cafe + |amenity + =biergarten - - - amenity=bar|amenity=pub|amenity=cafe|amenity=biergarten - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [pub](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dpub) [bar](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dbar) [cafe](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dcafe) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) [biergarten](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dbiergarten) -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/service:electricity#values) [service:electricity](https://wiki.openstreetmap.org/wiki/Key:service:electricity) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dlimited) [ask](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dask) [no](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dno) [](https://taginfo.openstreetmap.org/keys/dog#values) [dog](https://wiki.openstreetmap.org/wiki/Key:dog) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dno) [leashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dleashed) [unleashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dunleashed) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### Name - - +### Name The question is **What is the name of this pub?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This pub is named {name}` - - -### Classification - - +### Classification The question is **What kind of cafe is this** +- **Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig + met veel houtwerk ** corresponds with + amenity=pub +- **Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en + commercieel, soms met lichtinstallatie en feestmuziek** corresponds + with amenity + =bar +- **Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te + nuttigen.** corresponds with amenity + =cafe +- **Dit is een restaurant waar men een maaltijd geserveerd krijgt** corresponds + with amenity + =restaurant +- **Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland** corresponds + with amenity + =biergarten - - - - - **Dit is een bruin café of een kroeg waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk ** corresponds with amenity=pub - - **Dit is een bar waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek** corresponds with amenity=bar - - **Dit is een cafe - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen.** corresponds with amenity=cafe - - **Dit is een restaurant waar men een maaltijd geserveerd krijgt** corresponds with amenity=restaurant - - **Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland** corresponds with amenity=biergarten - - - - -### opening_hours - - +### opening_hours The question is **What are the opening hours of {name}?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### email - - +### email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` +- **{contact:email}** corresponds with contact:email~^..*$_This + option cannot be chosen as answer_ - - - **{contact:email}** corresponds with contact:email~^..*$_This option cannot be chosen as answer_ - - - - -### phone - - +### phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` +- **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be + chosen as answer_ - - - **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be chosen as answer_ - - - - -### payment-options - - +### payment-options The question is **Which methods of payment are accepted here?** +- **Cash is accepted here** corresponds + with payment:cash + =yesUnselecting this answer + will add payment:cash + =no +- **Payment cards are accepted here** corresponds + with payment:cards + =yesUnselecting this answer + will add payment:cards + =no - - - - - **Cash is accepted here** corresponds with payment:cash=yesUnselecting this answer will add payment:cash=no - - **Payment cards are accepted here** corresponds with payment:cards=yesUnselecting this answer will add payment:cards=no - - - - -### wheelchair-access - - +### wheelchair-access The question is **Is this place accessible with a wheelchair?** +- **This place is specially adapted for wheelchair users** corresponds + with wheelchair + =designated +- **This place is easily reachable with a wheelchair** corresponds + with wheelchair + =yes +- **It is possible to reach this place in a wheelchair, but it is not easy** corresponds + with wheelchair + =limited +- **This place is not reachable with a wheelchair** corresponds + with wheelchair + =no - - - - - **This place is specially adapted for wheelchair users** corresponds with wheelchair=designated - - **This place is easily reachable with a wheelchair** corresponds with wheelchair=yes - - **It is possible to reach this place in a wheelchair, but it is not easy** corresponds with wheelchair=limited - - **This place is not reachable with a wheelchair** corresponds with wheelchair=no - - - - -### service:electricity - - +### service:electricity The question is **Does this amenity have electrical outlets, available to customers when they are inside?** +- **There are plenty of domestic sockets available to customers seated indoors, where they can charge their + electronics** corresponds with + service:electricity= + yes +- **There are a few domestic sockets available to customers seated indoors, where they can charge their electronics** + corresponds with service: + electricity= + limited +- **There are no sockets available indoors to customers, but charging might be possible if the staff is asked** + corresponds with service: + electricity=ask +- **There are a no domestic sockets available to customers seated indoors** corresponds + with service:electricity + =no - - - - - **There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics** corresponds with service:electricity=yes - - **There are a few domestic sockets available to customers seated indoors, where they can charge their electronics** corresponds with service:electricity=limited - - **There are no sockets available indoors to customers, but charging might be possible if the staff is asked** corresponds with service:electricity=ask - - **There are a no domestic sockets available to customers seated indoors** corresponds with service:electricity=no - - - - -### dog-access - - +### dog-access The question is **Are dogs allowed in this business?** - - - - - - **Dogs are allowed** corresponds with dog=yes - - **Dogs are not allowed** corresponds with dog=no - - **Dogs are allowed, but they have to be leashed** corresponds with dog=leashed - - **Dogs are allowed and can run around freely** corresponds with dog=unleashed - +- **Dogs are allowed** corresponds with dog + =yes +- **Dogs are not allowed** corresponds + with dog + =no +- **Dogs are allowed, but they have to be leashed** corresponds + with dog + =leashed +- **Dogs are allowed and can run around freely** corresponds + with dog + =unleashed This document is autogenerated from assets/layers/cafe_pub/cafe_pub.json \ No newline at end of file diff --git a/Docs/Layers/caravansites.md b/Docs/Layers/caravansites.md index b65d3b498..a46f676c7 100644 --- a/Docs/Layers/caravansites.md +++ b/Docs/Layers/caravansites.md @@ -1,6 +1,4 @@ - - - caravansites +caravansites ============== @@ -9,15 +7,13 @@ camper sites - - - ## Table of contents 1. [caravansites](#caravansites) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [caravansites-name](#caravansites-name) + [caravansites-fee](#caravansites-fee) @@ -33,249 +29,168 @@ camper sites + [questions](#questions) + [reviews](#reviews) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [campersite](https://mapcomplete.osm.be/campersite) - +- [campersite](https://mapcomplete.osm.be/campersite) [Go to the source code](../assets/layers/caravansites/caravansites.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- tourism + =caravan_site +- permanent_camping!~^only$ - - - tourism=caravan_site - - permanent_camping!~^only$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/fee#values) [fee](https://wiki.openstreetmap.org/wiki/Key:fee) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dno) -[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/sanitary_dump_station#values) [sanitary_dump_station](https://wiki.openstreetmap.org/wiki/Key:sanitary_dump_station) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:sanitary_dump_station%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:sanitary_dump_station%3Dno) -[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) | [](https://taginfo.openstreetmap.org/keys/internet_access#values) [internet_access](https://wiki.openstreetmap.org/wiki/Key:internet_access) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dno) [](https://taginfo.openstreetmap.org/keys/internet_access:fee#values) [internet_access:fee](https://wiki.openstreetmap.org/wiki/Key:internet_access:fee) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:internet_access:fee%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:internet_access:fee%3Dno) [](https://taginfo.openstreetmap.org/keys/toilets#values) [toilets](https://wiki.openstreetmap.org/wiki/Key:toilets) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:toilets%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:toilets%3Dno) -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/permanent_camping#values) [permanent_camping](https://wiki.openstreetmap.org/wiki/Key:permanent_camping) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:permanent_camping%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:permanent_camping%3Dno) [only](https://wiki.openstreetmap.org/wiki/Tag:permanent_camping%3Donly) -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### caravansites-name - - +### caravansites-name The question is **What is this place called?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This place is called {name}` - - -### caravansites-fee - - +### caravansites-fee The question is **Does this place charge a fee?** +- **You need to pay for use** corresponds with + fee=yes +- **Can be used for free** corresponds with + fee=no +- **Can be used for free** corresponds with + fee=no_This option cannot be chosen + as answer_ - - - - - **You need to pay for use** corresponds with fee=yes - - **Can be used for free** corresponds with fee=no - - **Can be used for free** corresponds with fee=no_This option cannot be chosen as answer_ - - - - -### caravansites-charge - - +### caravansites-charge The question is **How much does this place charge?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `This place charges {charge}` - - -### caravansites-sanitary-dump - - +### caravansites-sanitary-dump The question is **Does this place have a sanitary dump station?** +- **This place has a sanitary dump station** corresponds + with sanitary_dump_station + =yes +- **This place does not have a sanitary dump station** corresponds + with sanitary_dump_station + =no - - - - - **This place has a sanitary dump station** corresponds with sanitary_dump_station=yes - - **This place does not have a sanitary dump station** corresponds with sanitary_dump_station=no - - - - -### caravansites-capacity - - +### caravansites-capacity The question is **How many campers can stay here? (skip if there is no obvious number of spaces or allowed vehicles)** -This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) +This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) This is rendered with `{capacity} campers can use this place at the same time` - - -### caravansites-internet - - +### caravansites-internet The question is **Does this place provide internet access?** +- **There is internet access** corresponds + with internet_access + =yes +- **There is internet access** corresponds + with internet_access + =wifi + |internet_access + =wlan_This option cannot + be chosen as answer_ +- **There is no internet access** corresponds + with internet_access + =no - - - - - **There is internet access** corresponds with internet_access=yes - - **There is internet access** corresponds with internet_access=wifi|internet_access=wlan_This option cannot be chosen as answer_ - - **There is no internet access** corresponds with internet_access=no - - - - -### caravansites-internet-fee - - +### caravansites-internet-fee The question is **Do you have to pay for the internet access?** +- **You need to pay extra for internet access** corresponds + with internet_access:fee + =yes +- **You do not need to pay extra for internet access** corresponds + with internet_access:fee + =no - - - - - **You need to pay extra for internet access** corresponds with internet_access:fee=yes - - **You do not need to pay extra for internet access** corresponds with internet_access:fee=no - - - - -### caravansites-toilets - - +### caravansites-toilets The question is **Does this place have toilets?** +- **This place has toilets** corresponds with + toilets=yes +- **This place does not have toilets** corresponds + with toilets + =no - - - - - **This place has toilets** corresponds with toilets=yes - - **This place does not have toilets** corresponds with toilets=no - - - - -### caravansites-website - - +### caravansites-website The question is **Does this place have a website?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `Official website: {website}` - - -### caravansites-long-term - - +### caravansites-long-term The question is **Does this place offer spots for long term rental?** +- **Yes, there are some spots for long term rental, but you can also stay on a daily basis** corresponds + with permanent_camping + =yes +- **No, there are no permanent guests here** corresponds + with permanent_camping + =no +- **It is only possible to stay here if you have a long term contract(this place will disappear from this map if you + choose this)** corresponds with + permanent_camping= + only +### caravansites-description +The question is **Would you like to add a general description of this place? (Do not repeat information previously asked +or shown above. Please keep it objective - opinions go into the reviews)** - - - **Yes, there are some spots for long term rental, but you can also stay on a daily basis** corresponds with permanent_camping=yes - - **No, there are no permanent guests here** corresponds with permanent_camping=no - - **It is only possible to stay here if you have a long term contract(this place will disappear from this map if you choose this)** corresponds with permanent_camping=only - - - - -### caravansites-description - - - -The question is **Would you like to add a general description of this place? (Do not repeat information previously asked or shown above. Please keep it objective - opinions go into the reviews)** - -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) This is rendered with `More details about this place: {description}` - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### reviews - - +### reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/caravansites/caravansites.json \ No newline at end of file diff --git a/Docs/Layers/charging_station.md b/Docs/Layers/charging_station.md index 6b37ad6d6..91e8a3f10 100644 --- a/Docs/Layers/charging_station.md +++ b/Docs/Layers/charging_station.md @@ -1,6 +1,4 @@ - - - charging_station +charging_station ================== @@ -9,15 +7,13 @@ A charging station - - - ## Table of contents 1. [charging_station](#charging_station) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Type](#type) + [access](#access) @@ -106,1486 +102,1843 @@ A charging station + [questions](#questions) + [questions](#questions) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [charging_stations](https://mapcomplete.osm.be/charging_stations) - - [personal](https://mapcomplete.osm.be/personal) - +- [charging_stations](https://mapcomplete.osm.be/charging_stations) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/charging_station/charging_station.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =charging_station + |disused:amenity + = + charging_station|planned: + amenity= + charging_station| + construction:amenity + = + charging_station - - - amenity=charging_station|disused:amenity=charging_station|planned:amenity=charging_station|construction:amenity=charging_station - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | [string](../SpecialInputElements.md#string) | [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) [private](https://wiki.openstreetmap.org/wiki/Tag:access%3Dprivate) -[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:schuko#values) [socket:schuko](https://wiki.openstreetmap.org/wiki/Key:socket:schuko) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:typee#values) [socket:typee](https://wiki.openstreetmap.org/wiki/Key:socket:typee) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:chademo#values) [socket:chademo](https://wiki.openstreetmap.org/wiki/Key:socket:chademo) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1_cable#values) [socket:type1_cable](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1#values) [socket:type1](https://wiki.openstreetmap.org/wiki/Key:socket:type1) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1_combo#values) [socket:type1_combo](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger#values) [socket:tesla_supercharger](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2#values) [socket:type2](https://wiki.openstreetmap.org/wiki/Key:socket:type2) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2_combo#values) [socket:type2_combo](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2_cable#values) [socket:type2_cable](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger_ccs#values) [socket:tesla_supercharger_ccs](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination#values) [socket:tesla_destination](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination#values) [socket:tesla_destination](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:USB-A#values) [socket:USB-A](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:bosch_3pin#values) [socket:bosch_3pin](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:bosch_5pin#values) [socket:bosch_5pin](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/socket:schuko:voltage#values) [socket:schuko:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:schuko:current#values) [socket:schuko:current](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:schuko:output#values) [socket:schuko:output](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:typee:voltage#values) [socket:typee:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:typee:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:typee:current#values) [socket:typee:current](https://wiki.openstreetmap.org/wiki/Key:socket:typee:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:typee:output#values) [socket:typee:output](https://wiki.openstreetmap.org/wiki/Key:socket:typee:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:chademo:voltage#values) [socket:chademo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:chademo:current#values) [socket:chademo:current](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:chademo:output#values) [socket:chademo:output](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1_cable:voltage#values) [socket:type1_cable:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1_cable:current#values) [socket:type1_cable:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1_cable:output#values) [socket:type1_cable:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1:voltage#values) [socket:type1:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1:current#values) [socket:type1:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1:output#values) [socket:type1:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1_combo:voltage#values) [socket:type1_combo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1_combo:current#values) [socket:type1_combo:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type1_combo:output#values) [socket:type1_combo:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger:voltage#values) [socket:tesla_supercharger:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger:current#values) [socket:tesla_supercharger:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger:output#values) [socket:tesla_supercharger:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2:voltage#values) [socket:type2:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2:current#values) [socket:type2:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2:output#values) [socket:type2:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2_combo:voltage#values) [socket:type2_combo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2_combo:current#values) [socket:type2_combo:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2_combo:output#values) [socket:type2_combo:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2_cable:voltage#values) [socket:type2_cable:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2_cable:current#values) [socket:type2_cable:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:type2_cable:output#values) [socket:type2_cable:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger_ccs:voltage#values) [socket:tesla_supercharger_ccs:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger_ccs:current#values) [socket:tesla_supercharger_ccs:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger_ccs:output#values) [socket:tesla_supercharger_ccs:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:voltage#values) [socket:tesla_destination:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:current#values) [socket:tesla_destination:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:output#values) [socket:tesla_destination:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:voltage#values) [socket:tesla_destination:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:current#values) [socket:tesla_destination:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:output#values) [socket:tesla_destination:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:USB-A:voltage#values) [socket:USB-A:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:USB-A:current#values) [socket:USB-A:current](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:USB-A:output#values) [socket:USB-A:output](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:bosch_3pin:voltage#values) [socket:bosch_3pin:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:bosch_3pin:current#values) [socket:bosch_3pin:current](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:bosch_3pin:output#values) [socket:bosch_3pin:output](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:output) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:bosch_5pin:voltage#values) [socket:bosch_5pin:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:bosch_5pin:current#values) [socket:bosch_5pin:current](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:current) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/socket:bosch_5pin:output#values) [socket:bosch_5pin:output](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:schuko#values) [socket:schuko](https://wiki.openstreetmap.org/wiki/Key:socket:schuko) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:typee#values) [socket:typee](https://wiki.openstreetmap.org/wiki/Key:socket:typee) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:chademo#values) [socket:chademo](https://wiki.openstreetmap.org/wiki/Key:socket:chademo) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1_cable#values) [socket:type1_cable](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1#values) [socket:type1](https://wiki.openstreetmap.org/wiki/Key:socket:type1) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1_combo#values) [socket:type1_combo](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger#values) [socket:tesla_supercharger](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2#values) [socket:type2](https://wiki.openstreetmap.org/wiki/Key:socket:type2) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2_combo#values) [socket:type2_combo](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2_cable#values) [socket:type2_cable](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger_ccs#values) [socket:tesla_supercharger_ccs](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination#values) [socket:tesla_destination](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination#values) [socket:tesla_destination](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:USB-A#values) [socket:USB-A](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:bosch_3pin#values) [socket:bosch_3pin](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:bosch_5pin#values) [socket:bosch_5pin](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/socket:schuko:voltage#values) [socket:schuko:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:schuko:current#values) [socket:schuko:current](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:schuko:output#values) [socket:schuko:output](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:typee:voltage#values) [socket:typee:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:typee:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:typee:current#values) [socket:typee:current](https://wiki.openstreetmap.org/wiki/Key:socket:typee:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:typee:output#values) [socket:typee:output](https://wiki.openstreetmap.org/wiki/Key:socket:typee:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:chademo:voltage#values) [socket:chademo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:chademo:current#values) [socket:chademo:current](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:chademo:output#values) [socket:chademo:output](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1_cable:voltage#values) [socket:type1_cable:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1_cable:current#values) [socket:type1_cable:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1_cable:output#values) [socket:type1_cable:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1:voltage#values) [socket:type1:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1:current#values) [socket:type1:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1:output#values) [socket:type1:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1_combo:voltage#values) [socket:type1_combo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1_combo:current#values) [socket:type1_combo:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type1_combo:output#values) [socket:type1_combo:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger:voltage#values) [socket:tesla_supercharger:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger:current#values) [socket:tesla_supercharger:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger:output#values) [socket:tesla_supercharger:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2:voltage#values) [socket:type2:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2:current#values) [socket:type2:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2:output#values) [socket:type2:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2_combo:voltage#values) [socket:type2_combo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2_combo:current#values) [socket:type2_combo:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2_combo:output#values) [socket:type2_combo:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2_cable:voltage#values) [socket:type2_cable:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2_cable:current#values) [socket:type2_cable:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:type2_cable:output#values) [socket:type2_cable:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger_ccs:voltage#values) [socket:tesla_supercharger_ccs:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger_ccs:current#values) [socket:tesla_supercharger_ccs:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_supercharger_ccs:output#values) [socket:tesla_supercharger_ccs:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:voltage#values) [socket:tesla_destination:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:current#values) [socket:tesla_destination:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:output#values) [socket:tesla_destination:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:voltage#values) [socket:tesla_destination:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:current#values) [socket:tesla_destination:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:tesla_destination:output#values) [socket:tesla_destination:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:USB-A:voltage#values) [socket:USB-A:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:USB-A:current#values) [socket:USB-A:current](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:USB-A:output#values) [socket:USB-A:output](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:bosch_3pin:voltage#values) [socket:bosch_3pin:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:bosch_3pin:current#values) [socket:bosch_3pin:current](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:bosch_3pin:output#values) [socket:bosch_3pin:output](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:output) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:bosch_5pin:voltage#values) [socket:bosch_5pin:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:voltage) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:bosch_5pin:current#values) [socket:bosch_5pin:current](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:current) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/socket:bosch_5pin:output#values) [socket:bosch_5pin:output](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:output) | [pfloat](../SpecialInputElements.md#pfloat) | [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) [](https://taginfo.openstreetmap.org/keys/fee#values) [fee](https://wiki.openstreetmap.org/wiki/Key:fee) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dno) [no](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dno) [yes](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dyes) [yes](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dyes) -[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/authentication:phone_call:number#values) [authentication:phone_call:number](https://wiki.openstreetmap.org/wiki/Key:authentication:phone_call:number) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/authentication:phone_call:number#values) [authentication:phone_call:number](https://wiki.openstreetmap.org/wiki/Key:authentication:phone_call:number) | [phone](../SpecialInputElements.md#phone) | [](https://taginfo.openstreetmap.org/keys/maxstay#values) [maxstay](https://wiki.openstreetmap.org/wiki/Key:maxstay) | [string](../SpecialInputElements.md#string) | [unlimited](https://wiki.openstreetmap.org/wiki/Tag:maxstay%3Dunlimited) [](https://taginfo.openstreetmap.org/keys/network#values) [network](https://wiki.openstreetmap.org/wiki/Key:network) | [string](../SpecialInputElements.md#string) | [AeroVironment](https://wiki.openstreetmap.org/wiki/Tag:network%3DAeroVironment) [Blink](https://wiki.openstreetmap.org/wiki/Tag:network%3DBlink) [EVgo](https://wiki.openstreetmap.org/wiki/Tag:network%3DEVgo) [Allego](https://wiki.openstreetmap.org/wiki/Tag:network%3DAllego) [Blue Corner](https://wiki.openstreetmap.org/wiki/Tag:network%3DBlue Corner) [Tesla](https://wiki.openstreetmap.org/wiki/Tag:network%3DTesla) -[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) -[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/planned:amenity#values) [planned:amenity](https://wiki.openstreetmap.org/wiki/Key:planned:amenity) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:planned:amenity%3D) [](https://wiki.openstreetmap.org/wiki/Tag:planned:amenity%3D) [charging_station](https://wiki.openstreetmap.org/wiki/Tag:planned:amenity%3Dcharging_station) [](https://wiki.openstreetmap.org/wiki/Tag:planned:amenity%3D) [](https://wiki.openstreetmap.org/wiki/Tag:planned:amenity%3D) [](https://taginfo.openstreetmap.org/keys/parking:fee#values) [parking:fee](https://wiki.openstreetmap.org/wiki/Key:parking:fee) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:parking:fee%3Dno) [yes](https://wiki.openstreetmap.org/wiki/Tag:parking:fee%3Dyes) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### Type - - +### Type The question is **Which vehicles are allowed to charge here?** +- **Bicycles can be charged here** corresponds + with bicycle + =yesUnselecting this answer will + add bicycle + =no +- **Cars can be charged here** corresponds + with motorcar + =yesUnselecting this answer will + add motorcar + =no +- **Scooters can be charged here** corresponds + with scooter + =yesUnselecting this answer will + add scooter + =no +- **Heavy good vehicles (such as trucks) can be charged here** corresponds + with hgv + =yesUnselecting this answer will + add hgv + =no +- **Buses can be charged here** corresponds + with bus + =yesUnselecting this answer will + add bus + =no - - - - - **Bicycles can be charged here** corresponds with bicycle=yesUnselecting this answer will add bicycle=no - - **Cars can be charged here** corresponds with motorcar=yesUnselecting this answer will add motorcar=no - - **Scooters can be charged here** corresponds with scooter=yesUnselecting this answer will add scooter=no - - **Heavy good vehicles (such as trucks) can be charged here** corresponds with hgv=yesUnselecting this answer will add hgv=no - - **Buses can be charged here** corresponds with bus=yesUnselecting this answer will add bus=no - - - - -### access - - +### access The question is **Who is allowed to use this charging station?** -This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) +This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) This is rendered with `Access is {access}` +- **Anyone can use this charging station (payment might be needed)** corresponds + with access + =yes +- **Anyone can use this charging station (payment might be needed)** corresponds + with access + =permissive + |access + =public_This option cannot be + chosen as answer_ +- **Only customers of the place this station belongs to can use this charging station
E.g. a + charging station operated by hotel which is only usable by their guests** corresponds + with access + =customers +- **Not accessible to the general public (e.g. only accessible to the owners, employees, ...)** corresponds + with access + =private - - - **Anyone can use this charging station (payment might be needed)** corresponds with access=yes - - **Anyone can use this charging station (payment might be needed)** corresponds with access=permissive|access=public_This option cannot be chosen as answer_ - - **Only customers of the place this station belongs to can use this charging station
E.g. a charging station operated by hotel which is only usable by their guests** corresponds with access=customers - - **Not accessible to the general public (e.g. only accessible to the owners, employees, ...)** corresponds with access=private - - - - -### capacity - - +### capacity The question is **How much vehicles can be charged here at the same time?** -This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) +This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) This is rendered with `{capacity} vehicles can be charged here at the same time` - - -### Available_charging_stations (generated) - - +### Available_charging_stations (generated) The question is **Which charging connections are available here?** +- **
Schuko wall + plug without ground pin (CEE7/4 type F)
** corresponds + with socket:schuko + =1Unselecting this answer will + add +- **
Schuko wall + plug without ground pin (CEE7/4 type F)
** corresponds with socket:schuko~^..*$&socket:schuko!~^1$_ + This option cannot be chosen as answer_ +- **
European wall + plug with ground pin (CEE7/4 type E)
** corresponds + with socket:typee + =1Unselecting this answer will + add +- **
European wall + plug with ground pin (CEE7/4 type E)
** corresponds with socket:typee~^..*$&socket:typee!~^1$_This + option cannot be chosen as answer_ +- **
+ Chademo
** corresponds + with socket:chademo + =1Unselecting this answer + will add +- **
+ Chademo
** corresponds with socket:chademo~^..*$&socket:chademo!~^1$_This option cannot be chosen as + answer_ +- **
Type 1 + with cable (J1772)
** corresponds + with socket:type1_cable + =1Unselecting this answer + will add +- **
Type 1 + with cable (J1772)
** corresponds with socket:type1_cable~^..*$&socket:type1_cable!~^1$_This option + cannot be chosen as answer_ +- **
Type + 1 without cable (J1772)
** corresponds + with socket:type1 + =1Unselecting this answer will + add +- **
Type + 1 without cable (J1772)
** corresponds with socket:type1~^..*$&socket:type1!~^1$_This option + cannot be chosen as answer_ +- **
Type 1 + CCS (aka Type 1 Combo)
** corresponds + with socket:type1_combo + =1Unselecting this answer + will add +- **
Type 1 + CCS (aka Type 1 Combo)
** corresponds with socket:type1_combo~^..*$&socket:type1_combo!~^1$_This + option cannot be chosen as answer_ +- **
+ Tesla Supercharger
** corresponds + with socket: + tesla_supercharger + =1Unselecting this + answer will add +- **
+ Tesla Supercharger
** corresponds with socket:tesla_supercharger~^..*$&socket:tesla_supercharger!~^1$_ + This option cannot be chosen as answer_ +- **
Type + 2 (mennekes)
** corresponds + with socket:type2 + =1Unselecting this answer will + add +- **
Type + 2 (mennekes)
** corresponds with socket:type2~^..*$&socket:type2!~^1$_This option cannot be chosen as + answer_ +- **
Type 2 + CCS (mennekes)
** corresponds + with socket:type2_combo + =1Unselecting this answer + will add +- **
Type 2 + CCS (mennekes)
** corresponds with socket:type2_combo~^..*$&socket:type2_combo!~^1$_This option cannot + be chosen as answer_ +- **
Type 2 + with cable (mennekes)
** corresponds + with socket:type2_cable + =1Unselecting this answer + will add +- **
Type 2 + with cable (mennekes)
** corresponds with socket:type2_cable~^..*$&socket:type2_cable!~^1$_This option + cannot be chosen as answer_ +- **
Tesla + Supercharger CCS (a branded type2_css)
** corresponds + with socket: + tesla_supercharger_ccs + =1Unselecting + this answer will add +- **
Tesla + Supercharger CCS (a branded type2_css)
** corresponds with socket:tesla_supercharger_ccs~^..*$&socket: + tesla_supercharger_ccs!~^1$_This option cannot be chosen as answer_ +- **
+ Tesla Supercharger (destination)
** corresponds + with socket: + tesla_destination= + 1Unselecting this answer will add +- **
+ Tesla Supercharger (destination)
** corresponds with socket:tesla_destination~^..*$&socket: + tesla_destination!~^1$&_country + =us_This option cannot be chosen + as answer_ +- **
Tesla + supercharger (destination) (A Type 2 with cable branded as tesla)
** corresponds + with socket: + tesla_destination= + 1Unselecting this answer will add +- **
Tesla + supercharger (destination) (A Type 2 with cable branded as tesla)
** corresponds with socket: + tesla_destination~^..*$&socket:tesla_destination!~^1$&_country!~^us$_This option cannot be chosen as answer_ +- **
USB to + charge phones and small electronics
** corresponds + with socket:USB-A + =1Unselecting this answer will + add +- **
USB to + charge phones and small electronics
** corresponds with socket:USB-A~^..*$&socket:USB-A!~^1$_This option + cannot be chosen as answer_ +- **
Bosch + Active Connect with 3 pins and cable
** corresponds + with socket:bosch_3pin + =1Unselecting this answer + will add +- **
Bosch + Active Connect with 3 pins and cable
** corresponds with socket:bosch_3pin~^..*$&socket:bosch_3pin!~ + ^1$_This option cannot be chosen as answer_ +- **
Bosch + Active Connect with 5 pins and cable
** corresponds + with socket:bosch_5pin + =1Unselecting this answer + will add +- **
Bosch + Active Connect with 5 pins and cable
** corresponds with socket:bosch_5pin~^..*$&socket:bosch_5pin!~ + ^1$_This option cannot be chosen as answer_ + +### plugs-0 + +The question is **How much plugs of type
Schuko wall plug without ground +pin (CEE7/4 type +F)
are +available here?** + +This rendering asks information about the +property [socket:schuko](https://wiki.openstreetmap.org/wiki/Key:socket:schuko) +This is rendered +with `There are {socket:schuko} plugs of type
Schuko wall plug without ground pin (CEE7/4 type F)
available here` + +### plugs-1 + +The question is **How much plugs of type
European wall plug with ground +pin (CEE7/4 type +E)
are +available here?** + +This rendering asks information about the property [socket:typee](https://wiki.openstreetmap.org/wiki/Key:socket:typee) +This is rendered +with `There are {socket:typee} plugs of type
European wall plug with ground pin (CEE7/4 type E)
available here` + +### plugs-2 + +The question is **How much plugs of type
+Chademo
+are available here?** + +This rendering asks information about the +property [socket:chademo](https://wiki.openstreetmap.org/wiki/Key:socket:chademo) +This is rendered +with `There are {socket:chademo} plugs of type
Chademo
available here` + +### plugs-3 + +The question is **How much plugs of type
Type 1 with cable ( +J1772)
+are available here?** + +This rendering asks information about the +property [socket:type1_cable](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable) +This is rendered +with `There are {socket:type1_cable} plugs of type
Type 1 with cable (J1772)
available here` + +### plugs-4 + +The question is **How much plugs of type
Type 1 without cable ( +J1772)
+are available here?** + +This rendering asks information about the property [socket:type1](https://wiki.openstreetmap.org/wiki/Key:socket:type1) +This is rendered +with `There are {socket:type1} plugs of type
Type 1 without cable (J1772)
available here` + +### plugs-5 + +The question is **How much plugs of type
Type 1 CCS (aka Type 1 +Combo)
+are available here?** + +This rendering asks information about the +property [socket:type1_combo](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo) +This is rendered +with `There are {socket:type1_combo} plugs of type
Type 1 CCS (aka Type 1 Combo)
available here` + +### plugs-6 + +The question is **How much plugs of type
Tesla +Supercharger
+are available here?** + +This rendering asks information about the +property [socket:tesla_supercharger](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger) +This is rendered +with `There are {socket:tesla_supercharger} plugs of type
Tesla Supercharger
available here` + +### plugs-7 +The question is **How much plugs of type
Type 2 ( +mennekes)
+are available here?** +This rendering asks information about the property [socket:type2](https://wiki.openstreetmap.org/wiki/Key:socket:type2) +This is rendered +with `There are {socket:type2} plugs of type
Type 2 (mennekes)
available here` +### plugs-8 - - **
Schuko wall plug without ground pin (CEE7/4 type F)
** corresponds with socket:schuko=1Unselecting this answer will add - - **
Schuko wall plug without ground pin (CEE7/4 type F)
** corresponds with socket:schuko~^..*$&socket:schuko!~^1$_This option cannot be chosen as answer_ - - **
European wall plug with ground pin (CEE7/4 type E)
** corresponds with socket:typee=1Unselecting this answer will add - - **
European wall plug with ground pin (CEE7/4 type E)
** corresponds with socket:typee~^..*$&socket:typee!~^1$_This option cannot be chosen as answer_ - - **
Chademo
** corresponds with socket:chademo=1Unselecting this answer will add - - **
Chademo
** corresponds with socket:chademo~^..*$&socket:chademo!~^1$_This option cannot be chosen as answer_ - - **
Type 1 with cable (J1772)
** corresponds with socket:type1_cable=1Unselecting this answer will add - - **
Type 1 with cable (J1772)
** corresponds with socket:type1_cable~^..*$&socket:type1_cable!~^1$_This option cannot be chosen as answer_ - - **
Type 1 without cable (J1772)
** corresponds with socket:type1=1Unselecting this answer will add - - **
Type 1 without cable (J1772)
** corresponds with socket:type1~^..*$&socket:type1!~^1$_This option cannot be chosen as answer_ - - **
Type 1 CCS (aka Type 1 Combo)
** corresponds with socket:type1_combo=1Unselecting this answer will add - - **
Type 1 CCS (aka Type 1 Combo)
** corresponds with socket:type1_combo~^..*$&socket:type1_combo!~^1$_This option cannot be chosen as answer_ - - **
Tesla Supercharger
** corresponds with socket:tesla_supercharger=1Unselecting this answer will add - - **
Tesla Supercharger
** corresponds with socket:tesla_supercharger~^..*$&socket:tesla_supercharger!~^1$_This option cannot be chosen as answer_ - - **
Type 2 (mennekes)
** corresponds with socket:type2=1Unselecting this answer will add - - **
Type 2 (mennekes)
** corresponds with socket:type2~^..*$&socket:type2!~^1$_This option cannot be chosen as answer_ - - **
Type 2 CCS (mennekes)
** corresponds with socket:type2_combo=1Unselecting this answer will add - - **
Type 2 CCS (mennekes)
** corresponds with socket:type2_combo~^..*$&socket:type2_combo!~^1$_This option cannot be chosen as answer_ - - **
Type 2 with cable (mennekes)
** corresponds with socket:type2_cable=1Unselecting this answer will add - - **
Type 2 with cable (mennekes)
** corresponds with socket:type2_cable~^..*$&socket:type2_cable!~^1$_This option cannot be chosen as answer_ - - **
Tesla Supercharger CCS (a branded type2_css)
** corresponds with socket:tesla_supercharger_ccs=1Unselecting this answer will add - - **
Tesla Supercharger CCS (a branded type2_css)
** corresponds with socket:tesla_supercharger_ccs~^..*$&socket:tesla_supercharger_ccs!~^1$_This option cannot be chosen as answer_ - - **
Tesla Supercharger (destination)
** corresponds with socket:tesla_destination=1Unselecting this answer will add - - **
Tesla Supercharger (destination)
** corresponds with socket:tesla_destination~^..*$&socket:tesla_destination!~^1$&_country=us_This option cannot be chosen as answer_ - - **
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
** corresponds with socket:tesla_destination=1Unselecting this answer will add - - **
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
** corresponds with socket:tesla_destination~^..*$&socket:tesla_destination!~^1$&_country!~^us$_This option cannot be chosen as answer_ - - **
USB to charge phones and small electronics
** corresponds with socket:USB-A=1Unselecting this answer will add - - **
USB to charge phones and small electronics
** corresponds with socket:USB-A~^..*$&socket:USB-A!~^1$_This option cannot be chosen as answer_ - - **
Bosch Active Connect with 3 pins and cable
** corresponds with socket:bosch_3pin=1Unselecting this answer will add - - **
Bosch Active Connect with 3 pins and cable
** corresponds with socket:bosch_3pin~^..*$&socket:bosch_3pin!~^1$_This option cannot be chosen as answer_ - - **
Bosch Active Connect with 5 pins and cable
** corresponds with socket:bosch_5pin=1Unselecting this answer will add - - **
Bosch Active Connect with 5 pins and cable
** corresponds with socket:bosch_5pin~^..*$&socket:bosch_5pin!~^1$_This option cannot be chosen as answer_ +The question is **How much plugs of type
Type 2 CCS ( +mennekes)
+are available here?** +This rendering asks information about the +property [socket:type2_combo](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo) +This is rendered +with `There are {socket:type2_combo} plugs of type
Type 2 CCS (mennekes)
available here` +### plugs-9 +The question is **How much plugs of type
Type 2 with cable ( +mennekes)
+are available here?** -### plugs-0 +This rendering asks information about the +property [socket:type2_cable](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable) +This is rendered +with `There are {socket:type2_cable} plugs of type
Type 2 with cable (mennekes)
available here` +### plugs-10 +The question is **How much plugs of type
Tesla Supercharger CCS (a branded +type2_css)
+are available here?** -The question is **How much plugs of type
Schuko wall plug without ground pin (CEE7/4 type F)
are available here?** +This rendering asks information about the +property [socket:tesla_supercharger_ccs](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs) +This is rendered +with `There are {socket:tesla_supercharger_ccs} plugs of type
Tesla Supercharger CCS (a branded type2_css)
available here` -This rendering asks information about the property [socket:schuko](https://wiki.openstreetmap.org/wiki/Key:socket:schuko) -This is rendered with `There are {socket:schuko} plugs of type
Schuko wall plug without ground pin (CEE7/4 type F)
available here` +### plugs-11 +The question is **How much plugs of type
Tesla Supercharger ( +destination)
+are available here?** +This rendering asks information about the +property [socket:tesla_destination](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination) +This is rendered +with `There are {socket:tesla_destination} plugs of type
Tesla Supercharger (destination)
available here` -### plugs-1 +### plugs-12 +The question is **How much plugs of type
Tesla supercharger (destination) ( +A Type 2 with cable branded as +tesla)
+are available here?** +This rendering asks information about the +property [socket:tesla_destination](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination) +This is rendered +with `There are {socket:tesla_destination} plugs of type
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
available here` -The question is **How much plugs of type
European wall plug with ground pin (CEE7/4 type E)
are available here?** +### plugs-13 -This rendering asks information about the property [socket:typee](https://wiki.openstreetmap.org/wiki/Key:socket:typee) -This is rendered with `There are {socket:typee} plugs of type
European wall plug with ground pin (CEE7/4 type E)
available here` +The question is **How much plugs of type
USB to charge phones and small +electronics
+are available here?** +This rendering asks information about the property [socket:USB-A](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A) +This is rendered +with `There are {socket:USB-A} plugs of type
USB to charge phones and small electronics
available here` +### plugs-14 -### plugs-2 +The question is **How much plugs of type
Bosch Active Connect with 3 pins +and +cable
+are available here?** +This rendering asks information about the +property [socket:bosch_3pin](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin) +This is rendered +with `There are {socket:bosch_3pin} plugs of type
Bosch Active Connect with 3 pins and cable
available here` +### plugs-15 + +The question is **How much plugs of type
Bosch Active Connect with 5 pins +and +cable
+are available here?** -The question is **How much plugs of type
Chademo
are available here?** - -This rendering asks information about the property [socket:chademo](https://wiki.openstreetmap.org/wiki/Key:socket:chademo) -This is rendered with `There are {socket:chademo} plugs of type
Chademo
available here` - - - -### plugs-3 - - - -The question is **How much plugs of type
Type 1 with cable (J1772)
are available here?** - -This rendering asks information about the property [socket:type1_cable](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable) -This is rendered with `There are {socket:type1_cable} plugs of type
Type 1 with cable (J1772)
available here` - - - -### plugs-4 - - - -The question is **How much plugs of type
Type 1 without cable (J1772)
are available here?** - -This rendering asks information about the property [socket:type1](https://wiki.openstreetmap.org/wiki/Key:socket:type1) -This is rendered with `There are {socket:type1} plugs of type
Type 1 without cable (J1772)
available here` - - - -### plugs-5 - - - -The question is **How much plugs of type
Type 1 CCS (aka Type 1 Combo)
are available here?** - -This rendering asks information about the property [socket:type1_combo](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo) -This is rendered with `There are {socket:type1_combo} plugs of type
Type 1 CCS (aka Type 1 Combo)
available here` - - - -### plugs-6 - - - -The question is **How much plugs of type
Tesla Supercharger
are available here?** - -This rendering asks information about the property [socket:tesla_supercharger](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger) -This is rendered with `There are {socket:tesla_supercharger} plugs of type
Tesla Supercharger
available here` - - - -### plugs-7 - - - -The question is **How much plugs of type
Type 2 (mennekes)
are available here?** - -This rendering asks information about the property [socket:type2](https://wiki.openstreetmap.org/wiki/Key:socket:type2) -This is rendered with `There are {socket:type2} plugs of type
Type 2 (mennekes)
available here` - - - -### plugs-8 - - - -The question is **How much plugs of type
Type 2 CCS (mennekes)
are available here?** - -This rendering asks information about the property [socket:type2_combo](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo) -This is rendered with `There are {socket:type2_combo} plugs of type
Type 2 CCS (mennekes)
available here` - - - -### plugs-9 - - - -The question is **How much plugs of type
Type 2 with cable (mennekes)
are available here?** - -This rendering asks information about the property [socket:type2_cable](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable) -This is rendered with `There are {socket:type2_cable} plugs of type
Type 2 with cable (mennekes)
available here` - - - -### plugs-10 - - - -The question is **How much plugs of type
Tesla Supercharger CCS (a branded type2_css)
are available here?** - -This rendering asks information about the property [socket:tesla_supercharger_ccs](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs) -This is rendered with `There are {socket:tesla_supercharger_ccs} plugs of type
Tesla Supercharger CCS (a branded type2_css)
available here` - - - -### plugs-11 - - - -The question is **How much plugs of type
Tesla Supercharger (destination)
are available here?** - -This rendering asks information about the property [socket:tesla_destination](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination) -This is rendered with `There are {socket:tesla_destination} plugs of type
Tesla Supercharger (destination)
available here` - - - -### plugs-12 - - - -The question is **How much plugs of type
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
are available here?** - -This rendering asks information about the property [socket:tesla_destination](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination) -This is rendered with `There are {socket:tesla_destination} plugs of type
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
available here` - - - -### plugs-13 - - - -The question is **How much plugs of type
USB to charge phones and small electronics
are available here?** - -This rendering asks information about the property [socket:USB-A](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A) -This is rendered with `There are {socket:USB-A} plugs of type
USB to charge phones and small electronics
available here` - - - -### plugs-14 - - - -The question is **How much plugs of type
Bosch Active Connect with 3 pins and cable
are available here?** - -This rendering asks information about the property [socket:bosch_3pin](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin) -This is rendered with `There are {socket:bosch_3pin} plugs of type
Bosch Active Connect with 3 pins and cable
available here` - - - -### plugs-15 - - - -The question is **How much plugs of type
Bosch Active Connect with 5 pins and cable
are available here?** - -This rendering asks information about the property [socket:bosch_5pin](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin) -This is rendered with `There are {socket:bosch_5pin} plugs of type
Bosch Active Connect with 5 pins and cable
available here` - - - -### voltage-0 - - - -The question is **What voltage do the plugs with
Schuko wall plug without ground pin (CEE7/4 type F)
offer?** - -This rendering asks information about the property [socket:schuko:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:voltage) -This is rendered with `
Schuko wall plug without ground pin (CEE7/4 type F)
outputs {socket:schuko:voltage} volt` - - - - - **
Schuko wall plug without ground pin (CEE7/4 type F)
outputs 230 volt** corresponds with socket:socket:schuko:voltage=230 V - - - - -### current-0 - - - -The question is **What current do the plugs with
Schuko wall plug without ground pin (CEE7/4 type F)
offer?** - -This rendering asks information about the property [socket:schuko:current](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:current) -This is rendered with `
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:current}A` - - - - - **
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 16 A** corresponds with socket:socket:schuko:current=16 A - - - - -### power-output-0 - - - -The question is **What power output does a single plug of type
Schuko wall plug without ground pin (CEE7/4 type F)
offer?** - -This rendering asks information about the property [socket:schuko:output](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:output) -This is rendered with `
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:output}` - - - - - **
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 3.6 kw** corresponds with socket:socket:schuko:output=3.6 kw - - - - -### voltage-1 - - - -The question is **What voltage do the plugs with
European wall plug with ground pin (CEE7/4 type E)
offer?** - -This rendering asks information about the property [socket:typee:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:typee:voltage) -This is rendered with `
European wall plug with ground pin (CEE7/4 type E)
outputs {socket:typee:voltage} volt` - - - - - **
European wall plug with ground pin (CEE7/4 type E)
outputs 230 volt** corresponds with socket:socket:typee:voltage=230 V - - - - -### current-1 - - - -The question is **What current do the plugs with
European wall plug with ground pin (CEE7/4 type E)
offer?** - -This rendering asks information about the property [socket:typee:current](https://wiki.openstreetmap.org/wiki/Key:socket:typee:current) -This is rendered with `
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:current}A` - - - - - **
European wall plug with ground pin (CEE7/4 type E)
outputs at most 16 A** corresponds with socket:socket:typee:current=16 A - - - - -### power-output-1 - - - -The question is **What power output does a single plug of type
European wall plug with ground pin (CEE7/4 type E)
offer?** - -This rendering asks information about the property [socket:typee:output](https://wiki.openstreetmap.org/wiki/Key:socket:typee:output) -This is rendered with `
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:output}` - - - - - **
European wall plug with ground pin (CEE7/4 type E)
outputs at most 3 kw** corresponds with socket:socket:typee:output=3 kw - - **
European wall plug with ground pin (CEE7/4 type E)
outputs at most 22 kw** corresponds with socket:socket:typee:output=22 kw - - - - -### voltage-2 - - - -The question is **What voltage do the plugs with
Chademo
offer?** - -This rendering asks information about the property [socket:chademo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:voltage) -This is rendered with `
Chademo
outputs {socket:chademo:voltage} volt` - - - - - **
Chademo
outputs 500 volt** corresponds with socket:socket:chademo:voltage=500 V - - - - -### current-2 - - - -The question is **What current do the plugs with
Chademo
offer?** - -This rendering asks information about the property [socket:chademo:current](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:current) -This is rendered with `
Chademo
outputs at most {socket:chademo:current}A` - - - - - **
Chademo
outputs at most 120 A** corresponds with socket:socket:chademo:current=120 A - - - - -### power-output-2 - - - -The question is **What power output does a single plug of type
Chademo
offer?** - -This rendering asks information about the property [socket:chademo:output](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:output) -This is rendered with `
Chademo
outputs at most {socket:chademo:output}` - - - - - **
Chademo
outputs at most 50 kw** corresponds with socket:socket:chademo:output=50 kw - - - - -### voltage-3 - - - -The question is **What voltage do the plugs with
Type 1 with cable (J1772)
offer?** - -This rendering asks information about the property [socket:type1_cable:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:voltage) -This is rendered with `
Type 1 with cable (J1772)
outputs {socket:type1_cable:voltage} volt` - - - - - **
Type 1 with cable (J1772)
outputs 200 volt** corresponds with socket:socket:type1_cable:voltage=200 V - - **
Type 1 with cable (J1772)
outputs 240 volt** corresponds with socket:socket:type1_cable:voltage=240 V - - - - -### current-3 - - - -The question is **What current do the plugs with
Type 1 with cable (J1772)
offer?** - -This rendering asks information about the property [socket:type1_cable:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:current) -This is rendered with `
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:current}A` - - - - - **
Type 1 with cable (J1772)
outputs at most 32 A** corresponds with socket:socket:type1_cable:current=32 A - - - - -### power-output-3 - - - -The question is **What power output does a single plug of type
Type 1 with cable (J1772)
offer?** - -This rendering asks information about the property [socket:type1_cable:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:output) -This is rendered with `
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:output}` - - - - - **
Type 1 with cable (J1772)
outputs at most 3.7 kw** corresponds with socket:socket:type1_cable:output=3.7 kw - - **
Type 1 with cable (J1772)
outputs at most 7 kw** corresponds with socket:socket:type1_cable:output=7 kw - - - - -### voltage-4 - - - -The question is **What voltage do the plugs with
Type 1 without cable (J1772)
offer?** - -This rendering asks information about the property [socket:type1:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1:voltage) -This is rendered with `
Type 1 without cable (J1772)
outputs {socket:type1:voltage} volt` - - - - - **
Type 1 without cable (J1772)
outputs 200 volt** corresponds with socket:socket:type1:voltage=200 V - - **
Type 1 without cable (J1772)
outputs 240 volt** corresponds with socket:socket:type1:voltage=240 V - - - - -### current-4 - - - -The question is **What current do the plugs with
Type 1 without cable (J1772)
offer?** - -This rendering asks information about the property [socket:type1:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1:current) -This is rendered with `
Type 1 without cable (J1772)
outputs at most {socket:type1:current}A` - - - - - **
Type 1 without cable (J1772)
outputs at most 32 A** corresponds with socket:socket:type1:current=32 A - - - - -### power-output-4 - - - -The question is **What power output does a single plug of type
Type 1 without cable (J1772)
offer?** - -This rendering asks information about the property [socket:type1:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1:output) -This is rendered with `
Type 1 without cable (J1772)
outputs at most {socket:type1:output}` - - - - - **
Type 1 without cable (J1772)
outputs at most 3.7 kw** corresponds with socket:socket:type1:output=3.7 kw - - **
Type 1 without cable (J1772)
outputs at most 6.6 kw** corresponds with socket:socket:type1:output=6.6 kw - - **
Type 1 without cable (J1772)
outputs at most 7 kw** corresponds with socket:socket:type1:output=7 kw - - **
Type 1 without cable (J1772)
outputs at most 7.2 kw** corresponds with socket:socket:type1:output=7.2 kw - - - - -### voltage-5 - - - -The question is **What voltage do the plugs with
Type 1 CCS (aka Type 1 Combo)
offer?** - -This rendering asks information about the property [socket:type1_combo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:voltage) -This is rendered with `
Type 1 CCS (aka Type 1 Combo)
outputs {socket:type1_combo:voltage} volt` - - - - - **
Type 1 CCS (aka Type 1 Combo)
outputs 400 volt** corresponds with socket:socket:type1_combo:voltage=400 V - - **
Type 1 CCS (aka Type 1 Combo)
outputs 1000 volt** corresponds with socket:socket:type1_combo:voltage=1000 V - - - - -### current-5 - - - -The question is **What current do the plugs with
Type 1 CCS (aka Type 1 Combo)
offer?** - -This rendering asks information about the property [socket:type1_combo:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:current) -This is rendered with `
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:current}A` - - - - - **
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 A** corresponds with socket:socket:type1_combo:current=50 A - - **
Type 1 CCS (aka Type 1 Combo)
outputs at most 125 A** corresponds with socket:socket:type1_combo:current=125 A - - - - -### power-output-5 - - - -The question is **What power output does a single plug of type
Type 1 CCS (aka Type 1 Combo)
offer?** - -This rendering asks information about the property [socket:type1_combo:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:output) -This is rendered with `
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:output}` - - - - - **
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 kw** corresponds with socket:socket:type1_combo:output=50 kw - - **
Type 1 CCS (aka Type 1 Combo)
outputs at most 62.5 kw** corresponds with socket:socket:type1_combo:output=62.5 kw - - **
Type 1 CCS (aka Type 1 Combo)
outputs at most 150 kw** corresponds with socket:socket:type1_combo:output=150 kw - - **
Type 1 CCS (aka Type 1 Combo)
outputs at most 350 kw** corresponds with socket:socket:type1_combo:output=350 kw - - - - -### voltage-6 - - - -The question is **What voltage do the plugs with
Tesla Supercharger
offer?** - -This rendering asks information about the property [socket:tesla_supercharger:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:voltage) -This is rendered with `
Tesla Supercharger
outputs {socket:tesla_supercharger:voltage} volt` - - - - - **
Tesla Supercharger
outputs 480 volt** corresponds with socket:socket:tesla_supercharger:voltage=480 V - - - - -### current-6 - - - -The question is **What current do the plugs with
Tesla Supercharger
offer?** - -This rendering asks information about the property [socket:tesla_supercharger:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:current) -This is rendered with `
Tesla Supercharger
outputs at most {socket:tesla_supercharger:current}A` - - - - - **
Tesla Supercharger
outputs at most 125 A** corresponds with socket:socket:tesla_supercharger:current=125 A - - **
Tesla Supercharger
outputs at most 350 A** corresponds with socket:socket:tesla_supercharger:current=350 A - - - - -### power-output-6 - - - -The question is **What power output does a single plug of type
Tesla Supercharger
offer?** - -This rendering asks information about the property [socket:tesla_supercharger:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:output) -This is rendered with `
Tesla Supercharger
outputs at most {socket:tesla_supercharger:output}` - - - - - **
Tesla Supercharger
outputs at most 120 kw** corresponds with socket:socket:tesla_supercharger:output=120 kw - - **
Tesla Supercharger
outputs at most 150 kw** corresponds with socket:socket:tesla_supercharger:output=150 kw - - **
Tesla Supercharger
outputs at most 250 kw** corresponds with socket:socket:tesla_supercharger:output=250 kw - - - - -### voltage-7 - - - -The question is **What voltage do the plugs with
Type 2 (mennekes)
offer?** - -This rendering asks information about the property [socket:type2:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2:voltage) -This is rendered with `
Type 2 (mennekes)
outputs {socket:type2:voltage} volt` - - - - - **
Type 2 (mennekes)
outputs 230 volt** corresponds with socket:socket:type2:voltage=230 V - - **
Type 2 (mennekes)
outputs 400 volt** corresponds with socket:socket:type2:voltage=400 V - - - - -### current-7 - - - -The question is **What current do the plugs with
Type 2 (mennekes)
offer?** - -This rendering asks information about the property [socket:type2:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2:current) -This is rendered with `
Type 2 (mennekes)
outputs at most {socket:type2:current}A` - - - - - **
Type 2 (mennekes)
outputs at most 16 A** corresponds with socket:socket:type2:current=16 A - - **
Type 2 (mennekes)
outputs at most 32 A** corresponds with socket:socket:type2:current=32 A - - - - -### power-output-7 - - - -The question is **What power output does a single plug of type
Type 2 (mennekes)
offer?** - -This rendering asks information about the property [socket:type2:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2:output) -This is rendered with `
Type 2 (mennekes)
outputs at most {socket:type2:output}` - - - - - **
Type 2 (mennekes)
outputs at most 11 kw** corresponds with socket:socket:type2:output=11 kw - - **
Type 2 (mennekes)
outputs at most 22 kw** corresponds with socket:socket:type2:output=22 kw - - - - -### voltage-8 - - - -The question is **What voltage do the plugs with
Type 2 CCS (mennekes)
offer?** - -This rendering asks information about the property [socket:type2_combo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:voltage) -This is rendered with `
Type 2 CCS (mennekes)
outputs {socket:type2_combo:voltage} volt` - - - - - **
Type 2 CCS (mennekes)
outputs 500 volt** corresponds with socket:socket:type2_combo:voltage=500 V - - **
Type 2 CCS (mennekes)
outputs 920 volt** corresponds with socket:socket:type2_combo:voltage=920 V - - - - -### current-8 - - - -The question is **What current do the plugs with
Type 2 CCS (mennekes)
offer?** - -This rendering asks information about the property [socket:type2_combo:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:current) -This is rendered with `
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:current}A` - - - - - **
Type 2 CCS (mennekes)
outputs at most 125 A** corresponds with socket:socket:type2_combo:current=125 A - - **
Type 2 CCS (mennekes)
outputs at most 350 A** corresponds with socket:socket:type2_combo:current=350 A - - - - -### power-output-8 - - - -The question is **What power output does a single plug of type
Type 2 CCS (mennekes)
offer?** - -This rendering asks information about the property [socket:type2_combo:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:output) -This is rendered with `
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:output}` - - - - - **
Type 2 CCS (mennekes)
outputs at most 50 kw** corresponds with socket:socket:type2_combo:output=50 kw - - - - -### voltage-9 - - - -The question is **What voltage do the plugs with
Type 2 with cable (mennekes)
offer?** - -This rendering asks information about the property [socket:type2_cable:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:voltage) -This is rendered with `
Type 2 with cable (mennekes)
outputs {socket:type2_cable:voltage} volt` - - - - - **
Type 2 with cable (mennekes)
outputs 230 volt** corresponds with socket:socket:type2_cable:voltage=230 V - - **
Type 2 with cable (mennekes)
outputs 400 volt** corresponds with socket:socket:type2_cable:voltage=400 V - - - - -### current-9 - - - -The question is **What current do the plugs with
Type 2 with cable (mennekes)
offer?** - -This rendering asks information about the property [socket:type2_cable:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:current) -This is rendered with `
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:current}A` - - - - - **
Type 2 with cable (mennekes)
outputs at most 16 A** corresponds with socket:socket:type2_cable:current=16 A - - **
Type 2 with cable (mennekes)
outputs at most 32 A** corresponds with socket:socket:type2_cable:current=32 A - - - - -### power-output-9 - - - -The question is **What power output does a single plug of type
Type 2 with cable (mennekes)
offer?** - -This rendering asks information about the property [socket:type2_cable:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:output) -This is rendered with `
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:output}` - - - - - **
Type 2 with cable (mennekes)
outputs at most 11 kw** corresponds with socket:socket:type2_cable:output=11 kw - - **
Type 2 with cable (mennekes)
outputs at most 22 kw** corresponds with socket:socket:type2_cable:output=22 kw - - - - -### voltage-10 - - - -The question is **What voltage do the plugs with
Tesla Supercharger CCS (a branded type2_css)
offer?** - -This rendering asks information about the property [socket:tesla_supercharger_ccs:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:voltage) -This is rendered with `
Tesla Supercharger CCS (a branded type2_css)
outputs {socket:tesla_supercharger_ccs:voltage} volt` - - - - - **
Tesla Supercharger CCS (a branded type2_css)
outputs 500 volt** corresponds with socket:socket:tesla_supercharger_ccs:voltage=500 V - - **
Tesla Supercharger CCS (a branded type2_css)
outputs 920 volt** corresponds with socket:socket:tesla_supercharger_ccs:voltage=920 V - - - - -### current-10 - - - -The question is **What current do the plugs with
Tesla Supercharger CCS (a branded type2_css)
offer?** - -This rendering asks information about the property [socket:tesla_supercharger_ccs:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:current) -This is rendered with `
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:current}A` - - - - - **
Tesla Supercharger CCS (a branded type2_css)
outputs at most 125 A** corresponds with socket:socket:tesla_supercharger_ccs:current=125 A - - **
Tesla Supercharger CCS (a branded type2_css)
outputs at most 350 A** corresponds with socket:socket:tesla_supercharger_ccs:current=350 A - - - - -### power-output-10 - - - -The question is **What power output does a single plug of type
Tesla Supercharger CCS (a branded type2_css)
offer?** - -This rendering asks information about the property [socket:tesla_supercharger_ccs:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:output) -This is rendered with `
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:output}` - - - - - **
Tesla Supercharger CCS (a branded type2_css)
outputs at most 50 kw** corresponds with socket:socket:tesla_supercharger_ccs:output=50 kw - - - - -### voltage-11 - - - -The question is **What voltage do the plugs with
Tesla Supercharger (destination)
offer?** - -This rendering asks information about the property [socket:tesla_destination:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:voltage) -This is rendered with `
Tesla Supercharger (destination)
outputs {socket:tesla_destination:voltage} volt` - - - - - **
Tesla Supercharger (destination)
outputs 480 volt** corresponds with socket:socket:tesla_destination:voltage=480 V - - - - -### current-11 - - - -The question is **What current do the plugs with
Tesla Supercharger (destination)
offer?** - -This rendering asks information about the property [socket:tesla_destination:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:current) -This is rendered with `
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:current}A` - - - - - **
Tesla Supercharger (destination)
outputs at most 125 A** corresponds with socket:socket:tesla_destination:current=125 A - - **
Tesla Supercharger (destination)
outputs at most 350 A** corresponds with socket:socket:tesla_destination:current=350 A - - - - -### power-output-11 - - - -The question is **What power output does a single plug of type
Tesla Supercharger (destination)
offer?** - -This rendering asks information about the property [socket:tesla_destination:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:output) -This is rendered with `
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:output}` - - - - - **
Tesla Supercharger (destination)
outputs at most 120 kw** corresponds with socket:socket:tesla_destination:output=120 kw - - **
Tesla Supercharger (destination)
outputs at most 150 kw** corresponds with socket:socket:tesla_destination:output=150 kw - - **
Tesla Supercharger (destination)
outputs at most 250 kw** corresponds with socket:socket:tesla_destination:output=250 kw - - - - -### voltage-12 - - - -The question is **What voltage do the plugs with
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
offer?** - -This rendering asks information about the property [socket:tesla_destination:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:voltage) -This is rendered with `
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs {socket:tesla_destination:voltage} volt` - - - - - **
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs 230 volt** corresponds with socket:socket:tesla_destination:voltage=230 V - - **
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs 400 volt** corresponds with socket:socket:tesla_destination:voltage=400 V - - - - -### current-12 - - - -The question is **What current do the plugs with
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
offer?** - -This rendering asks information about the property [socket:tesla_destination:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:current) -This is rendered with `
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:current}A` - - - - - **
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs at most 16 A** corresponds with socket:socket:tesla_destination:current=16 A - - **
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs at most 32 A** corresponds with socket:socket:tesla_destination:current=32 A - - - - -### power-output-12 - - - -The question is **What power output does a single plug of type
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
offer?** - -This rendering asks information about the property [socket:tesla_destination:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:output) -This is rendered with `
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:output}` - - - - - **
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs at most 11 kw** corresponds with socket:socket:tesla_destination:output=11 kw - - **
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs at most 22 kw** corresponds with socket:socket:tesla_destination:output=22 kw - - - - -### voltage-13 - - - -The question is **What voltage do the plugs with
USB to charge phones and small electronics
offer?** - -This rendering asks information about the property [socket:USB-A:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:voltage) -This is rendered with `
USB to charge phones and small electronics
outputs {socket:USB-A:voltage} volt` - - - - - **
USB to charge phones and small electronics
outputs 5 volt** corresponds with socket:socket:USB-A:voltage=5 V - - - - -### current-13 - - - -The question is **What current do the plugs with
USB to charge phones and small electronics
offer?** - -This rendering asks information about the property [socket:USB-A:current](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:current) -This is rendered with `
USB to charge phones and small electronics
outputs at most {socket:USB-A:current}A` - - - - - **
USB to charge phones and small electronics
outputs at most 1 A** corresponds with socket:socket:USB-A:current=1 A - - **
USB to charge phones and small electronics
outputs at most 2 A** corresponds with socket:socket:USB-A:current=2 A - - - - -### power-output-13 - - - -The question is **What power output does a single plug of type
USB to charge phones and small electronics
offer?** - -This rendering asks information about the property [socket:USB-A:output](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:output) -This is rendered with `
USB to charge phones and small electronics
outputs at most {socket:USB-A:output}` - - - - - **
USB to charge phones and small electronics
outputs at most 5w** corresponds with socket:socket:USB-A:output=5w - - **
USB to charge phones and small electronics
outputs at most 10w** corresponds with socket:socket:USB-A:output=10w - - - - -### voltage-14 - - - -The question is **What voltage do the plugs with
Bosch Active Connect with 3 pins and cable
offer?** - -This rendering asks information about the property [socket:bosch_3pin:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:voltage) -This is rendered with `
Bosch Active Connect with 3 pins and cable
outputs {socket:bosch_3pin:voltage} volt` - - - - - - - - -### current-14 - - - -The question is **What current do the plugs with
Bosch Active Connect with 3 pins and cable
offer?** - -This rendering asks information about the property [socket:bosch_3pin:current](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:current) -This is rendered with `
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:current}A` - - - - - - - - -### power-output-14 - - - -The question is **What power output does a single plug of type
Bosch Active Connect with 3 pins and cable
offer?** - -This rendering asks information about the property [socket:bosch_3pin:output](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:output) -This is rendered with `
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:output}` - - - - - - - - -### voltage-15 - - - -The question is **What voltage do the plugs with
Bosch Active Connect with 5 pins and cable
offer?** - -This rendering asks information about the property [socket:bosch_5pin:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:voltage) -This is rendered with `
Bosch Active Connect with 5 pins and cable
outputs {socket:bosch_5pin:voltage} volt` - - - - - - - - -### current-15 - - - -The question is **What current do the plugs with
Bosch Active Connect with 5 pins and cable
offer?** - -This rendering asks information about the property [socket:bosch_5pin:current](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:current) -This is rendered with `
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:current}A` - - - - - - - - -### power-output-15 - - - -The question is **What power output does a single plug of type
Bosch Active Connect with 5 pins and cable
offer?** - -This rendering asks information about the property [socket:bosch_5pin:output](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:output) -This is rendered with `
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:output}` - - - - - - - - -### OH - +This rendering asks information about the +property [socket:bosch_5pin](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin) +This is rendered +with `There are {socket:bosch_5pin} plugs of type
Bosch Active Connect with 5 pins and cable
available here` +### voltage-0 + +The question is **What voltage do the plugs with
Schuko wall plug without +ground pin (CEE7/4 type +F)
+offer?** + +This rendering asks information about the +property [socket:schuko:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:voltage) +This is rendered +with `
Schuko wall plug without ground pin (CEE7/4 type F)
outputs {socket:schuko:voltage} volt` + +- **
Schuko wall plug without ground pin (CEE7/4 type + F)
+ outputs 230 volt** corresponds + with socket:socket: + schuko:voltage + =230 V + +### current-0 + +The question is **What current do the plugs with
Schuko wall plug without +ground pin (CEE7/4 type +F)
+offer?** + +This rendering asks information about the +property [socket:schuko:current](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:current) +This is rendered +with `
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:current}A` + +- **
Schuko wall plug without ground pin (CEE7/4 type + F)
+ outputs at most 16 A** corresponds + with socket:socket: + schuko:current + =16 A + +### power-output-0 + +The question is **What power output does a single plug of type
Schuko wall +plug without ground pin (CEE7/4 type +F)
+offer?** + +This rendering asks information about the +property [socket:schuko:output](https://wiki.openstreetmap.org/wiki/Key:socket:schuko:output) +This is rendered +with `
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:output}` + +- **
Schuko wall plug without ground pin (CEE7/4 type + F)
+ outputs at most 3.6 kw** corresponds + with socket:socket: + schuko:output + =3.6 kw + +### voltage-1 + +The question is **What voltage do the plugs with
European wall plug with +ground pin (CEE7/4 type +E)
offer?** + +This rendering asks information about the +property [socket:typee:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:typee:voltage) +This is rendered +with `
European wall plug with ground pin (CEE7/4 type E)
outputs {socket:typee:voltage} volt` + +- **
European wall plug with ground pin (CEE7/4 type + E)
outputs + 230 volt** corresponds + with socket:socket: + typee:voltage + =230 V + +### current-1 + +The question is **What current do the plugs with
European wall plug with +ground pin (CEE7/4 type +E)
offer?** + +This rendering asks information about the +property [socket:typee:current](https://wiki.openstreetmap.org/wiki/Key:socket:typee:current) +This is rendered +with `
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:current}A` + +- **
European wall plug with ground pin (CEE7/4 type + E)
outputs + at most 16 A** corresponds + with socket:socket: + typee:current + =16 A + +### power-output-1 + +The question is **What power output does a single plug of type
European wall +plug with ground pin (CEE7/4 type +E)
offer?** + +This rendering asks information about the +property [socket:typee:output](https://wiki.openstreetmap.org/wiki/Key:socket:typee:output) +This is rendered +with `
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:output}` + +- **
European wall plug with ground pin (CEE7/4 type + E)
outputs + at most 3 kw** corresponds + with socket:socket:typee: + output=3 + kw +- **
European wall plug with ground pin (CEE7/4 type + E)
outputs + at most 22 kw** corresponds + with socket:socket:typee: + output=22 + kw + +### voltage-2 + +The question is **What voltage do the plugs with
+Chademo
+offer?** + +This rendering asks information about the +property [socket:chademo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:voltage) +This is rendered +with `
Chademo
outputs {socket:chademo:voltage} volt` + +- **
+ Chademo
+ outputs 500 volt** corresponds + with socket:socket: + chademo:voltage + =500 V + +### current-2 + +The question is **What current do the plugs with
+Chademo
+offer?** + +This rendering asks information about the +property [socket:chademo:current](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:current) +This is rendered +with `
Chademo
outputs at most {socket:chademo:current}A` + +- **
+ Chademo
+ outputs at most 120 A** corresponds + with socket:socket: + chademo:current + =120 A + +### power-output-2 + +The question is **What power output does a single plug of type
+Chademo
+offer?** + +This rendering asks information about the +property [socket:chademo:output](https://wiki.openstreetmap.org/wiki/Key:socket:chademo:output) +This is rendered +with `
Chademo
outputs at most {socket:chademo:output}` + +- **
+ Chademo
+ outputs at most 50 kw** corresponds + with socket:socket: + chademo:output + =50 kw + +### voltage-3 + +The question is **What voltage do the plugs with
Type 1 with cable ( +J1772)
+offer?** + +This rendering asks information about the +property [socket:type1_cable:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:voltage) +This is rendered +with `
Type 1 with cable (J1772)
outputs {socket:type1_cable:voltage} volt` + +- **
Type 1 with cable ( + J1772)
+ outputs 200 volt** corresponds + with socket: + socket:type1_cable:voltage + =200 V +- **
Type 1 with cable ( + J1772)
+ outputs 240 volt** corresponds + with socket: + socket:type1_cable:voltage + =240 V + +### current-3 + +The question is **What current do the plugs with
Type 1 with cable ( +J1772)
+offer?** + +This rendering asks information about the +property [socket:type1_cable:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:current) +This is rendered +with `
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:current}A` + +- **
Type 1 with cable ( + J1772)
+ outputs at most 32 A** corresponds + with socket: + socket:type1_cable:current + =32 A + +### power-output-3 + +The question is **What power output does a single plug of type
Type 1 with +cable ( +J1772)
+offer?** + +This rendering asks information about the +property [socket:type1_cable:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1_cable:output) +This is rendered +with `
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:output}` + +- **
Type 1 with cable ( + J1772)
+ outputs at most 3.7 kw** corresponds + with socket:socket: + type1_cable:output + =3.7 + kw +- **
Type 1 with cable ( + J1772)
+ outputs at most 7 kw** corresponds + with socket:socket: + type1_cable:output + =7 kw + +### voltage-4 + +The question is **What voltage do the plugs with
Type 1 without +cable ( +J1772)
+offer?** + +This rendering asks information about the +property [socket:type1:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1:voltage) +This is rendered +with `
Type 1 without cable (J1772)
outputs {socket:type1:voltage} volt` + +- **
Type 1 without cable ( + J1772)
+ outputs 200 volt** corresponds + with socket:socket: + type1:voltage + =200 V +- **
Type 1 without cable ( + J1772)
+ outputs 240 volt** corresponds + with socket:socket: + type1:voltage + =240 V + +### current-4 + +The question is **What current do the plugs with
Type 1 without +cable ( +J1772)
+offer?** + +This rendering asks information about the +property [socket:type1:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1:current) +This is rendered +with `
Type 1 without cable (J1772)
outputs at most {socket:type1:current}A` + +- **
Type 1 without cable ( + J1772)
+ outputs at most 32 A** corresponds + with socket:socket: + type1:current + =32 A + +### power-output-4 + +The question is **What power output does a single plug of type
Type 1 +without cable ( +J1772)
+offer?** + +This rendering asks information about the +property [socket:type1:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1:output) +This is rendered +with `
Type 1 without cable (J1772)
outputs at most {socket:type1:output}` + +- **
Type 1 without cable ( + J1772)
+ outputs at most 3.7 kw** corresponds + with socket:socket:type1: + output=3.7 + kw +- **
Type 1 without cable ( + J1772)
+ outputs at most 6.6 kw** corresponds + with socket:socket:type1: + output=6.6 + kw +- **
Type 1 without cable ( + J1772)
+ outputs at most 7 kw** corresponds + with socket:socket:type1: + output=7 + kw +- **
Type 1 without cable ( + J1772)
+ outputs at most 7.2 kw** corresponds + with socket:socket:type1: + output=7.2 + kw + +### voltage-5 + +The question is **What voltage do the plugs with
Type 1 CCS (aka Type 1 +Combo)
+offer?** + +This rendering asks information about the +property [socket:type1_combo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:voltage) +This is rendered +with `
Type 1 CCS (aka Type 1 Combo)
outputs {socket:type1_combo:voltage} volt` + +- **
Type 1 CCS (aka Type 1 + Combo)
+ outputs 400 volt** corresponds + with socket: + socket:type1_combo:voltage + =400 V +- **
Type 1 CCS (aka Type 1 + Combo)
+ outputs 1000 volt** corresponds + with socket: + socket:type1_combo:voltage + =1000 + V + +### current-5 + +The question is **What current do the plugs with
Type 1 CCS (aka Type 1 +Combo)
+offer?** + +This rendering asks information about the +property [socket:type1_combo:current](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:current) +This is rendered +with `
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:current}A` + +- **
Type 1 CCS (aka Type 1 + Combo)
+ outputs at most 50 A** corresponds + with socket: + socket:type1_combo:current + =50 A +- **
Type 1 CCS (aka Type 1 + Combo)
+ outputs at most 125 A** corresponds + with socket: + socket:type1_combo:current + =125 A + +### power-output-5 + +The question is **What power output does a single plug of type
Type 1 CCS ( +aka Type 1 +Combo)
+offer?** + +This rendering asks information about the +property [socket:type1_combo:output](https://wiki.openstreetmap.org/wiki/Key:socket:type1_combo:output) +This is rendered +with `
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:output}` + +- **
Type 1 CCS (aka Type 1 + Combo)
+ outputs at most 50 kw** corresponds + with socket:socket: + type1_combo:output + =50 kw +- **
Type 1 CCS (aka Type 1 + Combo)
+ outputs at most 62.5 kw** corresponds + with socket:socket: + type1_combo:output + =62.5 + kw +- **
Type 1 CCS (aka Type 1 + Combo)
+ outputs at most 150 kw** corresponds + with socket:socket: + type1_combo:output + =150 + kw +- **
Type 1 CCS (aka Type 1 + Combo)
+ outputs at most 350 kw** corresponds + with socket:socket: + type1_combo:output + =350 + kw + +### voltage-6 + +The question is **What voltage do the plugs with
Tesla +Supercharger
+offer?** + +This rendering asks information about the +property [socket:tesla_supercharger:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:voltage) +This is rendered +with `
Tesla Supercharger
outputs {socket:tesla_supercharger:voltage} volt` + +- **
Tesla + Supercharger
+ outputs 480 volt** corresponds + with + socket:socket:tesla_supercharger:voltage + = + 480 V + +### current-6 + +The question is **What current do the plugs with
Tesla +Supercharger
+offer?** + +This rendering asks information about the +property [socket:tesla_supercharger:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:current) +This is rendered +with `
Tesla Supercharger
outputs at most {socket:tesla_supercharger:current}A` + +- **
Tesla + Supercharger
+ outputs at most 125 A** corresponds + with + socket:socket:tesla_supercharger:current + = + 125 A +- **
Tesla + Supercharger
+ outputs at most 350 A** corresponds + with + socket:socket:tesla_supercharger:current + = + 350 A + +### power-output-6 + +The question is **What power output does a single plug of type
Tesla +Supercharger
+offer?** + +This rendering asks information about the +property [socket:tesla_supercharger:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger:output) +This is rendered +with `
Tesla Supercharger
outputs at most {socket:tesla_supercharger:output}` + +- **
Tesla + Supercharger
+ outputs at most 120 kw** corresponds + with socket: + socket:tesla_supercharger:output + = + 120 kw +- **
Tesla + Supercharger
+ outputs at most 150 kw** corresponds + with socket: + socket:tesla_supercharger:output + = + 150 kw +- **
Tesla + Supercharger
+ outputs at most 250 kw** corresponds + with socket: + socket:tesla_supercharger:output + = + 250 kw + +### voltage-7 + +The question is **What voltage do the plugs with
Type 2 ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2:voltage) +This is rendered +with `
Type 2 (mennekes)
outputs {socket:type2:voltage} volt` + +- **
Type 2 ( + mennekes)
+ outputs 230 volt** corresponds + with socket:socket: + type2:voltage + =230 V +- **
Type 2 ( + mennekes)
+ outputs 400 volt** corresponds + with socket:socket: + type2:voltage + =400 V + +### current-7 + +The question is **What current do the plugs with
Type 2 ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2:current) +This is rendered +with `
Type 2 (mennekes)
outputs at most {socket:type2:current}A` + +- **
Type 2 ( + mennekes)
+ outputs at most 16 A** corresponds + with socket:socket: + type2:current + =16 A +- **
Type 2 ( + mennekes)
+ outputs at most 32 A** corresponds + with socket:socket: + type2:current + =32 A + +### power-output-7 + +The question is **What power output does a single plug of type
Type 2 ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2:output) +This is rendered +with `
Type 2 (mennekes)
outputs at most {socket:type2:output}` + +- **
Type 2 ( + mennekes)
+ outputs at most 11 kw** corresponds + with socket:socket:type2: + output=11 + kw +- **
Type 2 ( + mennekes)
+ outputs at most 22 kw** corresponds + with socket:socket:type2: + output=22 + kw + +### voltage-8 + +The question is **What voltage do the plugs with
Type 2 CCS ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2_combo:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:voltage) +This is rendered +with `
Type 2 CCS (mennekes)
outputs {socket:type2_combo:voltage} volt` + +- **
Type 2 CCS ( + mennekes)
+ outputs 500 volt** corresponds + with socket: + socket:type2_combo:voltage + =500 V +- **
Type 2 CCS ( + mennekes)
+ outputs 920 volt** corresponds + with socket: + socket:type2_combo:voltage + =920 V + +### current-8 + +The question is **What current do the plugs with
Type 2 CCS ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2_combo:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:current) +This is rendered +with `
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:current}A` + +- **
Type 2 CCS ( + mennekes)
+ outputs at most 125 A** corresponds + with socket: + socket:type2_combo:current + =125 A +- **
Type 2 CCS ( + mennekes)
+ outputs at most 350 A** corresponds + with socket: + socket:type2_combo:current + =350 A + +### power-output-8 + +The question is **What power output does a single plug of type
Type 2 CCS ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2_combo:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2_combo:output) +This is rendered +with `
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:output}` + +- **
Type 2 CCS ( + mennekes)
+ outputs at most 50 kw** corresponds + with socket:socket: + type2_combo:output + =50 kw + +### voltage-9 + +The question is **What voltage do the plugs with
Type 2 with cable ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2_cable:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:voltage) +This is rendered +with `
Type 2 with cable (mennekes)
outputs {socket:type2_cable:voltage} volt` + +- **
Type 2 with cable ( + mennekes)
+ outputs 230 volt** corresponds + with socket: + socket:type2_cable:voltage + =230 V +- **
Type 2 with cable ( + mennekes)
+ outputs 400 volt** corresponds + with socket: + socket:type2_cable:voltage + =400 V + +### current-9 + +The question is **What current do the plugs with
Type 2 with cable ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2_cable:current](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:current) +This is rendered +with `
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:current}A` + +- **
Type 2 with cable ( + mennekes)
+ outputs at most 16 A** corresponds + with socket: + socket:type2_cable:current + =16 A +- **
Type 2 with cable ( + mennekes)
+ outputs at most 32 A** corresponds + with socket: + socket:type2_cable:current + =32 A + +### power-output-9 + +The question is **What power output does a single plug of type
Type 2 with +cable ( +mennekes)
+offer?** + +This rendering asks information about the +property [socket:type2_cable:output](https://wiki.openstreetmap.org/wiki/Key:socket:type2_cable:output) +This is rendered +with `
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:output}` + +- **
Type 2 with cable ( + mennekes)
+ outputs at most 11 kw** corresponds + with socket:socket: + type2_cable:output + =11 kw +- **
Type 2 with cable ( + mennekes)
+ outputs at most 22 kw** corresponds + with socket:socket: + type2_cable:output + =22 kw + +### voltage-10 + +The question is **What voltage do the plugs with
Tesla Supercharger CCS (a +branded +type2_css)
+offer?** + +This rendering asks information about the +property [socket:tesla_supercharger_ccs:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:voltage) +This is rendered +with `
Tesla Supercharger CCS (a branded type2_css)
outputs {socket:tesla_supercharger_ccs:voltage} volt` + +- **
Tesla Supercharger CCS (a branded + type2_css)
+ outputs 500 volt** corresponds + with + socket:socket:tesla_supercharger_ccs:voltage + = + 500 V +- **
Tesla Supercharger CCS (a branded + type2_css)
+ outputs 920 volt** corresponds + with + socket:socket:tesla_supercharger_ccs:voltage + = + 920 V + +### current-10 + +The question is **What current do the plugs with
Tesla Supercharger CCS (a +branded +type2_css)
+offer?** + +This rendering asks information about the +property [socket:tesla_supercharger_ccs:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:current) +This is rendered +with `
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:current}A` + +- **
Tesla Supercharger CCS (a branded + type2_css)
+ outputs at most 125 A** corresponds + with + socket:socket:tesla_supercharger_ccs:current + = + 125 A +- **
Tesla Supercharger CCS (a branded + type2_css)
+ outputs at most 350 A** corresponds + with + socket:socket:tesla_supercharger_ccs:current + = + 350 A + +### power-output-10 + +The question is **What power output does a single plug of type
Tesla +Supercharger CCS (a branded +type2_css)
+offer?** + +This rendering asks information about the +property [socket:tesla_supercharger_ccs:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_supercharger_ccs:output) +This is rendered +with `
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:output}` + +- **
Tesla Supercharger CCS (a branded + type2_css)
+ outputs at most 50 kw** corresponds + with + socket:socket:tesla_supercharger_ccs:output + = + 50 kw + +### voltage-11 + +The question is **What voltage do the plugs with
Tesla Supercharger ( +destination)
+offer?** + +This rendering asks information about the +property [socket:tesla_destination:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:voltage) +This is rendered +with `
Tesla Supercharger (destination)
outputs {socket:tesla_destination:voltage} volt` + +- **
Tesla Supercharger ( + destination)
+ outputs 480 volt** corresponds + with socket: + socket:tesla_destination:voltage + =480 + V + +### current-11 + +The question is **What current do the plugs with
Tesla Supercharger ( +destination)
+offer?** + +This rendering asks information about the +property [socket:tesla_destination:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:current) +This is rendered +with `
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:current}A` + +- **
Tesla Supercharger ( + destination)
+ outputs at most 125 A** corresponds + with socket: + socket:tesla_destination:current + =125 + A +- **
Tesla Supercharger ( + destination)
+ outputs at most 350 A** corresponds + with socket: + socket:tesla_destination:current + =350 + A + +### power-output-11 + +The question is **What power output does a single plug of type
Tesla +Supercharger ( +destination)
+offer?** + +This rendering asks information about the +property [socket:tesla_destination:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:output) +This is rendered +with `
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:output}` + +- **
Tesla Supercharger ( + destination)
+ outputs at most 120 kw** corresponds + with socket: + socket:tesla_destination:output + =120 + kw +- **
Tesla Supercharger ( + destination)
+ outputs at most 150 kw** corresponds + with socket: + socket:tesla_destination:output + =150 + kw +- **
Tesla Supercharger ( + destination)
+ outputs at most 250 kw** corresponds + with socket: + socket:tesla_destination:output + =250 + kw + +### voltage-12 + +The question is **What voltage do the plugs with
Tesla supercharger ( +destination) (A Type 2 with cable branded as +tesla)
+offer?** + +This rendering asks information about the +property [socket:tesla_destination:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:voltage) +This is rendered +with `
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs {socket:tesla_destination:voltage} volt` + +- **
Tesla supercharger (destination) (A Type 2 with cable branded as + tesla)
+ outputs 230 volt** corresponds + with socket: + socket:tesla_destination:voltage + =230 + V +- **
Tesla supercharger (destination) (A Type 2 with cable branded as + tesla)
+ outputs 400 volt** corresponds + with socket: + socket:tesla_destination:voltage + =400 + V + +### current-12 + +The question is **What current do the plugs with
Tesla supercharger ( +destination) (A Type 2 with cable branded as +tesla)
+offer?** + +This rendering asks information about the +property [socket:tesla_destination:current](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:current) +This is rendered +with `
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:current}A` + +- **
Tesla supercharger (destination) (A Type 2 with cable branded as + tesla)
+ outputs at most 16 A** corresponds + with socket: + socket:tesla_destination:current + =16 + A +- **
Tesla supercharger (destination) (A Type 2 with cable branded as + tesla)
+ outputs at most 32 A** corresponds + with socket: + socket:tesla_destination:current + =32 + A + +### power-output-12 + +The question is **What power output does a single plug of type
Tesla +supercharger (destination) (A Type 2 with cable branded as +tesla)
+offer?** + +This rendering asks information about the +property [socket:tesla_destination:output](https://wiki.openstreetmap.org/wiki/Key:socket:tesla_destination:output) +This is rendered +with `
Tesla supercharger (destination) (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:output}` + +- **
Tesla supercharger (destination) (A Type 2 with cable branded as + tesla)
+ outputs at most 11 kw** corresponds + with socket: + socket:tesla_destination:output + =11 + kw +- **
Tesla supercharger (destination) (A Type 2 with cable branded as + tesla)
+ outputs at most 22 kw** corresponds + with socket: + socket:tesla_destination:output + =22 + kw + +### voltage-13 + +The question is **What voltage do the plugs with
USB to charge phones and +small +electronics
+offer?** + +This rendering asks information about the +property [socket:USB-A:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:voltage) +This is rendered +with `
USB to charge phones and small electronics
outputs {socket:USB-A:voltage} volt` + +- **
USB to charge phones and small + electronics
+ outputs 5 volt** corresponds + with socket:socket: + USB-A:voltage= + 5 V + +### current-13 + +The question is **What current do the plugs with
USB to charge phones and +small +electronics
+offer?** + +This rendering asks information about the +property [socket:USB-A:current](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:current) +This is rendered +with `
USB to charge phones and small electronics
outputs at most {socket:USB-A:current}A` + +- **
USB to charge phones and small + electronics
+ outputs at most 1 A** corresponds + with socket:socket: + USB-A:current= + 1 A +- **
USB to charge phones and small + electronics
+ outputs at most 2 A** corresponds + with socket:socket: + USB-A:current= + 2 A + +### power-output-13 + +The question is **What power output does a single plug of type
USB to +charge phones and small +electronics
+offer?** + +This rendering asks information about the +property [socket:USB-A:output](https://wiki.openstreetmap.org/wiki/Key:socket:USB-A:output) +This is rendered +with `
USB to charge phones and small electronics
outputs at most {socket:USB-A:output}` + +- **
USB to charge phones and small + electronics
+ outputs at most 5w** corresponds + with socket:socket:USB-A: + output=5w +- **
USB to charge phones and small + electronics
+ outputs at most 10w** corresponds + with socket:socket:USB-A: + output=10w + +### voltage-14 + +The question is **What voltage do the plugs with
Bosch Active Connect with 3 +pins and +cable
+offer?** + +This rendering asks information about the +property [socket:bosch_3pin:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:voltage) +This is rendered +with `
Bosch Active Connect with 3 pins and cable
outputs {socket:bosch_3pin:voltage} volt` + +### current-14 + +The question is **What current do the plugs with
Bosch Active Connect with 3 +pins and +cable
+offer?** + +This rendering asks information about the +property [socket:bosch_3pin:current](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:current) +This is rendered +with `
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:current}A` + +### power-output-14 + +The question is **What power output does a single plug of type
Bosch Active +Connect with 3 pins and +cable
+offer?** + +This rendering asks information about the +property [socket:bosch_3pin:output](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_3pin:output) +This is rendered +with `
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:output}` + +### voltage-15 + +The question is **What voltage do the plugs with
Bosch Active Connect with 5 +pins and +cable
+offer?** + +This rendering asks information about the +property [socket:bosch_5pin:voltage](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:voltage) +This is rendered +with `
Bosch Active Connect with 5 pins and cable
outputs {socket:bosch_5pin:voltage} volt` + +### current-15 + +The question is **What current do the plugs with
Bosch Active Connect with 5 +pins and +cable
+offer?** + +This rendering asks information about the +property [socket:bosch_5pin:current](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:current) +This is rendered +with `
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:current}A` + +### power-output-15 + +The question is **What power output does a single plug of type
Bosch Active +Connect with 5 pins and +cable
+offer?** + +This rendering asks information about the +property [socket:bosch_5pin:output](https://wiki.openstreetmap.org/wiki/Key:socket:bosch_5pin:output) +This is rendered +with `
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:output}` + +### OH The question is **When is this charging station opened?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `{opening_hours_table(opening_hours)}` +- **24/7 opened (including holidays)** corresponds + with opening_hours + =24/7 - - - **24/7 opened (including holidays)** corresponds with opening_hours=24/7 - - - - -### fee - - +### fee The question is **Does one have to pay to use this charging station?** +- **Free to use** corresponds with fee + =no_This option cannot be chosen as + answer_ +- **Free to use (without authenticating)** corresponds + with fee + =no + &authentication:none + =yes +- **Free to use, but one has to authenticate** corresponds + with fee + =no + &authentication:none + =no +- **Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station** corresponds + with fee + =yes + &fee:conditional + =no @ customers +- **Paid use** corresponds with fee + =yes - - - - - **Free to use** corresponds with fee=no_This option cannot be chosen as answer_ - - **Free to use (without authenticating)** corresponds with fee=no&authentication:none=yes - - **Free to use, but one has to authenticate** corresponds with fee=no&authentication:none=no - - **Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station** corresponds with fee=yes&fee:conditional=no @ customers - - **Paid use** corresponds with fee=yes - - - - -### charge - - +### charge The question is **How much does one have to pay to use this charging station?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `Using this charging station costs {charge}` - - -### payment-options - - +### payment-options The question is **Which methods of payment are accepted here?** +- **Cash is accepted here** corresponds + with payment:cash + =yesUnselecting this answer + will add payment:cash + =no +- **Payment cards are accepted here** corresponds + with payment:cards + =yesUnselecting this answer + will add payment:cards + =no +- **Payment is done using a dedicated app** corresponds + with payment:app + =yesUnselecting this answer + will add payment:app + =no +- **Payment is done using a membership card** corresponds + with payment: + membership_card= + yesUnselecting this answer will + add payment: + membership_card= + no - - - - - **Cash is accepted here** corresponds with payment:cash=yesUnselecting this answer will add payment:cash=no - - **Payment cards are accepted here** corresponds with payment:cards=yesUnselecting this answer will add payment:cards=no - - **Payment is done using a dedicated app** corresponds with payment:app=yesUnselecting this answer will add payment:app=no - - **Payment is done using a membership card** corresponds with payment:membership_card=yesUnselecting this answer will add payment:membership_card=no - - - - -### Authentication - - +### Authentication The question is **What kind of authentication is available at the charging station?** +- **Authentication by a membership card** corresponds + with authentication: + membership_card + =yes + Unselecting this answer will + add authentication: + membership_card + =no +- **Authentication by an app** corresponds + with authentication:app + =yesUnselecting this + answer will add authentication: + app=no +- **Authentication via phone call is available** corresponds + with authentication: + phone_call= + yesUnselecting this answer will + add authentication: + phone_call=no +- **Authentication via SMS is available** corresponds + with authentication: + short_message + =yes + Unselecting this answer will + add authentication: + short_message= + no +- **Authentication via NFC is available** corresponds + with authentication:nfc + =yesUnselecting this + answer will add authentication: + nfc=no +- **Authentication via Money Card is available** corresponds + with authentication: + money_card= + yesUnselecting this answer will + add authentication: + money_card=no +- **Authentication via debit card is available** corresponds + with authentication: + debit_card= + yesUnselecting this answer will + add authentication: + debit_card=no +- **Charging here is (also) possible without authentication** corresponds + with authentication:none + =yesUnselecting this + answer will add authentication: + none=no - - - - - **Authentication by a membership card** corresponds with authentication:membership_card=yesUnselecting this answer will add authentication:membership_card=no - - **Authentication by an app** corresponds with authentication:app=yesUnselecting this answer will add authentication:app=no - - **Authentication via phone call is available** corresponds with authentication:phone_call=yesUnselecting this answer will add authentication:phone_call=no - - **Authentication via SMS is available** corresponds with authentication:short_message=yesUnselecting this answer will add authentication:short_message=no - - **Authentication via NFC is available** corresponds with authentication:nfc=yesUnselecting this answer will add authentication:nfc=no - - **Authentication via Money Card is available** corresponds with authentication:money_card=yesUnselecting this answer will add authentication:money_card=no - - **Authentication via debit card is available** corresponds with authentication:debit_card=yesUnselecting this answer will add authentication:debit_card=no - - **Charging here is (also) possible without authentication** corresponds with authentication:none=yesUnselecting this answer will add authentication:none=no - - - - -### Auth phone - - +### Auth phone The question is **What's the phone number for authentication call or SMS?** -This rendering asks information about the property [authentication:phone_call:number](https://wiki.openstreetmap.org/wiki/Key:authentication:phone_call:number) -This is rendered with `Authenticate by calling or SMS'ing to {authentication:phone_call:number}` - - - -### maxstay - +This rendering asks information about the +property [authentication:phone_call:number](https://wiki.openstreetmap.org/wiki/Key:authentication:phone_call:number) +This is rendered +with `Authenticate by calling or SMS'ing to {authentication:phone_call:number}` +### maxstay The question is **What is the maximum amount of time one is allowed to stay here?** -This rendering asks information about the property [maxstay](https://wiki.openstreetmap.org/wiki/Key:maxstay) +This rendering asks information about the property [maxstay](https://wiki.openstreetmap.org/wiki/Key:maxstay) This is rendered with `One can stay at most {canonical(maxstay)}` +- **No timelimit on leaving your vehicle here** corresponds + with maxstay + =unlimited - - - **No timelimit on leaving your vehicle here** corresponds with maxstay=unlimited - - - - -### Network - - +### Network The question is **Is this charging station part of a network?** -This rendering asks information about the property [network](https://wiki.openstreetmap.org/wiki/Key:network) +This rendering asks information about the property [network](https://wiki.openstreetmap.org/wiki/Key:network) This is rendered with `Part of the network {network}` +- **Not part of a bigger network, e.g. because the charging station is maintained by a local business** corresponds + with no:network + =yes +- **Not part of a bigger network** corresponds + with network + =none_This option cannot be + chosen as answer_ +- **AeroVironment** corresponds with + network= + AeroVironment +- **Blink** corresponds with network + =Blink +- **EVgo** corresponds with network + =EVgo +- **Allego** corresponds with network + =Allego +- **Blue Corner** corresponds with network + =Blue Corner +- **Tesla** corresponds with network + =Tesla - - - **Not part of a bigger network, e.g. because the charging station is maintained by a local business** corresponds with no:network=yes - - **Not part of a bigger network** corresponds with network=none_This option cannot be chosen as answer_ - - **AeroVironment** corresponds with network=AeroVironment - - **Blink** corresponds with network=Blink - - **EVgo** corresponds with network=EVgo - - **Allego** corresponds with network=Allego - - **Blue Corner** corresponds with network=Blue Corner - - **Tesla** corresponds with network=Tesla - - - - -### Operator - - +### Operator The question is **Who is the operator of this charging station?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `This charging station is operated by {operator}` +- **Actually, {operator} is the network** corresponds with network= - - - **Actually, {operator} is the network** corresponds with network= - - - - -### phone - - +### phone The question is **What number can one call if there is a problem with this charging station?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `In case of problems, call {phone}` - - -### email - - +### email The question is **What is the email address of the operator?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `In case of problems, send an email to {email}` - - -### website - - +### website The question is **What is the website where one can find more information about this charging station?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `More info on {website}` - - -### level - - +### level The question is **On what level is this feature located?** -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) This is rendered with `Located on the {level}th floor` +- **Located underground** corresponds with + location=underground_ + This option cannot be chosen as answer_ +- **Located on the ground floor** corresponds + with level + =0 +- **Located on the ground floor** corresponds with _This option cannot be chosen as answer_ +- **Located on the first floor** corresponds + with level + =1 - - - **Located underground** corresponds with location=underground_This option cannot be chosen as answer_ - - **Located on the ground floor** corresponds with level=0 - - **Located on the ground floor** corresponds with _This option cannot be chosen as answer_ - - **Located on the first floor** corresponds with level=1 - - - - -### ref - - +### ref The question is **What is the reference number of this charging station?** -This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) +This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) This is rendered with `Reference number is {ref}` - - -### Operational status - - +### Operational status The question is **Is this charging point in use?** +- **This charging station works** corresponds + with amenity + =charging_station +- **This charging station is broken** corresponds + with operational_status + =broken + &amenity + =charging_station +- **A charging station is planned here** corresponds + with planned:amenity + = + charging_station +- **A charging station is constructed here** corresponds + with construction:amenity + = + charging_station +- **This charging station has beed permanently disabled and is not in use anymore but is still visible** corresponds + with disused:amenity + = + charging_station - - - - - **This charging station works** corresponds with amenity=charging_station - - **This charging station is broken** corresponds with operational_status=broken&amenity=charging_station - - **A charging station is planned here** corresponds with planned:amenity=charging_station - - **A charging station is constructed here** corresponds with construction:amenity=charging_station - - **This charging station has beed permanently disabled and is not in use anymore but is still visible** corresponds with disused:amenity=charging_station - - - - -### Parking:fee - - +### Parking:fee The question is **Does one have to pay a parking fee while charging?** +- **No additional parking cost while charging** corresponds + with parking:fee + =no +- **An additional parking fee should be paid while charging** corresponds + with parking:fee + =yes - - - - - **No additional parking cost while charging** corresponds with parking:fee=no - - **An additional parking fee should be paid while charging** corresponds with parking:fee=yes - - - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/charging_station/charging_station.json \ No newline at end of file diff --git a/Docs/Layers/climbing.md b/Docs/Layers/climbing.md index 8c340b70b..3a77e5d9b 100644 --- a/Docs/Layers/climbing.md +++ b/Docs/Layers/climbing.md @@ -1,6 +1,4 @@ - - - climbing +climbing ========== @@ -9,15 +7,13 @@ A climbing opportunity - - - ## Table of contents 1. [climbing](#climbing) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [questions](#questions) + [minimap](#minimap) @@ -30,178 +26,106 @@ A climbing opportunity + [reviews](#reviews) +- This layer will automatically load [climbing_route](./climbing_route.md) into the layout as it depends on it: A + calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + contained_climbing_routes_properties) +#### Themes using this layer - - - This layer will automatically load [climbing_route](./climbing_route.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _contained_climbing_routes_properties) - - - - -#### Themes using this layer - - - - - - - [climbing](https://mapcomplete.osm.be/climbing) - +- [climbing](https://mapcomplete.osm.be/climbing) [Go to the source code](../assets/layers/climbing/climbing.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- sport + =climbing +- climbing!~^route$ +- leisure!~^sports_centre$ +- climbing!~^route_top$ +- climbing!~^route_bottom$ - - - sport=climbing - - climbing!~^route$ - - leisure!~^sports_centre$ - - climbing!~^route_top$ - - climbing!~^route_bottom$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:name%3D) [](https://taginfo.openstreetmap.org/keys/climbing#values) [climbing](https://wiki.openstreetmap.org/wiki/Key:climbing) | Multiple choice | [boulder](https://wiki.openstreetmap.org/wiki/Tag:climbing%3Dboulder) [crag](https://wiki.openstreetmap.org/wiki/Tag:climbing%3Dcrag) [area](https://wiki.openstreetmap.org/wiki/Tag:climbing%3Darea) [](https://taginfo.openstreetmap.org/keys/rock#values) [rock](https://wiki.openstreetmap.org/wiki/Key:rock) | [string](../SpecialInputElements.md#string) | [limestone](https://wiki.openstreetmap.org/wiki/Tag:rock%3Dlimestone) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - - - -### Contained routes length hist - - +### Contained routes length hist _This tagrendering has no question and is thus read-only_ - - - - -### Contained routes hist - - +### Contained routes hist _This tagrendering has no question and is thus read-only_ - - - - -### Contained_climbing_routes - - +### Contained_climbing_routes _This tagrendering has no question and is thus read-only_ - - - - -### name - - +### name The question is **What is the name of this climbing opportunity?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `{name}` +- **This climbing opportunity doesn't have a name** corresponds + with noname + =yes - - - **This climbing opportunity doesn't have a name** corresponds with noname=yes - - - - -### Type - - +### Type The question is **What kind of climbing opportunity is this?** +- **A climbing boulder - a single rock or cliff with one or a few climbing routes which can be climbed safely without + rope** corresponds with climbing + =boulder +- **A climbing crag - a single rock or cliff with at least a few climbing routes** corresponds + with climbing + =crag +- **A climbing area with one or more climbing crags and/or boulders** corresponds + with climbing + =area - - - - - **A climbing boulder - a single rock or cliff with one or a few climbing routes which can be climbed safely without rope** corresponds with climbing=boulder - - **A climbing crag - a single rock or cliff with at least a few climbing routes** corresponds with climbing=crag - - **A climbing area with one or more climbing crags and/or boulders** corresponds with climbing=area - - - - -### Rock type (crag/rock/cliff only) - - +### Rock type (crag/rock/cliff only) The question is **What is the rock type here?** -This rendering asks information about the property [rock](https://wiki.openstreetmap.org/wiki/Key:rock) +This rendering asks information about the property [rock](https://wiki.openstreetmap.org/wiki/Key:rock) This is rendered with `The rock type is {rock}` +- **Limestone** corresponds with rock + =limestone - - - **Limestone** corresponds with rock=limestone - - - - -### reviews - - +### reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/climbing/climbing.json \ No newline at end of file diff --git a/Docs/Layers/climbing_club.md b/Docs/Layers/climbing_club.md index 26f51fc51..562cb6137 100644 --- a/Docs/Layers/climbing_club.md +++ b/Docs/Layers/climbing_club.md @@ -1,6 +1,4 @@ - - - climbing_club +climbing_club =============== @@ -9,15 +7,13 @@ A climbing club or organisations - - - ## Table of contents 1. [climbing_club](#climbing_club) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [climbing_club-name](#climbing_club-name) + [minimap](#minimap) + [website](#website) @@ -25,138 +21,89 @@ A climbing club or organisations + [phone](#phone) + [opening_hours](#opening_hours) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [climbing](https://mapcomplete.osm.be/climbing) - +- [climbing](https://mapcomplete.osm.be/climbing) [Go to the source code](../assets/layers/climbing_club/climbing_club.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- club + =climbing + |sport + =climbing&office~^..*$|club~ + ^..*$ - - - club=climbing|sport=climbing&office~^..*$|club~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | - - - - -### climbing_club-name - +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +### climbing_club-name The question is **What is the name of this climbing club or NGO?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `{name}` - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### email - - +### email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` +- **{contact:email}** corresponds with contact:email~^..*$_This + option cannot be chosen as answer_ - - - **{contact:email}** corresponds with contact:email~^..*$_This option cannot be chosen as answer_ - - - - -### phone - - +### phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` +- **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be + chosen as answer_ - - - **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be chosen as answer_ - - - - -### opening_hours - - +### opening_hours The question is **What are the opening hours of {name}?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) -This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` This document is autogenerated from assets/layers/climbing_club/climbing_club.json \ No newline at end of file diff --git a/Docs/Layers/climbing_gym.md b/Docs/Layers/climbing_gym.md index 0e712e307..14a861119 100644 --- a/Docs/Layers/climbing_gym.md +++ b/Docs/Layers/climbing_gym.md @@ -1,6 +1,4 @@ - - - climbing_gym +climbing_gym ============== @@ -9,15 +7,13 @@ A climbing gym - - - ## Table of contents 1. [climbing_gym](#climbing_gym) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [questions](#questions) + [minimap](#minimap) @@ -28,169 +24,100 @@ A climbing gym + [opening_hours](#opening_hours) + [reviews](#reviews) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [climbing](https://mapcomplete.osm.be/climbing) - +- [climbing](https://mapcomplete.osm.be/climbing) [Go to the source code](../assets/layers/climbing_gym/climbing_gym.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- sport + =climbing +- leisure + =sports_centre - - - sport=climbing - - leisure=sports_centre - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - - - -### name - - +### name The question is **What is the name of this climbing gym?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `{name}` - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### phone - - +### phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` +- **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be + chosen as answer_ - - - **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be chosen as answer_ - - - - -### email - - +### email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` +- **{contact:email}** corresponds with contact:email~^..*$_This + option cannot be chosen as answer_ - - - **{contact:email}** corresponds with contact:email~^..*$_This option cannot be chosen as answer_ - - - - -### opening_hours - - +### opening_hours The question is **What are the opening hours of {name}?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` - - -### reviews - - +### reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/climbing_gym/climbing_gym.json \ No newline at end of file diff --git a/Docs/Layers/climbing_route.md b/Docs/Layers/climbing_route.md index 2360020ea..c60b3159c 100644 --- a/Docs/Layers/climbing_route.md +++ b/Docs/Layers/climbing_route.md @@ -1,21 +1,17 @@ - - - climbing_route +climbing_route ================ - - - ## Table of contents 1. [climbing_route](#climbing_route) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [questions](#questions) + [minimap](#minimap) @@ -28,175 +24,116 @@ + [reviews](#reviews) +- This layer is needed as dependency for layer [climbing](#climbing) +#### Themes using this layer - - - This layer is needed as dependency for layer [climbing](#climbing) - - - - -#### Themes using this layer - - - - - - - [climbing](https://mapcomplete.osm.be/climbing) - +- [climbing](https://mapcomplete.osm.be/climbing) [Go to the source code](../assets/layers/climbing_route/climbing_route.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- climbing + =route - - - climbing=route - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:name%3D) -[](https://taginfo.openstreetmap.org/keys/climbing:length#values) [climbing:length](https://wiki.openstreetmap.org/wiki/Key:climbing:length) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/climbing:grade:french#values) [climbing:grade:french](https://wiki.openstreetmap.org/wiki/Key:climbing:grade:french) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/climbing:bolts#values) [climbing:bolts](https://wiki.openstreetmap.org/wiki/Key:climbing:bolts) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/_embedding_features_with_rock:rock#values) [_embedding_features_with_rock:rock](https://wiki.openstreetmap.org/wiki/Key:_embedding_features_with_rock:rock) | [string](../SpecialInputElements.md#string) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/climbing:length#values) [climbing:length](https://wiki.openstreetmap.org/wiki/Key:climbing:length) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/climbing:grade:french#values) [climbing:grade:french](https://wiki.openstreetmap.org/wiki/Key:climbing:grade:french) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/climbing:bolts#values) [climbing:bolts](https://wiki.openstreetmap.org/wiki/Key:climbing:bolts) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/_embedding_features_with_rock:rock#values) [_embedding_features_with_rock:rock](https://wiki.openstreetmap.org/wiki/Key:_embedding_features_with_rock:rock) | [string](../SpecialInputElements.md#string) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - - - -### Name - - +### Name The question is **What is the name of this climbing route?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `{name}` +- **This climbing route doesn't have a name** corresponds + with noname + =yes - - - **This climbing route doesn't have a name** corresponds with noname=yes - - - - -### Length - - +### Length The question is **How long is this climbing route (in meters)?** -This rendering asks information about the property [climbing:length](https://wiki.openstreetmap.org/wiki/Key:climbing:length) +This rendering asks information about the +property [climbing:length](https://wiki.openstreetmap.org/wiki/Key:climbing:length) This is rendered with `This route is {canonical(climbing:length)} long` - - -### Difficulty - - +### Difficulty The question is **What is the difficulty of this climbing route according to the french/belgian system?** -This rendering asks information about the property [climbing:grade:french](https://wiki.openstreetmap.org/wiki/Key:climbing:grade:french) +This rendering asks information about the +property [climbing:grade:french](https://wiki.openstreetmap.org/wiki/Key:climbing:grade:french) This is rendered with `The difficulty is {climbing:grade:french} according to the french/belgian system` - - -### Bolts - - +### Bolts The question is **How much bolts does this route have before reaching the moulinette?** -This rendering asks information about the property [climbing:bolts](https://wiki.openstreetmap.org/wiki/Key:climbing:bolts) +This rendering asks information about the +property [climbing:bolts](https://wiki.openstreetmap.org/wiki/Key:climbing:bolts) This is rendered with `This route has {climbing:bolts} bolts` +- **This route is not bolted** corresponds + with climbing:bolted + =no_This option cannot be + chosen as answer_ +- **This route is not bolted** corresponds + with climbing:bolted + =no&climbing: + bolts= - - - **This route is not bolted** corresponds with climbing:bolted=no_This option cannot be chosen as answer_ - - **This route is not bolted** corresponds with climbing:bolted=no&climbing:bolts= - - - - -### Description - - +### Description The question is **Is there other relevant info?** -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) This is rendered with `

Description


{description}` - - -### Rock type - - +### Rock type _This tagrendering has no question and is thus read-only_ -This rendering asks information about the property [_embedding_features_with_rock:rock](https://wiki.openstreetmap.org/wiki/Key:_embedding_features_with_rock:rock) -This is rendered with `The rock type is {_embedding_features_with_rock:rock} as stated on the surrounding crag` - - - -### reviews - +This rendering asks information about the +property [_embedding_features_with_rock:rock](https://wiki.openstreetmap.org/wiki/Key:_embedding_features_with_rock:rock) +This is rendered +with `The rock type is {_embedding_features_with_rock:rock} as stated on the surrounding crag` +### reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/climbing_route/climbing_route.json \ No newline at end of file diff --git a/Docs/Layers/cluster_style.md b/Docs/Layers/cluster_style.md index 17c201b1a..5ac3cd05d 100644 --- a/Docs/Layers/cluster_style.md +++ b/Docs/Layers/cluster_style.md @@ -1,6 +1,4 @@ - - - cluster_style +cluster_style =============== @@ -9,54 +7,35 @@ The style for the clustering in all themes. Enable `debug=true` to peak into clustered tiles - - - ## Table of contents 1. [cluster_style](#cluster_style) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [all_tags](#all_tags) - - - - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` [Go to the source code](../assets/layers/cluster_style/cluster_style.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- tileId~^..*$ - - - tileId~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### all_tags - - +### all_tags _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/cluster_style/cluster_style.json \ No newline at end of file diff --git a/Docs/Layers/conflation.md b/Docs/Layers/conflation.md index 3d9b2dbe5..d5f0480cd 100644 --- a/Docs/Layers/conflation.md +++ b/Docs/Layers/conflation.md @@ -1,51 +1,39 @@ - - - conflation +conflation ============ -If the import-button moves OSM points, the imported way points or conflates, a preview is shown. This layer defines how this preview is rendered. This layer cannot be included in a theme. - - - +If the import-button moves OSM points, the imported way points or conflates, a preview is shown. This layer defines how +this preview is rendered. This layer cannot be included in a theme. ## Table of contents 1. [conflation](#conflation) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) - - - - - - +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) [Go to the source code](../assets/layers/conflation/conflation.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- move + =yes + |newpoint + =yes - - - move=yes|newpoint=yes - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/conflation/conflation.json \ No newline at end of file diff --git a/Docs/Layers/crab_address.md b/Docs/Layers/crab_address.md index 1d4939661..bcb0730a0 100644 --- a/Docs/Layers/crab_address.md +++ b/Docs/Layers/crab_address.md @@ -1,62 +1,43 @@ - - - crab_address +crab_address ============== -Address data for Flanders by the governement, suited for import into OpenStreetMap. Datadump from 2021-10-26. This layer contains only visualisation logic. Import buttons should be added via an override. Note that HNRLABEL contains the original value, whereas _HNRLABEL contains a slightly cleaned version - - - +Address data for Flanders by the governement, suited for import into OpenStreetMap. Datadump from 2021-10-26. This layer +contains only visualisation logic. Import buttons should be added via an override. Note that HNRLABEL contains the +original value, whereas _HNRLABEL contains a slightly cleaned version ## Table of contents 1. [crab_address](#crab_address) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [render_crab](#render_crab) - - - - - This layer is loaded from an external source, namely `https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/CRAB_2021_10_26/tile_{z}_{x}_{y}.geojson` - +- This layer is loaded from an external source, namely `https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/CRAB_2021_10_26/tile_{z}_{x}_{y}.geojson` [Go to the source code](../assets/layers/crab_address/crab_address.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- HUISNR~^..*$ - - - HUISNR~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### render_crab - - +### render_crab _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/crab_address/crab_address.json \ No newline at end of file diff --git a/Docs/Layers/crossings.md b/Docs/Layers/crossings.md index 63e3092ae..ebaa3bebb 100644 --- a/Docs/Layers/crossings.md +++ b/Docs/Layers/crossings.md @@ -1,6 +1,4 @@ - - - crossings +crossings =========== @@ -9,15 +7,13 @@ Crossings for pedestrians and cyclists - - - ## Table of contents 1. [crossings](#crossings) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [crossing-type](#crossing-type) + [crossing-is-zebra](#crossing-is-zebra) + [crossing-bicycle-allowed](#crossing-bicycle-allowed) @@ -28,52 +24,39 @@ Crossings for pedestrians and cyclists + [crossing-continue-through-red](#crossing-continue-through-red) +- This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on + it: a preset snaps to this layer (presets[0]) +- This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on + it: a preset snaps to this layer (presets[1]) +#### Themes using this layer - - - This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on it: a preset snaps to this layer (presets[0]) - - This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on it: a preset snaps to this layer (presets[1]) - - - - -#### Themes using this layer - - - - - - - [cycle_infra](https://mapcomplete.osm.be/cycle_infra) - - [personal](https://mapcomplete.osm.be/personal) - +- [cycle_infra](https://mapcomplete.osm.be/cycle_infra) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/crossings/crossings.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway + =traffic_signals + |highway + =crossing - - - highway=traffic_signals|highway=crossing - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/crossing#values) [crossing](https://wiki.openstreetmap.org/wiki/Key:crossing) | Multiple choice | [uncontrolled](https://wiki.openstreetmap.org/wiki/Tag:crossing%3Duncontrolled) [traffic_signals](https://wiki.openstreetmap.org/wiki/Tag:crossing%3Dtraffic_signals) [unmarked](https://wiki.openstreetmap.org/wiki/Tag:crossing%3Dunmarked) @@ -85,138 +68,108 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/red_turn:right:bicycle#values) [red_turn:right:bicycle](https://wiki.openstreetmap.org/wiki/Key:red_turn:right:bicycle) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:red_turn:right:bicycle%3Dyes) [yes](https://wiki.openstreetmap.org/wiki/Tag:red_turn:right:bicycle%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:red_turn:right:bicycle%3Dno) [](https://taginfo.openstreetmap.org/keys/red_turn:straight:bicycle#values) [red_turn:straight:bicycle](https://wiki.openstreetmap.org/wiki/Key:red_turn:straight:bicycle) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:red_turn:straight:bicycle%3Dyes) [yes](https://wiki.openstreetmap.org/wiki/Tag:red_turn:straight:bicycle%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:red_turn:straight:bicycle%3Dno) - - - -### crossing-type - - +### crossing-type The question is **What kind of crossing is this?** +- **Crossing, without traffic lights** corresponds + with crossing + =uncontrolled +- **Crossing with traffic signals** corresponds + with crossing + =traffic_signals +- **Zebra crossing** corresponds with + crossing=zebra_This option + cannot be chosen as answer_ +- **Crossing without crossing markings** corresponds + with crossing + =unmarked - - - - - **Crossing, without traffic lights** corresponds with crossing=uncontrolled - - **Crossing with traffic signals** corresponds with crossing=traffic_signals - - **Zebra crossing** corresponds with crossing=zebra_This option cannot be chosen as answer_ - - **Crossing without crossing markings** corresponds with crossing=unmarked - - - - -### crossing-is-zebra - - +### crossing-is-zebra The question is **Is this is a zebra crossing?** +- **This is a zebra crossing** corresponds + with crossing_ref + =zebra +- **This is not a zebra crossing** corresponds with - - - - - **This is a zebra crossing** corresponds with crossing_ref=zebra - - **This is not a zebra crossing** corresponds with - - - - -### crossing-bicycle-allowed - - +### crossing-bicycle-allowed The question is **Is this crossing also for bicycles?** +- **A cyclist can use this crossing** corresponds + with bicycle + =yes +- **A cyclist can not use this crossing** corresponds + with bicycle + =no - - - - - **A cyclist can use this crossing** corresponds with bicycle=yes - - **A cyclist can not use this crossing** corresponds with bicycle=no - - - - -### crossing-has-island - - +### crossing-has-island The question is **Does this crossing have an island in the middle?** +- **This crossing has an island in the middle** corresponds + with crossing:island + =yes +- **This crossing does not have an island in the middle** corresponds + with crossing:island + =no - - - - - **This crossing has an island in the middle** corresponds with crossing:island=yes - - **This crossing does not have an island in the middle** corresponds with crossing:island=no - - - - -### crossing-tactile - - +### crossing-tactile The question is **Does this crossing have tactile paving?** +- **This crossing has tactile paving** corresponds + with tactile_paving + =yes +- **This crossing does not have tactile paving** corresponds + with tactile_paving + =no +- **This crossing has tactile paving, but is not correct** corresponds + with tactile_paving + =incorrect_This + option cannot be chosen as answer_ - - - - - **This crossing has tactile paving** corresponds with tactile_paving=yes - - **This crossing does not have tactile paving** corresponds with tactile_paving=no - - **This crossing has tactile paving, but is not correct** corresponds with tactile_paving=incorrect_This option cannot be chosen as answer_ - - - - -### crossing-button - - +### crossing-button The question is **Does this traffic light have a button to request green light?** +- **This traffic light has a button to request green light** corresponds + with button_operated + =yes +- **This traffic light does not have a button to request green light** corresponds + with button_operated + =no - - - - - **This traffic light has a button to request green light** corresponds with button_operated=yes - - **This traffic light does not have a button to request green light** corresponds with button_operated=no - - - - -### crossing-right-turn-through-red - - +### crossing-right-turn-through-red The question is **Can a cyclist turn right when the light is red?** +- **A cyclist can turn right if the light is + red ** corresponds + with red_turn:right: + bicycle=yes +- **A cyclist can turn right if the light is red** corresponds + with red_turn:right: + bicycle=yes +- **A cyclist can not turn right if the light is red** corresponds + with red_turn:right: + bicycle=no - - - - - **A cyclist can turn right if the light is red ** corresponds with red_turn:right:bicycle=yes - - **A cyclist can turn right if the light is red** corresponds with red_turn:right:bicycle=yes - - **A cyclist can not turn right if the light is red** corresponds with red_turn:right:bicycle=no - - - - -### crossing-continue-through-red - - +### crossing-continue-through-red The question is **Can a cyclist go straight on when the light is red?** - - - - - - **A cyclist can go straight on if the light is red ** corresponds with red_turn:straight:bicycle=yes - - **A cyclist can go straight on if the light is red** corresponds with red_turn:straight:bicycle=yes - - **A cyclist can not go straight on if the light is red** corresponds with red_turn:straight:bicycle=no - +- **A cyclist can go straight on if the light is + red ** corresponds + with red_turn:straight: + bicycle=yes +- **A cyclist can go straight on if the light is red** corresponds + with red_turn:straight: + bicycle=yes +- **A cyclist can not go straight on if the light is red** corresponds + with red_turn:straight: + bicycle=no This document is autogenerated from assets/layers/crossings/crossings.json \ No newline at end of file diff --git a/Docs/Layers/current_view.md b/Docs/Layers/current_view.md index 7d763b88a..2425feeca 100644 --- a/Docs/Layers/current_view.md +++ b/Docs/Layers/current_view.md @@ -1,55 +1,44 @@ - - - current_view +current_view ============== -A meta-layer which contains one single feature, namely the BBOX of the current map view. This can be used to trigger special actions. If a popup is defined for this layer, this popup will be accessible via an extra button on screen. +A meta-layer which contains one single feature, namely the BBOX of the current map view. This can be used to trigger +special actions. If a popup is defined for this layer, this popup will be accessible via an extra button on screen. The icon on the button is the default icon of the layer, but can be customized by detecting 'button=yes'. - - - ## Table of contents 1. [current_view](#current_view) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer is not visible by default and must be enabled in the filter by the user. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - +- This layer is not visible by default and must be enabled in the filter by the user. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/current_view/current_view.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- current_view + =yes - - - current_view=yes - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/current_view/current_view.json \ No newline at end of file diff --git a/Docs/Layers/cycle_highways.md b/Docs/Layers/cycle_highways.md index 2fcf498d7..f190ce448 100644 --- a/Docs/Layers/cycle_highways.md +++ b/Docs/Layers/cycle_highways.md @@ -1,20 +1,12 @@ - - - cycle_highways +cycle_highways ================ - - - - - - - ## Table of contents 1. [cycle_highways](#cycle_highways) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [cycle_highways-name](#cycle_highways-name) + [cycle_highways-ref](#cycle_highways-ref) + [cycle_highways-state](#cycle_highways-state) @@ -23,123 +15,93 @@ + [all_tags](#all_tags) - - - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/cycle_highways/cycle_highways.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- cycle_network + =BE-VLG: + cycle_highway - - - cycle_network=BE-VLG:cycle_highway - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/state#values) [state](https://wiki.openstreetmap.org/wiki/Key:state) | [string](../SpecialInputElements.md#string) | [proposed](https://wiki.openstreetmap.org/wiki/Tag:state%3Dproposed) [proposed](https://wiki.openstreetmap.org/wiki/Tag:state%3Dproposed) [proposed](https://wiki.openstreetmap.org/wiki/Tag:state%3Dproposed) [temporary](https://wiki.openstreetmap.org/wiki/Tag:state%3Dtemporary) [](https://wiki.openstreetmap.org/wiki/Tag:state%3D) -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | - - - - -### cycle_highways-name - +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +### cycle_highways-name The question is **What is the name of this cycle highway?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `The name is {name}` - - -### cycle_highways-ref - - +### cycle_highways-ref The question is **What is the reference number of this cycle highway?** -This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) +This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) This is rendered with `Referentienummer is {ref}` - - -### cycle_highways-state - - +### cycle_highways-state The question is **What is the state of this link?** -This rendering asks information about the property [state](https://wiki.openstreetmap.org/wiki/Key:state) +This rendering asks information about the property [state](https://wiki.openstreetmap.org/wiki/Key:state) This is rendered with `The current state of this link is {state}` +- **This is a proposed route which can be cycled** corresponds + with state + =proposed +- **This is a proposed route which has missing links (thus: some parts don't even have a building permit yet)** + corresponds with state + =proposed + &note:state + =has_highway_no +- **This is a proposed route which has some links which are under construction** corresponds + with state + =proposed + &note:state + = + has_highway_under_construction +- **This is a temporary deviation** corresponds + with state + =temporary +- **This link is operational and signposted** corresponds with - - - **This is a proposed route which can be cycled** corresponds with state=proposed - - **This is a proposed route which has missing links (thus: some parts don't even have a building permit yet)** corresponds with state=proposed&note:state=has_highway_no - - **This is a proposed route which has some links which are under construction** corresponds with state=proposed&note:state=has_highway_under_construction - - **This is a temporary deviation** corresponds with state=temporary - - **This link is operational and signposted** corresponds with - - - - -### cycle-highway-length - - +### cycle-highway-length _This tagrendering has no question and is thus read-only_ - - - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### all_tags - - +### all_tags _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/cycle_highways/cycle_highways.json \ No newline at end of file diff --git a/Docs/Layers/cycleways_and_roads.md b/Docs/Layers/cycleways_and_roads.md index f754ddff4..844da2dcb 100644 --- a/Docs/Layers/cycleways_and_roads.md +++ b/Docs/Layers/cycleways_and_roads.md @@ -1,6 +1,4 @@ - - - cycleways_and_roads +cycleways_and_roads ===================== @@ -9,15 +7,13 @@ All infrastructure that someone can cycle over, accompanied with questions about this infrastructure" - - - ## Table of contents 1. [cycleways_and_roads](#cycleways_and_roads) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [Cycleway type for a road](#cycleway-type-for-a-road) + [is lit?](#is-lit) + [Is this a cyclestreet? (For a road)](#is-this-a-cyclestreet-(for-a-road)) @@ -36,54 +32,59 @@ All infrastructure that someone can cycle over, accompanied with questions about + [cycleway-segregation](#cycleway-segregation) +- This layer is needed as dependency for layer [barrier](#barrier) +- This layer is needed as dependency for layer [barrier](#barrier) +- This layer is needed as dependency for layer [crossings](#crossings) +- This layer is needed as dependency for layer [crossings](#crossings) +#### Themes using this layer - - - This layer is needed as dependency for layer [barrier](#barrier) - - This layer is needed as dependency for layer [barrier](#barrier) - - This layer is needed as dependency for layer [crossings](#crossings) - - This layer is needed as dependency for layer [crossings](#crossings) - - - - -#### Themes using this layer - - - - - - - [cycle_infra](https://mapcomplete.osm.be/cycle_infra) - - [personal](https://mapcomplete.osm.be/personal) - +- [cycle_infra](https://mapcomplete.osm.be/cycle_infra) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/cycleways_and_roads/cycleways_and_roads.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway + =cycleway + |cycleway + =lane + |cycleway + =shared_lane + |cycleway + =track + |cyclestreet + =yes + |highway + =residential + |highway + =tertiary + |highway + =unclassified + |highway + =primary + |highway + =secondary + |highway + =path + &bicycle + =designated - - - highway=cycleway|cycleway=lane|cycleway=shared_lane|cycleway=track|cyclestreet=yes|highway=residential|highway=tertiary|highway=unclassified|highway=primary|highway=secondary|highway=path&bicycle=designated - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/cycleway#values) [cycleway](https://wiki.openstreetmap.org/wiki/Key:cycleway) | Multiple choice | [shared_lane](https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dshared_lane) [lane](https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dlane) [track](https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dtrack) [separate](https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dseparate) [no](https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dno) [no](https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dno) @@ -94,325 +95,395 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/cycleway:smoothness#values) [cycleway:smoothness](https://wiki.openstreetmap.org/wiki/Key:cycleway:smoothness) | Multiple choice | [excellent](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dexcellent) [good](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dgood) [intermediate](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dintermediate) [bad](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dbad) [very_bad](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dvery_bad) [horrible](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dhorrible) [very_horrible](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dvery_horrible) [impassable](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dimpassable) [](https://taginfo.openstreetmap.org/keys/surface#values) [surface](https://wiki.openstreetmap.org/wiki/Key:surface) | [string](../SpecialInputElements.md#string) | [asphalt](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dasphalt) [paving_stones](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpaving_stones) [concrete](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dconcrete) [unhewn_cobblestone](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dunhewn_cobblestone) [sett](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dsett) [wood](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dwood) [gravel](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dgravel) [fine_gravel](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dfine_gravel) [pebblestone](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpebblestone) [ground](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dground) [](https://taginfo.openstreetmap.org/keys/smoothness#values) [smoothness](https://wiki.openstreetmap.org/wiki/Key:smoothness) | Multiple choice | [excellent](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dexcellent) [good](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dgood) [intermediate](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dintermediate) [bad](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dbad) [very_bad](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dvery_bad) [horrible](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dhorrible) [very_horrible](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dvery_horrible) [impassable](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dimpassable) -[](https://taginfo.openstreetmap.org/keys/width:carriageway#values) [width:carriageway](https://wiki.openstreetmap.org/wiki/Key:width:carriageway) | [length](../SpecialInputElements.md#length) | +[](https://taginfo.openstreetmap.org/keys/width:carriageway#values) [width:carriageway](https://wiki.openstreetmap.org/wiki/Key:width:carriageway) | [length](../SpecialInputElements.md#length) | [](https://taginfo.openstreetmap.org/keys/cycleway:traffic_sign#values) [cycleway:traffic_sign](https://wiki.openstreetmap.org/wiki/Key:cycleway:traffic_sign) | Multiple choice | [BE:D7](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D7) [BE:D9](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D9) [BE:D10](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D10) [none](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3Dnone) [](https://taginfo.openstreetmap.org/keys/traffic_sign#values) [traffic_sign](https://wiki.openstreetmap.org/wiki/Key:traffic_sign) | Multiple choice | [BE:D7](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D7) [BE:D9](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D9) [BE:D10](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D10) [none](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3Dnone) -[](https://taginfo.openstreetmap.org/keys/cycleway:buffer#values) [cycleway:buffer](https://wiki.openstreetmap.org/wiki/Key:cycleway:buffer) | [length](../SpecialInputElements.md#length) | +[](https://taginfo.openstreetmap.org/keys/cycleway:buffer#values) [cycleway:buffer](https://wiki.openstreetmap.org/wiki/Key:cycleway:buffer) | [length](../SpecialInputElements.md#length) | [](https://taginfo.openstreetmap.org/keys/cycleway:separation#values) [cycleway:separation](https://wiki.openstreetmap.org/wiki/Key:cycleway:separation) | Multiple choice | [dashed_line](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Ddashed_line) [solid_line](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dsolid_line) [parking_lane](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dparking_lane) [kerb](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dkerb) [](https://taginfo.openstreetmap.org/keys/separation#values) [separation](https://wiki.openstreetmap.org/wiki/Key:separation) | Multiple choice | [dashed_line](https://wiki.openstreetmap.org/wiki/Tag:separation%3Ddashed_line) [solid_line](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dsolid_line) [parking_lane](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dparking_lane) [kerb](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dkerb) - - - -### Cycleway type for a road - - +### Cycleway type for a road The question is **What kind of cycleway is here?** +- **There is a shared lane** corresponds + with cycleway + =shared_lane +- **There is a lane next to the road (separated with paint)** corresponds + with cycleway + =lane +- **There is a track, but no cycleway drawn separately from this road on the map.** corresponds + with cycleway + =track +- **There is a separately drawn cycleway** corresponds + with cycleway + =separate +- **There is no cycleway** corresponds with + cycleway=no +- **There is no cycleway** corresponds with + cycleway=no - - - - - **There is a shared lane** corresponds with cycleway=shared_lane - - **There is a lane next to the road (separated with paint)** corresponds with cycleway=lane - - **There is a track, but no cycleway drawn separately from this road on the map.** corresponds with cycleway=track - - **There is a separately drawn cycleway** corresponds with cycleway=separate - - **There is no cycleway** corresponds with cycleway=no - - **There is no cycleway** corresponds with cycleway=no - - - - -### is lit? - - +### is lit? The question is **Is this street lit?** +- **This street is lit** corresponds with lit + =yes +- **This road is not lit** corresponds with + lit=no +- **This road is lit at night** corresponds with + lit=sunset-sunrise_This + option cannot be chosen as answer_ +- **This road is lit 24/7** corresponds with + lit=24/7 - - - - - **This street is lit** corresponds with lit=yes - - **This road is not lit** corresponds with lit=no - - **This road is lit at night** corresponds with lit=sunset-sunrise_This option cannot be chosen as answer_ - - **This road is lit 24/7** corresponds with lit=24/7 - - - - -### Is this a cyclestreet? (For a road) - - +### Is this a cyclestreet? (For a road) The question is **Is this a cyclestreet?** +- **This is a cyclestreet, and a 30km/h zone.** corresponds + with cyclestreet + =yes +- **This is a cyclestreet** corresponds + with cyclestreet + =yes +- **This is not a cyclestreet.** corresponds with - - - - - **This is a cyclestreet, and a 30km/h zone.** corresponds with cyclestreet=yes - - **This is a cyclestreet** corresponds with cyclestreet=yes - - **This is not a cyclestreet.** corresponds with - - - - -### Maxspeed (for road) - - +### Maxspeed (for road) The question is **What is the maximum speed in this street?** -This rendering asks information about the property [maxspeed](https://wiki.openstreetmap.org/wiki/Key:maxspeed) +This rendering asks information about the property [maxspeed](https://wiki.openstreetmap.org/wiki/Key:maxspeed) This is rendered with `The maximum speed on this road is {maxspeed} km/h` +- **The maximum speed is 20 km/h** corresponds + with maxspeed + =20 +- **The maximum speed is 30 km/h** corresponds + with maxspeed + =30 +- **The maximum speed is 50 km/h** corresponds + with maxspeed + =50 +- **The maximum speed is 70 km/h** corresponds + with maxspeed + =70 +- **The maximum speed is 90 km/h** corresponds + with maxspeed + =90 - - - **The maximum speed is 20 km/h** corresponds with maxspeed=20 - - **The maximum speed is 30 km/h** corresponds with maxspeed=30 - - **The maximum speed is 50 km/h** corresponds with maxspeed=50 - - **The maximum speed is 70 km/h** corresponds with maxspeed=70 - - **The maximum speed is 90 km/h** corresponds with maxspeed=90 - - - - -### Cycleway:surface - - +### Cycleway:surface The question is **What is the surface of the cycleway made from?** -This rendering asks information about the property [cycleway:surface](https://wiki.openstreetmap.org/wiki/Key:cycleway:surface) +This rendering asks information about the +property [cycleway:surface](https://wiki.openstreetmap.org/wiki/Key:cycleway:surface) This is rendered with `This cyleway is made of {cycleway:surface}` +- **This cycleway is unpaved** corresponds + with cycleway:surface + =unpaved_This option + cannot be chosen as answer_ +- **This cycleway is paved** corresponds + with cycleway:surface + =paved_This option + cannot be chosen as answer_ +- **This cycleway is made of asphalt** corresponds + with cycleway:surface + =asphalt +- **This cycleway is made of smooth paving stones** corresponds + with cycleway:surface + =paving_stones +- **This cycleway is made of concrete** corresponds + with cycleway:surface + =concrete +- **This cycleway is made of cobblestone (unhewn or sett)** corresponds + with cycleway:surface + =cobblestone_This + option cannot be chosen as answer_ +- **This cycleway is made of raw, natural cobblestone** corresponds + with cycleway:surface + = + unhewn_cobblestone +- **This cycleway is made of flat, square cobblestone** corresponds + with cycleway:surface + =sett +- **This cycleway is made of wood** corresponds + with cycleway:surface + =wood +- **This cycleway is made of gravel** corresponds + with cycleway:surface + =gravel +- **This cycleway is made of fine gravel** corresponds + with cycleway:surface + =fine_gravel +- **This cycleway is made of pebblestone** corresponds + with cycleway:surface + =pebblestone +- **This cycleway is made from raw ground** corresponds + with cycleway:surface + =ground - - - **This cycleway is unpaved** corresponds with cycleway:surface=unpaved_This option cannot be chosen as answer_ - - **This cycleway is paved** corresponds with cycleway:surface=paved_This option cannot be chosen as answer_ - - **This cycleway is made of asphalt** corresponds with cycleway:surface=asphalt - - **This cycleway is made of smooth paving stones** corresponds with cycleway:surface=paving_stones - - **This cycleway is made of concrete** corresponds with cycleway:surface=concrete - - **This cycleway is made of cobblestone (unhewn or sett)** corresponds with cycleway:surface=cobblestone_This option cannot be chosen as answer_ - - **This cycleway is made of raw, natural cobblestone** corresponds with cycleway:surface=unhewn_cobblestone - - **This cycleway is made of flat, square cobblestone** corresponds with cycleway:surface=sett - - **This cycleway is made of wood** corresponds with cycleway:surface=wood - - **This cycleway is made of gravel** corresponds with cycleway:surface=gravel - - **This cycleway is made of fine gravel** corresponds with cycleway:surface=fine_gravel - - **This cycleway is made of pebblestone** corresponds with cycleway:surface=pebblestone - - **This cycleway is made from raw ground** corresponds with cycleway:surface=ground - - - - -### Cycleway:smoothness - - +### Cycleway:smoothness The question is **What is the smoothness of this cycleway?** +- **Usable for thin rollers: rollerblade, skateboard** corresponds + with cycleway:smoothness + =excellent +- **Usable for thin wheels: racing bike** corresponds + with cycleway:smoothness + =good +- **Usable for normal wheels: city bike, wheelchair, scooter** corresponds + with cycleway:smoothness + =intermediate +- **Usable for robust wheels: trekking bike, car, rickshaw** corresponds + with cycleway:smoothness + =bad +- **Usable for vehicles with high clearance: light duty off-road vehicle** corresponds + with cycleway:smoothness + =very_bad +- **Usable for off-road vehicles: heavy duty off-road vehicle** corresponds + with cycleway:smoothness + =horrible +- **Usable for specialized off-road vehicles: tractor, ATV** corresponds + with cycleway:smoothness + = + very_horrible +- **Impassable / No wheeled vehicle** corresponds + with cycleway:smoothness + =impassable - - - - - **Usable for thin rollers: rollerblade, skateboard** corresponds with cycleway:smoothness=excellent - - **Usable for thin wheels: racing bike** corresponds with cycleway:smoothness=good - - **Usable for normal wheels: city bike, wheelchair, scooter** corresponds with cycleway:smoothness=intermediate - - **Usable for robust wheels: trekking bike, car, rickshaw** corresponds with cycleway:smoothness=bad - - **Usable for vehicles with high clearance: light duty off-road vehicle** corresponds with cycleway:smoothness=very_bad - - **Usable for off-road vehicles: heavy duty off-road vehicle** corresponds with cycleway:smoothness=horrible - - **Usable for specialized off-road vehicles: tractor, ATV** corresponds with cycleway:smoothness=very_horrible - - **Impassable / No wheeled vehicle** corresponds with cycleway:smoothness=impassable - - - - -### Surface of the road - - +### Surface of the road The question is **What is the surface of the street made from?** -This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) +This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) This is rendered with `This road is made of {surface}` +- **This cycleway is unhardened** corresponds + with surface + =unpaved_This option cannot be + chosen as answer_ +- **This cycleway is paved** corresponds with + surface=paved_This option + cannot be chosen as answer_ +- **This cycleway is made of asphalt** corresponds + with surface + =asphalt +- **This cycleway is made of smooth paving stones** corresponds + with surface + =paving_stones +- **This cycleway is made of concrete** corresponds + with surface + =concrete +- **This cycleway is made of cobblestone (unhewn or sett)** corresponds + with surface + =cobblestone_This option + cannot be chosen as answer_ +- **This cycleway is made of raw, natural cobblestone** corresponds + with surface + =unhewn_cobblestone +- **This cycleway is made of flat, square cobblestone** corresponds + with surface + =sett +- **This cycleway is made of wood** corresponds + with surface + =wood +- **This cycleway is made of gravel** corresponds + with surface + =gravel +- **This cycleway is made of fine gravel** corresponds + with surface + =fine_gravel +- **This cycleway is made of pebblestone** corresponds + with surface + =pebblestone +- **This cycleway is made from raw ground** corresponds + with surface + =ground - - - **This cycleway is unhardened** corresponds with surface=unpaved_This option cannot be chosen as answer_ - - **This cycleway is paved** corresponds with surface=paved_This option cannot be chosen as answer_ - - **This cycleway is made of asphalt** corresponds with surface=asphalt - - **This cycleway is made of smooth paving stones** corresponds with surface=paving_stones - - **This cycleway is made of concrete** corresponds with surface=concrete - - **This cycleway is made of cobblestone (unhewn or sett)** corresponds with surface=cobblestone_This option cannot be chosen as answer_ - - **This cycleway is made of raw, natural cobblestone** corresponds with surface=unhewn_cobblestone - - **This cycleway is made of flat, square cobblestone** corresponds with surface=sett - - **This cycleway is made of wood** corresponds with surface=wood - - **This cycleway is made of gravel** corresponds with surface=gravel - - **This cycleway is made of fine gravel** corresponds with surface=fine_gravel - - **This cycleway is made of pebblestone** corresponds with surface=pebblestone - - **This cycleway is made from raw ground** corresponds with surface=ground - - - - -### Surface of the street - - +### Surface of the street The question is **What is the smoothness of this street?** +- **Usable for thin rollers: rollerblade, skateboard** corresponds + with smoothness + =excellent +- **Usable for thin wheels: racing bike** corresponds + with smoothness + =good +- **Usable for normal wheels: city bike, wheelchair, scooter** corresponds + with smoothness + =intermediate +- **Usable for robust wheels: trekking bike, car, rickshaw** corresponds + with smoothness + =bad +- **Usable for vehicles with high clearance: light duty off-road vehicle** corresponds + with smoothness + =very_bad +- **Usable for off-road vehicles: heavy duty off-road vehicle** corresponds + with smoothness + =horrible +- **Usable for specialized off-road vehicles: tractor, ATV** corresponds + with smoothness + =very_horrible +- **Impassable / No wheeled vehicle** corresponds + with smoothness + =impassable +### width:carriageway +The question is **What is the carriage width of this road (in meters)?
This is measured curb to +curb and thus includes the width of parallell parking lanes** - - - **Usable for thin rollers: rollerblade, skateboard** corresponds with smoothness=excellent - - **Usable for thin wheels: racing bike** corresponds with smoothness=good - - **Usable for normal wheels: city bike, wheelchair, scooter** corresponds with smoothness=intermediate - - **Usable for robust wheels: trekking bike, car, rickshaw** corresponds with smoothness=bad - - **Usable for vehicles with high clearance: light duty off-road vehicle** corresponds with smoothness=very_bad - - **Usable for off-road vehicles: heavy duty off-road vehicle** corresponds with smoothness=horrible - - **Usable for specialized off-road vehicles: tractor, ATV** corresponds with smoothness=very_horrible - - **Impassable / No wheeled vehicle** corresponds with smoothness=impassable - - - - -### width:carriageway - - - -The question is **What is the carriage width of this road (in meters)?
This is measured curb to curb and thus includes the width of parallell parking lanes** - -This rendering asks information about the property [width:carriageway](https://wiki.openstreetmap.org/wiki/Key:width:carriageway) +This rendering asks information about the +property [width:carriageway](https://wiki.openstreetmap.org/wiki/Key:width:carriageway) This is rendered with `The carriage width of this road is {width:carriageway}m` - - -### cycleway-lane-track-traffic-signs - - +### cycleway-lane-track-traffic-signs The question is **What traffic sign does this cycleway have?** +- **Compulsory cycleway ** + corresponds with cycleway: + traffic_sign=BE: + D7 +- **Compulsory cycleway (with supplementary + sign)
** corresponds with + cycleway:traffic_sign~^BE:D7;.*$_This option cannot be chosen as answer_ +- **Segregated foot/cycleway ** + corresponds with cycleway: + traffic_sign=BE: + D9 +- **Unsegregated foot/cycleway ** + corresponds with cycleway: + traffic_sign=BE: + D10 +- **No traffic sign present** corresponds + with cycleway:traffic_sign + =none - - - - - **Compulsory cycleway ** corresponds with cycleway:traffic_sign=BE:D7 - - **Compulsory cycleway (with supplementary sign)
** corresponds with cycleway:traffic_sign~^BE:D7;.*$_This option cannot be chosen as answer_ - - **Segregated foot/cycleway ** corresponds with cycleway:traffic_sign=BE:D9 - - **Unsegregated foot/cycleway ** corresponds with cycleway:traffic_sign=BE:D10 - - **No traffic sign present** corresponds with cycleway:traffic_sign=none - - - - -### cycleway-traffic-signs - - +### cycleway-traffic-signs The question is **What traffic sign does this cycleway have?** +- **Compulsory cycleway ** + corresponds with traffic_sign + =BE:D7 +- **Compulsory cycleway (with supplementary + sign)
** corresponds with + traffic_sign~^BE:D7;.*$_This option cannot be chosen as answer_ +- **Segregated foot/cycleway ** + corresponds with traffic_sign + =BE:D9 +- **Unsegregated foot/cycleway ** + corresponds with traffic_sign + =BE:D10 +- **No traffic sign present** corresponds + with traffic_sign + =none +### cycleway-traffic-signs-supplementary +The question is **Does the traffic sign +D7 () have a supplementary sign?** +- **** corresponds + with cycleway:traffic_sign + =BE:D7;BE:M6 +- **** corresponds + with cycleway:traffic_sign + =BE:D7;BE: + M13 +- **** corresponds + with cycleway:traffic_sign + =BE:D7;BE: + M14 +- **** corresponds + with cycleway:traffic_sign + =BE:D7;BE:M7 +- **** corresponds + with cycleway:traffic_sign + =BE:D7;BE: + M15 +- **** corresponds + with cycleway:traffic_sign + =BE:D7;BE: + M16 +- **No supplementary traffic sign present** corresponds + with cycleway: + traffic_sign:supplementary + =none - - **Compulsory cycleway ** corresponds with traffic_sign=BE:D7 - - **Compulsory cycleway (with supplementary sign)
** corresponds with traffic_sign~^BE:D7;.*$_This option cannot be chosen as answer_ - - **Segregated foot/cycleway ** corresponds with traffic_sign=BE:D9 - - **Unsegregated foot/cycleway ** corresponds with traffic_sign=BE:D10 - - **No traffic sign present** corresponds with traffic_sign=none +### cycleway-traffic-signs-D7-supplementary +The question is **Does the traffic sign +D7 () have a supplementary sign?** +- **** corresponds + with traffic_sign + =BE:D7;BE:M6 +- **** corresponds + with traffic_sign + =BE:D7;BE:M13 +- **** corresponds + with traffic_sign + =BE:D7;BE:M14 +- **** corresponds + with traffic_sign + =BE:D7;BE:M7 +- **** corresponds + with :traffic_sign + =BE:D7;BE:M15 +- **** corresponds + with traffic_sign + =BE:D7;BE:M16 +- **No supplementary traffic sign present** corresponds + with traffic_sign: + supplementary= + none - -### cycleway-traffic-signs-supplementary - - - -The question is **Does the traffic sign D7 () have a supplementary sign?** - - - - - - - **** corresponds with cycleway:traffic_sign=BE:D7;BE:M6 - - **** corresponds with cycleway:traffic_sign=BE:D7;BE:M13 - - **** corresponds with cycleway:traffic_sign=BE:D7;BE:M14 - - **** corresponds with cycleway:traffic_sign=BE:D7;BE:M7 - - **** corresponds with cycleway:traffic_sign=BE:D7;BE:M15 - - **** corresponds with cycleway:traffic_sign=BE:D7;BE:M16 - - **No supplementary traffic sign present** corresponds with cycleway:traffic_sign:supplementary=none - - - - -### cycleway-traffic-signs-D7-supplementary - - - -The question is **Does the traffic sign D7 () have a supplementary sign?** - - - - - - - **** corresponds with traffic_sign=BE:D7;BE:M6 - - **** corresponds with traffic_sign=BE:D7;BE:M13 - - **** corresponds with traffic_sign=BE:D7;BE:M14 - - **** corresponds with traffic_sign=BE:D7;BE:M7 - - **** corresponds with :traffic_sign=BE:D7;BE:M15 - - **** corresponds with traffic_sign=BE:D7;BE:M16 - - **No supplementary traffic sign present** corresponds with traffic_sign:supplementary=none - - - - -### cycleways_and_roads-cycleway:buffer - - +### cycleways_and_roads-cycleway:buffer The question is **How wide is the gap between the cycleway and the road?** -This rendering asks information about the property [cycleway:buffer](https://wiki.openstreetmap.org/wiki/Key:cycleway:buffer) +This rendering asks information about the +property [cycleway:buffer](https://wiki.openstreetmap.org/wiki/Key:cycleway:buffer) This is rendered with `The buffer besides this cycleway is {cycleway:buffer} m` - - -### cyclelan-segregation - - +### cyclelan-segregation The question is **How is this cycleway separated from the road?** +- **This cycleway is separated by a dashed line** corresponds + with cycleway:separation + =dashed_line +- **This cycleway is separated by a solid line** corresponds + with cycleway:separation + =solid_line +- **This cycleway is separated by a parking lane** corresponds + with cycleway:separation + =parking_lane +- **This cycleway is separated by a kerb** corresponds + with cycleway:separation + =kerb - - - - - **This cycleway is separated by a dashed line** corresponds with cycleway:separation=dashed_line - - **This cycleway is separated by a solid line** corresponds with cycleway:separation=solid_line - - **This cycleway is separated by a parking lane** corresponds with cycleway:separation=parking_lane - - **This cycleway is separated by a kerb** corresponds with cycleway:separation=kerb - - - - -### cycleway-segregation - - +### cycleway-segregation The question is **How is this cycleway separated from the road?** - - - - - - **This cycleway is separated by a dashed line** corresponds with separation=dashed_line - - **This cycleway is separated by a solid line** corresponds with separation=solid_line - - **This cycleway is separated by a parking lane** corresponds with separation=parking_lane - - **This cycleway is separated by a kerb** corresponds with separation=kerb - +- **This cycleway is separated by a dashed line** corresponds + with separation + =dashed_line +- **This cycleway is separated by a solid line** corresponds + with separation + =solid_line +- **This cycleway is separated by a parking lane** corresponds + with separation + =parking_lane +- **This cycleway is separated by a kerb** corresponds + with separation + =kerb This document is autogenerated from assets/layers/cycleways_and_roads/cycleways_and_roads.json \ No newline at end of file diff --git a/Docs/Layers/defibrillator.md b/Docs/Layers/defibrillator.md index 54511815e..4321a42b3 100644 --- a/Docs/Layers/defibrillator.md +++ b/Docs/Layers/defibrillator.md @@ -1,23 +1,20 @@ - - - defibrillator +defibrillator =============== -A layer showing defibrillators which can be used in case of emergency. This contains public defibrillators, but also defibrillators which might need staff to fetch the actual device - - - +A layer showing defibrillators which can be used in case of emergency. This contains public defibrillators, but also +defibrillators which might need staff to fetch the actual device ## Table of contents 1. [defibrillator](#defibrillator) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [defibrillator-indoors](#defibrillator-indoors) + [defibrillator-access](#defibrillator-access) @@ -36,287 +33,216 @@ A layer showing defibrillators which can be used in case of emergency. This cont + [defibrillator-fixme](#defibrillator-fixme) +- This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on + it: a preset snaps to this layer (presets[1]) +#### Themes using this layer - - - This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on it: a preset snaps to this layer (presets[1]) - - - - -#### Themes using this layer - - - - - - - [aed](https://mapcomplete.osm.be/aed) - - [personal](https://mapcomplete.osm.be/personal) - +- [aed](https://mapcomplete.osm.be/aed) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/defibrillator/defibrillator.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- emergency + =defibrillator - - - emergency=defibrillator - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/indoor#values) [indoor](https://wiki.openstreetmap.org/wiki/Key:indoor) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:indoor%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:indoor%3Dno) [](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | [string](../SpecialInputElements.md#string) | [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) [private](https://wiki.openstreetmap.org/wiki/Tag:access%3Dprivate) [no](https://wiki.openstreetmap.org/wiki/Tag:access%3Dno) [](https://taginfo.openstreetmap.org/keys/defibrillator#values) [defibrillator](https://wiki.openstreetmap.org/wiki/Key:defibrillator) | Multiple choice | [manual](https://wiki.openstreetmap.org/wiki/Tag:defibrillator%3Dmanual) [automatic](https://wiki.openstreetmap.org/wiki/Tag:defibrillator%3Dautomatic) [](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [int](../SpecialInputElements.md#int) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) -[](https://taginfo.openstreetmap.org/keys/defibrillator:location#values) [defibrillator:location](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location) | [text](../SpecialInputElements.md#text) | -[](https://taginfo.openstreetmap.org/keys/defibrillator:location:en#values) [defibrillator:location:en](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location:en) | [text](../SpecialInputElements.md#text) | -[](https://taginfo.openstreetmap.org/keys/defibrillator:location:fr#values) [defibrillator:location:fr](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location:fr) | [text](../SpecialInputElements.md#text) | +[](https://taginfo.openstreetmap.org/keys/defibrillator:location#values) [defibrillator:location](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location) | [text](../SpecialInputElements.md#text) | +[](https://taginfo.openstreetmap.org/keys/defibrillator:location:en#values) [defibrillator:location:en](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location:en) | [text](../SpecialInputElements.md#text) | +[](https://taginfo.openstreetmap.org/keys/defibrillator:location:fr#values) [defibrillator:location:fr](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location:fr) | [text](../SpecialInputElements.md#text) | [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) -[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [text](../SpecialInputElements.md#text) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [text](../SpecialInputElements.md#text) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | [](https://taginfo.openstreetmap.org/keys/survey:date#values) [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) | [date](../SpecialInputElements.md#date) | [](https://wiki.openstreetmap.org/wiki/Tag:survey:date%3D) -[](https://taginfo.openstreetmap.org/keys/fixme#values) [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) | [text](../SpecialInputElements.md#text) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/fixme#values) [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) | [text](../SpecialInputElements.md#text) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### defibrillator-indoors - - +### defibrillator-indoors The question is **Is this defibrillator located indoors?** +- **This defibrillator is located indoors** corresponds + with indoor + =yes +- **This defibrillator is located outdoors** corresponds + with indoor + =no - - - - - **This defibrillator is located indoors** corresponds with indoor=yes - - **This defibrillator is located outdoors** corresponds with indoor=no - - - - -### defibrillator-access - - +### defibrillator-access The question is **Is this defibrillator freely accessible?** -This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) +This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) This is rendered with `Access is {access}` +- **Publicly accessible** corresponds with + access=yes +- **Publicly accessible** corresponds with + access=public_This option + cannot be chosen as answer_ +- **Only accessible to customers** corresponds + with access + =customers +- **Not accessible to the general public (e.g. only accesible to staff, the owners, ...)** corresponds + with access + =private +- **Not accessible, possibly only for professional use** corresponds + with access + =no - - - **Publicly accessible** corresponds with access=yes - - **Publicly accessible** corresponds with access=public_This option cannot be chosen as answer_ - - **Only accessible to customers** corresponds with access=customers - - **Not accessible to the general public (e.g. only accesible to staff, the owners, ...)** corresponds with access=private - - **Not accessible, possibly only for professional use** corresponds with access=no - - - - -### defibrillator-defibrillator - - +### defibrillator-defibrillator The question is **Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?** +- **There is no info about the type of device** corresponds with _This option cannot be chosen as answer_ +- **This is a manual defibrillator for professionals** corresponds + with defibrillator + =manual +- **This is a normal automatic defibrillator** corresponds + with defibrillator + =automatic +- **This is a special type of defibrillator: {defibrillator}** corresponds with defibrillator~^..*$_This option cannot + be chosen as answer_ - - - - - **There is no info about the type of device** corresponds with _This option cannot be chosen as answer_ - - **This is a manual defibrillator for professionals** corresponds with defibrillator=manual - - **This is a normal automatic defibrillator** corresponds with defibrillator=automatic - - **This is a special type of defibrillator: {defibrillator}** corresponds with defibrillator~^..*$_This option cannot be chosen as answer_ - - - - -### defibrillator-level - - +### defibrillator-level The question is **On which floor is this defibrillator located?** -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) This is rendered with `This defibrillator is on floor {level}` +- **This defibrillator is on the ground floor** corresponds + with level + =0 +- **This defibrillator is on the first floor** corresponds + with level + =1 - - - **This defibrillator is on the ground floor** corresponds with level=0 - - **This defibrillator is on the first floor** corresponds with level=1 - - - - -### defibrillator-defibrillator:location - - +### defibrillator-defibrillator:location The question is **Please give some explanation on where the defibrillator can be found (in the local language)** -This rendering asks information about the property [defibrillator:location](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location) -This is rendered with `Extra information about the location (in the local languagel):
{defibrillator:location}` - - - -### defibrillator-defibrillator:location:en - +This rendering asks information about the +property [defibrillator:location](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location) +This is rendered +with `Extra information about the location (in the local languagel):
{defibrillator:location}` +### defibrillator-defibrillator:location:en The question is **Please give some explanation on where the defibrillator can be found (in English)** -This rendering asks information about the property [defibrillator:location:en](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location:en) +This rendering asks information about the +property [defibrillator:location:en](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location:en) This is rendered with `Extra information about the location (in English):
{defibrillator:location:en}` - - -### defibrillator-defibrillator:location:fr - - +### defibrillator-defibrillator:location:fr The question is **Please give some explanation on where the defibrillator can be found (in French)** -This rendering asks information about the property [defibrillator:location:fr](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location:fr) +This rendering asks information about the +property [defibrillator:location:fr](https://wiki.openstreetmap.org/wiki/Key:defibrillator:location:fr) This is rendered with `Extra information about the location (in French):
{defibrillator:location:fr}` - - -### wheelchair-access - - +### wheelchair-access The question is **Is this place accessible with a wheelchair?** +- **This place is specially adapted for wheelchair users** corresponds + with wheelchair + =designated +- **This place is easily reachable with a wheelchair** corresponds + with wheelchair + =yes +- **It is possible to reach this place in a wheelchair, but it is not easy** corresponds + with wheelchair + =limited +- **This place is not reachable with a wheelchair** corresponds + with wheelchair + =no - - - - - **This place is specially adapted for wheelchair users** corresponds with wheelchair=designated - - **This place is easily reachable with a wheelchair** corresponds with wheelchair=yes - - **It is possible to reach this place in a wheelchair, but it is not easy** corresponds with wheelchair=limited - - **This place is not reachable with a wheelchair** corresponds with wheelchair=no - - - - -### defibrillator-ref - - +### defibrillator-ref The question is **What is the official identification number of the device? (if visible on device)** -This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) +This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) This is rendered with `Official identification number of the device: {ref}` - - -### defibrillator-email - - +### defibrillator-email The question is **What is the email for questions about this defibrillator?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `Email for questions about this defibrillator: {email}` - - -### defibrillator-phone - - +### defibrillator-phone The question is **What is the phone number for questions about this defibrillator?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `Telephone for questions about this defibrillator: {phone}` - - -### defibrillator-opening_hours - - +### defibrillator-opening_hours The question is **At what times is this defibrillator available?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `{opening_hours_table(opening_hours)}` +- **24/7 opened (including holidays)** corresponds + with opening_hours + =24/7 +### defibrillator-description - - **24/7 opened (including holidays)** corresponds with opening_hours=24/7 +The question is **Is there any useful information for users that you haven't been able to describe above? (leave blank +if no)** - - - -### defibrillator-description - - - -The question is **Is there any useful information for users that you haven't been able to describe above? (leave blank if no)** - -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) This is rendered with `Additional information: {description}` - - -### defibrillator-survey:date - - +### defibrillator-survey:date The question is **When was this defibrillator last surveyed?** -This rendering asks information about the property [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) +This rendering asks information about the property [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) This is rendered with `This defibrillator was last surveyed on {survey:date}` +- **Checked today!** corresponds with survey:date= +### defibrillator-fixme - - **Checked today!** corresponds with survey:date= +The question is **Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to +OpenStreetMap experts)** - - - -### defibrillator-fixme - - - -The question is **Is there something wrong with how this is mapped, that you weren't able to fix here? (leave a note to OpenStreetMap experts)** - -This rendering asks information about the property [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) -This is rendered with `Extra information for OpenStreetMap experts: {fixme}` +This rendering asks information about the property [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) +This is rendered with `Extra information for OpenStreetMap experts: {fixme}` This document is autogenerated from assets/layers/defibrillator/defibrillator.json \ No newline at end of file diff --git a/Docs/Layers/direction.md b/Docs/Layers/direction.md index abe885a0b..7af008f90 100644 --- a/Docs/Layers/direction.md +++ b/Docs/Layers/direction.md @@ -1,6 +1,4 @@ - - - direction +direction =========== @@ -9,56 +7,39 @@ This layer visualizes directions - - - ## Table of contents 1. [direction](#direction) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +#### Themes using this layer - - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [surveillance](https://mapcomplete.osm.be/surveillance) - +- [personal](https://mapcomplete.osm.be/personal) +- [surveillance](https://mapcomplete.osm.be/surveillance) [Go to the source code](../assets/layers/direction/direction.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- camera:direction~^..*$|direction~^..*$ - - - camera:direction~^..*$|direction~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/direction/direction.json \ No newline at end of file diff --git a/Docs/Layers/drinking_water.md b/Docs/Layers/drinking_water.md index fff8e4045..7e92ef1d1 100644 --- a/Docs/Layers/drinking_water.md +++ b/Docs/Layers/drinking_water.md @@ -1,6 +1,4 @@ - - - drinking_water +drinking_water ================ @@ -9,129 +7,92 @@ A layer showing drinking water fountains - - - ## Table of contents 1. [drinking_water](#drinking_water) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Still in use?](#still-in-use) + [Bottle refill](#bottle-refill) + [render-closest-drinking-water](#render-closest-drinking-water) +- This layer will automatically load [drinking_water](./drinking_water.md) into the layout as it depends on it: A + calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + closest_other_drinking_water) +- This layer is needed as dependency for layer [drinking_water](#drinking_water) +#### Themes using this layer - - - This layer will automatically load [drinking_water](./drinking_water.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _closest_other_drinking_water) - - This layer is needed as dependency for layer [drinking_water](#drinking_water) - - - - -#### Themes using this layer - - - - - - - [cyclofix](https://mapcomplete.osm.be/cyclofix) - - [drinking_water](https://mapcomplete.osm.be/drinking_water) - - [nature](https://mapcomplete.osm.be/nature) - - [personal](https://mapcomplete.osm.be/personal) - +- [cyclofix](https://mapcomplete.osm.be/cyclofix) +- [drinking_water](https://mapcomplete.osm.be/drinking_water) +- [nature](https://mapcomplete.osm.be/nature) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/drinking_water/drinking_water.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =drinking_water +- access!~^permissive$ +- access!~^private$ - - - amenity=drinking_water - - access!~^permissive$ - - access!~^private$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/operational_status#values) [operational_status](https://wiki.openstreetmap.org/wiki/Key:operational_status) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:operational_status%3D) [broken](https://wiki.openstreetmap.org/wiki/Tag:operational_status%3Dbroken) [closed](https://wiki.openstreetmap.org/wiki/Tag:operational_status%3Dclosed) [](https://taginfo.openstreetmap.org/keys/bottle#values) [bottle](https://wiki.openstreetmap.org/wiki/Key:bottle) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:bottle%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:bottle%3Dno) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### Still in use? - - +### Still in use? The question is **Is this drinking water spot still operational?** -This rendering asks information about the property [operational_status](https://wiki.openstreetmap.org/wiki/Key:operational_status) +This rendering asks information about the +property [operational_status](https://wiki.openstreetmap.org/wiki/Key:operational_status) This is rendered with `The operational status is {operational_status}` +- **This drinking water works** corresponds with +- **This drinking water is broken** corresponds + with operational_status + =broken +- **This drinking water is closed** corresponds + with operational_status + =closed - - - **This drinking water works** corresponds with - - **This drinking water is broken** corresponds with operational_status=broken - - **This drinking water is closed** corresponds with operational_status=closed - - - - -### Bottle refill - - +### Bottle refill The question is **How easy is it to fill water bottles?** +- **It is easy to refill water bottles** corresponds + with bottle + =yes +- **Water bottles may not fit** corresponds + with bottle + =no - - - - - **It is easy to refill water bottles** corresponds with bottle=yes - - **Water bottles may not fit** corresponds with bottle=no - - - - -### render-closest-drinking-water - - +### render-closest-drinking-water _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/drinking_water/drinking_water.json \ No newline at end of file diff --git a/Docs/Layers/dumpstations.md b/Docs/Layers/dumpstations.md index 9b00170d6..5b4414abe 100644 --- a/Docs/Layers/dumpstations.md +++ b/Docs/Layers/dumpstations.md @@ -1,6 +1,4 @@ - - - dumpstations +dumpstations ============== @@ -9,15 +7,13 @@ Sanitary dump stations - - - ## Table of contents 1. [dumpstations](#dumpstations) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [dumpstations-fee](#dumpstations-fee) + [dumpstations-charge](#dumpstations-charge) @@ -27,175 +23,123 @@ Sanitary dump stations + [dumpstations-access](#dumpstations-access) + [dumpstations-network](#dumpstations-network) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [campersite](https://mapcomplete.osm.be/campersite) - +- [campersite](https://mapcomplete.osm.be/campersite) [Go to the source code](../assets/layers/dumpstations/dumpstations.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + = + sanitary_dump_station +- vehicle!~^no$ - - - amenity=sanitary_dump_station - - vehicle!~^no$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/fee#values) [fee](https://wiki.openstreetmap.org/wiki/Key:fee) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dno) -[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/water_point#values) [water_point](https://wiki.openstreetmap.org/wiki/Key:water_point) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:water_point%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:water_point%3Dno) [](https://taginfo.openstreetmap.org/keys/sanitary_dump_station:grey_water#values) [sanitary_dump_station:grey_water](https://wiki.openstreetmap.org/wiki/Key:sanitary_dump_station:grey_water) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:sanitary_dump_station:grey_water%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:sanitary_dump_station:grey_water%3Dno) [](https://taginfo.openstreetmap.org/keys/sanitary_dump_station:chemical_toilet#values) [sanitary_dump_station:chemical_toilet](https://wiki.openstreetmap.org/wiki/Key:sanitary_dump_station:chemical_toilet) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:sanitary_dump_station:chemical_toilet%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:sanitary_dump_station:chemical_toilet%3Dno) [](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | Multiple choice | [network](https://wiki.openstreetmap.org/wiki/Tag:access%3Dnetwork) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) -[](https://taginfo.openstreetmap.org/keys/network#values) [network](https://wiki.openstreetmap.org/wiki/Key:network) | [string](../SpecialInputElements.md#string) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/network#values) [network](https://wiki.openstreetmap.org/wiki/Key:network) | [string](../SpecialInputElements.md#string) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### dumpstations-fee - - +### dumpstations-fee The question is **Does this place charge a fee?** +- **You need to pay for use** corresponds with + fee=yes +- **Can be used for free** corresponds with + fee=no - - - - - **You need to pay for use** corresponds with fee=yes - - **Can be used for free** corresponds with fee=no - - - - -### dumpstations-charge - - +### dumpstations-charge The question is **How much does this place charge?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `This place charges {charge}` - - -### dumpstations-waterpoint - - +### dumpstations-waterpoint The question is **Does this place have a water point?** +- **This place has a water point** corresponds + with water_point + =yes +- **This place does not have a water point** corresponds + with water_point + =no - - - - - **This place has a water point** corresponds with water_point=yes - - **This place does not have a water point** corresponds with water_point=no - - - - -### dumpstations-grey-water - - +### dumpstations-grey-water The question is **Can you dispose of grey water here?** +- **You can dispose of grey water here** corresponds + with + sanitary_dump_station:grey_water + =yes +- **You cannot dispose of gray water here** corresponds + with + sanitary_dump_station:grey_water + =no - - - - - **You can dispose of grey water here** corresponds with sanitary_dump_station:grey_water=yes - - **You cannot dispose of gray water here** corresponds with sanitary_dump_station:grey_water=no - - - - -### dumpstations-chemical-waste - - +### dumpstations-chemical-waste The question is **Can you dispose of chemical toilet waste here?** +- **You can dispose of chemical toilet waste here** corresponds + with + sanitary_dump_station:chemical_toilet + =yes +- **You cannot dispose of chemical toilet waste here** corresponds + with + sanitary_dump_station:chemical_toilet + =no - - - - - **You can dispose of chemical toilet waste here** corresponds with sanitary_dump_station:chemical_toilet=yes - - **You cannot dispose of chemical toilet waste here** corresponds with sanitary_dump_station:chemical_toilet=no - - - - -### dumpstations-access - - +### dumpstations-access The question is **Who can use this dump station?** +- **You need a network key/code to use this** corresponds + with access + =network +- **You need to be a customer of camping/campersite to use this place** corresponds + with access + =customers +- **Anyone can use this dump station** corresponds + with access + =public_This option cannot be + chosen as answer_ +- **Anyone can use this dump station** corresponds + with access + =yes - - - - - **You need a network key/code to use this** corresponds with access=network - - **You need to be a customer of camping/campersite to use this place** corresponds with access=customers - - **Anyone can use this dump station** corresponds with access=public_This option cannot be chosen as answer_ - - **Anyone can use this dump station** corresponds with access=yes - - - - -### dumpstations-network - - +### dumpstations-network The question is **What network is this place a part of? (skip if none)** -This rendering asks information about the property [network](https://wiki.openstreetmap.org/wiki/Key:network) -This is rendered with `This station is part of network {network}` +This rendering asks information about the property [network](https://wiki.openstreetmap.org/wiki/Key:network) +This is rendered with `This station is part of network {network}` This document is autogenerated from assets/layers/dumpstations/dumpstations.json \ No newline at end of file diff --git a/Docs/Layers/entrance.md b/Docs/Layers/entrance.md index f715c29a5..0990f73f4 100644 --- a/Docs/Layers/entrance.md +++ b/Docs/Layers/entrance.md @@ -1,23 +1,20 @@ - - - entrance +entrance ========== -A layer showing entrances and offering capabilities to survey some advanced data which is important for e.g. wheelchair users (but also bicycle users, people who want to deliver, ...) - - - +A layer showing entrances and offering capabilities to survey some advanced data which is important for e.g. wheelchair +users (but also bicycle users, people who want to deliver, ...) ## Table of contents 1. [entrance](#entrance) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Entrance type](#entrance-type) + [Door_type](#door_type) @@ -25,145 +22,147 @@ A layer showing entrances and offering capabilities to survey some advanced data + [width](#width) +- This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on + it: a preset snaps to this layer (presets[0]) +- This layer will automatically load [pedestrian_path](./pedestrian_path.md) into the layout as it depends on it: a + preset snaps to this layer (presets[0]) +#### Themes using this layer - - - This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on it: a preset snaps to this layer (presets[0]) - - This layer will automatically load [pedestrian_path](./pedestrian_path.md) into the layout as it depends on it: a preset snaps to this layer (presets[0]) - - - - -#### Themes using this layer - - - - - - - [entrances](https://mapcomplete.osm.be/entrances) - - [personal](https://mapcomplete.osm.be/personal) - +- [entrances](https://mapcomplete.osm.be/entrances) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/entrance/entrance.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- entrance~^..*$|indoor + =door - - - entrance~^..*$|indoor=door - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/entrance#values) [entrance](https://wiki.openstreetmap.org/wiki/Key:entrance) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:entrance%3D) [main](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dmain) [secondary](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dsecondary) [service](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dservice) [exit](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dexit) [entrance](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dentrance) [emergency](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Demergency) [home](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dhome) [](https://taginfo.openstreetmap.org/keys/door#values) [door](https://wiki.openstreetmap.org/wiki/Key:door) | Multiple choice | [hinged](https://wiki.openstreetmap.org/wiki/Tag:door%3Dhinged) [revolving](https://wiki.openstreetmap.org/wiki/Tag:door%3Drevolving) [sliding](https://wiki.openstreetmap.org/wiki/Tag:door%3Dsliding) [overhead](https://wiki.openstreetmap.org/wiki/Tag:door%3Doverhead) [no](https://wiki.openstreetmap.org/wiki/Tag:door%3Dno) [](https://taginfo.openstreetmap.org/keys/automatic_door#values) [automatic_door](https://wiki.openstreetmap.org/wiki/Key:automatic_door) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dno) [motion](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dmotion) [floor](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dfloor) [button](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dbutton) [slowdown_button](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dslowdown_button) [continuous](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dcontinuous) [serviced_on_button_press](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dserviced_on_button_press) [serviced_on_request](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dserviced_on_request) -[](https://taginfo.openstreetmap.org/keys/width#values) [width](https://wiki.openstreetmap.org/wiki/Key:width) | [length](../SpecialInputElements.md#length) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/width#values) [width](https://wiki.openstreetmap.org/wiki/Key:width) | [length](../SpecialInputElements.md#length) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### Entrance type - - +### Entrance type The question is **What type of entrance is this?** +- **No specific entrance type is known** corresponds + with entrance + =yes_This option cannot be chosen + as answer_ +- **This is an indoor door, separating a room or a corridor within a single building** corresponds + with indoor + =door +- **This is the main entrance** corresponds + with entrance + =main +- **This is a secondary entrance** corresponds + with entrance + =secondary +- **This is a service entrance - normally only used for employees, delivery, ...** corresponds + with entrance + =service +- **This is an exit where one can not enter** corresponds + with entrance + =exit +- **This is an entrance where one can only enter (but not exit)** corresponds + with entrance + =entrance +- **This is emergency exit** corresponds + with entrance + =emergency +- **This is the entrance to a private home** corresponds + with entrance + =home +### Door_type +The question is **What is the type of this door?
Wether or not the door is automated is asked +in the next question** +- **The door type is not known** corresponds + with door + =yes_This option cannot be chosen as + answer_ +- **A classical, hinged door supported by joints** corresponds + with door + =hinged +- **A revolving door which hangs on a central shaft, rotating within a cylindrical enclosure** corresponds + with door + =revolving +- **A sliding door where the door slides sidewards, typically parallel with a wall** corresponds + with door + =sliding +- **A door which rolls from overhead, typically seen for garages** corresponds + with door + =overhead +- **This is an entrance without a physical door** corresponds + with door + =no - - **No specific entrance type is known** corresponds with entrance=yes_This option cannot be chosen as answer_ - - **This is an indoor door, separating a room or a corridor within a single building** corresponds with indoor=door - - **This is the main entrance** corresponds with entrance=main - - **This is a secondary entrance** corresponds with entrance=secondary - - **This is a service entrance - normally only used for employees, delivery, ...** corresponds with entrance=service - - **This is an exit where one can not enter** corresponds with entrance=exit - - **This is an entrance where one can only enter (but not exit)** corresponds with entrance=entrance - - **This is emergency exit** corresponds with entrance=emergency - - **This is the entrance to a private home** corresponds with entrance=home - - - - -### Door_type - - - -The question is **What is the type of this door?
Wether or not the door is automated is asked in the next question** - - - - - - - **The door type is not known** corresponds with door=yes_This option cannot be chosen as answer_ - - **A classical, hinged door supported by joints** corresponds with door=hinged - - **A revolving door which hangs on a central shaft, rotating within a cylindrical enclosure** corresponds with door=revolving - - **A sliding door where the door slides sidewards, typically parallel with a wall** corresponds with door=sliding - - **A door which rolls from overhead, typically seen for garages** corresponds with door=overhead - - **This is an entrance without a physical door** corresponds with door=no - - - - -### automatic_door - - +### automatic_door The question is **Is this door automated?** +- **This is an automatic door** corresponds + with automatic_door + =yes_This option cannot be + chosen as answer_ +- **This door is not automated** corresponds + with automatic_door + =no +- **This door will open automatically when motion is detected** corresponds + with automatic_door + =motion +- **This door will open automatically when a sensor in the floor is triggered** corresponds + with automatic_door + =floor +- **This door will open automatically when a button is pressed** corresponds + with automatic_door + =button +- **This door revolves automatically all the time, but has a button to slow it down, e.g. for wheelchair users** + corresponds with automatic_door + = + slowdown_button +- **This door revolves automatically all the time** corresponds + with automatic_door + =continuous +- **This door will be opened by staff when requested by pressing a buttonautomatic_door + = + serviced_on_button_press +- **This door will be opened by staff when requested** corresponds + with automatic_door + = + serviced_on_request - - - - - **This is an automatic door** corresponds with automatic_door=yes_This option cannot be chosen as answer_ - - **This door is not automated** corresponds with automatic_door=no - - **This door will open automatically when motion is detected** corresponds with automatic_door=motion - - **This door will open automatically when a sensor in the floor is triggered** corresponds with automatic_door=floor - - **This door will open automatically when a button is pressed** corresponds with automatic_door=button - - **This door revolves automatically all the time, but has a button to slow it down, e.g. for wheelchair users** corresponds with automatic_door=slowdown_button - - **This door revolves automatically all the time** corresponds with automatic_door=continuous - - **This door will be opened by staff when requested by pressing a buttonautomatic_door=serviced_on_button_press - - **This door will be opened by staff when requested** corresponds with automatic_door=serviced_on_request - - - - -### width - - +### width The question is **What is the width of this door/entrance?** -This rendering asks information about the property [width](https://wiki.openstreetmap.org/wiki/Key:width) -This is rendered with `This door has a width of {canonical(width)} meter` +This rendering asks information about the property [width](https://wiki.openstreetmap.org/wiki/Key:width) +This is rendered with `This door has a width of {canonical(width)} meter` This document is autogenerated from assets/layers/entrance/entrance.json \ No newline at end of file diff --git a/Docs/Layers/etymology.md b/Docs/Layers/etymology.md index 2a4053da3..06e6251b0 100644 --- a/Docs/Layers/etymology.md +++ b/Docs/Layers/etymology.md @@ -1,6 +1,4 @@ - - - etymology +etymology =========== @@ -9,15 +7,13 @@ All objects which have an etymology known - - - ## Table of contents 1. [etymology](#etymology) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [etymology-images-from-wikipedia](#etymology-images-from-wikipedia) + [wikipedia-etymology](#wikipedia-etymology) + [zoeken op inventaris onroerend erfgoed](#zoeken-op-inventaris-onroerend-erfgoed) @@ -28,153 +24,84 @@ All objects which have an etymology known + [etymology_multi_apply](#etymology_multi_apply) + [wikipedia](#wikipedia) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [etymology](https://mapcomplete.osm.be/etymology) - - [personal](https://mapcomplete.osm.be/personal) - +- [etymology](https://mapcomplete.osm.be/etymology) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/etymology/etymology.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- name:etymology:wikidata~^..*$|name:etymology~^..*$ - - - name:etymology:wikidata~^..*$|name:etymology~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name:etymology:wikidata#values) [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | +[](https://taginfo.openstreetmap.org/keys/name:etymology:wikidata#values) [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | [](https://taginfo.openstreetmap.org/keys/name:etymology#values) [name:etymology](https://wiki.openstreetmap.org/wiki/Key:name:etymology) | [string](../SpecialInputElements.md#string) | [unknown](https://wiki.openstreetmap.org/wiki/Tag:name:etymology%3Dunknown) - - - -### etymology-images-from-wikipedia - - +### etymology-images-from-wikipedia _This tagrendering has no question and is thus read-only_ - - - - -### wikipedia-etymology - - +### wikipedia-etymology The question is **What is the Wikidata-item that this object is named after?** -This rendering asks information about the property [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) -This is rendered with `

Wikipedia article of the name giver

{wikipedia(name:etymology:wikidata):max-height:20rem}` - - - -### zoeken op inventaris onroerend erfgoed - +This rendering asks information about the +property [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) +This is rendered +with `

Wikipedia article of the name giver

{wikipedia(name:etymology:wikidata):max-height:20rem}` +### zoeken op inventaris onroerend erfgoed _This tagrendering has no question and is thus read-only_ +### simple etymology +The question is **What is this object named after?
This might be written on the street name +sign** - - -### simple etymology - - - -The question is **What is this object named after?
This might be written on the street name sign** - -This rendering asks information about the property [name:etymology](https://wiki.openstreetmap.org/wiki/Key:name:etymology) +This rendering asks information about the +property [name:etymology](https://wiki.openstreetmap.org/wiki/Key:name:etymology) This is rendered with `Named after {name:etymology}` +- **The origin of this name is unknown in all literature** corresponds + with name:etymology + =unknown - - - **The origin of this name is unknown in all literature** corresponds with name:etymology=unknown - - - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### street-name-sign-image - - +### street-name-sign-image _This tagrendering has no question and is thus read-only_ - - - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - - - -### etymology_multi_apply - - +### etymology_multi_apply _This tagrendering has no question and is thus read-only_ - - - - -### wikipedia - - +### wikipedia _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/etymology/etymology.json \ No newline at end of file diff --git a/Docs/Layers/extinguisher.md b/Docs/Layers/extinguisher.md index e8df792b2..d9ab42317 100644 --- a/Docs/Layers/extinguisher.md +++ b/Docs/Layers/extinguisher.md @@ -1,6 +1,4 @@ - - - extinguisher +extinguisher ============== @@ -9,94 +7,60 @@ Map layer to show fire hydrants. - - - ## Table of contents 1. [extinguisher](#extinguisher) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [extinguisher-location](#extinguisher-location) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [hailhydrant](https://mapcomplete.osm.be/hailhydrant) - - [personal](https://mapcomplete.osm.be/personal) - +- [hailhydrant](https://mapcomplete.osm.be/hailhydrant) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/extinguisher/extinguisher.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- emergency + =fire_extinguisher - - - emergency=fire_extinguisher - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/location#values) [location](https://wiki.openstreetmap.org/wiki/Key:location) | [string](../SpecialInputElements.md#string) | [indoor](https://wiki.openstreetmap.org/wiki/Tag:location%3Dindoor) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:location%3Doutdoor) - - - -### extinguisher-location - - +### extinguisher-location The question is **Where is it positioned?** -This rendering asks information about the property [location](https://wiki.openstreetmap.org/wiki/Key:location) +This rendering asks information about the property [location](https://wiki.openstreetmap.org/wiki/Key:location) This is rendered with `Location: {location}` +- **Found indoors.** corresponds with + location=indoor +- **Found outdoors.** corresponds with + location=outdoor - - - **Found indoors.** corresponds with location=indoor - - **Found outdoors.** corresponds with location=outdoor - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/extinguisher/extinguisher.json \ No newline at end of file diff --git a/Docs/Layers/facadegardens.md b/Docs/Layers/facadegardens.md index 47817dacf..e29139bfa 100644 --- a/Docs/Layers/facadegardens.md +++ b/Docs/Layers/facadegardens.md @@ -1,6 +1,4 @@ - - - facadegardens +facadegardens =============== @@ -9,15 +7,13 @@ Facade gardens - - - ## Table of contents 1. [facadegardens](#facadegardens) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [facadegardens-direction](#facadegardens-direction) + [facadegardens-sunshine](#facadegardens-sunshine) @@ -27,171 +23,116 @@ Facade gardens + [facadegardens-plants](#facadegardens-plants) + [facadegardens-description](#facadegardens-description) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [facadegardens](https://mapcomplete.osm.be/facadegardens) - +- [facadegardens](https://mapcomplete.osm.be/facadegardens) [Go to the source code](../assets/layers/facadegardens/facadegardens.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =garden +- garden:type + =facade_garden - - - leisure=garden - - garden:type=facade_garden - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/direction#values) [direction](https://wiki.openstreetmap.org/wiki/Key:direction) | [direction](../SpecialInputElements.md#direction) | +[](https://taginfo.openstreetmap.org/keys/direction#values) [direction](https://wiki.openstreetmap.org/wiki/Key:direction) | [direction](../SpecialInputElements.md#direction) | [](https://taginfo.openstreetmap.org/keys/direct_sunlight#values) [direct_sunlight](https://wiki.openstreetmap.org/wiki/Key:direct_sunlight) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:direct_sunlight%3Dyes) [partial](https://wiki.openstreetmap.org/wiki/Tag:direct_sunlight%3Dpartial) [no](https://wiki.openstreetmap.org/wiki/Tag:direct_sunlight%3Dno) [](https://taginfo.openstreetmap.org/keys/rain_barrel#values) [rain_barrel](https://wiki.openstreetmap.org/wiki/Key:rain_barrel) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:rain_barrel%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:rain_barrel%3Dno) -[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [text](../SpecialInputElements.md#text) | +[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [text](../SpecialInputElements.md#text) | [](https://taginfo.openstreetmap.org/keys/edible#values) [edible](https://wiki.openstreetmap.org/wiki/Key:edible) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:edible%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:edible%3Dno) [](https://taginfo.openstreetmap.org/keys/plant#values) [plant](https://wiki.openstreetmap.org/wiki/Key:plant) | Multiple choice | [vine](https://wiki.openstreetmap.org/wiki/Tag:plant%3Dvine) [flower](https://wiki.openstreetmap.org/wiki/Tag:plant%3Dflower) [shrub](https://wiki.openstreetmap.org/wiki/Tag:plant%3Dshrub) [groundcover](https://wiki.openstreetmap.org/wiki/Tag:plant%3Dgroundcover) -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### facadegardens-direction - - +### facadegardens-direction The question is **What is the orientation of the garden?** -This rendering asks information about the property [direction](https://wiki.openstreetmap.org/wiki/Key:direction) +This rendering asks information about the property [direction](https://wiki.openstreetmap.org/wiki/Key:direction) This is rendered with `Orientation: {direction} (where 0=N and 90=O)` - - -### facadegardens-sunshine - - +### facadegardens-sunshine The question is **Is the garden shaded or sunny?** +- **The garden is in full sun** corresponds + with direct_sunlight + =yes +- **The garden is in partial shade** corresponds + with direct_sunlight + =partial +- **The garden is in the shade** corresponds + with direct_sunlight + =no - - - - - **The garden is in full sun** corresponds with direct_sunlight=yes - - **The garden is in partial shade** corresponds with direct_sunlight=partial - - **The garden is in the shade** corresponds with direct_sunlight=no - - - - -### facadegardens-rainbarrel - - +### facadegardens-rainbarrel The question is **Is there a water barrel installed for the garden?** +- **There is a rain barrel** corresponds + with rain_barrel + =yes +- **There is no rain barrel** corresponds + with rain_barrel + =no - - - - - **There is a rain barrel** corresponds with rain_barrel=yes - - **There is no rain barrel** corresponds with rain_barrel=no - - - - -### facadegardens-start_date - - +### facadegardens-start_date The question is **When was the garden constructed? (a year is sufficient)** -This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) +This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) This is rendered with `Construction date of the garden: {start_date}` - - -### facadegardens-edible - - +### facadegardens-edible The question is **Are there any edible plants?** +- **There are edible plants** corresponds with + edible=yes +- **There are no edible plants** corresponds + with edible + =no - - - - - **There are edible plants** corresponds with edible=yes - - **There are no edible plants** corresponds with edible=no - - - - -### facadegardens-plants - - +### facadegardens-plants The question is **What kinds of plants grow here?** +- **There are vines** corresponds with plant + =vine +- **There are flowering plants** corresponds + with plant + =flower +- **There are shrubs** corresponds with + plant=shrub +- **There are groundcovering plants** corresponds + with plant + =groundcover - - - - - **There are vines** corresponds with plant=vine - - **There are flowering plants** corresponds with plant=flower - - **There are shrubs** corresponds with plant=shrub - - **There are groundcovering plants** corresponds with plant=groundcover - - - - -### facadegardens-description - - +### facadegardens-description The question is **Extra describing info about the garden (if needed and not yet described above)** -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) -This is rendered with `More details: {description}` +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This is rendered with `More details: {description}` This document is autogenerated from assets/layers/facadegardens/facadegardens.json \ No newline at end of file diff --git a/Docs/Layers/fietsstraat.md b/Docs/Layers/fietsstraat.md index 4d78584c1..327223b21 100644 --- a/Docs/Layers/fietsstraat.md +++ b/Docs/Layers/fietsstraat.md @@ -1,6 +1,4 @@ - - - fietsstraat +fietsstraat ============= @@ -9,66 +7,38 @@ A cyclestreet is a street where motorized traffic is not allowed to overtake a cyclist - - - ## Table of contents 1. [fietsstraat](#fietsstraat) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclestreets](https://mapcomplete.osm.be/cyclestreets) - +- [cyclestreets](https://mapcomplete.osm.be/cyclestreets) [Go to the source code](../assets/layers/fietsstraat/fietsstraat.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- cyclestreet + =yes - - - cyclestreet=yes - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/fietsstraat/fietsstraat.json \ No newline at end of file diff --git a/Docs/Layers/fire_station.md b/Docs/Layers/fire_station.md index 410023ffe..9c6419ecd 100644 --- a/Docs/Layers/fire_station.md +++ b/Docs/Layers/fire_station.md @@ -1,6 +1,4 @@ - - - fire_station +fire_station ============== @@ -9,15 +7,13 @@ Map layer to show fire stations. - - - ## Table of contents 1. [fire_station](#fire_station) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [station-name](#station-name) + [station-street](#station-street) + [station-place](#station-place) @@ -25,137 +21,97 @@ Map layer to show fire stations. + [station-operator](#station-operator) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [hailhydrant](https://mapcomplete.osm.be/hailhydrant) - - [personal](https://mapcomplete.osm.be/personal) - +- [hailhydrant](https://mapcomplete.osm.be/hailhydrant) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/fire_station/fire_station.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =fire_station - - - amenity=fire_station - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/addr:street#values) [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/addr:place#values) [addr:place](https://wiki.openstreetmap.org/wiki/Key:addr:place) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/addr:street#values) [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/addr:place#values) [addr:place](https://wiki.openstreetmap.org/wiki/Key:addr:place) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Bureau of Fire Protection](https://wiki.openstreetmap.org/wiki/Tag:operator%3DBureau of Fire Protection) [](https://taginfo.openstreetmap.org/keys/operator:type#values) [operator:type](https://wiki.openstreetmap.org/wiki/Key:operator:type) | [string](../SpecialInputElements.md#string) | [government](https://wiki.openstreetmap.org/wiki/Tag:operator:type%3Dgovernment) [community](https://wiki.openstreetmap.org/wiki/Tag:operator:type%3Dcommunity) [ngo](https://wiki.openstreetmap.org/wiki/Tag:operator:type%3Dngo) [private](https://wiki.openstreetmap.org/wiki/Tag:operator:type%3Dprivate) - - - -### station-name - - +### station-name The question is **What is the name of this fire station?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This station is called {name}.` - - -### station-street - - +### station-street The question is ** What is the street name where the station located?** -This rendering asks information about the property [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) +This rendering asks information about the property [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) This is rendered with `This station is along a highway called {addr:street}.` - - -### station-place - - +### station-place The question is **Where is the station located? (e.g. name of neighborhood, villlage, or town)** -This rendering asks information about the property [addr:place](https://wiki.openstreetmap.org/wiki/Key:addr:place) +This rendering asks information about the property [addr:place](https://wiki.openstreetmap.org/wiki/Key:addr:place) This is rendered with `This station is found within {addr:place}.` - - -### station-agency - - +### station-agency The question is **What agency operates this station?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `This station is operated by {operator}.` +- **Bureau of Fire Protection** corresponds + with operator + =Bureau of Fire + Protection&operator:type + =government - - - **Bureau of Fire Protection** corresponds with operator=Bureau of Fire Protection&operator:type=government - - - - -### station-operator - - +### station-operator The question is **How is the station operator classified?** -This rendering asks information about the property [operator:type](https://wiki.openstreetmap.org/wiki/Key:operator:type) +This rendering asks information about the +property [operator:type](https://wiki.openstreetmap.org/wiki/Key:operator:type) This is rendered with `The operator is a(n) {operator:type} entity.` +- **The station is operated by the government.** corresponds + with operator:type + =government +- **The station is operated by a community-based, or informal organization.** corresponds + with operator:type + =community +- **The station is operated by a formal group of volunteers.** corresponds + with operator:type + =ngo +- **The station is privately operated.** corresponds + with operator:type + =private - - - **The station is operated by the government.** corresponds with operator:type=government - - **The station is operated by a community-based, or informal organization.** corresponds with operator:type=community - - **The station is operated by a formal group of volunteers.** corresponds with operator:type=ngo - - **The station is privately operated.** corresponds with operator:type=private - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/fire_station/fire_station.json \ No newline at end of file diff --git a/Docs/Layers/food.md b/Docs/Layers/food.md index 070ee08c6..25548feef 100644 --- a/Docs/Layers/food.md +++ b/Docs/Layers/food.md @@ -1,6 +1,4 @@ - - - food +food ====== @@ -9,15 +7,13 @@ A layer showing restaurants and fast-food amenities (with a special rendering for friteries) - - - ## Table of contents 1. [food](#food) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Name](#name) + [Fastfood vs restaurant](#fastfood-vs-restaurant) @@ -40,61 +36,43 @@ A layer showing restaurants and fast-food amenities (with a special rendering fo + [dog-access](#dog-access) + [reviews](#reviews) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [food](https://mapcomplete.osm.be/food) - - [fritures](https://mapcomplete.osm.be/fritures) - - [personal](https://mapcomplete.osm.be/personal) - +- [food](https://mapcomplete.osm.be/food) +- [fritures](https://mapcomplete.osm.be/fritures) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/food/food.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =fast_food + |amenity + =restaurant - - - amenity=fast_food|amenity=restaurant - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [fast_food](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfast_food) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/cuisine#values) [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) | [string](../SpecialInputElements.md#string) | [pizza](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpizza) [friture](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfriture) [pasta](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpasta) [kebab](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dkebab) [sandwich](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsandwich) [burger](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dburger) [sushi](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsushi) [coffee](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dcoffee) [italian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Ditalian) [french](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfrench) [chinese](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchinese) [greek](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dgreek) [indian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dindian) [turkish](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dturkish) [thai](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dthai) [](https://taginfo.openstreetmap.org/keys/takeaway#values) [takeaway](https://wiki.openstreetmap.org/wiki/Key:takeaway) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:takeaway%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:takeaway%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:takeaway%3Dno) @@ -108,349 +86,302 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/service:electricity#values) [service:electricity](https://wiki.openstreetmap.org/wiki/Key:service:electricity) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dlimited) [ask](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dask) [no](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dno) [](https://taginfo.openstreetmap.org/keys/dog#values) [dog](https://wiki.openstreetmap.org/wiki/Key:dog) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dno) [leashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dleashed) [unleashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dunleashed) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### Name - - +### Name The question is **What is the name of this restaurant?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `The name of this restaurant is {name}` - - -### Fastfood vs restaurant - - +### Fastfood vs restaurant The question is **What type of business is this?** +- **Dit is een fastfood-zaak. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel** + corresponds with amenity + =fast_food +- **Dit is een restaurant. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend** corresponds + with amenity + =restaurant - - - - - **Dit is een fastfood-zaak. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel** corresponds with amenity=fast_food - - **Dit is een restaurant. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend** corresponds with amenity=restaurant - - - - -### opening_hours - - +### opening_hours The question is **What are the opening hours of {name}?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `

Opening hours

{opening_hours_table(opening_hours)}` - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### email - - +### email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` +- **{contact:email}** corresponds with contact:email~^..*$_This + option cannot be chosen as answer_ - - - **{contact:email}** corresponds with contact:email~^..*$_This option cannot be chosen as answer_ - - - - -### phone - - +### phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` +- **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be + chosen as answer_ - - - **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be chosen as answer_ - - - - -### payment-options - - +### payment-options The question is **Which methods of payment are accepted here?** +- **Cash is accepted here** corresponds + with payment:cash + =yesUnselecting this answer + will add payment:cash + =no +- **Payment cards are accepted here** corresponds + with payment:cards + =yesUnselecting this answer + will add payment:cards + =no - - - - - **Cash is accepted here** corresponds with payment:cash=yesUnselecting this answer will add payment:cash=no - - **Payment cards are accepted here** corresponds with payment:cards=yesUnselecting this answer will add payment:cards=no - - - - -### wheelchair-access - - +### wheelchair-access The question is **Is this place accessible with a wheelchair?** +- **This place is specially adapted for wheelchair users** corresponds + with wheelchair + =designated +- **This place is easily reachable with a wheelchair** corresponds + with wheelchair + =yes +- **It is possible to reach this place in a wheelchair, but it is not easy** corresponds + with wheelchair + =limited +- **This place is not reachable with a wheelchair** corresponds + with wheelchair + =no - - - - - **This place is specially adapted for wheelchair users** corresponds with wheelchair=designated - - **This place is easily reachable with a wheelchair** corresponds with wheelchair=yes - - **It is possible to reach this place in a wheelchair, but it is not easy** corresponds with wheelchair=limited - - **This place is not reachable with a wheelchair** corresponds with wheelchair=no - - - - -### Cuisine - - +### Cuisine The question is **Which food is served here?** -This rendering asks information about the property [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) +This rendering asks information about the property [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) This is rendered with `This place mostly serves {cuisine}` +- **This is a pizzeria** corresponds with + cuisine=pizza +- **This is a friture** corresponds with + cuisine=friture +- **Mainly serves pasta** corresponds with + cuisine=pasta +- **Dit is een kebabzaak** corresponds with + cuisine=kebab +- **Dit is een broodjeszaak** corresponds + with cuisine + =sandwich +- **Dit is een hamburgerrestaurant** corresponds + with cuisine + =burger +- **Dit is een sushirestaurant** corresponds + with cuisine + =sushi +- **Dit is een koffiezaak** corresponds with + cuisine=coffee +- **Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)** corresponds + with cuisine + =italian +- **Dit is een Frans restaurant** corresponds + with cuisine + =french +- **Dit is een Chinees restaurant** corresponds + with cuisine + =chinese +- **Dit is een Grieks restaurant** corresponds + with cuisine + =greek +- **Dit is een Indisch restaurant** corresponds + with cuisine + =indian +- **Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)** corresponds + with cuisine + =turkish +- **Dit is een Thaïs restaurant** corresponds + with cuisine + =thai - - - **This is a pizzeria** corresponds with cuisine=pizza - - **This is a friture** corresponds with cuisine=friture - - **Mainly serves pasta** corresponds with cuisine=pasta - - **Dit is een kebabzaak** corresponds with cuisine=kebab - - **Dit is een broodjeszaak** corresponds with cuisine=sandwich - - **Dit is een hamburgerrestaurant** corresponds with cuisine=burger - - **Dit is een sushirestaurant** corresponds with cuisine=sushi - - **Dit is een koffiezaak** corresponds with cuisine=coffee - - **Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)** corresponds with cuisine=italian - - **Dit is een Frans restaurant** corresponds with cuisine=french - - **Dit is een Chinees restaurant** corresponds with cuisine=chinese - - **Dit is een Grieks restaurant** corresponds with cuisine=greek - - **Dit is een Indisch restaurant** corresponds with cuisine=indian - - **Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)** corresponds with cuisine=turkish - - **Dit is een Thaïs restaurant** corresponds with cuisine=thai - - - - -### Takeaway - - +### Takeaway The question is **Does this place offer takea-way?** +- **This is a take-away only business** corresponds + with takeaway + =only +- **Take-away is possible here** corresponds + with takeaway + =yes +- **Take-away is not possible here** corresponds + with takeaway + =no - - - - - **This is a take-away only business** corresponds with takeaway=only - - **Take-away is possible here** corresponds with takeaway=yes - - **Take-away is not possible here** corresponds with takeaway=no - - - - -### Vegetarian (no friture) - - +### Vegetarian (no friture) The question is **Does this restaurant have a vegetarian option?** +- **Geen vegetarische opties beschikbaar** corresponds + with diet:vegetarian + =no +- **Beperkte vegetarische opties zijn beschikbaar** corresponds + with diet:vegetarian + =limited +- **Vegetarische opties zijn beschikbaar** corresponds + with diet:vegetarian + =yes +- **Enkel vegetarische opties zijn beschikbaar** corresponds + with diet:vegetarian + =only - - - - - **Geen vegetarische opties beschikbaar** corresponds with diet:vegetarian=no - - **Beperkte vegetarische opties zijn beschikbaar** corresponds with diet:vegetarian=limited - - **Vegetarische opties zijn beschikbaar** corresponds with diet:vegetarian=yes - - **Enkel vegetarische opties zijn beschikbaar** corresponds with diet:vegetarian=only - - - - -### Vegan (no friture) - - +### Vegan (no friture) The question is **Heeft deze eetgelegenheid een veganistische optie?** +- **Geen veganistische opties beschikbaar** corresponds + with diet:vegan + =no +- **Beperkte veganistische opties zijn beschikbaar** corresponds + with diet:vegan + =limited +- **Veganistische opties zijn beschikbaar** corresponds + with diet:vegan + =yes +- **Enkel veganistische opties zijn beschikbaar** corresponds + with diet:vegan + =only - - - - - **Geen veganistische opties beschikbaar** corresponds with diet:vegan=no - - **Beperkte veganistische opties zijn beschikbaar** corresponds with diet:vegan=limited - - **Veganistische opties zijn beschikbaar** corresponds with diet:vegan=yes - - **Enkel veganistische opties zijn beschikbaar** corresponds with diet:vegan=only - - - - -### halal (no friture) - - +### halal (no friture) The question is **Does this restaurant offer a halal menu?** +- **There are no halal options available** corresponds + with diet:halal + =no +- **There is a small halal menu** corresponds + with diet:halal + =limited +- **There is a halal menu** corresponds + with diet:halal + =yes +- **Only halal options are available** corresponds + with diet:halal + =only - - - - - **There are no halal options available** corresponds with diet:halal=no - - **There is a small halal menu** corresponds with diet:halal=limited - - **There is a halal menu** corresponds with diet:halal=yes - - **Only halal options are available** corresponds with diet:halal=only - - - - -### friture-vegetarian - - +### friture-vegetarian The question is **Heeft deze frituur vegetarische snacks?** +- **Er zijn vegetarische snacks aanwezig** corresponds + with diet:vegetarian + =yes +- **Slechts enkele vegetarische snacks** corresponds + with diet:vegetarian + =limited +- **Geen vegetarische snacks beschikbaar** corresponds + with diet:vegetarian + =no - - - - - **Er zijn vegetarische snacks aanwezig** corresponds with diet:vegetarian=yes - - **Slechts enkele vegetarische snacks** corresponds with diet:vegetarian=limited - - **Geen vegetarische snacks beschikbaar** corresponds with diet:vegetarian=no - - - - -### friture-vegan - - +### friture-vegan The question is **Heeft deze frituur veganistische snacks?** +- **Er zijn veganistische snacks aanwezig** corresponds + with diet:vegan + =yes +- **Slechts enkele veganistische snacks** corresponds + with diet:vegan + =limited +- **Geen veganistische snacks beschikbaar** corresponds + with diet:vegan + =no - - - - - **Er zijn veganistische snacks aanwezig** corresponds with diet:vegan=yes - - **Slechts enkele veganistische snacks** corresponds with diet:vegan=limited - - **Geen veganistische snacks beschikbaar** corresponds with diet:vegan=no - - - - -### friture-oil - - +### friture-oil The question is **Bakt deze frituur met dierlijk vet of met plantaardige olie?** +- **Plantaardige olie** corresponds with + friture:oil= + vegetable +- **Dierlijk vet** corresponds with + friture:oil=animal +### friture-take-your-container +The question is **If you bring your own container (such as a cooking pot and small pots), is it used to package your +order?
** +- **You can bring your own containers to get your order, saving on single-use packaging material and thus waste** + corresponds with + reusable_packaging:accept + =yes +- **Bringing your own container is not allowed** corresponds + with reusable_packaging: + accept=no +- **You must bring your own container to order here.** corresponds + with reusable_packaging: + accept=only - - **Plantaardige olie** corresponds with friture:oil=vegetable - - **Dierlijk vet** corresponds with friture:oil=animal - - - - -### friture-take-your-container - - - -The question is **If you bring your own container (such as a cooking pot and small pots), is it used to package your order?
** - - - - - - - **You can bring your own containers to get your order, saving on single-use packaging material and thus waste** corresponds with reusable_packaging:accept=yes - - **Bringing your own container is not allowed** corresponds with reusable_packaging:accept=no - - **You must bring your own container to order here.** corresponds with reusable_packaging:accept=only - - - - -### service:electricity - - +### service:electricity The question is **Does this amenity have electrical outlets, available to customers when they are inside?** +- **There are plenty of domestic sockets available to customers seated indoors, where they can charge their + electronics** corresponds with + service:electricity= + yes +- **There are a few domestic sockets available to customers seated indoors, where they can charge their electronics** + corresponds with service: + electricity= + limited +- **There are no sockets available indoors to customers, but charging might be possible if the staff is asked** + corresponds with service: + electricity=ask +- **There are a no domestic sockets available to customers seated indoors** corresponds + with service:electricity + =no - - - - - **There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics** corresponds with service:electricity=yes - - **There are a few domestic sockets available to customers seated indoors, where they can charge their electronics** corresponds with service:electricity=limited - - **There are no sockets available indoors to customers, but charging might be possible if the staff is asked** corresponds with service:electricity=ask - - **There are a no domestic sockets available to customers seated indoors** corresponds with service:electricity=no - - - - -### dog-access - - +### dog-access The question is **Are dogs allowed in this business?** +- **Dogs are allowed** corresponds with dog + =yes +- **Dogs are not allowed** corresponds + with dog + =no +- **Dogs are allowed, but they have to be leashed** corresponds + with dog + =leashed +- **Dogs are allowed and can run around freely** corresponds + with dog + =unleashed - - - - - **Dogs are allowed** corresponds with dog=yes - - **Dogs are not allowed** corresponds with dog=no - - **Dogs are allowed, but they have to be leashed** corresponds with dog=leashed - - **Dogs are allowed and can run around freely** corresponds with dog=unleashed - - - - -### reviews - - +### reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/food/food.json \ No newline at end of file diff --git a/Docs/Layers/forest.md b/Docs/Layers/forest.md index d92f53c27..6688ee8c4 100644 --- a/Docs/Layers/forest.md +++ b/Docs/Layers/forest.md @@ -1,6 +1,4 @@ - - - forest +forest ======== @@ -9,55 +7,44 @@ Een bos is een verzameling bomen, al dan niet als productiehout. - - - ## Table of contents 1. [forest](#forest) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) - - - - - This layer will automatically load [parks](./parks.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _overlapWithUpperLayers) - - This layer will automatically load [nature_reserve_buurtnatuur](./nature_reserve_buurtnatuur.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _overlapWithUpperLayers) - +- This layer will automatically load [parks](./parks.md) into the layout as it depends on it: A calculated tag loads + features from this layer (calculatedTag[0] which calculates the value for _overlapWithUpperLayers) +- This layer will automatically load [nature_reserve_buurtnatuur](./nature_reserve_buurtnatuur.md) into the layout as + it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + overlapWithUpperLayers) [Go to the source code](../assets/layers/forest/forest.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- landuse + =forest + |natural + =wood + |natural + =scrub - - - landuse=forest|natural=wood|natural=scrub - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/forest/forest.json \ No newline at end of file diff --git a/Docs/Layers/fruitboom.md b/Docs/Layers/fruitboom.md index 0317e6f8e..e1ded5c7c 100644 --- a/Docs/Layers/fruitboom.md +++ b/Docs/Layers/fruitboom.md @@ -1,6 +1,4 @@ - - - fruitboom +fruitboom =========== @@ -9,103 +7,71 @@ Een boom - - - ## Table of contents 1. [fruitboom](#fruitboom) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [fruitboom-species:nl](#fruitboom-speciesnl) + [fruitboom-taxon](#fruitboom-taxon) + [fruitboom-description](#fruitboom-description) + [fruitboom-ref](#fruitboom-ref) - - - - - - - [Go to the source code](../assets/layers/fruitboom/fruitboom.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- natural + =tree - - - natural=tree - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/species:nl#values) [species:nl](https://wiki.openstreetmap.org/wiki/Key:species:nl) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/taxon#values) [taxon](https://wiki.openstreetmap.org/wiki/Key:taxon) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | - - - - -### fruitboom-species:nl - +[](https://taginfo.openstreetmap.org/keys/species:nl#values) [species:nl](https://wiki.openstreetmap.org/wiki/Key:species:nl) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/taxon#values) [taxon](https://wiki.openstreetmap.org/wiki/Key:taxon) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | +### fruitboom-species:nl The question is **Wat is de soort van deze boom (in het Nederlands)?** -This rendering asks information about the property [species:nl](https://wiki.openstreetmap.org/wiki/Key:species:nl) +This rendering asks information about the property [species:nl](https://wiki.openstreetmap.org/wiki/Key:species:nl) This is rendered with `De soort is {species:nl}` - - -### fruitboom-taxon - - +### fruitboom-taxon The question is **Wat is het taxon (ras) van deze boom?** -This rendering asks information about the property [taxon](https://wiki.openstreetmap.org/wiki/Key:taxon) +This rendering asks information about the property [taxon](https://wiki.openstreetmap.org/wiki/Key:taxon) This is rendered with `Het ras (taxon) van deze boom is {taxon}` - - -### fruitboom-description - - +### fruitboom-description The question is **Welke beschrijving past bij deze boom?** -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) This is rendered with `Beschrijving: {description}` - - -### fruitboom-ref - - +### fruitboom-ref The question is **Is er een refernetienummer?** -This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) -This is rendered with `Referentienummer: {ref}` +This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) +This is rendered with `Referentienummer: {ref}` This document is autogenerated from assets/layers/fruitboom/fruitboom.json \ No newline at end of file diff --git a/Docs/Layers/generic_osm_object.md b/Docs/Layers/generic_osm_object.md index 7c7b1b99c..eccc85294 100644 --- a/Docs/Layers/generic_osm_object.md +++ b/Docs/Layers/generic_osm_object.md @@ -1,68 +1,45 @@ - - - generic_osm_object +generic_osm_object ==================== - - - - - - - ## Table of contents 1. [generic_osm_object](#generic_osm_object) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [all_tags](#all_tags) - - - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - This layer is needed as dependency for layer [grb](#grb) - +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +- This layer is needed as dependency for layer [grb](#grb) [Go to the source code](../assets/layers/generic_osm_object/generic_osm_object.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id~^..*$ +- +- +- +- type!~^boundary$ +- +- |level + =0 +- layer + =0| - - - id~^..*$ - - - - - - - - type!~^boundary$ - - - - |level=0 - - layer=0| - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### all_tags - - +### all_tags _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/generic_osm_object/generic_osm_object.json \ No newline at end of file diff --git a/Docs/Layers/ghost_bike.md b/Docs/Layers/ghost_bike.md index 9c786a270..c86cbb782 100644 --- a/Docs/Layers/ghost_bike.md +++ b/Docs/Layers/ghost_bike.md @@ -1,6 +1,4 @@ - - - ghost_bike +ghost_bike ============ @@ -9,15 +7,13 @@ A layer showing memorials for cyclists, killed in road accidents - - - ## Table of contents 1. [ghost_bike](#ghost_bike) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [ghost-bike-explanation](#ghost-bike-explanation) + [images](#images) + [ghost_bike-name](#ghost_bike-name) @@ -25,127 +21,78 @@ A layer showing memorials for cyclists, killed in road accidents + [ghost_bike-inscription](#ghost_bike-inscription) + [ghost_bike-start_date](#ghost_bike-start_date) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [ghostbikes](https://mapcomplete.osm.be/ghostbikes) - - [personal](https://mapcomplete.osm.be/personal) - +- [ghostbikes](https://mapcomplete.osm.be/ghostbikes) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/ghost_bike/ghost_bike.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- memorial + =ghost_bike - - - memorial=ghost_bike - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/source#values) [source](https://wiki.openstreetmap.org/wiki/Key:source) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/inscription#values) [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [date](../SpecialInputElements.md#date) | - - - - -### ghost-bike-explanation - +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/source#values) [source](https://wiki.openstreetmap.org/wiki/Key:source) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/inscription#values) [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [date](../SpecialInputElements.md#date) | +### ghost-bike-explanation _This tagrendering has no question and is thus read-only_ - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ +### ghost_bike-name +The question is **Whom is remembered by this ghost bike?
Please respect privacy - +only fill out the name if it is widely published or marked on the cycle. Opt to leave out the family name.
** - - -### ghost_bike-name - - - -The question is **Whom is remembered by this ghost bike?
Please respect privacy - only fill out the name if it is widely published or marked on the cycle. Opt to leave out the family name.
** - -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `In remembrance of {name}` +- **No name is marked on the bike** corresponds + with noname + =yes - - - **No name is marked on the bike** corresponds with noname=yes - - - - -### ghost_bike-source - - +### ghost_bike-source The question is **On what webpage can one find more information about the Ghost bike or the accident?** -This rendering asks information about the property [source](https://wiki.openstreetmap.org/wiki/Key:source) +This rendering asks information about the property [source](https://wiki.openstreetmap.org/wiki/Key:source) This is rendered with `More information is available` - - -### ghost_bike-inscription - - +### ghost_bike-inscription The question is **What is the inscription on this Ghost bike?** -This rendering asks information about the property [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) +This rendering asks information about the property [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) This is rendered with `{inscription}` - - -### ghost_bike-start_date - - +### ghost_bike-start_date The question is **When was this Ghost bike installed?** -This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) -This is rendered with `Placed on {start_date}` +This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) +This is rendered with `Placed on {start_date}` This document is autogenerated from assets/layers/ghost_bike/ghost_bike.json \ No newline at end of file diff --git a/Docs/Layers/gps_location.md b/Docs/Layers/gps_location.md index f2ade0f75..2e196b1b8 100644 --- a/Docs/Layers/gps_location.md +++ b/Docs/Layers/gps_location.md @@ -1,52 +1,44 @@ - - - gps_location +gps_location ============== -Meta layer showing the current location of the user. Add this to your theme and override the icon to change the appearance of the current location. The object will always have `id=gps` and will have _all_ the properties included in the [`Coordinates`-object](https://developer.mozilla.org/en-US/docs/Web/API/GeolocationCoordinates) returned by the browser. - - - +Meta layer showing the current location of the user. Add this to your theme and override the icon to change the +appearance of the current location. The object will always have `id=gps` and will have _all_ the properties included in +the [`Coordinates`-object](https://developer.mozilla.org/en-US/docs/Web/API/GeolocationCoordinates) returned by the +browser. ## Table of contents 1. [gps_location](#gps_location) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` [Go to the source code](../assets/layers/gps_location/gps_location.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id + =gps - - - id=gps - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/gps_location/gps_location.json \ No newline at end of file diff --git a/Docs/Layers/gps_location_history.md b/Docs/Layers/gps_location_history.md index c7548953b..cdfe7f610 100644 --- a/Docs/Layers/gps_location_history.md +++ b/Docs/Layers/gps_location_history.md @@ -1,53 +1,43 @@ - - - gps_location_history +gps_location_history ====================== -Meta layer which contains the previous locations of the user as single points. This is mainly for technical reasons, e.g. to keep match the distance to the modified object - - - +Meta layer which contains the previous locations of the user as single points. This is mainly for technical reasons, +e.g. to keep match the distance to the modified object ## Table of contents 1. [gps_location_history](#gps_location_history) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/gps_location_history/gps_location_history.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- user:location + =yes - - - user:location=yes - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/gps_location_history/gps_location_history.json \ No newline at end of file diff --git a/Docs/Layers/gps_track.md b/Docs/Layers/gps_track.md index 47d4523c1..d10ccff47 100644 --- a/Docs/Layers/gps_track.md +++ b/Docs/Layers/gps_track.md @@ -1,96 +1,59 @@ - - - gps_track +gps_track =========== -Meta layer showing the previous locations of the user as single line. Add this to your theme and override the icon to change the appearance of the current location. - - - +Meta layer showing the previous locations of the user as single line. Add this to your theme and override the icon to +change the appearance of the current location. ## Table of contents 1. [gps_track](#gps_track) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [Privacy notice](#privacy-notice) + [export_as_gpx](#export_as_gpx) + [minimap](#minimap) + [delete](#delete) - - - - - This layer is not visible by default and must be enabled in the filter by the user. - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - +- This layer is not visible by default and must be enabled in the filter by the user. +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/gps_track/gps_track.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id + =location_track - - - id=location_track - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### Privacy notice - - +### Privacy notice _This tagrendering has no question and is thus read-only_ - - - - -### export_as_gpx - - +### export_as_gpx _This tagrendering has no question and is thus read-only_ - - - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - - - -### delete - - +### delete _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/gps_track/gps_track.json \ No newline at end of file diff --git a/Docs/Layers/grass_in_parks.md b/Docs/Layers/grass_in_parks.md index 19e05058c..682410e02 100644 --- a/Docs/Layers/grass_in_parks.md +++ b/Docs/Layers/grass_in_parks.md @@ -1,6 +1,4 @@ - - - grass_in_parks +grass_in_parks ================ @@ -9,76 +7,49 @@ Searches for all accessible grass patches within public parks - these are 'groenzones'" - - - ## Table of contents 1. [grass_in_parks](#grass_in_parks) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [explanation](#explanation) + [grass-in-parks-reviews](#grass-in-parks-reviews) - - - - - - - [Go to the source code](../assets/layers/grass_in_parks/grass_in_parks.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- name + =Park Oude God + |landuse + =grass + &access + =public + |access + =yes - - - name=Park Oude God|landuse=grass&access=public|access=yes - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### explanation - - +### explanation _This tagrendering has no question and is thus read-only_ - - - - -### grass-in-parks-reviews - - +### grass-in-parks-reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/grass_in_parks/grass_in_parks.json \ No newline at end of file diff --git a/Docs/Layers/grb.md b/Docs/Layers/grb.md index 53031f2b4..6e339fdf1 100644 --- a/Docs/Layers/grb.md +++ b/Docs/Layers/grb.md @@ -1,6 +1,4 @@ - - - grb +grb ===== @@ -9,14 +7,12 @@ Geometry which comes from GRB with tools to import them - - - ## Table of contents 1. [grb](#grb) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [Import-button](#import-button) + [Building info](#building-info) + [overlapping building address](#overlapping-building-address) @@ -26,122 +22,77 @@ Geometry which comes from GRB with tools to import them + [apply-building-type](#apply-building-type) - - - - - This layer is loaded from an external source, namely `https://betadata.grbosm.site/grb?bbox={x_min},{y_min},{x_max},{y_max}` - - This layer will automatically load [osm-buildings](./osm-buildings.md) into the layout as it depends on it: a tagrendering needs this layer (Import-button) - - This layer will automatically load [type_node](./type_node.md) into the layout as it depends on it: a tagrendering needs this layer (Import-button) - - This layer will automatically load [osm-buildings](./osm-buildings.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _overlaps_with_buildings) - - This layer will automatically load [generic_osm_object](./generic_osm_object.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[18] which calculates the value for _intersects_with_other_features) - +- This layer is loaded from an external source, namely `https://betadata.grbosm.site/grb?bbox={x_min},{y_min},{x_max},{y_max}` +- This layer will automatically load [osm-buildings](./osm-buildings.md) into the layout as it depends on it: a + tagrendering needs this layer (Import-button) +- This layer will automatically load [type_node](./type_node.md) into the layout as it depends on it: a tagrendering + needs this layer (Import-button) +- This layer will automatically load [osm-buildings](./osm-buildings.md) into the layout as it depends on it: A + calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + overlaps_with_buildings) +- This layer will automatically load [generic_osm_object](./generic_osm_object.md) into the layout as it depends on + it: A calculated tag loads features from this layer (calculatedTag[18] which calculates the value for _ + intersects_with_other_features) [Go to the source code](../assets/layers/grb/grb.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- HUISNR~^..*$ +- man_made!~^mast$ - - - HUISNR~^..*$ - - man_made!~^mast$ - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### Import-button - - +### Import-button _This tagrendering has no question and is thus read-only_ +- **{conflate_button(osm-buildings,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry: + ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber, Replace the geometry in OpenStreetMap and + add the address,,_osm_obj:id)}** corresponds with _overlap_percentage>50&_reverse_overlap_percentage>50&_ + overlaps_with!~^$&addr:street~^..*$&addr:housenumber~^..*$&addr:street!=&addr:housenumber!= +- **{conflate_button(osm-buildings,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry: + ref=$_grb_ref, Replace the geometry in OpenStreetMap,,_osm_obj:id)}** corresponds with _overlap_percentage>50&_ + reverse_overlap_percentage>50&_overlaps_with!~^$ - - - - - **{conflate_button(osm-buildings,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber, Replace the geometry in OpenStreetMap and add the address,,_osm_obj:id)}** corresponds with _overlap_percentage>50&_reverse_overlap_percentage>50&_overlaps_with!~^$&addr:street~^..*$&addr:housenumber~^..*$&addr:street!=&addr:housenumber!= - - **{conflate_button(osm-buildings,building=$_target_building_type; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref, Replace the geometry in OpenStreetMap,,_osm_obj:id)}** corresponds with _overlap_percentage>50&_reverse_overlap_percentage>50&_overlaps_with!~^$ - - - - -### Building info - - +### Building info _This tagrendering has no question and is thus read-only_ - - - - -### overlapping building address - - +### overlapping building address _This tagrendering has no question and is thus read-only_ +- **The overlapping openstreetmap-building has address {_osm_obj:addr:street} {_osm_obj:addr:housenumber}** corresponds + with _osm_obj:addr:street~^..*$&_osm_obj:addr:housenumber~^..*$ +- **The overlapping building only has a street known: {_osm_obj:addr:street}** corresponds with _osm_obj:addr:street~ + ^..*$ +- **The overlapping building only has a housenumber known: {_osm_obj:addr:housenumber}** corresponds with _osm_obj:addr: + housenumber~^..*$ +- **No overlapping OpenStreetMap-building found** corresponds with - - - - - **The overlapping openstreetmap-building has address {_osm_obj:addr:street} {_osm_obj:addr:housenumber}** corresponds with _osm_obj:addr:street~^..*$&_osm_obj:addr:housenumber~^..*$ - - **The overlapping building only has a street known: {_osm_obj:addr:street}** corresponds with _osm_obj:addr:street~^..*$ - - **The overlapping building only has a housenumber known: {_osm_obj:addr:housenumber}** corresponds with _osm_obj:addr:housenumber~^..*$ - - **No overlapping OpenStreetMap-building found** corresponds with - - - - -### grb_address_diff - - +### grb_address_diff _This tagrendering has no question and is thus read-only_ - - - - -### overlapping building type - - +### overlapping building type _This tagrendering has no question and is thus read-only_ - - - - -### apply-id - - +### apply-id _This tagrendering has no question and is thus read-only_ - - - - -### apply-building-type - - +### apply-building-type _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/grb/grb.json \ No newline at end of file diff --git a/Docs/Layers/hackerspaces.md b/Docs/Layers/hackerspaces.md index c45cc1c3e..cfc1dd152 100644 --- a/Docs/Layers/hackerspaces.md +++ b/Docs/Layers/hackerspaces.md @@ -1,6 +1,4 @@ - - - hackerspaces +hackerspaces ============== @@ -9,15 +7,13 @@ Hackerspace - - - ## Table of contents 1. [hackerspaces](#hackerspaces) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [is_makerspace](#is_makerspace) + [hackerspaces-name](#hackerspaces-name) + [website](#website) @@ -28,198 +24,133 @@ Hackerspace + [hs-club-mate](#hs-club-mate) + [hackerspaces-start_date](#hackerspaces-start_date) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [hackerspaces](https://mapcomplete.osm.be/hackerspaces) - +- [hackerspaces](https://mapcomplete.osm.be/hackerspaces) [Go to the source code](../assets/layers/hackerspaces/hackerspaces.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =hackerspace - - - leisure=hackerspace - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/hackerspace#values) [hackerspace](https://wiki.openstreetmap.org/wiki/Key:hackerspace) | Multiple choice | [makerspace](https://wiki.openstreetmap.org/wiki/Tag:hackerspace%3Dmakerspace) [](https://wiki.openstreetmap.org/wiki/Tag:hackerspace%3D) -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/drink:club-mate#values) [drink:club-mate](https://wiki.openstreetmap.org/wiki/Key:drink:club-mate) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:drink:club-mate%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:drink:club-mate%3Dno) -[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [date](../SpecialInputElements.md#date) | - - - - -### is_makerspace - +[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [date](../SpecialInputElements.md#date) | +### is_makerspace The question is **Is this a hackerspace or a makerspace?** +- **This is a makerspace** corresponds + with hackerspace + =makerspace +- **This is a traditional (software oriented) hackerspace** corresponds with - - - - - **This is a makerspace** corresponds with hackerspace=makerspace - - **This is a traditional (software oriented) hackerspace** corresponds with - - - - -### hackerspaces-name - - +### hackerspaces-name The question is **What is the name of this hackerspace?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This hackerspace is named {name}` - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### email - - +### email The question is **What is the email address of {name}?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` +- **{contact:email}** corresponds with contact:email~^..*$_This + option cannot be chosen as answer_ - - - **{contact:email}** corresponds with contact:email~^..*$_This option cannot be chosen as answer_ - - - - -### phone - - +### phone The question is **What is the phone number of {name}?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` +- **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be + chosen as answer_ - - - **{contact:phone}** corresponds with contact:phone~^..*$_This option cannot be chosen as answer_ - - - - -### hackerspaces-opening_hours - - +### hackerspaces-opening_hours The question is **When is this hackerspace opened?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `{opening_hours_table()}` +- **Opened 24/7** corresponds with + opening_hours=24/7 - - - **Opened 24/7** corresponds with opening_hours=24/7 - - - - -### wheelchair-access - - +### wheelchair-access The question is **Is this place accessible with a wheelchair?** +- **This place is specially adapted for wheelchair users** corresponds + with wheelchair + =designated +- **This place is easily reachable with a wheelchair** corresponds + with wheelchair + =yes +- **It is possible to reach this place in a wheelchair, but it is not easy** corresponds + with wheelchair + =limited +- **This place is not reachable with a wheelchair** corresponds + with wheelchair + =no - - - - - **This place is specially adapted for wheelchair users** corresponds with wheelchair=designated - - **This place is easily reachable with a wheelchair** corresponds with wheelchair=yes - - **It is possible to reach this place in a wheelchair, but it is not easy** corresponds with wheelchair=limited - - **This place is not reachable with a wheelchair** corresponds with wheelchair=no - - - - -### hs-club-mate - - +### hs-club-mate The question is **Does this hackerspace serve Club Mate?** +- **This hackerspace serves club mate** corresponds + with drink:club-mate + =yes +- **This hackerspace does not serve club mate** corresponds + with drink:club-mate + =no - - - - - **This hackerspace serves club mate** corresponds with drink:club-mate=yes - - **This hackerspace does not serve club mate** corresponds with drink:club-mate=no - - - - -### hackerspaces-start_date - - +### hackerspaces-start_date The question is **When was this hackerspace founded?** -This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) -This is rendered with `This hackerspace was founded at {start_date}` +This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) +This is rendered with `This hackerspace was founded at {start_date}` This document is autogenerated from assets/layers/hackerspaces/hackerspaces.json \ No newline at end of file diff --git a/Docs/Layers/home_location.md b/Docs/Layers/home_location.md index fc957cbd4..c8b3734a2 100644 --- a/Docs/Layers/home_location.md +++ b/Docs/Layers/home_location.md @@ -1,52 +1,42 @@ - - - home_location +home_location =============== -Meta layer showing the home location of the user. The home location can be set in the [profile settings](https://www.openstreetmap.org/profile/edit) of OpenStreetMap. - - - +Meta layer showing the home location of the user. The home location can be set in +the [profile settings](https://www.openstreetmap.org/profile/edit) of OpenStreetMap. ## Table of contents 1. [home_location](#home_location) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` [Go to the source code](../assets/layers/home_location/home_location.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- user:home + =yes - - - user:home=yes - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/home_location/home_location.json \ No newline at end of file diff --git a/Docs/Layers/hydrant.md b/Docs/Layers/hydrant.md index 30dbca1e9..281c44120 100644 --- a/Docs/Layers/hydrant.md +++ b/Docs/Layers/hydrant.md @@ -1,6 +1,4 @@ - - - hydrant +hydrant ========= @@ -9,136 +7,103 @@ Map layer to show fire hydrants. - - - ## Table of contents 1. [hydrant](#hydrant) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [hydrant-color](#hydrant-color) + [hydrant-type](#hydrant-type) + [hydrant-state](#hydrant-state) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [hailhydrant](https://mapcomplete.osm.be/hailhydrant) - - [personal](https://mapcomplete.osm.be/personal) - +- [hailhydrant](https://mapcomplete.osm.be/hailhydrant) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/hydrant/hydrant.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- emergency + =fire_hydrant - - - emergency=fire_hydrant - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/colour#values) [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [string](../SpecialInputElements.md#string) | [yellow](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dyellow) [red](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dred) [](https://taginfo.openstreetmap.org/keys/fire_hydrant:type#values) [fire_hydrant:type](https://wiki.openstreetmap.org/wiki/Key:fire_hydrant:type) | [string](../SpecialInputElements.md#string) | [pillar](https://wiki.openstreetmap.org/wiki/Tag:fire_hydrant:type%3Dpillar) [pipe](https://wiki.openstreetmap.org/wiki/Tag:fire_hydrant:type%3Dpipe) [wall](https://wiki.openstreetmap.org/wiki/Tag:fire_hydrant:type%3Dwall) [underground](https://wiki.openstreetmap.org/wiki/Tag:fire_hydrant:type%3Dunderground) [](https://taginfo.openstreetmap.org/keys/emergency#values) [emergency](https://wiki.openstreetmap.org/wiki/Key:emergency) | Multiple choice | [fire_hydrant](https://wiki.openstreetmap.org/wiki/Tag:emergency%3Dfire_hydrant) [](https://wiki.openstreetmap.org/wiki/Tag:emergency%3D) [](https://wiki.openstreetmap.org/wiki/Tag:emergency%3D) - - - -### hydrant-color - - +### hydrant-color The question is **What color is the hydrant?** -This rendering asks information about the property [colour](https://wiki.openstreetmap.org/wiki/Key:colour) +This rendering asks information about the property [colour](https://wiki.openstreetmap.org/wiki/Key:colour) This is rendered with `The hydrant color is {colour}` +- **The hydrant color is unknown.** corresponds with _This option cannot be chosen as answer_ +- **The hydrant color is yellow.** corresponds + with colour + =yellow +- **The hydrant color is red.** corresponds + with colour + =red - - - **The hydrant color is unknown.** corresponds with _This option cannot be chosen as answer_ - - **The hydrant color is yellow.** corresponds with colour=yellow - - **The hydrant color is red.** corresponds with colour=red - - - - -### hydrant-type - - +### hydrant-type The question is **What type of hydrant is it?** -This rendering asks information about the property [fire_hydrant:type](https://wiki.openstreetmap.org/wiki/Key:fire_hydrant:type) +This rendering asks information about the +property [fire_hydrant:type](https://wiki.openstreetmap.org/wiki/Key:fire_hydrant:type) This is rendered with ` Hydrant type: {fire_hydrant:type}` +- **The hydrant type is unknown.** corresponds with _This option cannot be chosen as answer_ +- ** Pillar type.** corresponds + with fire_hydrant:type + =pillar +- ** Pipe type.** corresponds + with fire_hydrant:type + =pipe +- ** Wall type.** corresponds + with fire_hydrant:type + =wall +- ** Underground type.** corresponds + with fire_hydrant:type + =underground - - - **The hydrant type is unknown.** corresponds with _This option cannot be chosen as answer_ - - ** Pillar type.** corresponds with fire_hydrant:type=pillar - - ** Pipe type.** corresponds with fire_hydrant:type=pipe - - ** Wall type.** corresponds with fire_hydrant:type=wall - - ** Underground type.** corresponds with fire_hydrant:type=underground - - - - -### hydrant-state - - +### hydrant-state The question is **Is this hydrant still working?** +- **The hydrant is (fully or partially) working** corresponds + with emergency + =fire_hydrant +- **The hydrant is unavailable** corresponds + with disused:emergency + =fire_hydrant +- **The hydrant has been removed** corresponds + with removed:emergency + =fire_hydrant - - - - - **The hydrant is (fully or partially) working** corresponds with emergency=fire_hydrant - - **The hydrant is unavailable** corresponds with disused:emergency=fire_hydrant - - **The hydrant has been removed** corresponds with removed:emergency=fire_hydrant - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/hydrant/hydrant.json \ No newline at end of file diff --git a/Docs/Layers/information_board.md b/Docs/Layers/information_board.md index 081894604..19e2fa124 100644 --- a/Docs/Layers/information_board.md +++ b/Docs/Layers/information_board.md @@ -1,75 +1,46 @@ - - - information_board +information_board =================== -A layer showing touristical, road side information boards (e.g. giving information about the landscape, a building, a feature, a map, ...) - - - +A layer showing touristical, road side information boards (e.g. giving information about the landscape, a building, a +feature, a map, ...) ## Table of contents 1. [information_board](#information_board) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [nature](https://mapcomplete.osm.be/nature) - - [personal](https://mapcomplete.osm.be/personal) - +- [nature](https://mapcomplete.osm.be/nature) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/information_board/information_board.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- information + =board - - - information=board - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/information_board/information_board.json \ No newline at end of file diff --git a/Docs/Layers/left_right_style.md b/Docs/Layers/left_right_style.md index 82dc38ec5..471b5c9f6 100644 --- a/Docs/Layers/left_right_style.md +++ b/Docs/Layers/left_right_style.md @@ -1,53 +1,45 @@ - - - left_right_style +left_right_style ================== -Special meta-style which will show one single line, either on the left or on the right depending on the id. This is used in the small popups with left_right roads. Cannot be included in a theme - - - +Special meta-style which will show one single line, either on the left or on the right depending on the id. This is used +in the small popups with left_right roads. Cannot be included in a theme ## Table of contents 1. [left_right_style](#left_right_style) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/left_right_style/left_right_style.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id + =left + |id + =right - - - id=left|id=right - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/left_right_style/left_right_style.json \ No newline at end of file diff --git a/Docs/Layers/lit_streets.md b/Docs/Layers/lit_streets.md index c9b6198a0..158f4e997 100644 --- a/Docs/Layers/lit_streets.md +++ b/Docs/Layers/lit_streets.md @@ -1,92 +1,62 @@ - - - lit_streets +lit_streets ============= - - - - - - - ## Table of contents 1. [lit_streets](#lit_streets) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [lit](#lit) +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +#### Themes using this layer - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - - - -#### Themes using this layer - - - - - - - [street_lighting](https://mapcomplete.osm.be/street_lighting) - +- [street_lighting](https://mapcomplete.osm.be/street_lighting) [Go to the source code](../assets/layers/lit_streets/lit_streets.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway!~^$ +- lit!~^no$ +- lit!~^$ +- service!~^driveway$ - - - highway!~^$ - - lit!~^no$ - - lit!~^$ - - service!~^driveway$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/lit#values) [lit](https://wiki.openstreetmap.org/wiki/Key:lit) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dno) [24/7](https://wiki.openstreetmap.org/wiki/Tag:lit%3D24/7) - - - -### lit - - +### lit The question is **Is this street lit?** - - - - - - **This street is lit** corresponds with lit=yes - - **This street is not lit** corresponds with lit=no - - **This street is lit at night** corresponds with lit=sunset-sunrise_This option cannot be chosen as answer_ - - **This street is lit 24/7** corresponds with lit=24/7 - +- **This street is lit** corresponds with lit + =yes +- **This street is not lit** corresponds with + lit=no +- **This street is lit at night** corresponds + with lit + =sunset-sunrise_This option + cannot be chosen as answer_ +- **This street is lit 24/7** corresponds with + lit=24/7 This document is autogenerated from assets/layers/lit_streets/lit_streets.json \ No newline at end of file diff --git a/Docs/Layers/map.md b/Docs/Layers/map.md index 3330d65bb..c59177385 100644 --- a/Docs/Layers/map.md +++ b/Docs/Layers/map.md @@ -1,6 +1,4 @@ - - - map +map ===== @@ -9,115 +7,88 @@ A map, meant for tourists which is permanently installed in the public space - - - ## Table of contents 1. [map](#map) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [map-map_source](#map-map_source) + [map-attribution](#map-attribution) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [maps](https://mapcomplete.osm.be/maps) - - [nature](https://mapcomplete.osm.be/nature) - - [personal](https://mapcomplete.osm.be/personal) - +- [maps](https://mapcomplete.osm.be/maps) +- [nature](https://mapcomplete.osm.be/nature) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/map/map.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- tourism + =map + |information + =map - - - tourism=map|information=map - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/map_source#values) [map_source](https://wiki.openstreetmap.org/wiki/Key:map_source) | [string](../SpecialInputElements.md#string) | [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Tag:map_source%3DOpenStreetMap) [](https://taginfo.openstreetmap.org/keys/map_source:attribution#values) [map_source:attribution](https://wiki.openstreetmap.org/wiki/Key:map_source:attribution) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:map_source:attribution%3Dyes) [incomplete](https://wiki.openstreetmap.org/wiki/Tag:map_source:attribution%3Dincomplete) [sticker](https://wiki.openstreetmap.org/wiki/Tag:map_source:attribution%3Dsticker) [none](https://wiki.openstreetmap.org/wiki/Tag:map_source:attribution%3Dnone) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### map-map_source - - +### map-map_source The question is **On which data is this map based?** -This rendering asks information about the property [map_source](https://wiki.openstreetmap.org/wiki/Key:map_source) +This rendering asks information about the property [map_source](https://wiki.openstreetmap.org/wiki/Key:map_source) This is rendered with `This map is based on {map_source}` +- **This map is based on OpenStreetMap** corresponds + with map_source + =OpenStreetMap - - - **This map is based on OpenStreetMap** corresponds with map_source=OpenStreetMap - - - - -### map-attribution - - +### map-attribution The question is **Is the OpenStreetMap-attribution given?** - - - - - - **OpenStreetMap is clearly attributed, including the ODBL-license** corresponds with map_source:attribution=yes - - **OpenStreetMap is clearly attributed, but the license is not mentioned** corresponds with map_source:attribution=incomplete - - **OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it** corresponds with map_source:attribution=sticker - - **There is no attribution at all** corresponds with map_source:attribution=none - - **There is no attribution at all** corresponds with map_source:attribution=no_This option cannot be chosen as answer_ - +- **OpenStreetMap is clearly attributed, including the ODBL-license** corresponds + with map_source: + attribution=yes +- **OpenStreetMap is clearly attributed, but the license is not mentioned** corresponds + with map_source: + attribution= + incomplete +- **OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it** corresponds + with map_source: + attribution= + sticker +- **There is no attribution at all** corresponds + with map_source: + attribution= + none +- **There is no attribution at all** corresponds + with map_source: + attribution=no_ + This option cannot be chosen as answer_ This document is autogenerated from assets/layers/map/map.json \ No newline at end of file diff --git a/Docs/Layers/matchpoint.md b/Docs/Layers/matchpoint.md index e348b4148..5fd22c6ca 100644 --- a/Docs/Layers/matchpoint.md +++ b/Docs/Layers/matchpoint.md @@ -1,6 +1,4 @@ - - - matchpoint +matchpoint ============ @@ -9,28 +7,23 @@ The default rendering for a locationInput which snaps onto another object - - - ## Table of contents 1. [matchpoint](#matchpoint) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` [Go to the source code](../assets/layers/matchpoint/matchpoint.json) - Basic tags for this layer +Basic tags for this layer --------------------------- @@ -44,9 +37,9 @@ Elements must have the all of following tags to be shown on this layer: - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/matchpoint/matchpoint.json \ No newline at end of file diff --git a/Docs/Layers/maybe_climbing.md b/Docs/Layers/maybe_climbing.md index e624240e9..f3940462b 100644 --- a/Docs/Layers/maybe_climbing.md +++ b/Docs/Layers/maybe_climbing.md @@ -1,6 +1,4 @@ - - - maybe_climbing +maybe_climbing ================ @@ -9,96 +7,67 @@ A climbing opportunity? - - - ## Table of contents 1. [maybe_climbing](#maybe_climbing) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [minimap](#minimap) + [climbing-opportunity-name](#climbing-opportunity-name) + [climbing-possible](#climbing-possible) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [climbing](https://mapcomplete.osm.be/climbing) - +- [climbing](https://mapcomplete.osm.be/climbing) [Go to the source code](../assets/layers/maybe_climbing/maybe_climbing.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =sports_centre + |barrier + =wall + |barrier + =retaining_wall + |natural + =cliff + |natural + =rock + |natural + =stone +- - - - leisure=sports_centre|barrier=wall|barrier=retaining_wall|natural=cliff|natural=rock|natural=stone - - - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - - - -### climbing-opportunity-name - - +### climbing-opportunity-name _This tagrendering has no question and is thus read-only_ - - - - -### climbing-possible - - +### climbing-possible The question is **Is climbing possible here?** - - - - - - **Climbing is not possible here** corresponds with sport!~^climbing$_This option cannot be chosen as answer_ - - **Climbing is possible here** corresponds with sport=climbing - - **Climbing is not possible here** corresponds with climbing=no - +- **Climbing is not possible here** corresponds with sport!~^climbing$_This option cannot be chosen as answer_ +- **Climbing is possible here** corresponds + with sport + =climbing +- **Climbing is not possible here** corresponds + with climbing + =no This document is autogenerated from assets/layers/maybe_climbing/maybe_climbing.json \ No newline at end of file diff --git a/Docs/Layers/named_streets.md b/Docs/Layers/named_streets.md index bbbb93ba2..a5e5a7b76 100644 --- a/Docs/Layers/named_streets.md +++ b/Docs/Layers/named_streets.md @@ -1,6 +1,4 @@ - - - named_streets +named_streets =============== @@ -9,49 +7,41 @@ Hidden layer with all streets which have a name. Useful to detect addresses - - - ## Table of contents 1. [named_streets](#named_streets) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer is not visible by default and must be enabled in the filter by the user. - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - This layer is not visible by default and the visibility cannot be toggled, effectively resulting in a fully hidden layer. This can be useful, e.g. to calculate some metatags. If you want to render this layer (e.g. for debugging), enable it by setting the URL-parameter layer-=true - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - This layer is needed as dependency for layer [address](#address) - +- This layer is not visible by default and must be enabled in the filter by the user. +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- This layer is not visible by default and the visibility cannot be toggled, effectively resulting in a fully hidden + layer. This can be useful, e.g. to calculate some metatags. If you want to render this layer (e.g. for debugging), + enable it by setting the URL-parameter layer-=true +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +- This layer is needed as dependency for layer [address](#address) [Go to the source code](../assets/layers/named_streets/named_streets.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway~^..*$ +- name~^..*$ - - - highway~^..*$ - - name~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/named_streets/named_streets.json \ No newline at end of file diff --git a/Docs/Layers/nature_reserve.md b/Docs/Layers/nature_reserve.md index 28209a941..60962dffd 100644 --- a/Docs/Layers/nature_reserve.md +++ b/Docs/Layers/nature_reserve.md @@ -1,23 +1,20 @@ - - - nature_reserve +nature_reserve ================ -Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid. - - - +Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van +Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid. ## Table of contents 1. [nature_reserve](#nature_reserve) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Access tag](#access-tag) + [Operator tag](#operator-tag) @@ -33,257 +30,189 @@ Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. T + [Surface area](#surface-area) + [wikipedia](#wikipedia) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [nature](https://mapcomplete.osm.be/nature) - - [personal](https://mapcomplete.osm.be/personal) - +- [nature](https://mapcomplete.osm.be/nature) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/nature_reserve/nature_reserve.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =nature_reserve + |protect_class!~^98$&boundary + =protected_area - - - leisure=nature_reserve|protect_class!~^98$&boundary=protected_area - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/access:description#values) [access:description](https://wiki.openstreetmap.org/wiki/Key:access:description) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/access:description#values) [access:description](https://wiki.openstreetmap.org/wiki/Key:access:description) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Natuurpunt](https://wiki.openstreetmap.org/wiki/Tag:operator%3DNatuurpunt) [Agentschap Natuur en Bos](https://wiki.openstreetmap.org/wiki/Tag:operator%3DAgentschap Natuur en Bos) -[](https://taginfo.openstreetmap.org/keys/name:nl#values) [name:nl](https://wiki.openstreetmap.org/wiki/Key:name:nl) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name:nl#values) [name:nl](https://wiki.openstreetmap.org/wiki/Key:name:nl) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:name%3D) [](https://taginfo.openstreetmap.org/keys/dog#values) [dog](https://wiki.openstreetmap.org/wiki/Key:dog) | Multiple choice | [leashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dleashed) [no](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dno) [yes](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dyes) -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/curator#values) [curator](https://wiki.openstreetmap.org/wiki/Key:curator) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/description:0#values) [description:0](https://wiki.openstreetmap.org/wiki/Key:description:0) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/curator#values) [curator](https://wiki.openstreetmap.org/wiki/Key:curator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/description:0#values) [description:0](https://wiki.openstreetmap.org/wiki/Key:description:0) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/_surface:ha#values) [_surface:ha](https://wiki.openstreetmap.org/wiki/Key:_surface:ha) | Multiple choice | [0](https://wiki.openstreetmap.org/wiki/Tag:_surface:ha%3D0) -[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### Access tag - - +### Access tag The question is **Is dit gebied toegankelijk?** -This rendering asks information about the property [access:description](https://wiki.openstreetmap.org/wiki/Key:access:description) +This rendering asks information about the +property [access:description](https://wiki.openstreetmap.org/wiki/Key:access:description) This is rendered with `De toegankelijkheid van dit gebied is: {access:description}` +- **Vrij toegankelijk** corresponds with + access=yes +- **Niet toegankelijk** corresponds with + access=no +- **Niet toegankelijk, want privégebied** corresponds + with access + =private +- **Toegankelijk, ondanks dat het privegebied is** corresponds + with access + =permissive +- **Enkel toegankelijk met een gids of tijdens een activiteit** corresponds + with access + =guided +- **Toegankelijk mits betaling** corresponds + with access + =yes + &fee + =yes - - - **Vrij toegankelijk** corresponds with access=yes - - **Niet toegankelijk** corresponds with access=no - - **Niet toegankelijk, want privégebied** corresponds with access=private - - **Toegankelijk, ondanks dat het privegebied is** corresponds with access=permissive - - **Enkel toegankelijk met een gids of tijdens een activiteit** corresponds with access=guided - - **Toegankelijk mits betaling** corresponds with access=yes&fee=yes - - - - -### Operator tag - - +### Operator tag The question is **Wie beheert dit gebied?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Beheer door {operator}` +- **Dit gebied wordt beheerd door + Natuurpunt** corresponds with operator + =Natuurpunt +- **Dit gebied wordt beheerd door + {operator}** corresponds with operator~^(n|N)atuurpunt.*$_This option cannot be chosen as answer_ +- **Dit gebied wordt beheerd door het Agentschap + Natuur en Bos** corresponds with + operator= + Agentschap Natuur en Bos - - - **Dit gebied wordt beheerd door Natuurpunt** corresponds with operator=Natuurpunt - - **Dit gebied wordt beheerd door {operator}** corresponds with operator~^(n|N)atuurpunt.*$_This option cannot be chosen as answer_ - - **Dit gebied wordt beheerd door het Agentschap Natuur en Bos** corresponds with operator=Agentschap Natuur en Bos - - - - -### Name:nl-tag - - +### Name:nl-tag The question is **Wat is de Nederlandstalige naam van dit gebied?** -This rendering asks information about the property [name:nl](https://wiki.openstreetmap.org/wiki/Key:name:nl) +This rendering asks information about the property [name:nl](https://wiki.openstreetmap.org/wiki/Key:name:nl) This is rendered with `Dit gebied heet {name:nl}` - - -### Name tag - - +### Name tag The question is **Wat is de naam van dit gebied?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `Dit gebied heet {name}` +- **Dit gebied heeft geen naam** corresponds + with noname + =yes - - - **Dit gebied heeft geen naam** corresponds with noname=yes - - - - -### Dogs? - - +### Dogs? The question is **Are dogs allowed in this nature reserve?** +- **Dogs have to be leashed** corresponds with + dog=leashed +- **No dogs allowed** corresponds with dog + =no +- **Dogs are allowed to roam freely** corresponds + with dog + =yes - - - - - **Dogs have to be leashed** corresponds with dog=leashed - - **No dogs allowed** corresponds with dog=no - - **Dogs are allowed to roam freely** corresponds with dog=yes - - - - -### Website - - +### Website The question is **On which webpage can one find more information about this nature reserve?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +### Curator +The question is **Whom is the curator of this nature reserve?
Respect privacy - only fill out a +name if this is widely published** -### Curator - - - -The question is **Whom is the curator of this nature reserve?
Respect privacy - only fill out a name if this is widely published** - -This rendering asks information about the property [curator](https://wiki.openstreetmap.org/wiki/Key:curator) +This rendering asks information about the property [curator](https://wiki.openstreetmap.org/wiki/Key:curator) This is rendered with `{curator} is the curator of this nature reserve` +### Email +The question is **What email adress can one send to with questions and problems with this nature +reserve?
Respect privacy - only fill out a personal email address if this is widely published** -### Email - - - -The question is **What email adress can one send to with questions and problems with this nature reserve?
Respect privacy - only fill out a personal email address if this is widely published** - -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` +### phone +The question is **What phone number can one call to with questions and problems with this nature +reserve?
Respect privacy - only fill out a personal phone number address if this is widely +published** -### phone - - - -The question is **What phone number can one call to with questions and problems with this nature reserve?
Respect privacy - only fill out a personal phone number address if this is widely published** - -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` - - -### Non-editable description - - +### Non-editable description _This tagrendering has no question and is thus read-only_ -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) This is rendered with `Extra info: {description}` - - -### Editable description - - +### Editable description The question is **Is er extra info die je kwijt wil?** -This rendering asks information about the property [description:0](https://wiki.openstreetmap.org/wiki/Key:description:0) +This rendering asks information about the +property [description:0](https://wiki.openstreetmap.org/wiki/Key:description:0) This is rendered with `Extra info: {description:0}` - - -### Surface area - - +### Surface area _This tagrendering has no question and is thus read-only_ +- **** corresponds with _surface:ha + =0 - - - - - **** corresponds with _surface:ha=0 - - - - -### wikipedia - - +### wikipedia The question is **What is the corresponding Wikidata entity?** -This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) +This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) This is rendered with `{wikipedia():max-height:25rem}` - - - - **No Wikipedia page has been linked yet** corresponds with _This option cannot be chosen as answer_ - +- **No Wikipedia page has been linked yet** corresponds with _This option cannot be chosen as answer_ This document is autogenerated from assets/layers/nature_reserve/nature_reserve.json \ No newline at end of file diff --git a/Docs/Layers/nature_reserve_buurtnatuur.md b/Docs/Layers/nature_reserve_buurtnatuur.md index da989bffd..3f2a9cf68 100644 --- a/Docs/Layers/nature_reserve_buurtnatuur.md +++ b/Docs/Layers/nature_reserve_buurtnatuur.md @@ -1,63 +1,46 @@ - - - nature_reserve_buurtnatuur +nature_reserve_buurtnatuur ============================ -Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid. - - - +Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van +Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid. ## Table of contents 1. [nature_reserve_buurtnatuur](#nature_reserve_buurtnatuur) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) - - - - - This layer is needed as dependency for layer [parks](#parks) - - This layer is needed as dependency for layer [forest](#forest) - +- This layer is needed as dependency for layer [parks](#parks) +- This layer is needed as dependency for layer [forest](#forest) [Go to the source code](../assets/layers/nature_reserve_buurtnatuur/nature_reserve_buurtnatuur.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =nature_reserve + |boundary + =protected_area - - - leisure=nature_reserve|boundary=protected_area - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/nature_reserve_buurtnatuur/nature_reserve_buurtnatuur.json \ No newline at end of file diff --git a/Docs/Layers/node.md b/Docs/Layers/node.md index c2e453141..a767e1f35 100644 --- a/Docs/Layers/node.md +++ b/Docs/Layers/node.md @@ -1,99 +1,60 @@ - - - node +node ====== - - - - - - - ## Table of contents 1. [node](#node) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [node-survey:date](#node-surveydate) + [node-expected_rcn_route_relations](#node-expected_rcn_route_relations) + [images](#images) - - - - - - - [Go to the source code](../assets/layers/node/node.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- rcn_ref~^..*$ - - - rcn_ref~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/survey:date#values) [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) | [date](../SpecialInputElements.md#date) | [](https://wiki.openstreetmap.org/wiki/Tag:survey:date%3D) -[](https://taginfo.openstreetmap.org/keys/expected_rcn_route_relations#values) [expected_rcn_route_relations](https://wiki.openstreetmap.org/wiki/Key:expected_rcn_route_relations) | [int](../SpecialInputElements.md#int) | - - - - -### node-survey:date - +[](https://taginfo.openstreetmap.org/keys/expected_rcn_route_relations#values) [expected_rcn_route_relations](https://wiki.openstreetmap.org/wiki/Key:expected_rcn_route_relations) | [int](../SpecialInputElements.md#int) | +### node-survey:date The question is **When was this cycle node last surveyed?** -This rendering asks information about the property [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) +This rendering asks information about the property [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) This is rendered with `This cycle node was last surveyed on {survey:date}` +- **Surveyed today!** corresponds with survey:date= - - - **Surveyed today!** corresponds with survey:date= - - - - -### node-expected_rcn_route_relations - - +### node-expected_rcn_route_relations The question is **How many other cycle nodes does this node link to?** -This rendering asks information about the property [expected_rcn_route_relations](https://wiki.openstreetmap.org/wiki/Key:expected_rcn_route_relations) +This rendering asks information about the +property [expected_rcn_route_relations](https://wiki.openstreetmap.org/wiki/Key:expected_rcn_route_relations) This is rendered with `This node links to {expected_rcn_route_relations} other cycle nodes.` - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/node/node.json \ No newline at end of file diff --git a/Docs/Layers/node2node.md b/Docs/Layers/node2node.md index a0e2ea2a2..c8a724752 100644 --- a/Docs/Layers/node2node.md +++ b/Docs/Layers/node2node.md @@ -1,88 +1,58 @@ - - - node2node +node2node =========== - - - - - - - ## Table of contents 1. [node2node](#node2node) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [node2node-survey:date](#node2node-surveydate) + [export_as_gpx](#export_as_gpx) - - - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/node2node/node2node.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- network + =rcn +- network:type + =node_network +- route + =bicycle - - - network=rcn - - network:type=node_network - - route=bicycle - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/survey:date#values) [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) | [date](../SpecialInputElements.md#date) | [](https://wiki.openstreetmap.org/wiki/Tag:survey:date%3D) - - - -### node2node-survey:date - - +### node2node-survey:date The question is **When was this node to node link last surveyed?** -This rendering asks information about the property [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) +This rendering asks information about the property [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) This is rendered with `This node to node link was last surveyed on {survey:date}` +- **Surveyed today!** corresponds with survey:date= - - - **Surveyed today!** corresponds with survey:date= - - - - -### export_as_gpx - - +### export_as_gpx _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/node2node/node2node.json \ No newline at end of file diff --git a/Docs/Layers/note_import.md b/Docs/Layers/note_import.md index b9c7a885f..563557e86 100644 --- a/Docs/Layers/note_import.md +++ b/Docs/Layers/note_import.md @@ -1,6 +1,4 @@ - - - note_import +note_import ============= @@ -9,14 +7,12 @@ Template for note note imports. - - - ## Table of contents 1. [note_import](#note_import) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [conversation](#conversation) + [Intro](#intro) + [import](#import) @@ -26,104 +22,52 @@ Template for note note imports. + [add_image](#add_image) - - - - - This layer is loaded from an external source, namely `https://api.openstreetmap.org/api/0.6/notes.json?closed=0&bbox={x_min},{y_min},{x_max},{y_max}` - - This layer will automatically load [public_bookcase](./public_bookcase.md) into the layout as it depends on it: a tagrendering needs this layer (import) - +- This layer is loaded from an external source, namely `https://api.openstreetmap.org/api/0.6/notes.json?closed=0&bbox={x_min},{y_min},{x_max},{y_max}` +- This layer will automatically load [public_bookcase](./public_bookcase.md) into the layout as it depends on it: a + tagrendering needs this layer (import) [Go to the source code](../assets/layers/note_import/note_import.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id~^..*$ - - - id~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### conversation - - +### conversation _This tagrendering has no question and is thus read-only_ - - - - -### Intro - - +### Intro _This tagrendering has no question and is thus read-only_ - - - - -### import - - +### import _This tagrendering has no question and is thus read-only_ - - - - -### close_note_ - - +### close_note_ _This tagrendering has no question and is thus read-only_ - - - - -### close_note_mapped - - +### close_note_mapped _This tagrendering has no question and is thus read-only_ - - - - -### comment - - +### comment _This tagrendering has no question and is thus read-only_ - - - - -### add_image - - +### add_image _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/note_import/note_import.json \ No newline at end of file diff --git a/Docs/Layers/observation_tower.md b/Docs/Layers/observation_tower.md index 52a113631..16ab80baa 100644 --- a/Docs/Layers/observation_tower.md +++ b/Docs/Layers/observation_tower.md @@ -1,6 +1,4 @@ - - - observation_tower +observation_tower =================== @@ -9,15 +7,13 @@ Towers with a panoramic view - - - ## Table of contents 1. [observation_tower](#observation_tower) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [name](#name) + [Height](#height) @@ -28,191 +24,130 @@ Towers with a panoramic view + [wheelchair-access](#wheelchair-access) + [wikipedia](#wikipedia) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [observation_towers](https://mapcomplete.osm.be/observation_towers) - - [personal](https://mapcomplete.osm.be/personal) - +- [observation_towers](https://mapcomplete.osm.be/observation_towers) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/observation_tower/observation_tower.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- tower:type + =observation - - - tower:type=observation - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/height#values) [height](https://wiki.openstreetmap.org/wiki/Key:height) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/height#values) [height](https://wiki.openstreetmap.org/wiki/Key:height) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:charge%3D) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) -[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### name - - +### name The question is **What is the name of this tower?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This tower is called {name}` +- **This tower doesn't have a specific name** corresponds + with noname + =yes - - - **This tower doesn't have a specific name** corresponds with noname=yes - - - - -### Height - - +### Height The question is **What is the height of this tower?** -This rendering asks information about the property [height](https://wiki.openstreetmap.org/wiki/Key:height) +This rendering asks information about the property [height](https://wiki.openstreetmap.org/wiki/Key:height) This is rendered with `This tower is {height} high` - - -### Operator - - +### Operator The question is **Who maintains this tower?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Maintained by {operator}` - - -### website - - +### website The question is **What is the website of {name}?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` +- **{contact:website}** corresponds with contact:website~^..*$_This + option cannot be chosen as answer_ - - - **{contact:website}** corresponds with contact:website~^..*$_This option cannot be chosen as answer_ - - - - -### Fee - - +### Fee The question is **How much does one have to pay to enter this tower?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `Visiting this tower costs {charge}` +- **Free to visit** corresponds with fee + =no - - - **Free to visit** corresponds with fee=no - - - - -### payment-options - - +### payment-options The question is **Which methods of payment are accepted here?** +- **Cash is accepted here** corresponds + with payment:cash + =yesUnselecting this answer + will add payment:cash + =no +- **Payment cards are accepted here** corresponds + with payment:cards + =yesUnselecting this answer + will add payment:cards + =no - - - - - **Cash is accepted here** corresponds with payment:cash=yesUnselecting this answer will add payment:cash=no - - **Payment cards are accepted here** corresponds with payment:cards=yesUnselecting this answer will add payment:cards=no - - - - -### wheelchair-access - - +### wheelchair-access The question is **Is this place accessible with a wheelchair?** +- **This place is specially adapted for wheelchair users** corresponds + with wheelchair + =designated +- **This place is easily reachable with a wheelchair** corresponds + with wheelchair + =yes +- **It is possible to reach this place in a wheelchair, but it is not easy** corresponds + with wheelchair + =limited +- **This place is not reachable with a wheelchair** corresponds + with wheelchair + =no - - - - - **This place is specially adapted for wheelchair users** corresponds with wheelchair=designated - - **This place is easily reachable with a wheelchair** corresponds with wheelchair=yes - - **It is possible to reach this place in a wheelchair, but it is not easy** corresponds with wheelchair=limited - - **This place is not reachable with a wheelchair** corresponds with wheelchair=no - - - - -### wikipedia - - +### wikipedia The question is **What is the corresponding Wikidata entity?** -This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) +This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) This is rendered with `{wikipedia():max-height:25rem}` - - - - **No Wikipedia page has been linked yet** corresponds with _This option cannot be chosen as answer_ - +- **No Wikipedia page has been linked yet** corresponds with _This option cannot be chosen as answer_ This document is autogenerated from assets/layers/observation_tower/observation_tower.json \ No newline at end of file diff --git a/Docs/Layers/orchards.md b/Docs/Layers/orchards.md index c69a43525..e25d58bf1 100644 --- a/Docs/Layers/orchards.md +++ b/Docs/Layers/orchards.md @@ -1,60 +1,37 @@ - - - orchards +orchards ========== - - - ## Table of contents 1. [orchards](#orchards) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) - - - - - - - [Go to the source code](../assets/layers/orchards/orchards.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- landuse + =orchard - - - landuse=orchard - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/orchards/orchards.json \ No newline at end of file diff --git a/Docs/Layers/osm-buildings-fixme.md b/Docs/Layers/osm-buildings-fixme.md index 2acd195e1..e9f6d2706 100644 --- a/Docs/Layers/osm-buildings-fixme.md +++ b/Docs/Layers/osm-buildings-fixme.md @@ -1,20 +1,12 @@ - - - osm-buildings-fixme +osm-buildings-fixme ===================== - - - - - - - ## Table of contents 1. [osm-buildings-fixme](#osm-buildings-fixme) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [building type](#building-type) + [grb-housenumber](#grb-housenumber) + [grb-unit](#grb-unit) @@ -24,166 +16,128 @@ + [fix_verdieping](#fix_verdieping) + [all_tags](#all_tags) - - - - - - - [Go to the source code](../assets/layers/osm-buildings-fixme/osm-buildings-fixme.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- building~^..*$ +- fixme~^..*$ - - - building~^..*$ - - fixme~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/building#values) [building](https://wiki.openstreetmap.org/wiki/Key:building) | [string](../SpecialInputElements.md#string) | [house](https://wiki.openstreetmap.org/wiki/Tag:building%3Dhouse) [detached](https://wiki.openstreetmap.org/wiki/Tag:building%3Ddetached) [semidetached_house](https://wiki.openstreetmap.org/wiki/Tag:building%3Dsemidetached_house) [apartments](https://wiki.openstreetmap.org/wiki/Tag:building%3Dapartments) [office](https://wiki.openstreetmap.org/wiki/Tag:building%3Doffice) [apartments](https://wiki.openstreetmap.org/wiki/Tag:building%3Dapartments) [shed](https://wiki.openstreetmap.org/wiki/Tag:building%3Dshed) [garage](https://wiki.openstreetmap.org/wiki/Tag:building%3Dgarage) [garages](https://wiki.openstreetmap.org/wiki/Tag:building%3Dgarages) [yes](https://wiki.openstreetmap.org/wiki/Tag:building%3Dyes) [](https://taginfo.openstreetmap.org/keys/addr:housenumber#values) [addr:housenumber](https://wiki.openstreetmap.org/wiki/Key:addr:housenumber) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:addr:housenumber%3D) [](https://wiki.openstreetmap.org/wiki/Tag:addr:housenumber%3D) [](https://wiki.openstreetmap.org/wiki/Tag:addr:housenumber%3D) [](https://taginfo.openstreetmap.org/keys/addr:unit#values) [addr:unit](https://wiki.openstreetmap.org/wiki/Key:addr:unit) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:addr:unit%3D) -[](https://taginfo.openstreetmap.org/keys/addr:street#values) [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/addr:street#values) [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/fixme#values) [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:fixme%3D) -[](https://taginfo.openstreetmap.org/keys/building:min_level#values) [building:min_level](https://wiki.openstreetmap.org/wiki/Key:building:min_level) | [pnat](../SpecialInputElements.md#pnat) | - - - - -### building type - +[](https://taginfo.openstreetmap.org/keys/building:min_level#values) [building:min_level](https://wiki.openstreetmap.org/wiki/Key:building:min_level) | [pnat](../SpecialInputElements.md#pnat) | +### building type The question is **What kind of building is this?** -This rendering asks information about the property [building](https://wiki.openstreetmap.org/wiki/Key:building) +This rendering asks information about the property [building](https://wiki.openstreetmap.org/wiki/Key:building) This is rendered with `The building type is {building}` +- **A normal house** corresponds with + building=house +- **A house detached from other building** corresponds + with building + =detached +- **A house sharing only one wall with another house** corresponds + with building + = + semidetached_house +- **An apartment building - highrise for living** corresponds + with building + =apartments +- **An office building - highrise for work** corresponds + with building + =office +- **An apartment building** corresponds with + building=apartments +- **A small shed, e.g. in a garden** corresponds + with building + =shed +- **A single garage to park a car** corresponds + with building + =garage +- **A building containing only garages; typically they are all identical** corresponds + with building + =garages +- **A building - no specification** corresponds + with building + =yes - - - **A normal house** corresponds with building=house - - **A house detached from other building** corresponds with building=detached - - **A house sharing only one wall with another house** corresponds with building=semidetached_house - - **An apartment building - highrise for living** corresponds with building=apartments - - **An office building - highrise for work** corresponds with building=office - - **An apartment building** corresponds with building=apartments - - **A small shed, e.g. in a garden** corresponds with building=shed - - **A single garage to park a car** corresponds with building=garage - - **A building containing only garages; typically they are all identical** corresponds with building=garages - - **A building - no specification** corresponds with building=yes - - - - -### grb-housenumber - - +### grb-housenumber The question is **Wat is het huisnummer?** -This rendering asks information about the property [addr:housenumber](https://wiki.openstreetmap.org/wiki/Key:addr:housenumber) +This rendering asks information about the +property [addr:housenumber](https://wiki.openstreetmap.org/wiki/Key:addr:housenumber) This is rendered with `Het huisnummer is {addr:housenumber}` +- **Geen huisnummer** corresponds + with not:addr:housenumber + =yes +- **Het huisnummer is {_grbNumber}, wat overeenkomt met het GRB** corresponds with addr:housenumber= +- **Dit gebouw heeft geen nummer, net zoals in het GRB** corresponds + with not:addr:housenumber + =yes - - - **Geen huisnummer** corresponds with not:addr:housenumber=yes - - **Het huisnummer is {_grbNumber}, wat overeenkomt met het GRB** corresponds with addr:housenumber= - - **Dit gebouw heeft geen nummer, net zoals in het GRB** corresponds with not:addr:housenumber=yes - - - - -### grb-unit - - +### grb-unit The question is **Wat is de wooneenheid-aanduiding?** -This rendering asks information about the property [addr:unit](https://wiki.openstreetmap.org/wiki/Key:addr:unit) +This rendering asks information about the property [addr:unit](https://wiki.openstreetmap.org/wiki/Key:addr:unit) This is rendered with `De wooneenheid-aanduiding is {addr:unit} ` +- **Geen wooneenheid-nummer** corresponds with - - - **Geen wooneenheid-nummer** corresponds with - - - - -### grb-street - - +### grb-street The question is **Wat is de straat?** -This rendering asks information about the property [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) +This rendering asks information about the property [addr:street](https://wiki.openstreetmap.org/wiki/Key:addr:street) This is rendered with `De straat is {addr:street}` - - -### grb-fixme - - +### grb-fixme The question is **Wat zegt de fixme?** -This rendering asks information about the property [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) +This rendering asks information about the property [fixme](https://wiki.openstreetmap.org/wiki/Key:fixme) This is rendered with `De fixme is {fixme}` +- **Geen fixme** corresponds with - - - **Geen fixme** corresponds with - - - - -### grb-min-level - - +### grb-min-level The question is **Hoeveel verdiepingen ontbreken?** -This rendering asks information about the property [building:min_level](https://wiki.openstreetmap.org/wiki/Key:building:min_level) +This rendering asks information about the +property [building:min_level](https://wiki.openstreetmap.org/wiki/Key:building:min_level) This is rendered with `Dit gebouw begint maar op de {building:min_level} verdieping` - - -### fix_verdieping - - +### fix_verdieping _This tagrendering has no question and is thus read-only_ - - - - -### all_tags - - +### all_tags _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/osm-buildings-fixme/osm-buildings-fixme.json \ No newline at end of file diff --git a/Docs/Layers/osm-buildings.md b/Docs/Layers/osm-buildings.md index f5c8dcc72..f5562c9dc 100644 --- a/Docs/Layers/osm-buildings.md +++ b/Docs/Layers/osm-buildings.md @@ -1,72 +1,51 @@ - - - osm-buildings +osm-buildings =============== - - - - - - - ## Table of contents 1. [osm-buildings](#osm-buildings) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [apply_streetname](#apply_streetname) - - - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - This layer will automatically load [crab_address](./crab_address.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _embedded_crab_addresses) - - This layer will automatically load [named_streets](./named_streets.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[3] which calculates the value for _nearby_street_names) - - This layer is needed as dependency for layer [grb](#grb) - - This layer is needed as dependency for layer [grb](#grb) - +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +- This layer will automatically load [crab_address](./crab_address.md) into the layout as it depends on it: A + calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + embedded_crab_addresses) +- This layer will automatically load [named_streets](./named_streets.md) into the layout as it depends on it: A + calculated tag loads features from this layer (calculatedTag[3] which calculates the value for _nearby_street_names) +- This layer is needed as dependency for layer [grb](#grb) +- This layer is needed as dependency for layer [grb](#grb) [Go to the source code](../assets/layers/osm-buildings/osm-buildings.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- building~^..*$ +- addr:housenumber~^..*$ +- - - - building~^..*$ - - addr:housenumber~^..*$ - - - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### apply_streetname - - +### apply_streetname _This tagrendering has no question and is thus read-only_ - - - - - - **No nearby street has the same name. The CRAB-name is {_name_to_apply}** corresponds with _spelling_is_correct=false - - **There are multiple streetnames applicable here** corresponds with _singular_import=false - +- **No nearby street has the same name. The CRAB-name is {_name_to_apply}** corresponds + with _spelling_is_correct + =false +- **There are multiple streetnames applicable here** corresponds + with _singular_import + =false This document is autogenerated from assets/layers/osm-buildings/osm-buildings.json \ No newline at end of file diff --git a/Docs/Layers/parking.md b/Docs/Layers/parking.md index 41e749c52..34f295b0e 100644 --- a/Docs/Layers/parking.md +++ b/Docs/Layers/parking.md @@ -1,6 +1,4 @@ - - - parking +parking ========= @@ -9,67 +7,39 @@ A layer showing car parkings - - - ## Table of contents 1. [parking](#parking) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [parkings](https://mapcomplete.osm.be/parkings) - - [personal](https://mapcomplete.osm.be/personal) - +- [parkings](https://mapcomplete.osm.be/parkings) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/parking/parking.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =parking - - - amenity=parking - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/parking/parking.json \ No newline at end of file diff --git a/Docs/Layers/parks.md b/Docs/Layers/parks.md index e131e804f..800d653f0 100644 --- a/Docs/Layers/parks.md +++ b/Docs/Layers/parks.md @@ -1,63 +1,48 @@ - - - parks +parks ======= -Een park is een publiek toegankelijke, groene ruimte binnen de stad. Ze is typisch ingericht voor recreatief gebruik, met (verharde) wandelpaden, zitbanken, vuilnisbakken, een gezellig vijvertje, ... - - - +Een park is een publiek toegankelijke, groene ruimte binnen de stad. Ze is typisch ingericht voor recreatief gebruik, +met (verharde) wandelpaden, zitbanken, vuilnisbakken, een gezellig vijvertje, ... ## Table of contents 1. [parks](#parks) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) - - - - - This layer will automatically load [nature_reserve_buurtnatuur](./nature_reserve_buurtnatuur.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _overlapWithUpperLayers) - - This layer is needed as dependency for layer [forest](#forest) - +- This layer will automatically load [nature_reserve_buurtnatuur](./nature_reserve_buurtnatuur.md) into the layout as + it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + overlapWithUpperLayers) +- This layer is needed as dependency for layer [forest](#forest) [Go to the source code](../assets/layers/parks/parks.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =park + |landuse + =village_green - - - leisure=park|landuse=village_green - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/parks/parks.json \ No newline at end of file diff --git a/Docs/Layers/pedestrian_path.md b/Docs/Layers/pedestrian_path.md index 768f8cb1a..10300a0be 100644 --- a/Docs/Layers/pedestrian_path.md +++ b/Docs/Layers/pedestrian_path.md @@ -1,6 +1,4 @@ - - - pedestrian_path +pedestrian_path ================= @@ -9,56 +7,45 @@ Pedestrian footpaths, especially used for indoor navigation and snapping entrances to this layer - - - ## Table of contents 1. [pedestrian_path](#pedestrian_path) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) +- This layer is needed as dependency for layer [entrance](#entrance) +#### Themes using this layer - - - This layer is needed as dependency for layer [entrance](#entrance) - - - - -#### Themes using this layer - - - - - - - [entrances](https://mapcomplete.osm.be/entrances) - - [personal](https://mapcomplete.osm.be/personal) - +- [entrances](https://mapcomplete.osm.be/entrances) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/pedestrian_path/pedestrian_path.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway + =footway + |highway + =path + |highway + =corridor + |highway + =steps - - - highway=footway|highway=path|highway=corridor|highway=steps - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/pedestrian_path/pedestrian_path.json \ No newline at end of file diff --git a/Docs/Layers/picnic_table.md b/Docs/Layers/picnic_table.md index e3fcc7a49..0d6817eb5 100644 --- a/Docs/Layers/picnic_table.md +++ b/Docs/Layers/picnic_table.md @@ -1,6 +1,4 @@ - - - picnic_table +picnic_table ============== @@ -9,83 +7,57 @@ The layer showing picnic tables - - - ## Table of contents 1. [picnic_table](#picnic_table) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [picnic_table-material](#picnic_table-material) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [benches](https://mapcomplete.osm.be/benches) - - [personal](https://mapcomplete.osm.be/personal) - +- [benches](https://mapcomplete.osm.be/benches) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/picnic_table/picnic_table.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =picnic_table - - - leisure=picnic_table - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/material#values) [material](https://wiki.openstreetmap.org/wiki/Key:material) | [string](../SpecialInputElements.md#string) | [wood](https://wiki.openstreetmap.org/wiki/Tag:material%3Dwood) [concrete](https://wiki.openstreetmap.org/wiki/Tag:material%3Dconcrete) - - - -### picnic_table-material - - +### picnic_table-material The question is **What material is this picnic table made of?** -This rendering asks information about the property [material](https://wiki.openstreetmap.org/wiki/Key:material) +This rendering asks information about the property [material](https://wiki.openstreetmap.org/wiki/Key:material) This is rendered with `This picnic table is made of {material}` - - - - **This is a wooden picnic table** corresponds with material=wood - - **This is a concrete picnic table** corresponds with material=concrete - +- **This is a wooden picnic table** corresponds + with material + =wood +- **This is a concrete picnic table** corresponds + with material + =concrete This document is autogenerated from assets/layers/picnic_table/picnic_table.json \ No newline at end of file diff --git a/Docs/Layers/play_forest.md b/Docs/Layers/play_forest.md index bde5ec6ff..d782beb0b 100644 --- a/Docs/Layers/play_forest.md +++ b/Docs/Layers/play_forest.md @@ -1,6 +1,4 @@ - - - play_forest +play_forest ============= @@ -9,14 +7,12 @@ Een speelbos is een vrij toegankelijke zone in een bos - - - ## Table of contents 1. [play_forest](#play_forest) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [play_forest-operator](#play_forest-operator) + [play_forest-opening_hours](#play_forest-opening_hours) @@ -25,131 +21,84 @@ Een speelbos is een vrij toegankelijke zone in een bos + [questions](#questions) + [play_forest-reviews](#play_forest-reviews) - - - - - - - [Go to the source code](../assets/layers/play_forest/play_forest.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- playground + =forest - - - playground=forest - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Agenstchap Natuur en Bos](https://wiki.openstreetmap.org/wiki/Tag:operator%3DAgenstchap Natuur en Bos) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | Multiple choice | [08:00-22:00](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D08:00-22:00) [Jul-Aug 08:00-22:00](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3DJul-Aug 08:00-22:00) -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### play_forest-operator - - +### play_forest-operator The question is **Wie beheert dit gebied?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Dit gebied wordt beheerd door {operator}` +- **Dit gebied wordt beheerd door het Agentschap Natuur en Bos** + corresponds with operator~^[aA][nN][bB]$_This option cannot be chosen as answer_ +- **Dit gebied wordt beheerd door het Agentschap Natuur en Bos** + corresponds with operator + =Agenstchap + Natuur en Bos - - - **Dit gebied wordt beheerd door het Agentschap Natuur en Bos** corresponds with operator~^[aA][nN][bB]$_This option cannot be chosen as answer_ - - **Dit gebied wordt beheerd door het Agentschap Natuur en Bos** corresponds with operator=Agenstchap Natuur en Bos - - - - -### play_forest-opening_hours - - +### play_forest-opening_hours The question is **Wanneer is deze speelzone toegankelijk?** +- **Het hele jaar door overdag toegankelijk (van 08:00 tot 22:00)** corresponds + with opening_hours + =08:00-22:00 +- **Enkel in de zomervakantie en overdag toegankelijk (van 1 juli tot 31 augustus, van 08:00 tot 22:00** + corresponds with opening_hours + =Jul-Aug 08: + 00-22:00 - - - - - **Het hele jaar door overdag toegankelijk (van 08:00 tot 22:00)** corresponds with opening_hours=08:00-22:00 - - **Enkel in de zomervakantie en overdag toegankelijk (van 1 juli tot 31 augustus, van 08:00 tot 22:00** corresponds with opening_hours=Jul-Aug 08:00-22:00 - - - - -### play_forest-email - - +### play_forest-email The question is **Wie kan men emailen indien er problemen zijn met de speelzone?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `De bevoegde dienst kan bereikt worden via {email}` - - -### play_forest-phone - - +### play_forest-phone The question is **Wie kan men bellen indien er problemen zijn met de speelzone?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `De bevoegde dienst kan getelefoneerd worden via {phone}` - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### play_forest-reviews - - +### play_forest-reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/play_forest/play_forest.json \ No newline at end of file diff --git a/Docs/Layers/playground.md b/Docs/Layers/playground.md index c38df8c46..6747f0413 100644 --- a/Docs/Layers/playground.md +++ b/Docs/Layers/playground.md @@ -1,6 +1,4 @@ - - - playground +playground ============ @@ -9,15 +7,13 @@ Playgrounds - - - ## Table of contents 1. [playground](#playground) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [playground-surface](#playground-surface) + [playground-lit](#playground-lit) @@ -32,243 +28,184 @@ Playgrounds + [questions](#questions) + [playground-reviews](#playground-reviews) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [playgrounds](https://mapcomplete.osm.be/playgrounds) - +- [personal](https://mapcomplete.osm.be/personal) +- [playgrounds](https://mapcomplete.osm.be/playgrounds) [Go to the source code](../assets/layers/playground/playground.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =playground +- playground!~^forest$ - - - leisure=playground - - playground!~^forest$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/surface#values) [surface](https://wiki.openstreetmap.org/wiki/Key:surface) | [string](../SpecialInputElements.md#string) | [grass](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dgrass) [sand](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dsand) [woodchips](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dwoodchips) [paving_stones](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpaving_stones) [asphalt](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dasphalt) [concrete](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dconcrete) [](https://taginfo.openstreetmap.org/keys/lit#values) [lit](https://wiki.openstreetmap.org/wiki/Key:lit) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dno) -[](https://taginfo.openstreetmap.org/keys/min_age#values) [min_age](https://wiki.openstreetmap.org/wiki/Key:min_age) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/max_age#values) [max_age](https://wiki.openstreetmap.org/wiki/Key:max_age) | [pnat](../SpecialInputElements.md#pnat) | -[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/min_age#values) [min_age](https://wiki.openstreetmap.org/wiki/Key:min_age) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/max_age#values) [max_age](https://wiki.openstreetmap.org/wiki/Key:max_age) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) [students](https://wiki.openstreetmap.org/wiki/Tag:access%3Dstudents) [private](https://wiki.openstreetmap.org/wiki/Tag:access%3Dprivate) -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [sunrise-sunset](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3Dsunrise-sunset) [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ +### playground-surface +The question is **Which is the surface of this playground?
If there are multiple, select the most occuring +one** - - -### playground-surface - - - -The question is **Which is the surface of this playground?
If there are multiple, select the most occuring one** - -This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) +This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) This is rendered with `The surface is {surface}` +- **The surface is grass** corresponds + with surface + =grass +- **The surface is sand** corresponds + with surface + =sand +- **The surface consist of woodchips** corresponds + with surface + =woodchips +- **The surface is paving stones** corresponds + with surface + =paving_stones +- **The surface is asphalt** corresponds + with surface + =asphalt +- **The surface is concrete** corresponds + with surface + =concrete +- **The surface is unpaved** corresponds + with surface + =unpaved_This option cannot be + chosen as answer_ +- **The surface is paved** corresponds + with surface + =paved_This option cannot be + chosen as answer_ - - - **The surface is grass** corresponds with surface=grass - - **The surface is sand** corresponds with surface=sand - - **The surface consist of woodchips** corresponds with surface=woodchips - - **The surface is paving stones** corresponds with surface=paving_stones - - **The surface is asphalt** corresponds with surface=asphalt - - **The surface is concrete** corresponds with surface=concrete - - **The surface is unpaved** corresponds with surface=unpaved_This option cannot be chosen as answer_ - - **The surface is paved** corresponds with surface=paved_This option cannot be chosen as answer_ - - - - -### playground-lit - - +### playground-lit The question is **Is this playground lit at night?** +- **This playground is lit at night** corresponds + with lit + =yes +- **This playground is not lit at night** corresponds + with lit + =no - - - - - **This playground is lit at night** corresponds with lit=yes - - **This playground is not lit at night** corresponds with lit=no - - - - -### playground-min_age - - +### playground-min_age The question is **What is the minimum age required to access this playground?** -This rendering asks information about the property [min_age](https://wiki.openstreetmap.org/wiki/Key:min_age) +This rendering asks information about the property [min_age](https://wiki.openstreetmap.org/wiki/Key:min_age) This is rendered with `Accessible to kids older than {min_age} years` - - -### playground-max_age - - +### playground-max_age The question is **What is the maximum age allowed to access this playground?** -This rendering asks information about the property [max_age](https://wiki.openstreetmap.org/wiki/Key:max_age) +This rendering asks information about the property [max_age](https://wiki.openstreetmap.org/wiki/Key:max_age) This is rendered with `Accessible to kids of at most {max_age}` - - -### playground-operator - - +### playground-operator The question is **Who operates this playground?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Operated by {operator}` - - -### playground-access - - +### playground-access The question is **Is this playground accessible to the general public?** +- **Accessible to the general public** corresponds with _This option cannot be chosen as answer_ +- **Accessible to the general public** corresponds + with access + =yes +- **Only accessible for clients of the operating business** corresponds + with access + =customers +- **Only accessible to students of the school** corresponds + with access + =students +- **Not accessible** corresponds with + access=private - - - - - **Accessible to the general public** corresponds with _This option cannot be chosen as answer_ - - **Accessible to the general public** corresponds with access=yes - - **Only accessible for clients of the operating business** corresponds with access=customers - - **Only accessible to students of the school** corresponds with access=students - - **Not accessible** corresponds with access=private - - - - -### playground-email - - +### playground-email The question is **What is the email address of the playground maintainer?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` - - -### playground-phone - - +### playground-phone The question is **What is the phone number of the playground maintainer?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` - - -### Playground-wheelchair - - +### Playground-wheelchair The question is **Is this playground accessible to wheelchair users?** +- **Completely accessible for wheelchair users** corresponds + with wheelchair + =yes +- **Limited accessibility for wheelchair users** corresponds + with wheelchair + =limited +- **Not accessible for wheelchair users** corresponds + with wheelchair + =no - - - - - **Completely accessible for wheelchair users** corresponds with wheelchair=yes - - **Limited accessibility for wheelchair users** corresponds with wheelchair=limited - - **Not accessible for wheelchair users** corresponds with wheelchair=no - - - - -### playground-opening_hours - - +### playground-opening_hours The question is **When is this playground accessible?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `{opening_hours_table(opening_hours)}` +- **Accessible from sunrise till sunset** corresponds + with opening_hours + =sunrise-sunset +- **Always accessible** corresponds + with opening_hours + =24/7 +- **Always accessible** corresponds with _This option cannot be chosen as answer_ - - - **Accessible from sunrise till sunset** corresponds with opening_hours=sunrise-sunset - - **Always accessible** corresponds with opening_hours=24/7 - - **Always accessible** corresponds with _This option cannot be chosen as answer_ - - - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### playground-reviews - - +### playground-reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/playground/playground.json \ No newline at end of file diff --git a/Docs/Layers/postal_code_boundary.md b/Docs/Layers/postal_code_boundary.md index 530fb88cf..d5ec722a4 100644 --- a/Docs/Layers/postal_code_boundary.md +++ b/Docs/Layers/postal_code_boundary.md @@ -1,60 +1,39 @@ - - - postal_code_boundary +postal_code_boundary ====================== - - - - - - - ## Table of contents 1. [postal_code_boundary](#postal_code_boundary) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [postal_code](#postal_code) - - - - - This layer is needed as dependency for layer [town_hall](#town_hall) - +- This layer is needed as dependency for layer [town_hall](#town_hall) [Go to the source code](../assets/layers/postal_code_boundary/postal_code_boundary.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- boundary + =postal_code + |bounary + =administrative + &postal_code~^..*$ - - - boundary=postal_code|bounary=administrative&postal_code~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### postal_code - - +### postal_code _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/postal_code_boundary/postal_code_boundary.json \ No newline at end of file diff --git a/Docs/Layers/postboxes.md b/Docs/Layers/postboxes.md index b0b1324bf..3edae41ea 100644 --- a/Docs/Layers/postboxes.md +++ b/Docs/Layers/postboxes.md @@ -1,6 +1,4 @@ - - - postboxes +postboxes =========== @@ -9,77 +7,43 @@ The layer showing postboxes. - - - ## Table of contents 1. [postboxes](#postboxes) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [minimap](#minimap) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [postboxes](https://mapcomplete.osm.be/postboxes) - +- [postboxes](https://mapcomplete.osm.be/postboxes) [Go to the source code](../assets/layers/postboxes/postboxes.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =post_box - - - amenity=post_box - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/postboxes/postboxes.json \ No newline at end of file diff --git a/Docs/Layers/postoffices.md b/Docs/Layers/postoffices.md index ab0f61925..3bde0835e 100644 --- a/Docs/Layers/postoffices.md +++ b/Docs/Layers/postoffices.md @@ -1,6 +1,4 @@ - - - postoffices +postoffices ============= @@ -9,103 +7,64 @@ A layer showing post offices. - - - ## Table of contents 1. [postoffices](#postoffices) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [minimap](#minimap) + [OH](#oh) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [postboxes](https://mapcomplete.osm.be/postboxes) - +- [postboxes](https://mapcomplete.osm.be/postboxes) [Go to the source code](../assets/layers/postoffices/postoffices.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =post_office - - - amenity=post_office - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### minimap - - +### minimap _This tagrendering has no question and is thus read-only_ - - - - -### OH - - +### OH The question is **What are the opening hours for this post office?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `Opening Hours: {opening_hours_table()}` - - - - **24/7 opened (including holidays)** corresponds with opening_hours=24/7 - +- **24/7 opened (including holidays)** corresponds + with opening_hours + =24/7 This document is autogenerated from assets/layers/postoffices/postoffices.json \ No newline at end of file diff --git a/Docs/Layers/public_bookcase.md b/Docs/Layers/public_bookcase.md index 6d187d70f..bf92e4764 100644 --- a/Docs/Layers/public_bookcase.md +++ b/Docs/Layers/public_bookcase.md @@ -1,6 +1,4 @@ - - - public_bookcase +public_bookcase ================= @@ -9,15 +7,13 @@ A streetside cabinet with books, accessible to anyone - - - ## Table of contents 1. [public_bookcase](#public_bookcase) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [public_bookcase-name](#public_bookcase-name) + [public_bookcase-capacity](#public_bookcase-capacity) @@ -31,216 +27,147 @@ A streetside cabinet with books, accessible to anyone + [public_bookcase-website](#public_bookcase-website) +- This layer is needed as dependency for layer [note_import](#note_import) +#### Themes using this layer - - - This layer is needed as dependency for layer [note_import](#note_import) - - - - -#### Themes using this layer - - - - - - - [bookcases](https://mapcomplete.osm.be/bookcases) - - [personal](https://mapcomplete.osm.be/personal) - +- [bookcases](https://mapcomplete.osm.be/bookcases) +- [personal](https://mapcomplete.osm.be/personal) [Go to the source code](../assets/layers/public_bookcase/public_bookcase.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =public_bookcase - - - amenity=public_bookcase - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:name%3D) -[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [nat](../SpecialInputElements.md#nat) | +[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [nat](../SpecialInputElements.md#nat) | [](https://taginfo.openstreetmap.org/keys/books#values) [books](https://wiki.openstreetmap.org/wiki/Key:books) | Multiple choice | [children](https://wiki.openstreetmap.org/wiki/Tag:books%3Dchildren) [adults](https://wiki.openstreetmap.org/wiki/Tag:books%3Dadults) [children;adults](https://wiki.openstreetmap.org/wiki/Tag:books%3Dchildren;adults) [](https://taginfo.openstreetmap.org/keys/indoor#values) [indoor](https://wiki.openstreetmap.org/wiki/Key:indoor) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:indoor%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:indoor%3Dno) [](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) -[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/brand#values) [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | [Little Free Library](https://wiki.openstreetmap.org/wiki/Tag:brand%3DLittle Free Library) [](https://wiki.openstreetmap.org/wiki/Tag:brand%3D) [](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:ref%3D) -[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [date](../SpecialInputElements.md#date) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [date](../SpecialInputElements.md#date) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### public_bookcase-name - - +### public_bookcase-name The question is **What is the name of this public bookcase?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `The name of this bookcase is {name}` +- **This bookcase doesn't have a name** corresponds + with noname + =yes - - - **This bookcase doesn't have a name** corresponds with noname=yes - - - - -### public_bookcase-capacity - - +### public_bookcase-capacity The question is **How many books fit into this public bookcase?** -This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) +This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) This is rendered with `{capacity} books fit in this bookcase` - - -### bookcase-booktypes - - +### bookcase-booktypes The question is **What kind of books can be found in this public bookcase?** +- **Mostly children books** corresponds with + books=children +- **Mostly books for adults** corresponds with + books=adults +- **Both books for kids and adults** corresponds + with books + =children;adults - - - - - **Mostly children books** corresponds with books=children - - **Mostly books for adults** corresponds with books=adults - - **Both books for kids and adults** corresponds with books=children;adults - - - - -### bookcase-is-indoors - - +### bookcase-is-indoors The question is **Is this bookcase located outdoors?** +- **This bookcase is located indoors** corresponds + with indoor + =yes +- **This bookcase is located outdoors** corresponds + with indoor + =no +- **This bookcase is located outdoors** corresponds with _This option cannot be chosen as answer_ - - - - - **This bookcase is located indoors** corresponds with indoor=yes - - **This bookcase is located outdoors** corresponds with indoor=no - - **This bookcase is located outdoors** corresponds with _This option cannot be chosen as answer_ - - - - -### bookcase-is-accessible - - +### bookcase-is-accessible The question is **Is this public bookcase freely accessible?** +- **Publicly accessible** corresponds with + access=yes +- **Only accessible to customers** corresponds + with access + =customers - - - - - **Publicly accessible** corresponds with access=yes - - **Only accessible to customers** corresponds with access=customers - - - - -### public_bookcase-operator - - +### public_bookcase-operator The question is **Who maintains this public bookcase?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Operated by {operator}` - - -### public_bookcase-brand - - +### public_bookcase-brand The question is **Is this public bookcase part of a bigger network?** -This rendering asks information about the property [brand](https://wiki.openstreetmap.org/wiki/Key:brand) +This rendering asks information about the property [brand](https://wiki.openstreetmap.org/wiki/Key:brand) This is rendered with `This public bookcase is part of {brand}` +- **Part of the network 'Little Free Library'** corresponds + with brand + =Little Free Library +- **This public bookcase is not part of a bigger network** corresponds + with nobrand + =yes - - - **Part of the network 'Little Free Library'** corresponds with brand=Little Free Library - - **This public bookcase is not part of a bigger network** corresponds with nobrand=yes - - - - -### public_bookcase-ref - - +### public_bookcase-ref The question is **What is the reference number of this public bookcase?** -This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) +This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) This is rendered with `The reference number of this public bookcase within {brand} is {ref}` +- **This bookcase is not part of a bigger network** corresponds + with nobrand + =yes - - - **This bookcase is not part of a bigger network** corresponds with nobrand=yes - - - - -### public_bookcase-start_date - - +### public_bookcase-start_date The question is **When was this public bookcase installed?** -This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) +This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) This is rendered with `Installed on {start_date}` - - -### public_bookcase-website - - +### public_bookcase-website The question is **Is there a website with more information about this public bookcase?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) -This is rendered with `More info on the website` +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This is rendered with `More info on the website` This document is autogenerated from assets/layers/public_bookcase/public_bookcase.json \ No newline at end of file diff --git a/Docs/Layers/raw_inspire_polygons.md b/Docs/Layers/raw_inspire_polygons.md index d4124edd2..c38230aa2 100644 --- a/Docs/Layers/raw_inspire_polygons.md +++ b/Docs/Layers/raw_inspire_polygons.md @@ -1,54 +1,39 @@ - - - raw_inspire_polygons +raw_inspire_polygons ====================== - - - - - - - ## Table of contents 1. [raw_inspire_polygons](#raw_inspire_polygons) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - This layer is loaded from an external source, namely `https://osm-uk-addresses.russss.dev/inspire/{z}/{x}/{y}.json` - - This layer will automatically load [address](./address.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _has_address) - - This layer is needed as dependency for layer [to_import](#to_import) - +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +- This layer is loaded from an external source, namely `https://osm-uk-addresses.russss.dev/inspire/{z}/{x}/{y}.json` +- This layer will automatically load [address](./address.md) into the layout as it depends on it: A calculated tag + loads features from this layer (calculatedTag[0] which calculates the value for _has_address) +- This layer is needed as dependency for layer [to_import](#to_import) [Go to the source code](../assets/layers/raw_inspire_polygons/raw_inspire_polygons.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- inspireid~^..*$ - - - inspireid~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/raw_inspire_polygons/raw_inspire_polygons.json \ No newline at end of file diff --git a/Docs/Layers/service_ways.md b/Docs/Layers/service_ways.md index f05a2f385..189b97941 100644 --- a/Docs/Layers/service_ways.md +++ b/Docs/Layers/service_ways.md @@ -1,6 +1,4 @@ - - - service_ways +service_ways ============== @@ -9,43 +7,33 @@ A seperate layer with service roads, as to remove them from the intersection testing - - - ## Table of contents 1. [service_ways](#service_ways) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/service_ways/service_ways.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway + =service - - - highway=service - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/service_ways/service_ways.json \ No newline at end of file diff --git a/Docs/Layers/shadow.md b/Docs/Layers/shadow.md index 4ff88b468..1cd41fafe 100644 --- a/Docs/Layers/shadow.md +++ b/Docs/Layers/shadow.md @@ -1,52 +1,37 @@ - - - shadow +shadow ======== - - - - - - - ## Table of contents 1. [shadow](#shadow) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - This layer is loaded from an external source, namely `https://raw.githubusercontent.com/pietervdvn/MapComplete/master/assets/themes/speelplekken/shadow.geojson` - +- This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this + toggleable. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +- This layer is loaded from an external source, namely `https://raw.githubusercontent.com/pietervdvn/MapComplete/master/assets/themes/speelplekken/shadow.geojson` [Go to the source code](../assets/layers/shadow/shadow.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- shadow + =yes - - - shadow=yes - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/shadow/shadow.json \ No newline at end of file diff --git a/Docs/Layers/shops.md b/Docs/Layers/shops.md index 1bbf91da3..777ad3a3e 100644 --- a/Docs/Layers/shops.md +++ b/Docs/Layers/shops.md @@ -1,6 +1,4 @@ - - - shops +shops ======= @@ -9,15 +7,13 @@ A shop - - - ## Table of contents 1. [shops](#shops) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [shops-name](#shops-name) + [shops-shop](#shops-shop) @@ -28,167 +24,108 @@ A shop + [questions](#questions) + [reviews](#reviews) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [shops](https://mapcomplete.osm.be/shops) - +- [personal](https://mapcomplete.osm.be/personal) +- [shops](https://mapcomplete.osm.be/shops) [Go to the source code](../assets/layers/shops/shops.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- shop~^..*$ - - - shop~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### shops-name - - +### shops-name The question is **What is the name of this shop?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `This shop is called {name}` - - -### shops-shop - - +### shops-shop The question is **What does this shop sell?** -This rendering asks information about the property [shop](https://wiki.openstreetmap.org/wiki/Key:shop) +This rendering asks information about the property [shop](https://wiki.openstreetmap.org/wiki/Key:shop) This is rendered with `This shop sells {shop}` +- **Convenience store** corresponds with shop + =convenience +- **Supermarket** corresponds with shop + =supermarket +- **Clothing store** corresponds with shop + =clothes +- **Hairdresser** corresponds with shop + =hairdresser +- **Bakery** corresponds with shop + =bakery +- **Car repair (garage)** corresponds with + shop=car_repair +- **Car dealer** corresponds with shop + =car - - - **Convenience store** corresponds with shop=convenience - - **Supermarket** corresponds with shop=supermarket - - **Clothing store** corresponds with shop=clothes - - **Hairdresser** corresponds with shop=hairdresser - - **Bakery** corresponds with shop=bakery - - **Car repair (garage)** corresponds with shop=car_repair - - **Car dealer** corresponds with shop=car - - - - -### shops-phone - - +### shops-phone The question is **What is the phone number?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` - - -### shops-website - - +### shops-website The question is **What is the website of this shop?** -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) +This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) This is rendered with `{website}` - - -### shops-email - - +### shops-email The question is **What is the email address of this shop?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` - - -### shops-opening_hours - - +### shops-opening_hours The question is **What are the opening hours of this shop?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `{opening_hours_table(opening_hours)}` - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### reviews - - +### reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/shops/shops.json \ No newline at end of file diff --git a/Docs/Layers/sidewalks.md b/Docs/Layers/sidewalks.md index 1b5690bd8..42a9de872 100644 --- a/Docs/Layers/sidewalks.md +++ b/Docs/Layers/sidewalks.md @@ -1,6 +1,4 @@ - - - sidewalks +sidewalks =========== @@ -9,14 +7,12 @@ Layer showing sidewalks of highways - - - ## Table of contents 1. [sidewalks](#sidewalks) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [streetname](#streetname) + [left-sidewalk_minimap](#left-sidewalk_minimap) + [left-has_sidewalk](#left-has_sidewalk) @@ -27,150 +23,96 @@ Layer showing sidewalks of highways + [right-sidewalk_width](#right-sidewalk_width) + [questions](#questions) - - - - - - - [Go to the source code](../assets/layers/sidewalks/sidewalks.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway + =residential + |highway + =unclassified + |highway + =tertiary + |highway + =secondary - - - highway=residential|highway=unclassified|highway=tertiary|highway=secondary - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/sidewalk:left#values) [sidewalk:left](https://wiki.openstreetmap.org/wiki/Key:sidewalk:left) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:left%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:left%3Dno) -[](https://taginfo.openstreetmap.org/keys/sidewalk:left:width#values) [sidewalk:left:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:left:width) | [length](../SpecialInputElements.md#length) | +[](https://taginfo.openstreetmap.org/keys/sidewalk:left:width#values) [sidewalk:left:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:left:width) | [length](../SpecialInputElements.md#length) | [](https://taginfo.openstreetmap.org/keys/sidewalk:right#values) [sidewalk:right](https://wiki.openstreetmap.org/wiki/Key:sidewalk:right) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:right%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:right%3Dno) -[](https://taginfo.openstreetmap.org/keys/sidewalk:right:width#values) [sidewalk:right:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:right:width) | [length](../SpecialInputElements.md#length) | - - - - -### streetname - +[](https://taginfo.openstreetmap.org/keys/sidewalk:right:width#values) [sidewalk:right:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:right:width) | [length](../SpecialInputElements.md#length) | +### streetname _This tagrendering has no question and is thus read-only_ - - - - -### left-sidewalk_minimap - - +### left-sidewalk_minimap _This tagrendering has no question and is thus read-only_ - - - - -### left-has_sidewalk - - +### left-has_sidewalk The question is **Is there a sidewalk on this side of the road?** +- **Yes, there is a sidewalk on this side of the road** corresponds + with sidewalk:left + =yes +- **No, there is no seperated sidewalk to walk on** corresponds + with sidewalk:left + =no - - - - - **Yes, there is a sidewalk on this side of the road** corresponds with sidewalk:left=yes - - **No, there is no seperated sidewalk to walk on** corresponds with sidewalk:left=no - - - - -### left-sidewalk_width - - +### left-sidewalk_width The question is **What is the width of the sidewalk on this side of the road?** -This rendering asks information about the property [sidewalk:left:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:left:width) +This rendering asks information about the +property [sidewalk:left:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:left:width) This is rendered with `This sidewalk is {sidewalk:left:width}m wide` - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### right-sidewalk_minimap - - +### right-sidewalk_minimap _This tagrendering has no question and is thus read-only_ - - - - -### right-has_sidewalk - - +### right-has_sidewalk The question is **Is there a sidewalk on this side of the road?** +- **Yes, there is a sidewalk on this side of the road** corresponds + with sidewalk:right + =yes +- **No, there is no seperated sidewalk to walk on** corresponds + with sidewalk:right + =no - - - - - **Yes, there is a sidewalk on this side of the road** corresponds with sidewalk:right=yes - - **No, there is no seperated sidewalk to walk on** corresponds with sidewalk:right=no - - - - -### right-sidewalk_width - - +### right-sidewalk_width The question is **What is the width of the sidewalk on this side of the road?** -This rendering asks information about the property [sidewalk:right:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:right:width) +This rendering asks information about the +property [sidewalk:right:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:right:width) This is rendered with `This sidewalk is {sidewalk:right:width}m wide` - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/sidewalks/sidewalks.json \ No newline at end of file diff --git a/Docs/Layers/slow_roads.md b/Docs/Layers/slow_roads.md index 88948e17d..6a64a11e5 100644 --- a/Docs/Layers/slow_roads.md +++ b/Docs/Layers/slow_roads.md @@ -1,6 +1,4 @@ - - - slow_roads +slow_roads ============ @@ -9,129 +7,125 @@ All carfree roads - - - ## Table of contents 1. [slow_roads](#slow_roads) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [explanation](#explanation) + [slow_roads-surface](#slow_roads-surface) + [slow_road_is_lit](#slow_road_is_lit) - - - - - - - [Go to the source code](../assets/layers/slow_roads/slow_roads.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway + =pedestrian + |highway + =footway + |highway + =path + |highway + =bridleway + |highway + =living_street + |highway + =track +- access!~^no$ +- access!~^private$ - - - highway=pedestrian|highway=footway|highway=path|highway=bridleway|highway=living_street|highway=track - - access!~^no$ - - access!~^private$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/highway#values) [highway](https://wiki.openstreetmap.org/wiki/Key:highway) | Multiple choice | [living_street](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dliving_street) [pedestrian](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dpedestrian) [footway](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dfootway) [path](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dpath) [bridleway](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dbridleway) [track](https://wiki.openstreetmap.org/wiki/Tag:highway%3Dtrack) [](https://taginfo.openstreetmap.org/keys/surface#values) [surface](https://wiki.openstreetmap.org/wiki/Key:surface) | [string](../SpecialInputElements.md#string) | [grass](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dgrass) [ground](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dground) [sand](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dsand) [paving_stones](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpaving_stones) [asphalt](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dasphalt) [concrete](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dconcrete) [](https://taginfo.openstreetmap.org/keys/lit#values) [lit](https://wiki.openstreetmap.org/wiki/Key:lit) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dno) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### explanation - - +### explanation _This tagrendering has no question and is thus read-only_ +- **
+ Dit is een woonerf:
  • Voetgangers mogen hier de volledige breedte van de straat gebruiken
  • Gemotoriseerd + verkeer mag maximaal 20km/h rijden
** corresponds + with highway + =living_street +- **Dit is een brede, autovrije straat** corresponds + with highway + =pedestrian +- **Dit is een voetpaadje** corresponds with + highway=footway +- **Dit is een wegeltje of bospad** corresponds + with highway + =path +- **Dit is een ruiterswegel** corresponds + with highway + =bridleway +- **Dit is een tractorspoor of weg om landbouwgrond te bereikken** corresponds + with highway + =track - - - - - **
Dit is een woonerf:
  • Voetgangers mogen hier de volledige breedte van de straat gebruiken
  • Gemotoriseerd verkeer mag maximaal 20km/h rijden
** corresponds with highway=living_street - - **Dit is een brede, autovrije straat** corresponds with highway=pedestrian - - **Dit is een voetpaadje** corresponds with highway=footway - - **Dit is een wegeltje of bospad** corresponds with highway=path - - **Dit is een ruiterswegel** corresponds with highway=bridleway - - **Dit is een tractorspoor of weg om landbouwgrond te bereikken** corresponds with highway=track - - - - -### slow_roads-surface - - +### slow_roads-surface The question is **Wat is de wegverharding van dit pad?** -This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) +This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) This is rendered with `The surface is {surface}` +- **The surface is grass** corresponds + with surface + =grass +- **The surface is ground** corresponds + with surface + =ground +- **The surface is unpaved** corresponds + with surface + =unpaved_This option cannot be + chosen as answer_ +- **The surface is sand** corresponds + with surface + =sand +- **The surface is paving stones** corresponds + with surface + =paving_stones +- **The surface is asphalt** corresponds + with surface + =asphalt +- **The surface is concrete** corresponds + with surface + =concrete +- **The surface is paved** corresponds + with surface + =paved_This option cannot be + chosen as answer_ - - - **The surface is grass** corresponds with surface=grass - - **The surface is ground** corresponds with surface=ground - - **The surface is unpaved** corresponds with surface=unpaved_This option cannot be chosen as answer_ - - **The surface is sand** corresponds with surface=sand - - **The surface is paving stones** corresponds with surface=paving_stones - - **The surface is asphalt** corresponds with surface=asphalt - - **The surface is concrete** corresponds with surface=concrete - - **The surface is paved** corresponds with surface=paved_This option cannot be chosen as answer_ - - - - -### slow_road_is_lit - - +### slow_road_is_lit The question is **Is deze weg 's nachts verlicht?** - - - - - - **'s nachts verlicht** corresponds with lit=yes - - **Niet verlicht** corresponds with lit=no - +- **'s nachts verlicht** corresponds with lit + =yes +- **Niet verlicht** corresponds with lit + =no This document is autogenerated from assets/layers/slow_roads/slow_roads.json \ No newline at end of file diff --git a/Docs/Layers/split_point.md b/Docs/Layers/split_point.md index e586d794e..8164c272d 100644 --- a/Docs/Layers/split_point.md +++ b/Docs/Layers/split_point.md @@ -1,6 +1,4 @@ - - - split_point +split_point ============= @@ -9,43 +7,30 @@ Layer rendering the little scissors for the minimap in the 'splitRoadWizard' - - - ## Table of contents 1. [split_point](#split_point) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) - - - - - - +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) [Go to the source code](../assets/layers/split_point/split_point.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- _split_point + =yes - - - _split_point=yes - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/split_point/split_point.json \ No newline at end of file diff --git a/Docs/Layers/sport_pitch.md b/Docs/Layers/sport_pitch.md index f64730bc0..284f84d06 100644 --- a/Docs/Layers/sport_pitch.md +++ b/Docs/Layers/sport_pitch.md @@ -1,6 +1,4 @@ - - - sport_pitch +sport_pitch ============= @@ -9,15 +7,13 @@ A sport pitch - - - ## Table of contents 1. [sport_pitch](#sport_pitch) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [sport_pitch-sport](#sport_pitch-sport) + [sport_pitch-surface](#sport_pitch-surface) @@ -29,207 +25,158 @@ A sport pitch + [questions](#questions) + [sport-pitch-reviews](#sport-pitch-reviews) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [sport_pitches](https://mapcomplete.osm.be/sport_pitches) - +- [personal](https://mapcomplete.osm.be/personal) +- [sport_pitches](https://mapcomplete.osm.be/sport_pitches) [Go to the source code](../assets/layers/sport_pitch/sport_pitch.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- leisure + =pitch - - - leisure=pitch - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/sport#values) [sport](https://wiki.openstreetmap.org/wiki/Key:sport) | [string](../SpecialInputElements.md#string) | [basketball](https://wiki.openstreetmap.org/wiki/Tag:sport%3Dbasketball) [soccer](https://wiki.openstreetmap.org/wiki/Tag:sport%3Dsoccer) [table_tennis](https://wiki.openstreetmap.org/wiki/Tag:sport%3Dtable_tennis) [tennis](https://wiki.openstreetmap.org/wiki/Tag:sport%3Dtennis) [korfball](https://wiki.openstreetmap.org/wiki/Tag:sport%3Dkorfball) [](https://taginfo.openstreetmap.org/keys/surface#values) [surface](https://wiki.openstreetmap.org/wiki/Key:surface) | [string](../SpecialInputElements.md#string) | [grass](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dgrass) [sand](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dsand) [paving_stones](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpaving_stones) [asphalt](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dasphalt) [concrete](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dconcrete) [](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | Multiple choice | [public](https://wiki.openstreetmap.org/wiki/Tag:access%3Dpublic) [limited](https://wiki.openstreetmap.org/wiki/Tag:access%3Dlimited) [members](https://wiki.openstreetmap.org/wiki/Tag:access%3Dmembers) [private](https://wiki.openstreetmap.org/wiki/Tag:access%3Dprivate) [](https://taginfo.openstreetmap.org/keys/reservation#values) [reservation](https://wiki.openstreetmap.org/wiki/Key:reservation) | Multiple choice | [required](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drequired) [recommended](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drecommended) [yes](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dno) -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | -[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### sport_pitch-sport - - +### sport_pitch-sport The question is **Which sport can be played here?** -This rendering asks information about the property [sport](https://wiki.openstreetmap.org/wiki/Key:sport) +This rendering asks information about the property [sport](https://wiki.openstreetmap.org/wiki/Key:sport) This is rendered with `{sport} is played here` +- **Basketball is played here** corresponds + with sport + =basketball +- **Soccer is played here** corresponds with + sport=soccer +- **This is a pingpong table** corresponds with + sport=table_tennis +- **Tennis is played here** corresponds with + sport=tennis +- **Korfball is played here** corresponds with + sport=korfball +- **Basketball is played here** corresponds + with sport + =basket_This option cannot be + chosen as answer_ - - - **Basketball is played here** corresponds with sport=basketball - - **Soccer is played here** corresponds with sport=soccer - - **This is a pingpong table** corresponds with sport=table_tennis - - **Tennis is played here** corresponds with sport=tennis - - **Korfball is played here** corresponds with sport=korfball - - **Basketball is played here** corresponds with sport=basket_This option cannot be chosen as answer_ - - - - -### sport_pitch-surface - - +### sport_pitch-surface The question is **Which is the surface of this sport pitch?** -This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) +This rendering asks information about the property [surface](https://wiki.openstreetmap.org/wiki/Key:surface) This is rendered with `The surface is {surface}` +- **The surface is grass** corresponds + with surface + =grass +- **The surface is sand** corresponds + with surface + =sand +- **The surface is paving stones** corresponds + with surface + =paving_stones +- **The surface is asphalt** corresponds + with surface + =asphalt +- **The surface is concrete** corresponds + with surface + =concrete - - - **The surface is grass** corresponds with surface=grass - - **The surface is sand** corresponds with surface=sand - - **The surface is paving stones** corresponds with surface=paving_stones - - **The surface is asphalt** corresponds with surface=asphalt - - **The surface is concrete** corresponds with surface=concrete - - - - -### sport-pitch-access - - +### sport-pitch-access The question is **Is this sport pitch publicly accessible?** +- **Public access** corresponds with access + =public +- **Limited access (e.g. only with an appointment, during certain hours, ...)** corresponds + with access + =limited +- **Only accessible for members of the club** corresponds + with access + =members +- **Private - not accessible to the public** corresponds + with access + =private - - - - - **Public access** corresponds with access=public - - **Limited access (e.g. only with an appointment, during certain hours, ...)** corresponds with access=limited - - **Only accessible for members of the club** corresponds with access=members - - **Private - not accessible to the public** corresponds with access=private - - - - -### sport-pitch-reservation - - +### sport-pitch-reservation The question is **Does one have to make an appointment to use this sport pitch?** +- **Making an appointment is obligatory to use this sport pitch** corresponds + with reservation + =required +- **Making an appointment is recommended when using this sport pitch** corresponds + with reservation + =recommended +- **Making an appointment is possible, but not necessary to use this sport pitch** corresponds + with reservation + =yes +- **Making an appointment is not possible** corresponds + with reservation + =no - - - - - **Making an appointment is obligatory to use this sport pitch** corresponds with reservation=required - - **Making an appointment is recommended when using this sport pitch** corresponds with reservation=recommended - - **Making an appointment is possible, but not necessary to use this sport pitch** corresponds with reservation=yes - - **Making an appointment is not possible** corresponds with reservation=no - - - - -### sport_pitch-phone - - +### sport_pitch-phone The question is **What is the phone number of the operator?** -This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) +This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone) This is rendered with `{phone}` - - -### sport_pitch-email - - +### sport_pitch-email The question is **What is the email address of the operator?** -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) +This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) This is rendered with `{email}` - - -### sport_pitch-opening_hours - - +### sport_pitch-opening_hours The question is **When is this pitch accessible?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `Openingsuren: {opening_hours_table()}` +- **24/7 toegankelijk** corresponds with _This option cannot be chosen as answer_ +- **Always accessible** corresponds + with opening_hours + =24/7 - - - **24/7 toegankelijk** corresponds with _This option cannot be chosen as answer_ - - **Always accessible** corresponds with opening_hours=24/7 - - - - -### questions - - +### questions _This tagrendering has no question and is thus read-only_ - - - - -### sport-pitch-reviews - - +### sport-pitch-reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/sport_pitch/sport_pitch.json \ No newline at end of file diff --git a/Docs/Layers/street_lamps.md b/Docs/Layers/street_lamps.md index 1d7cb5ce3..61182e041 100644 --- a/Docs/Layers/street_lamps.md +++ b/Docs/Layers/street_lamps.md @@ -1,6 +1,4 @@ - - - street_lamps +street_lamps ============== @@ -9,15 +7,13 @@ A layer showing street lights - - - ## Table of contents 1. [street_lamps](#street_lamps) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [ref](#ref) + [support](#support) + [lamp_mount](#lamp_mount) @@ -27,200 +23,185 @@ A layer showing street lights + [lit](#lit) + [direction](#direction) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [street_lighting](https://mapcomplete.osm.be/street_lighting) - +- [personal](https://mapcomplete.osm.be/personal) +- [street_lighting](https://mapcomplete.osm.be/street_lighting) [Go to the source code](../assets/layers/street_lamps/street_lamps.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- highway + =street_lamp - - - highway=street_lamp - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/support#values) [support](https://wiki.openstreetmap.org/wiki/Key:support) | Multiple choice | [catenary](https://wiki.openstreetmap.org/wiki/Tag:support%3Dcatenary) [ceiling](https://wiki.openstreetmap.org/wiki/Tag:support%3Dceiling) [ground](https://wiki.openstreetmap.org/wiki/Tag:support%3Dground) [pedestal](https://wiki.openstreetmap.org/wiki/Tag:support%3Dpedestal) [pole](https://wiki.openstreetmap.org/wiki/Tag:support%3Dpole) [wall](https://wiki.openstreetmap.org/wiki/Tag:support%3Dwall) [wall_mount](https://wiki.openstreetmap.org/wiki/Tag:support%3Dwall_mount) [](https://taginfo.openstreetmap.org/keys/lamp_mount#values) [lamp_mount](https://wiki.openstreetmap.org/wiki/Key:lamp_mount) | Multiple choice | [straight_mast](https://wiki.openstreetmap.org/wiki/Tag:lamp_mount%3Dstraight_mast) [bent_mast](https://wiki.openstreetmap.org/wiki/Tag:lamp_mount%3Dbent_mast) [](https://taginfo.openstreetmap.org/keys/light:method#values) [light:method](https://wiki.openstreetmap.org/wiki/Key:light:method) | Multiple choice | [LED](https://wiki.openstreetmap.org/wiki/Tag:light:method%3DLED) [incandescent](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dincandescent) [halogen](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dhalogen) [discharge](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Ddischarge) [mercury](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dmercury) [metal-halide](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dmetal-halide) [fluorescent](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dfluorescent) [sodium](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dsodium) [low_pressure_sodium](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dlow_pressure_sodium) [high_pressure_sodium](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dhigh_pressure_sodium) [gas](https://wiki.openstreetmap.org/wiki/Tag:light:method%3Dgas) [](https://taginfo.openstreetmap.org/keys/light:colour#values) [light:colour](https://wiki.openstreetmap.org/wiki/Key:light:colour) | [color](../SpecialInputElements.md#color) | [white](https://wiki.openstreetmap.org/wiki/Tag:light:colour%3Dwhite) [green](https://wiki.openstreetmap.org/wiki/Tag:light:colour%3Dgreen) [orange](https://wiki.openstreetmap.org/wiki/Tag:light:colour%3Dorange) [](https://taginfo.openstreetmap.org/keys/light:count#values) [light:count](https://wiki.openstreetmap.org/wiki/Key:light:count) | [pnat](../SpecialInputElements.md#pnat) | [1](https://wiki.openstreetmap.org/wiki/Tag:light:count%3D1) [2](https://wiki.openstreetmap.org/wiki/Tag:light:count%3D2) [](https://taginfo.openstreetmap.org/keys/light:lit#values) [light:lit](https://wiki.openstreetmap.org/wiki/Key:light:lit) | Multiple choice | [dusk-dawn](https://wiki.openstreetmap.org/wiki/Tag:light:lit%3Ddusk-dawn) [24/7](https://wiki.openstreetmap.org/wiki/Tag:light:lit%3D24/7) [motion](https://wiki.openstreetmap.org/wiki/Tag:light:lit%3Dmotion) [demand](https://wiki.openstreetmap.org/wiki/Tag:light:lit%3Ddemand) -[](https://taginfo.openstreetmap.org/keys/light:direction#values) [light:direction](https://wiki.openstreetmap.org/wiki/Key:light:direction) | [direction](../SpecialInputElements.md#direction) | - - - - -### ref - +[](https://taginfo.openstreetmap.org/keys/light:direction#values) [light:direction](https://wiki.openstreetmap.org/wiki/Key:light:direction) | [direction](../SpecialInputElements.md#direction) | +### ref The question is **What is the reference number of this street lamp?** -This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) +This rendering asks information about the property [ref](https://wiki.openstreetmap.org/wiki/Key:ref) This is rendered with `This street lamp has the reference number {ref}` - - -### support - - +### support The question is **How is this street lamp mounted?** +- **This lamp is suspended using cables** corresponds + with support + =catenary +- **This lamp is mounted on a ceiling** corresponds + with support + =ceiling +- **This lamp is mounted in the ground** corresponds + with support + =ground +- **This lamp is mounted on a short pole (mostly < 1.5m)** corresponds + with support + =pedestal +- **This lamp is mounted on a pole** corresponds + with support + =pole +- **This lamp is mounted directly to the wall** corresponds + with support + =wall +- **This lamp is mounted to the wall using a metal bar** corresponds + with support + =wall_mount - - - - - **This lamp is suspended using cables** corresponds with support=catenary - - **This lamp is mounted on a ceiling** corresponds with support=ceiling - - **This lamp is mounted in the ground** corresponds with support=ground - - **This lamp is mounted on a short pole (mostly < 1.5m)** corresponds with support=pedestal - - **This lamp is mounted on a pole** corresponds with support=pole - - **This lamp is mounted directly to the wall** corresponds with support=wall - - **This lamp is mounted to the wall using a metal bar** corresponds with support=wall_mount - - - - -### lamp_mount - - +### lamp_mount The question is **How is this lamp mounted to the pole?** +- **This lamp sits atop of a straight mast** corresponds + with lamp_mount + =straight_mast +- **This lamp sits at the end of a bent mast** corresponds + with lamp_mount + =bent_mast - - - - - **This lamp sits atop of a straight mast** corresponds with lamp_mount=straight_mast - - **This lamp sits at the end of a bent mast** corresponds with lamp_mount=bent_mast - - - - -### method - - +### method The question is **What kind of lighting does this lamp use?** +- **This lamp is lit electrically** corresponds + with light:method + =electric_This option + cannot be chosen as answer_ +- **This lamp uses LEDs** corresponds + with light:method + =LED +- **This lamp uses incandescent lighting** corresponds + with light:method + =incandescent +- **This lamp uses halogen lighting** corresponds + with light:method + =halogen +- **This lamp uses discharge lamps (unknown type)** corresponds + with light:method + =discharge +- **This lamp uses a mercury-vapour lamp (lightly blueish)** corresponds + with light:method + =mercury +- **This lamp uses metal-halide lamps (bright white)** corresponds + with light:method + =metal-halide +- **This lamp uses fluorescent lighting** corresponds + with light:method + =fluorescent +- **This lamp uses sodium lamps (unknown type)** corresponds + with light:method + =sodium +- **This lamp uses low pressure sodium lamps (monochrome orange)** corresponds + with light:method + = + low_pressure_sodium +- **This lamp uses high pressure sodium lamps (orange with white)** corresponds + with light:method + = + high_pressure_sodium +- **This lamp is lit using gas** corresponds + with light:method + =gas - - - - - **This lamp is lit electrically** corresponds with light:method=electric_This option cannot be chosen as answer_ - - **This lamp uses LEDs** corresponds with light:method=LED - - **This lamp uses incandescent lighting** corresponds with light:method=incandescent - - **This lamp uses halogen lighting** corresponds with light:method=halogen - - **This lamp uses discharge lamps (unknown type)** corresponds with light:method=discharge - - **This lamp uses a mercury-vapour lamp (lightly blueish)** corresponds with light:method=mercury - - **This lamp uses metal-halide lamps (bright white)** corresponds with light:method=metal-halide - - **This lamp uses fluorescent lighting** corresponds with light:method=fluorescent - - **This lamp uses sodium lamps (unknown type)** corresponds with light:method=sodium - - **This lamp uses low pressure sodium lamps (monochrome orange)** corresponds with light:method=low_pressure_sodium - - **This lamp uses high pressure sodium lamps (orange with white)** corresponds with light:method=high_pressure_sodium - - **This lamp is lit using gas** corresponds with light:method=gas - - - - -### colour - - +### colour The question is **What colour light does this lamp emit?** -This rendering asks information about the property [light:colour](https://wiki.openstreetmap.org/wiki/Key:light:colour) +This rendering asks information about the property [light:colour](https://wiki.openstreetmap.org/wiki/Key:light:colour) This is rendered with `This lamp emits {light:colour} light` +- **This lamp emits white light** corresponds + with light:colour + =white +- **This lamp emits green light** corresponds + with light:colour + =green +- **This lamp emits orange light** corresponds + with light:colour + =orange - - - **This lamp emits white light** corresponds with light:colour=white - - **This lamp emits green light** corresponds with light:colour=green - - **This lamp emits orange light** corresponds with light:colour=orange - - - - -### count - - +### count The question is **How many fixtures does this light have?** -This rendering asks information about the property [light:count](https://wiki.openstreetmap.org/wiki/Key:light:count) +This rendering asks information about the property [light:count](https://wiki.openstreetmap.org/wiki/Key:light:count) This is rendered with `This lamp has {light:count} fixtures` +- **This lamp has 1 fixture** corresponds + with light:count + =1 +- **This lamp has 2 fixtures** corresponds + with light:count + =2 - - - **This lamp has 1 fixture** corresponds with light:count=1 - - **This lamp has 2 fixtures** corresponds with light:count=2 - - - - -### lit - - +### lit The question is **When is this lamp lit?** +- **This lamp is lit at night** corresponds + with light:lit + =dusk-dawn +- **This lamp is lit 24/7** corresponds + with light:lit + =24/7 +- **This lamp is lit based on motion** corresponds + with light:lit + =motion +- **This lamp is lit based on demand (e.g. with a pushbutton)** corresponds + with light:lit + =demand - - - - - **This lamp is lit at night** corresponds with light:lit=dusk-dawn - - **This lamp is lit 24/7** corresponds with light:lit=24/7 - - **This lamp is lit based on motion** corresponds with light:lit=motion - - **This lamp is lit based on demand (e.g. with a pushbutton)** corresponds with light:lit=demand - - - - -### direction - - +### direction The question is **Where does this lamp point to?** -This rendering asks information about the property [light:direction](https://wiki.openstreetmap.org/wiki/Key:light:direction) -This is rendered with `This lamp points towards {light:direction}` +This rendering asks information about the +property [light:direction](https://wiki.openstreetmap.org/wiki/Key:light:direction) +This is rendered with `This lamp points towards {light:direction}` This document is autogenerated from assets/layers/street_lamps/street_lamps.json \ No newline at end of file diff --git a/Docs/Layers/surveillance_camera.md b/Docs/Layers/surveillance_camera.md index 685f417ec..41d5caf6e 100644 --- a/Docs/Layers/surveillance_camera.md +++ b/Docs/Layers/surveillance_camera.md @@ -1,6 +1,4 @@ - - - surveillance_camera +surveillance_camera ===================== @@ -9,15 +7,13 @@ This layer shows surveillance cameras and allows a contributor to update information and add new cameras - - - ## Table of contents 1. [surveillance_camera](#surveillance_camera) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Camera type: fixed; panning; dome](#camera-type-fixed;-panning;-dome) + [camera_direction](#camera_direction) @@ -29,200 +25,162 @@ This layer shows surveillance cameras and allows a contributor to update informa + [camera:mount](#cameramount) +- This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on + it: a preset snaps to this layer (presets[1]) +#### Themes using this layer - - - This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on it: a preset snaps to this layer (presets[1]) - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [surveillance](https://mapcomplete.osm.be/surveillance) - +- [personal](https://mapcomplete.osm.be/personal) +- [surveillance](https://mapcomplete.osm.be/surveillance) [Go to the source code](../assets/layers/surveillance_camera/surveillance_camera.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- man_made + =surveillance +- surveillance:type + =camera + |surveillance:type + =ALPR + |surveillance:type + =ANPR - - - man_made=surveillance - - surveillance:type=camera|surveillance:type=ALPR|surveillance:type=ANPR - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/camera:type#values) [camera:type](https://wiki.openstreetmap.org/wiki/Key:camera:type) | Multiple choice | [fixed](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Dfixed) [dome](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Ddome) [panning](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Dpanning) -[](https://taginfo.openstreetmap.org/keys/camera:direction#values) [camera:direction](https://wiki.openstreetmap.org/wiki/Key:camera:direction) | [direction](../SpecialInputElements.md#direction) | -[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/camera:direction#values) [camera:direction](https://wiki.openstreetmap.org/wiki/Key:camera:direction) | [direction](../SpecialInputElements.md#direction) | +[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/surveillance#values) [surveillance](https://wiki.openstreetmap.org/wiki/Key:surveillance) | Multiple choice | [public](https://wiki.openstreetmap.org/wiki/Tag:surveillance%3Dpublic) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:surveillance%3Doutdoor) [indoor](https://wiki.openstreetmap.org/wiki/Tag:surveillance%3Dindoor) [](https://taginfo.openstreetmap.org/keys/indoor#values) [indoor](https://wiki.openstreetmap.org/wiki/Key:indoor) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:indoor%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:indoor%3Dno) -[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [nat](../SpecialInputElements.md#nat) | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [nat](../SpecialInputElements.md#nat) | [](https://taginfo.openstreetmap.org/keys/surveillance:zone#values) [surveillance:zone](https://wiki.openstreetmap.org/wiki/Key:surveillance:zone) | [string](../SpecialInputElements.md#string) | [parking](https://wiki.openstreetmap.org/wiki/Tag:surveillance:zone%3Dparking) [traffic](https://wiki.openstreetmap.org/wiki/Tag:surveillance:zone%3Dtraffic) [entrance](https://wiki.openstreetmap.org/wiki/Tag:surveillance:zone%3Dentrance) [corridor](https://wiki.openstreetmap.org/wiki/Tag:surveillance:zone%3Dcorridor) [public_transport_platform](https://wiki.openstreetmap.org/wiki/Tag:surveillance:zone%3Dpublic_transport_platform) [shop](https://wiki.openstreetmap.org/wiki/Tag:surveillance:zone%3Dshop) [](https://taginfo.openstreetmap.org/keys/camera:mount#values) [camera:mount](https://wiki.openstreetmap.org/wiki/Key:camera:mount) | [string](../SpecialInputElements.md#string) | [wall](https://wiki.openstreetmap.org/wiki/Tag:camera:mount%3Dwall) [pole](https://wiki.openstreetmap.org/wiki/Tag:camera:mount%3Dpole) [ceiling](https://wiki.openstreetmap.org/wiki/Tag:camera:mount%3Dceiling) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### Camera type: fixed; panning; dome - - +### Camera type: fixed; panning; dome The question is **What kind of camera is this?** +- **A fixed (non-moving) camera** corresponds + with camera:type + =fixed +- **A dome camera (which can turn)** corresponds + with camera:type + =dome +- **A panning camera** corresponds with + camera:type=panning - - - - - **A fixed (non-moving) camera** corresponds with camera:type=fixed - - **A dome camera (which can turn)** corresponds with camera:type=dome - - **A panning camera** corresponds with camera:type=panning - - - - -### camera_direction - - +### camera_direction The question is **In which geographical direction does this camera film?** -This rendering asks information about the property [camera:direction](https://wiki.openstreetmap.org/wiki/Key:camera:direction) +This rendering asks information about the +property [camera:direction](https://wiki.openstreetmap.org/wiki/Key:camera:direction) This is rendered with `Films to a compass heading of {camera:direction}` +- **Films to a compass heading of {direction}** corresponds with direction~^..*$_This option cannot be chosen as answer_ - - - **Films to a compass heading of {direction}** corresponds with direction~^..*$_This option cannot be chosen as answer_ - - - - -### Operator - - +### Operator The question is **Who operates this CCTV?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Operated by {operator}` - - -### Surveillance type: public, outdoor, indoor - - +### Surveillance type: public, outdoor, indoor The question is **What kind of surveillance is this camera** +- **A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or + tunnel,...** corresponds with + surveillance=public +- **An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private + driveway, ...)** corresponds with + surveillance=outdoor +- **A private indoor area is surveilled, e.g. a shop, a private underground parking, ...** corresponds + with surveillance + =indoor - - - - - **A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel,...** corresponds with surveillance=public - - **An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, ...)** corresponds with surveillance=outdoor - - **A private indoor area is surveilled, e.g. a shop, a private underground parking, ...** corresponds with surveillance=indoor - - - - -### is_indoor - - +### is_indoor The question is **Is the public space surveilled by this camera an indoor or outdoor space?** +- **This camera is located indoors** corresponds + with indoor + =yes +- **This camera is located outdoors** corresponds + with indoor + =no +- **This camera is probably located outdoors** corresponds with _This option cannot be chosen as answer_ - - - - - **This camera is located indoors** corresponds with indoor=yes - - **This camera is located outdoors** corresponds with indoor=no - - **This camera is probably located outdoors** corresponds with _This option cannot be chosen as answer_ - - - - -### Level - - +### Level The question is **On which level is this camera located?** -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) This is rendered with `Located on level {level}` - - -### Surveillance:zone - - +### Surveillance:zone The question is **What exactly is surveilled here?** -This rendering asks information about the property [surveillance:zone](https://wiki.openstreetmap.org/wiki/Key:surveillance:zone) +This rendering asks information about the +property [surveillance:zone](https://wiki.openstreetmap.org/wiki/Key:surveillance:zone) This is rendered with ` Surveills a {surveillance:zone}` +- **Surveills a parking** corresponds + with surveillance:zone + =parking +- **Surveills the traffic** corresponds + with surveillance:zone + =traffic +- **Surveills an entrance** corresponds + with surveillance:zone + =entrance +- **Surveills a corridor** corresponds + with surveillance:zone + =corridor +- **Surveills a public tranport platform** corresponds + with surveillance:zone + = + public_transport_platform +- **Surveills a shop** corresponds + with surveillance:zone + =shop - - - **Surveills a parking** corresponds with surveillance:zone=parking - - **Surveills the traffic** corresponds with surveillance:zone=traffic - - **Surveills an entrance** corresponds with surveillance:zone=entrance - - **Surveills a corridor** corresponds with surveillance:zone=corridor - - **Surveills a public tranport platform** corresponds with surveillance:zone=public_transport_platform - - **Surveills a shop** corresponds with surveillance:zone=shop - - - - -### camera:mount - - +### camera:mount The question is **How is this camera placed?** -This rendering asks information about the property [camera:mount](https://wiki.openstreetmap.org/wiki/Key:camera:mount) +This rendering asks information about the property [camera:mount](https://wiki.openstreetmap.org/wiki/Key:camera:mount) This is rendered with `Mounting method: {camera:mount}` - - - - **This camera is placed against a wall** corresponds with camera:mount=wall - - **This camera is placed one a pole** corresponds with camera:mount=pole - - **This camera is placed on the ceiling** corresponds with camera:mount=ceiling - +- **This camera is placed against a wall** corresponds + with camera:mount + =wall +- **This camera is placed one a pole** corresponds + with camera:mount + =pole +- **This camera is placed on the ceiling** corresponds + with camera:mount + =ceiling This document is autogenerated from assets/layers/surveillance_camera/surveillance_camera.json \ No newline at end of file diff --git a/Docs/Layers/to_import.md b/Docs/Layers/to_import.md index e138d0c0d..ca546e45f 100644 --- a/Docs/Layers/to_import.md +++ b/Docs/Layers/to_import.md @@ -1,6 +1,4 @@ - - - to_import +to_import =========== @@ -9,94 +7,67 @@ Alamat - - - ## Table of contents 1. [to_import](#to_import) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [uk_addresses_explanation](#uk_addresses_explanation) + [uk_addresses_embedding_outline](#uk_addresses_embedding_outline) + [uk_addresses_import_button](#uk_addresses_import_button) - - - - - This layer is loaded from an external source, namely `https://osm-uk-addresses.russss.dev/addresses/{z}/{x}/{y}.json` - - This layer will automatically load [address](./address.md) into the layout as it depends on it: a tagrendering needs this layer (uk_addresses_import_button) - - This layer will automatically load [address](./address.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _embedding_object) - - This layer will automatically load [raw_inspire_polygons](./raw_inspire_polygons.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[3] which calculates the value for _embedding_inspire_polygon_has_address) - +- This layer is loaded from an external source, namely `https://osm-uk-addresses.russss.dev/addresses/{z}/{x}/{y}.json` +- This layer will automatically load [address](./address.md) into the layout as it depends on it: a tagrendering + needs this layer (uk_addresses_import_button) +- This layer will automatically load [address](./address.md) into the layout as it depends on it: A calculated tag + loads features from this layer (calculatedTag[0] which calculates the value for _embedding_object) +- This layer will automatically load [raw_inspire_polygons](./raw_inspire_polygons.md) into the layout as it depends + on it: A calculated tag loads features from this layer (calculatedTag[3] which calculates the value for _ + embedding_inspire_polygon_has_address) [Go to the source code](../assets/layers/to_import/to_import.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- inspireid~^..*$ - - - inspireid~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/_embedding_object:id#values) [_embedding_object:id](https://wiki.openstreetmap.org/wiki/Key:_embedding_object:id) | Multiple choice | [true](https://wiki.openstreetmap.org/wiki/Tag:_embedding_object:id%3Dtrue) [false](https://wiki.openstreetmap.org/wiki/Tag:_embedding_object:id%3Dfalse) - - - -### uk_addresses_explanation - - +### uk_addresses_explanation _This tagrendering has no question and is thus read-only_ - - - - -### uk_addresses_embedding_outline - - +### uk_addresses_embedding_outline _This tagrendering has no question and is thus read-only_ +- **The INSPIRE-polygon containing this point has at least one address contained** corresponds + with _embedding_object:id + =true +- **The INSPIRE-polygon containing this point has no addresses contained** corresponds + with _embedding_object:id + =false - - - - - **The INSPIRE-polygon containing this point has at least one address contained** corresponds with _embedding_object:id=true - - **The INSPIRE-polygon containing this point has no addresses contained** corresponds with _embedding_object:id=false - - - - -### uk_addresses_import_button - - +### uk_addresses_import_button _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/to_import/to_import.json \ No newline at end of file diff --git a/Docs/Layers/toekomstige_fietsstraat.md b/Docs/Layers/toekomstige_fietsstraat.md index 5fd14bafb..d411f8e98 100644 --- a/Docs/Layers/toekomstige_fietsstraat.md +++ b/Docs/Layers/toekomstige_fietsstraat.md @@ -1,6 +1,4 @@ - - - toekomstige_fietsstraat +toekomstige_fietsstraat ========================= @@ -9,66 +7,38 @@ This street will become a cyclestreet soon - - - ## Table of contents 1. [toekomstige_fietsstraat](#toekomstige_fietsstraat) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [cyclestreets](https://mapcomplete.osm.be/cyclestreets) - +- [cyclestreets](https://mapcomplete.osm.be/cyclestreets) [Go to the source code](../assets/layers/toekomstige_fietsstraat/toekomstige_fietsstraat.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- proposed:cyclestreet + =yes - - - proposed:cyclestreet=yes - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/toekomstige_fietsstraat/toekomstige_fietsstraat.json \ No newline at end of file diff --git a/Docs/Layers/toilet.md b/Docs/Layers/toilet.md index f538e829d..967332642 100644 --- a/Docs/Layers/toilet.md +++ b/Docs/Layers/toilet.md @@ -1,6 +1,4 @@ - - - toilet +toilet ======== @@ -9,15 +7,13 @@ A layer showing (public) toilets - - - ## Table of contents 1. [toilet](#toilet) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [toilet-access](#toilet-access) + [toilets-fee](#toilets-fee) @@ -33,57 +29,37 @@ A layer showing (public) toilets + [level](#level) + [description](#description) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [toilets](https://mapcomplete.osm.be/toilets) - +- [personal](https://mapcomplete.osm.be/personal) +- [toilets](https://mapcomplete.osm.be/toilets) [Go to the source code](../assets/layers/toilet/toilet.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =toilets - - - amenity=toilets - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | [string](../SpecialInputElements.md#string) | [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) [no](https://wiki.openstreetmap.org/wiki/Tag:access%3Dno) [key](https://wiki.openstreetmap.org/wiki/Tag:access%3Dkey) [](https://taginfo.openstreetmap.org/keys/fee#values) [fee](https://wiki.openstreetmap.org/wiki/Key:fee) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dno) -[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/toilets:position#values) [toilets:position](https://wiki.openstreetmap.org/wiki/Key:toilets:position) | Multiple choice | [seated](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dseated) [urinal](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Durinal) [squat](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dsquat) [seated;urinal](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dseated;urinal) @@ -92,227 +68,190 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/toilets:handwashing#values) [toilets:handwashing](https://wiki.openstreetmap.org/wiki/Key:toilets:handwashing) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:toilets:handwashing%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:toilets:handwashing%3Dno) [](https://taginfo.openstreetmap.org/keys/toilets:paper_supplied#values) [toilets:paper_supplied](https://wiki.openstreetmap.org/wiki/Key:toilets:paper_supplied) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:toilets:paper_supplied%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:toilets:paper_supplied%3Dno) [](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### toilet-access - - +### toilet-access The question is **Are these toilets publicly accessible?** -This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) +This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access) This is rendered with `Access is {access}` +- **Public access** corresponds with access + =yes +- **Only access to customers** corresponds + with access + =customers +- **Not accessible** corresponds with + access=no +- **Accessible, but one has to ask a key to enter** corresponds + with access + =key +- **Public access** corresponds with access + =public_This option cannot be + chosen as answer_ - - - **Public access** corresponds with access=yes - - **Only access to customers** corresponds with access=customers - - **Not accessible** corresponds with access=no - - **Accessible, but one has to ask a key to enter** corresponds with access=key - - **Public access** corresponds with access=public_This option cannot be chosen as answer_ - - - - -### toilets-fee - - +### toilets-fee The question is **Are these toilets free to use?** +- **These are paid toilets** corresponds with + fee=yes +- **Free to use** corresponds with fee + =no - - - - - **These are paid toilets** corresponds with fee=yes - - **Free to use** corresponds with fee=no - - - - -### toilet-charge - - +### toilet-charge The question is **How much does one have to pay for these toilets?** -This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) +This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge) This is rendered with `The fee is {charge}` - - -### payment-options - - +### payment-options The question is **Which methods of payment are accepted here?** +- **Cash is accepted here** corresponds + with payment:cash + =yesUnselecting this answer + will add payment:cash + =no +- **Payment cards are accepted here** corresponds + with payment:cards + =yesUnselecting this answer + will add payment:cards + =no - - - - - **Cash is accepted here** corresponds with payment:cash=yesUnselecting this answer will add payment:cash=no - - **Payment cards are accepted here** corresponds with payment:cards=yesUnselecting this answer will add payment:cards=no - - - - -### Opening-hours - - +### Opening-hours The question is **When are these toilets opened?** -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) +This rendering asks information about the +property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) This is rendered with `{opening_hours_table()}` +- **Opened 24/7** corresponds with + opening_hours=24/7 - - - **Opened 24/7** corresponds with opening_hours=24/7 - - - - -### toilets-wheelchair - - +### toilets-wheelchair The question is **Is there a dedicated toilet for wheelchair users** +- **There is a dedicated toilet for wheelchair users** corresponds + with wheelchair + =yes +- **No wheelchair access** corresponds + with wheelchair + =no - - - - - **There is a dedicated toilet for wheelchair users** corresponds with wheelchair=yes - - **No wheelchair access** corresponds with wheelchair=no - - - - -### toilets-type - - +### toilets-type The question is **Which kind of toilets are this?** +- **There are only seated toilets** corresponds + with toilets:position + =seated +- **There are only urinals here** corresponds + with toilets:position + =urinal +- **There are only squat toilets here** corresponds + with toilets:position + =squat +- **Both seated toilets and urinals are available here** corresponds + with toilets:position + =seated;urinal - - - - - **There are only seated toilets** corresponds with toilets:position=seated - - **There are only urinals here** corresponds with toilets:position=urinal - - **There are only squat toilets here** corresponds with toilets:position=squat - - **Both seated toilets and urinals are available here** corresponds with toilets:position=seated;urinal - - - - -### toilets-changing-table - - +### toilets-changing-table The question is **Is a changing table (to change diapers) available?** +- **A changing table is available** corresponds + with changing_table + =yes +- **No changing table is available** corresponds + with changing_table + =no - - - - - **A changing table is available** corresponds with changing_table=yes - - **No changing table is available** corresponds with changing_table=no - - - - -### toilet-changing_table:location - - +### toilet-changing_table:location The question is **Where is the changing table located?** -This rendering asks information about the property [changing_table:location](https://wiki.openstreetmap.org/wiki/Key:changing_table:location) +This rendering asks information about the +property [changing_table:location](https://wiki.openstreetmap.org/wiki/Key:changing_table:location) This is rendered with `The changing table is located at {changing_table:location}` +- **The changing table is in the toilet for women. ** corresponds + with changing_table: + location + = + female_toilet +- **The changing table is in the toilet for men. ** corresponds + with changing_table: + location= + male_toilet +- **The changing table is in the toilet for wheelchair users. ** corresponds + with changing_table: + location + = + wheelchair_toilet +- **The changing table is in a dedicated room. ** corresponds + with changing_table: + location + = + dedicated_room - - - **The changing table is in the toilet for women. ** corresponds with changing_table:location=female_toilet - - **The changing table is in the toilet for men. ** corresponds with changing_table:location=male_toilet - - **The changing table is in the toilet for wheelchair users. ** corresponds with changing_table:location=wheelchair_toilet - - **The changing table is in a dedicated room. ** corresponds with changing_table:location=dedicated_room - - - - -### toilet-handwashing - - +### toilet-handwashing The question is **Do these toilets have a sink to wash your hands?** +- **This toilets have a sink to wash your hands** corresponds + with toilets:handwashing + =yes +- **This toilets don't have a sink to wash your hands** corresponds + with toilets:handwashing + =no - - - - - **This toilets have a sink to wash your hands** corresponds with toilets:handwashing=yes - - **This toilets don't have a sink to wash your hands** corresponds with toilets:handwashing=no - - - - -### toilet-has-paper - - +### toilet-has-paper The question is **Does one have to bring their own toilet paper to this toilet?** +- **This toilet is equipped with toilet paper** corresponds + with toilets: + paper_supplied= + yes +- **You have to bring your own toilet paper to this toilet** corresponds + with toilets: + paper_supplied= + no - - - - - **This toilet is equipped with toilet paper** corresponds with toilets:paper_supplied=yes - - **You have to bring your own toilet paper to this toilet** corresponds with toilets:paper_supplied=no - - - - -### level - - +### level The question is **On what level is this feature located?** -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) This is rendered with `Located on the {level}th floor` +- **Located underground** corresponds with + location=underground_ + This option cannot be chosen as answer_ +- **Located on the ground floor** corresponds + with level + =0 +- **Located on the ground floor** corresponds with _This option cannot be chosen as answer_ +- **Located on the first floor** corresponds + with level + =1 +### description - - **Located underground** corresponds with location=underground_This option cannot be chosen as answer_ - - **Located on the ground floor** corresponds with level=0 - - **Located on the ground floor** corresponds with _This option cannot be chosen as answer_ - - **Located on the first floor** corresponds with level=1 +The question is **Is there still something relevant you couldn't give in the previous questions? Add it +here.
Don't repeat already stated facts** - - - -### description - - - -The question is **Is there still something relevant you couldn't give in the previous questions? Add it here.
Don't repeat already stated facts** - -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) -This is rendered with `{description}` +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This is rendered with `{description}` This document is autogenerated from assets/layers/toilet/toilet.json \ No newline at end of file diff --git a/Docs/Layers/town_hall.md b/Docs/Layers/town_hall.md index ca36b4926..54230f32a 100644 --- a/Docs/Layers/town_hall.md +++ b/Docs/Layers/town_hall.md @@ -1,49 +1,41 @@ - - - town_hall +town_hall =========== - - - ## Table of contents 1. [town_hall](#town_hall) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - This layer will automatically load [postal_code_boundary](./postal_code_boundary.md) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _postal_code_properties) - +- This layer will automatically load [postal_code_boundary](./postal_code_boundary.md) into the layout as it depends + on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _ + postal_code_properties) [Go to the source code](../assets/layers/town_hall/town_hall.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =townhall + |building + =church - - - amenity=townhall|building=church - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/town_hall/town_hall.json \ No newline at end of file diff --git a/Docs/Layers/trail.md b/Docs/Layers/trail.md index d84ad3bbf..324da9989 100644 --- a/Docs/Layers/trail.md +++ b/Docs/Layers/trail.md @@ -1,6 +1,4 @@ - - - trail +trail ======= @@ -9,14 +7,12 @@ Aangeduide wandeltochten - - - ## Table of contents 1. [trail](#trail) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [trail-length](#trail-length) + [Name](#name) @@ -25,146 +21,98 @@ Aangeduide wandeltochten + [Wheelchair access](#wheelchair-access) + [pushchair access](#pushchair-access) - - - - - - - [Go to the source code](../assets/layers/trail/trail.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- route~^.*foot.*$|route~^.*hiking.*$|route~^.*bycicle.*$|route~^.*horse.*$ - - - route~^.*foot.*$|route~^.*hiking.*$|route~^.*bycicle.*$|route~^.*horse.*$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Natuurpunt](https://wiki.openstreetmap.org/wiki/Tag:operator%3DNatuurpunt) [](https://taginfo.openstreetmap.org/keys/colour#values) [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [color](../SpecialInputElements.md#color) | [blue](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblue) [red](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dred) [green](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgreen) [yellow](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dyellow) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/pushchair#values) [pushchair](https://wiki.openstreetmap.org/wiki/Key:pushchair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:pushchair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:pushchair%3Dno) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### trail-length - - +### trail-length _This tagrendering has no question and is thus read-only_ - - - - -### Name - - +### Name The question is **Wat is de naam van deze wandeling?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `Deze wandeling heet {name}` - - -### Operator tag - - +### Operator tag The question is **Wie beheert deze wandeltocht?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Beheer door {operator}` +- **Dit gebied wordt beheerd door Natuurpunt** + corresponds with operator + =Natuurpunt +- **Dit gebied wordt beheerd door {operator}** + corresponds with operator~^(n|N)atuurpunt.*$_This option cannot be chosen as answer_ - - - **Dit gebied wordt beheerd door Natuurpunt** corresponds with operator=Natuurpunt - - **Dit gebied wordt beheerd door {operator}** corresponds with operator~^(n|N)atuurpunt.*$_This option cannot be chosen as answer_ - - - - -### Color - - +### Color The question is **Welke kleur heeft deze wandeling?** -This rendering asks information about the property [colour](https://wiki.openstreetmap.org/wiki/Key:colour) +This rendering asks information about the property [colour](https://wiki.openstreetmap.org/wiki/Key:colour) This is rendered with `Deze wandeling heeft kleur {colour}` +- **Blue trail** corresponds with colour + =blue +- **Red trail** corresponds with colour + =red +- **Green trail** corresponds with colour + =green +- **Yellow trail** corresponds with colour + =yellow - - - **Blue trail** corresponds with colour=blue - - **Red trail** corresponds with colour=red - - **Green trail** corresponds with colour=green - - **Yellow trail** corresponds with colour=yellow - - - - -### Wheelchair access - - +### Wheelchair access The question is **Is deze wandeling toegankelijk met de rolstoel?** +- **deze wandeltocht is toegankelijk met de rolstoel** corresponds + with wheelchair + =yes +- **deze wandeltocht is niet toegankelijk met de rolstoel** corresponds + with wheelchair + =no - - - - - **deze wandeltocht is toegankelijk met de rolstoel** corresponds with wheelchair=yes - - **deze wandeltocht is niet toegankelijk met de rolstoel** corresponds with wheelchair=no - - - - -### pushchair access - - +### pushchair access The question is **Is deze wandeltocht toegankelijk met de buggy?** - - - - - - **deze wandeltocht is toegankelijk met de buggy** corresponds with pushchair=yes - - **deze wandeltocht is niet toegankelijk met de buggy** corresponds with pushchair=no - +- **deze wandeltocht is toegankelijk met de buggy** corresponds + with pushchair + =yes +- **deze wandeltocht is niet toegankelijk met de buggy** corresponds + with pushchair + =no This document is autogenerated from assets/layers/trail/trail.json \ No newline at end of file diff --git a/Docs/Layers/tree_node.md b/Docs/Layers/tree_node.md index 7b9be4ddb..ddb54c8f8 100644 --- a/Docs/Layers/tree_node.md +++ b/Docs/Layers/tree_node.md @@ -1,6 +1,4 @@ - - - tree_node +tree_node =========== @@ -9,15 +7,13 @@ A layer showing trees - - - ## Table of contents 1. [tree_node](#tree_node) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [tree-height](#tree-height) + [tree-leaf_type](#tree-leaf_type) @@ -28,199 +24,158 @@ A layer showing trees + [tree_node-ref:OnroerendErfgoed](#tree_node-refonroerenderfgoed) + [tree_node-wikidata](#tree_node-wikidata) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [trees](https://mapcomplete.osm.be/trees) - +- [personal](https://mapcomplete.osm.be/personal) +- [trees](https://mapcomplete.osm.be/trees) [Go to the source code](../assets/layers/tree_node/tree_node.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- natural + =tree - - - natural=tree - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/height#values) [height](https://wiki.openstreetmap.org/wiki/Key:height) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/height#values) [height](https://wiki.openstreetmap.org/wiki/Key:height) | Multiple choice | [](https://taginfo.openstreetmap.org/keys/leaf_type#values) [leaf_type](https://wiki.openstreetmap.org/wiki/Key:leaf_type) | Multiple choice | [broadleaved](https://wiki.openstreetmap.org/wiki/Tag:leaf_type%3Dbroadleaved) [needleleaved](https://wiki.openstreetmap.org/wiki/Tag:leaf_type%3Dneedleleaved) [](https://taginfo.openstreetmap.org/keys/denotation#values) [denotation](https://wiki.openstreetmap.org/wiki/Key:denotation) | Multiple choice | [landmark](https://wiki.openstreetmap.org/wiki/Tag:denotation%3Dlandmark) [natural_monument](https://wiki.openstreetmap.org/wiki/Tag:denotation%3Dnatural_monument) [agricultural](https://wiki.openstreetmap.org/wiki/Tag:denotation%3Dagricultural) [park](https://wiki.openstreetmap.org/wiki/Tag:denotation%3Dpark) [garden](https://wiki.openstreetmap.org/wiki/Tag:denotation%3Dgarden) [avenue](https://wiki.openstreetmap.org/wiki/Tag:denotation%3Davenue) [urban](https://wiki.openstreetmap.org/wiki/Tag:denotation%3Durban) [none](https://wiki.openstreetmap.org/wiki/Tag:denotation%3Dnone) [](https://taginfo.openstreetmap.org/keys/leaf_cycle#values) [leaf_cycle](https://wiki.openstreetmap.org/wiki/Key:leaf_cycle) | Multiple choice | [deciduous](https://wiki.openstreetmap.org/wiki/Tag:leaf_cycle%3Ddeciduous) [evergreen](https://wiki.openstreetmap.org/wiki/Tag:leaf_cycle%3Devergreen) [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:name%3D) [](https://taginfo.openstreetmap.org/keys/heritage#values) [heritage](https://wiki.openstreetmap.org/wiki/Key:heritage) | Multiple choice | [4](https://wiki.openstreetmap.org/wiki/Tag:heritage%3D4) [4](https://wiki.openstreetmap.org/wiki/Tag:heritage%3D4) [yes](https://wiki.openstreetmap.org/wiki/Tag:heritage%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:heritage%3Dno) -[](https://taginfo.openstreetmap.org/keys/ref:OnroerendErfgoed#values) [ref:OnroerendErfgoed](https://wiki.openstreetmap.org/wiki/Key:ref:OnroerendErfgoed) | [nat](../SpecialInputElements.md#nat) | -[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/ref:OnroerendErfgoed#values) [ref:OnroerendErfgoed](https://wiki.openstreetmap.org/wiki/Key:ref:OnroerendErfgoed) | [nat](../SpecialInputElements.md#nat) | +[](https://taginfo.openstreetmap.org/keys/wikidata#values) [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### tree-height - - +### tree-height _This tagrendering has no question and is thus read-only_ +- **Height: {height} m** corresponds with height~^[0-9.]+$ - - - - - **Height: {height} m** corresponds with height~^[0-9.]+$ - - - - -### tree-leaf_type - - +### tree-leaf_type The question is **Is this a broadleaved or needleleaved tree?** +- ** Broadleaved** corresponds + with leaf_type + =broadleaved +- ** Needleleaved** + corresponds with leaf_type + =needleleaved +- ** Permanently leafless** + corresponds with leaf_type + =leafless_This option + cannot be chosen as answer_ - - - - - ** Broadleaved** corresponds with leaf_type=broadleaved - - ** Needleleaved** corresponds with leaf_type=needleleaved - - ** Permanently leafless** corresponds with leaf_type=leafless_This option cannot be chosen as answer_ - - - - -### tree-denotation - - +### tree-denotation The question is **How significant is this tree? Choose the first answer that applies.** +- **The tree is remarkable due to its size or prominent location. It is useful for navigation.** corresponds + with denotation + =landmark +- **The tree is a natural monument, e.g. because it is especially old, or of a valuable species.** corresponds + with denotation + =natural_monument +- **The tree is used for agricultural purposes, e.g. in an orchard.** corresponds + with denotation + =agricultural +- **The tree is in a park or similar (cemetery, school grounds, …).** corresponds + with denotation + =park +- **The tree is a residential garden.** corresponds + with denotation + =garden +- **This is a tree along an avenue.** corresponds + with denotation + =avenue +- **The tree is an urban area.** corresponds + with denotation + =urban +- **The tree is outside of an urban area.** corresponds + with denotation + =none - - - - - **The tree is remarkable due to its size or prominent location. It is useful for navigation.** corresponds with denotation=landmark - - **The tree is a natural monument, e.g. because it is especially old, or of a valuable species.** corresponds with denotation=natural_monument - - **The tree is used for agricultural purposes, e.g. in an orchard.** corresponds with denotation=agricultural - - **The tree is in a park or similar (cemetery, school grounds, …).** corresponds with denotation=park - - **The tree is a residential garden.** corresponds with denotation=garden - - **This is a tree along an avenue.** corresponds with denotation=avenue - - **The tree is an urban area.** corresponds with denotation=urban - - **The tree is outside of an urban area.** corresponds with denotation=none - - - - -### tree-decidouous - - +### tree-decidouous The question is **Is this tree evergreen or deciduous?** +- **Deciduous: the tree loses its leaves for some time of the year.** corresponds + with leaf_cycle + =deciduous +- **Evergreen.** corresponds with + leaf_cycle=evergreen - - - - - **Deciduous: the tree loses its leaves for some time of the year.** corresponds with leaf_cycle=deciduous - - **Evergreen.** corresponds with leaf_cycle=evergreen - - - - -### tree_node-name - - +### tree_node-name The question is **Does the tree have a name?** -This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) +This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name) This is rendered with `Name: {name}` +- **The tree does not have a name.** corresponds + with noname + =yes - - - **The tree does not have a name.** corresponds with noname=yes - - - - -### tree-heritage - - +### tree-heritage The question is **Is this tree registered heritage?** +- ** + Registered as heritage by Onroerend Erfgoed Flanders** corresponds + with heritage + =4 + &heritage:operator + = + OnroerendErfgoed +- **Registered as heritage by Direction du Patrimoine culturel Brussels** corresponds + with heritage + =4 + &heritage:operator + =aatl +- **Registered as heritage by a different organisation** corresponds + with heritage + =yes +- **Not registered as heritage** corresponds + with heritage + =no +- **Registered as heritage by a different organisation** corresponds with heritage~^..*$_This option cannot be chosen as + answer_ - - - - - ** Registered as heritage by Onroerend Erfgoed Flanders** corresponds with heritage=4&heritage:operator=OnroerendErfgoed - - **Registered as heritage by Direction du Patrimoine culturel Brussels** corresponds with heritage=4&heritage:operator=aatl - - **Registered as heritage by a different organisation** corresponds with heritage=yes - - **Not registered as heritage** corresponds with heritage=no - - **Registered as heritage by a different organisation** corresponds with heritage~^..*$_This option cannot be chosen as answer_ - - - - -### tree_node-ref:OnroerendErfgoed - - +### tree_node-ref:OnroerendErfgoed The question is **What is the ID issued by Onroerend Erfgoed Flanders?** -This rendering asks information about the property [ref:OnroerendErfgoed](https://wiki.openstreetmap.org/wiki/Key:ref:OnroerendErfgoed) -This is rendered with ` Onroerend Erfgoed ID: {ref:OnroerendErfgoed}` - - - -### tree_node-wikidata - +This rendering asks information about the +property [ref:OnroerendErfgoed](https://wiki.openstreetmap.org/wiki/Key:ref:OnroerendErfgoed) +This is rendered +with ` Onroerend Erfgoed ID: {ref:OnroerendErfgoed}` +### tree_node-wikidata The question is **What is the Wikidata ID for this tree?** -This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) -This is rendered with ` Wikidata: {wikidata}` +This rendering asks information about the property [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) +This is rendered +with ` Wikidata: {wikidata}` This document is autogenerated from assets/layers/tree_node/tree_node.json \ No newline at end of file diff --git a/Docs/Layers/type_node.md b/Docs/Layers/type_node.md index 46d402992..d584c121f 100644 --- a/Docs/Layers/type_node.md +++ b/Docs/Layers/type_node.md @@ -1,52 +1,42 @@ - - - type_node +type_node =========== -This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do advanced conflations. Expert use only. - - - +This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the +full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which +contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do +advanced conflations. Expert use only. ## Table of contents 1. [type_node](#type_node) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - This layer is needed as dependency for layer [grb](#grb) - +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +- This layer is needed as dependency for layer [grb](#grb) [Go to the source code](../assets/layers/type_node/type_node.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- id~^node\/.*$ - - - id~^node\/.*$ - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/type_node/type_node.json \ No newline at end of file diff --git a/Docs/Layers/viewpoint.md b/Docs/Layers/viewpoint.md index 8b2bcac35..341db70b2 100644 --- a/Docs/Layers/viewpoint.md +++ b/Docs/Layers/viewpoint.md @@ -1,6 +1,4 @@ - - - viewpoint +viewpoint =========== @@ -9,75 +7,49 @@ A nice viewpoint or nice view. Ideal to add an image if no other category fits - - - ## Table of contents 1. [viewpoint](#viewpoint) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [viewpoint-description](#viewpoint-description) - - - - - - - [Go to the source code](../assets/layers/viewpoint/viewpoint.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- tourism + =viewpoint - - - tourism=viewpoint - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | - - - - -### images - +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [string](../SpecialInputElements.md#string) | +### images _This tagrendering has no question and is thus read-only_ - - - - -### viewpoint-description - - +### viewpoint-description The question is **Do you want to add a description?** -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) -This is rendered with `{description}` +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This is rendered with `{description}` This document is autogenerated from assets/layers/viewpoint/viewpoint.json \ No newline at end of file diff --git a/Docs/Layers/village_green.md b/Docs/Layers/village_green.md index fbc8ce8ee..2511c9708 100644 --- a/Docs/Layers/village_green.md +++ b/Docs/Layers/village_green.md @@ -1,6 +1,4 @@ - - - village_green +village_green =============== @@ -9,76 +7,43 @@ A layer showing village-green (which are communal green areas, but not quite parks" - - - ## Table of contents 1. [village_green](#village_green) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [village_green-explanation](#village_green-explanation) + [village_green-reviews](#village_green-reviews) - - - - - - - [Go to the source code](../assets/layers/village_green/village_green.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- landuse + =village_green - - - landuse=village_green - - - - - Supported attributes +Supported attributes ---------------------- - - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### village_green-explanation - - +### village_green-explanation _This tagrendering has no question and is thus read-only_ - - - - -### village_green-reviews - - +### village_green-reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/village_green/village_green.json \ No newline at end of file diff --git a/Docs/Layers/visitor_information_centre.md b/Docs/Layers/visitor_information_centre.md index 06f61cf60..44b52f3fc 100644 --- a/Docs/Layers/visitor_information_centre.md +++ b/Docs/Layers/visitor_information_centre.md @@ -1,6 +1,4 @@ - - - visitor_information_centre +visitor_information_centre ============================ @@ -9,43 +7,32 @@ A visitor center offers information about a specific attraction or place of interest where it is located. - - - ## Table of contents 1. [visitor_information_centre](#visitor_information_centre) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) - - - - - - +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) [Go to the source code](../assets/layers/visitor_information_centre/visitor_information_centre.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- information + =visitor_centre + |information + =office - - - information=visitor_centre|information=office - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/visitor_information_centre/visitor_information_centre.json \ No newline at end of file diff --git a/Docs/Layers/walking_routes.md b/Docs/Layers/walking_routes.md index 910fb7a8a..81cf10307 100644 --- a/Docs/Layers/walking_routes.md +++ b/Docs/Layers/walking_routes.md @@ -1,6 +1,4 @@ - - - walking_routes +walking_routes ================ @@ -9,14 +7,12 @@ Walking routes by 'provincie Antwerpen' - - - ## Table of contents 1. [walking_routes](#walking_routes) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [walk-length](#walk-length) + [walk-type](#walk-type) + [walk-description](#walk-description) @@ -26,129 +22,90 @@ Walking routes by 'provincie Antwerpen' + [reviews](#reviews) - - - - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - This layer is loaded from an external source, namely `https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson` - +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +- This layer is loaded from an external source, namely `https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson` [Go to the source code](../assets/layers/walking_routes/walking_routes.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- type + =route +- route + =foot +- operator~^[pP]rovincie Antwerpen$ - - - type=route - - route=foot - - operator~^[pP]rovincie Antwerpen$ - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/route#values) [route](https://wiki.openstreetmap.org/wiki/Key:route) | Multiple choice | [iwn](https://wiki.openstreetmap.org/wiki/Tag:route%3Diwn) [nwn](https://wiki.openstreetmap.org/wiki/Tag:route%3Dnwn) [rwn](https://wiki.openstreetmap.org/wiki/Tag:route%3Drwn) [lwn](https://wiki.openstreetmap.org/wiki/Tag:route%3Dlwn) -[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | -[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/operator:email#values) [operator:email](https://wiki.openstreetmap.org/wiki/Key:operator:email) | [email](../SpecialInputElements.md#email) | - - - - -### walk-length - +[](https://taginfo.openstreetmap.org/keys/description#values) [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | +[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/operator:email#values) [operator:email](https://wiki.openstreetmap.org/wiki/Key:operator:email) | [email](../SpecialInputElements.md#email) | +### walk-length _This tagrendering has no question and is thus read-only_ - - - - -### walk-type - - +### walk-type _This tagrendering has no question and is thus read-only_ +- **Dit is een internationale wandelroute** corresponds + with route + =iwn +- **Dit is een nationale wandelroute** corresponds + with route + =nwn +- **Dit is een regionale wandelroute** corresponds + with route + =rwn +- **Dit is een lokale wandelroute** corresponds + with route + =lwn - - - - - **Dit is een internationale wandelroute** corresponds with route=iwn - - **Dit is een nationale wandelroute** corresponds with route=nwn - - **Dit is een regionale wandelroute** corresponds with route=rwn - - **Dit is een lokale wandelroute** corresponds with route=lwn - - - - -### walk-description - - +### walk-description The question is **Geef een korte beschrijving van de wandeling (max 255 tekens)** -This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) +This rendering asks information about the property [description](https://wiki.openstreetmap.org/wiki/Key:description) This is rendered with `

Korte beschrijving:

{description}` - - -### walk-operator - - +### walk-operator The question is **Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Signalisatie geplaatst door {operator}` - - -### walk-operator-email - - +### walk-operator-email The question is **Naar wie kan men emailen bij problemen rond signalisatie?** -This rendering asks information about the property [operator:email](https://wiki.openstreetmap.org/wiki/Key:operator:email) -This is rendered with `Bij problemen met signalisatie kan men emailen naar {operator:email}` - - - -### questions - +This rendering asks information about the +property [operator:email](https://wiki.openstreetmap.org/wiki/Key:operator:email) +This is rendered +with `Bij problemen met signalisatie kan men emailen naar {operator:email}` +### questions _This tagrendering has no question and is thus read-only_ - - - - -### reviews - - +### reviews _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/walking_routes/walking_routes.json \ No newline at end of file diff --git a/Docs/Layers/walls_and_buildings.md b/Docs/Layers/walls_and_buildings.md index 3cf13aa66..7940feec6 100644 --- a/Docs/Layers/walls_and_buildings.md +++ b/Docs/Layers/walls_and_buildings.md @@ -1,71 +1,54 @@ - - - walls_and_buildings +walls_and_buildings ===================== -Special builtin layer providing all walls and buildings. This layer is useful in presets for objects which can be placed against walls (e.g. AEDs, postboxes, entrances, addresses, surveillance cameras, ...). This layer is invisible by default and not toggleable by the user. - - - +Special builtin layer providing all walls and buildings. This layer is useful in presets for objects which can be placed +against walls (e.g. AEDs, postboxes, entrances, addresses, surveillance cameras, ...). This layer is invisible by +default and not toggleable by the user. ## Table of contents 1. [walls_and_buildings](#walls_and_buildings) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) +- This layer is not visible by default and must be enabled in the filter by the user. +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` +- This layer is needed as dependency for layer [defibrillator](#defibrillator) +- This layer is needed as dependency for layer [entrance](#entrance) +- This layer is needed as dependency for layer [surveillance_camera](#surveillance_camera) +#### Themes using this layer - - - This layer is not visible by default and must be enabled in the filter by the user. - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - - This layer is needed as dependency for layer [defibrillator](#defibrillator) - - This layer is needed as dependency for layer [entrance](#entrance) - - This layer is needed as dependency for layer [surveillance_camera](#surveillance_camera) - - - - -#### Themes using this layer - - - - - - - [aed](https://mapcomplete.osm.be/aed) - - [entrances](https://mapcomplete.osm.be/entrances) - - [personal](https://mapcomplete.osm.be/personal) - - [surveillance](https://mapcomplete.osm.be/surveillance) - +- [aed](https://mapcomplete.osm.be/aed) +- [entrances](https://mapcomplete.osm.be/entrances) +- [personal](https://mapcomplete.osm.be/personal) +- [surveillance](https://mapcomplete.osm.be/surveillance) [Go to the source code](../assets/layers/walls_and_buildings/walls_and_buildings.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- barrier + =wall|building~^..*$ - - - barrier=wall|building~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/walls_and_buildings/walls_and_buildings.json \ No newline at end of file diff --git a/Docs/Layers/waste_basket.md b/Docs/Layers/waste_basket.md index 1797f60fe..3357babed 100644 --- a/Docs/Layers/waste_basket.md +++ b/Docs/Layers/waste_basket.md @@ -1,6 +1,4 @@ - - - waste_basket +waste_basket ============== @@ -9,105 +7,78 @@ This is a public waste basket, thrash can, where you can throw away your thrash. - - - ## Table of contents 1. [waste_basket](#waste_basket) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [waste-basket-waste-types](#waste-basket-waste-types) + [dispensing_dog_bags](#dispensing_dog_bags) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [personal](https://mapcomplete.osm.be/personal) - - [waste_basket](https://mapcomplete.osm.be/waste_basket) - +- [personal](https://mapcomplete.osm.be/personal) +- [waste_basket](https://mapcomplete.osm.be/waste_basket) [Go to the source code](../assets/layers/waste_basket/waste_basket.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- amenity + =waste_basket - - - amenity=waste_basket - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/waste#values) [waste](https://wiki.openstreetmap.org/wiki/Key:waste) | Multiple choice | [trash](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dtrash) [dog_excrement](https://wiki.openstreetmap.org/wiki/Tag:waste%3Ddog_excrement) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dcigarettes) [drugs](https://wiki.openstreetmap.org/wiki/Tag:waste%3Ddrugs) [sharps](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dsharps) [](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | Multiple choice | [dog_excrement_bag](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddog_excrement_bag) [](https://wiki.openstreetmap.org/wiki/Tag:vending%3D) [](https://wiki.openstreetmap.org/wiki/Tag:vending%3D) - - - -### waste-basket-waste-types - - +### waste-basket-waste-types The question is **What kind of waste basket is this?** +- **A waste basket for general waste** corresponds with _This option cannot be chosen as answer_ +- **A waste basket for general waste** corresponds + with waste + =trash +- **A waste basket for dog excrements** corresponds + with waste + =dog_excrement +- **A waste basket for cigarettes** corresponds + with waste + =cigarettes +- **A waste basket for drugs** corresponds with + waste=drugs +- **A waste basket for needles and other sharp objects** corresponds + with waste + =sharps - - - - - **A waste basket for general waste** corresponds with _This option cannot be chosen as answer_ - - **A waste basket for general waste** corresponds with waste=trash - - **A waste basket for dog excrements** corresponds with waste=dog_excrement - - **A waste basket for cigarettes** corresponds with waste=cigarettes - - **A waste basket for drugs** corresponds with waste=drugs - - **A waste basket for needles and other sharp objects** corresponds with waste=sharps - - - - -### dispensing_dog_bags - - +### dispensing_dog_bags The question is **Does this waste basket have a dispenser for dog excrement bags?** - - - - - - **This waste basket has a dispenser for (dog) excrement bags** corresponds with vending=dog_excrement_bag - - **This waste basket does not have a dispenser for (dog) excrement bags** corresponds with not:vending=dog_excrement_bag - - **This waste basket does not have a dispenser for (dog) excrement bags** corresponds with - +- **This waste basket has a dispenser for (dog) excrement bags** corresponds + with vending + =dog_excrement_bag +- **This waste basket does not have a dispenser for (dog) excrement bags** corresponds + with not:vending + = + dog_excrement_bag +- **This waste basket does not have a dispenser for (dog) excrement bags** corresponds with This document is autogenerated from assets/layers/waste_basket/waste_basket.json \ No newline at end of file diff --git a/Docs/Layers/watermill.md b/Docs/Layers/watermill.md index a69c90700..939beb29f 100644 --- a/Docs/Layers/watermill.md +++ b/Docs/Layers/watermill.md @@ -1,6 +1,4 @@ - - - watermill +watermill =========== @@ -9,104 +7,84 @@ Watermolens - - - ## Table of contents 1. [watermill](#watermill) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [images](#images) + [Access tag](#access-tag) + [Operator tag](#operator-tag) - - - - - - - [Go to the source code](../assets/layers/watermill/watermill.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- man_made + =watermill - - - man_made=watermill - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/access:description#values) [access:description](https://wiki.openstreetmap.org/wiki/Key:access:description) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/access:description#values) [access:description](https://wiki.openstreetmap.org/wiki/Key:access:description) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Natuurpunt](https://wiki.openstreetmap.org/wiki/Tag:operator%3DNatuurpunt) - - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - - - -### Access tag - - +### Access tag The question is **Is dit gebied toegankelijk?** -This rendering asks information about the property [access:description](https://wiki.openstreetmap.org/wiki/Key:access:description) +This rendering asks information about the +property [access:description](https://wiki.openstreetmap.org/wiki/Key:access:description) This is rendered with `De toegankelijkheid van dit gebied is: {access:description}` +- **Vrij toegankelijk** corresponds with + access=yes +- **Niet toegankelijk** corresponds with + access=no +- **Niet toegankelijk, want privégebied** corresponds + with access + =private +- **Toegankelijk, ondanks dat het privegebied is** corresponds + with access + =permissive +- **Enkel toegankelijk met een gids of tijdens een activiteit** corresponds + with access + =guided +- **Toegankelijk mits betaling** corresponds + with access + =yes + &fee + =yes - - - **Vrij toegankelijk** corresponds with access=yes - - **Niet toegankelijk** corresponds with access=no - - **Niet toegankelijk, want privégebied** corresponds with access=private - - **Toegankelijk, ondanks dat het privegebied is** corresponds with access=permissive - - **Enkel toegankelijk met een gids of tijdens een activiteit** corresponds with access=guided - - **Toegankelijk mits betaling** corresponds with access=yes&fee=yes - - - - -### Operator tag - - +### Operator tag The question is **Wie beheert dit pad?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `Beheer door {operator}` - - - - **Dit gebied wordt beheerd door Natuurpunt** corresponds with operator=Natuurpunt - - **Dit gebied wordt beheerd door {operator}** corresponds with operator~^(n|N)atuurpunt.*$_This option cannot be chosen as answer_ - +- **Dit gebied wordt beheerd door Natuurpunt** + corresponds with operator + =Natuurpunt +- **Dit gebied wordt beheerd door {operator}** + corresponds with operator~^(n|N)atuurpunt.*$_This option cannot be chosen as answer_ This document is autogenerated from assets/layers/watermill/watermill.json \ No newline at end of file diff --git a/Docs/Layers/windturbine.md b/Docs/Layers/windturbine.md index 4a9af8b3e..f8873bf9e 100644 --- a/Docs/Layers/windturbine.md +++ b/Docs/Layers/windturbine.md @@ -1,21 +1,17 @@ - - - windturbine +windturbine ============= - - - ## Table of contents 1. [windturbine](#windturbine) - * [Themes using this layer](#themes-using-this-layer) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + * [Themes using this layer](#themes-using-this-layer) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) + [turbine-output](#turbine-output) + [turbine-operator](#turbine-operator) + [turbine-height](#turbine-height) @@ -23,123 +19,78 @@ + [turbine-start-date](#turbine-start-date) + [images](#images) +#### Themes using this layer - - - - - - - - -#### Themes using this layer - - - - - - - [openwindpowermap](https://mapcomplete.osm.be/openwindpowermap) - +- [openwindpowermap](https://mapcomplete.osm.be/openwindpowermap) [Go to the source code](../assets/layers/windturbine/windturbine.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- generator:source + =wind - - - generator:source=wind - - - - - Supported attributes +Supported attributes ---------------------- **Warning** This quick overview is incomplete - - attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ -[](https://taginfo.openstreetmap.org/keys/generator:output:electricity#values) [generator:output:electricity](https://wiki.openstreetmap.org/wiki/Key:generator:output:electricity) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/height#values) [height](https://wiki.openstreetmap.org/wiki/Key:height) | [pfloat](../SpecialInputElements.md#pfloat) | -[](https://taginfo.openstreetmap.org/keys/rotor:diameter#values) [rotor:diameter](https://wiki.openstreetmap.org/wiki/Key:rotor:diameter) | [float](../SpecialInputElements.md#float) | -[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [date](../SpecialInputElements.md#date) | - - - - -### turbine-output - +[](https://taginfo.openstreetmap.org/keys/generator:output:electricity#values) [generator:output:electricity](https://wiki.openstreetmap.org/wiki/Key:generator:output:electricity) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/height#values) [height](https://wiki.openstreetmap.org/wiki/Key:height) | [pfloat](../SpecialInputElements.md#pfloat) | +[](https://taginfo.openstreetmap.org/keys/rotor:diameter#values) [rotor:diameter](https://wiki.openstreetmap.org/wiki/Key:rotor:diameter) | [float](../SpecialInputElements.md#float) | +[](https://taginfo.openstreetmap.org/keys/start_date#values) [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) | [date](../SpecialInputElements.md#date) | +### turbine-output The question is **What is the power output of this wind turbine? (e.g. 2.3 MW)** -This rendering asks information about the property [generator:output:electricity](https://wiki.openstreetmap.org/wiki/Key:generator:output:electricity) +This rendering asks information about the +property [generator:output:electricity](https://wiki.openstreetmap.org/wiki/Key:generator:output:electricity) This is rendered with `The power output of this wind turbine is {generator:output:electricity}.` - - -### turbine-operator - - +### turbine-operator The question is **Who operates this wind turbine?** -This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) +This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator) This is rendered with `This wind turbine is operated by {operator}.` - - -### turbine-height - - +### turbine-height The question is **What is the total height of this wind turbine (including rotor radius), in metres?** -This rendering asks information about the property [height](https://wiki.openstreetmap.org/wiki/Key:height) +This rendering asks information about the property [height](https://wiki.openstreetmap.org/wiki/Key:height) This is rendered with `The total height (including rotor radius) of this wind turbine is {height} metres.` - - -### turbine-diameter - - +### turbine-diameter The question is **What is the rotor diameter of this wind turbine, in metres?** -This rendering asks information about the property [rotor:diameter](https://wiki.openstreetmap.org/wiki/Key:rotor:diameter) +This rendering asks information about the +property [rotor:diameter](https://wiki.openstreetmap.org/wiki/Key:rotor:diameter) This is rendered with `The rotor diameter of this wind turbine is {rotor:diameter} metres.` - - -### turbine-start-date - - +### turbine-start-date The question is **When did this wind turbine go into operation?** -This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) +This rendering asks information about the property [start_date](https://wiki.openstreetmap.org/wiki/Key:start_date) This is rendered with `This wind turbine went into operation on/in {start_date}.` - - -### images - - +### images _This tagrendering has no question and is thus read-only_ - - This document is autogenerated from assets/layers/windturbine/windturbine.json \ No newline at end of file diff --git a/Docs/Layers/wrong_postal_code.md b/Docs/Layers/wrong_postal_code.md index a3d603d36..572aaedfb 100644 --- a/Docs/Layers/wrong_postal_code.md +++ b/Docs/Layers/wrong_postal_code.md @@ -1,51 +1,34 @@ - - - wrong_postal_code +wrong_postal_code =================== - - - - - - - ## Table of contents 1. [wrong_postal_code](#wrong_postal_code) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) + +- [Basic tags for this layer](#basic-tags-for-this-layer) +- [Supported attributes](#supported-attributes) - - - - - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` - +- Not visible in the layer selection by default. If you want to make this layer toggable, override `name` +- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` [Go to the source code](../assets/layers/wrong_postal_code/wrong_postal_code.json) - Basic tags for this layer +Basic tags for this layer --------------------------- Elements must have the all of following tags to be shown on this layer: +- boundary~^..*$ +- addr:postcode~^..*$ - - - boundary~^..*$ - - addr:postcode~^..*$ - - - - - Supported attributes +Supported attributes ---------------------- - + This document is autogenerated from assets/layers/wrong_postal_code/wrong_postal_code.json \ No newline at end of file diff --git a/Docs/Making_Your_Own_Theme.md b/Docs/Making_Your_Own_Theme.md index 37a81548b..4baa5ff22 100644 --- a/Docs/Making_Your_Own_Theme.md +++ b/Docs/Making_Your_Own_Theme.md @@ -112,16 +112,17 @@ A JSON-schema file is available in Docs/Schemas - use LayoutConfig.schema.json t There are few tags available that are calculated for convenience - e.g. the country an object is located at. [An overview of all these metatags is available here](CalculatedTags.md) - ### TagRendering groups -A tagRendering can have a `group`-attribute, which acts as a tag. -All tagRenderings with the same group name will be rendered together, in the same order as they were defined. +A tagRendering can have a `group`-attribute, which acts as a tag. All tagRenderings with the same group name will be +rendered together, in the same order as they were defined. -For example, if the defined tagrenderings have groups `A A B A A B B B`, the group order is `A B` and first all tagrenderings from group A will be rendered (thus numbers 0, 1, 3 and 4) followed by the question box for this group. +For example, if the defined tagrenderings have groups `A A B A A B B B`, the group order is `A B` and first all +tagrenderings from group A will be rendered (thus numbers 0, 1, 3 and 4) followed by the question box for this group. Then, all the tagRenderings for group B will be shown, thus number 2, 5, 6 and 7, again followed by their questionbox. -Additionally, every tagrendering will receive a the groupname as class in the HTML, which can be used to hook up custom CSS. +Additionally, every tagrendering will receive a the groupname as class in the HTML, which can be used to hook up custom +CSS. If no group tag is given, the group is `` (empty string) @@ -133,7 +134,8 @@ To override this behaviour, one can add a tagrendering with id `questions` to mo To add a title to the questions, one can add a `render` and a condition. -To change the behaviour of the questionbox to show _all_ questions at once, one can use a helperArgs in the freeform field with option `showAllQuestions`. +To change the behaviour of the questionbox to show _all_ questions at once, one can use a helperArgs in the freeform +field with option `showAllQuestions`. For example, to show the questions on top, use: diff --git a/Docs/Misc/geolocation_button.gv.svg b/Docs/Misc/geolocation_button.gv.svg index 52384ae20..c7fa3ec85 100644 --- a/Docs/Misc/geolocation_button.gv.svg +++ b/Docs/Misc/geolocation_button.gv.svg @@ -1,330 +1,687 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Docs/Schemas/AndOrTagConfigJsonJSC.ts b/Docs/Schemas/AndOrTagConfigJsonJSC.ts index 6600f8502..3da8b5b09 100644 --- a/Docs/Schemas/AndOrTagConfigJsonJSC.ts +++ b/Docs/Schemas/AndOrTagConfigJsonJSC.ts @@ -1,37 +1,37 @@ export default { - "$ref": "#/definitions/AndOrTagConfigJson", - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } + "$ref": "#/definitions/AndOrTagConfigJson", + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } } - } - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/DeleteConfigJsonJSC.ts b/Docs/Schemas/DeleteConfigJsonJSC.ts index bdc96c0c4..eb67718d7 100644 --- a/Docs/Schemas/DeleteConfigJsonJSC.ts +++ b/Docs/Schemas/DeleteConfigJsonJSC.ts @@ -1,91 +1,91 @@ export default { - "type": "object", - "properties": { - "extraDeleteReasons": { - "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", - "type": "array", - "items": { - "type": "object", - "properties": { - "explanation": { - "description": "The text that will be shown to the user - translatable" - }, - "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", - "type": "string" - } + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } }, - "required": [ - "changesetMessage", - "explanation" - ] - } - }, - "nonDeleteMappings": { - "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - "then": {} + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } }, - "required": [ - "if", - "then" - ] - } - }, - "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - } - }, - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } ] - } }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" } - } - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/FilterConfigJsonJSC.ts b/Docs/Schemas/FilterConfigJsonJSC.ts index b2f245b1b..cfb9f858d 100644 --- a/Docs/Schemas/FilterConfigJsonJSC.ts +++ b/Docs/Schemas/FilterConfigJsonJSC.ts @@ -1,70 +1,70 @@ export default { - "type": "object", - "properties": { - "id": { - "description": "An id/name for this filter, used to set the URL parameters", - "type": "string" - }, - "options": { - "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", - "type": "array", - "items": { - "type": "object", - "properties": { - "question": {}, - "osmTags": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" }, - "required": [ - "question" - ] - } - } - }, - "required": [ - "id", - "options" - ], - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } } - } - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + }, + "required": [ + "id", + "options" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/LayerConfigJsonJSC.ts b/Docs/Schemas/LayerConfigJsonJSC.ts index fbe866103..37f826569 100644 --- a/Docs/Schemas/LayerConfigJsonJSC.ts +++ b/Docs/Schemas/LayerConfigJsonJSC.ts @@ -1,894 +1,894 @@ export default { - "description": "Configuration for a single layer", - "type": "object", - "properties": { - "id": { - "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", - "type": "string" - }, - "name": { - "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control" - }, - "description": { - "description": "A description for this layer.\nShown in the layer selections and in the personel theme" - }, - "source": { - "description": "This determines where the data for the layer is fetched.\nThere are some options:\n\n# Query OSM directly\nsource: {osmTags: \"key=value\"}\n will fetch all objects with given tags from OSM.\n Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API\n\n# Query OSM Via the overpass API with a custom script\nsource: {overpassScript: \"\"} when you want to do special things. _This should be really rare_.\n This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query\n However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...\n\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\nSome API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nNote that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too\n\n\nNOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: \"key=value\"}\n While still supported, this is considered deprecated", - "anyOf": [ - { - "allOf": [ - { - "type": "object", - "properties": { - "osmTags": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "overpassScript": { - "type": "string" - } - }, - "required": [ - "osmTags" - ] - }, - { - "type": "object", - "properties": { - "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", - "type": "number" - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "properties": { - "osmTags": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "geoJson": { - "type": "string" - }, - "geoJsonZoomLevel": { - "type": "number" - }, - "isOsmCache": { - "type": "boolean" - }, - "mercatorCrs": { - "type": "boolean" - } - }, - "required": [ - "geoJson", - "osmTags" - ] - }, - { - "type": "object", - "properties": { - "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", - "type": "number" - } - } - } - ] - } - ] - }, - "calculatedTags": { - "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]", - "type": "array", - "items": { - "type": "string" - } - }, - "doNotDownload": { - "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", - "type": "boolean" - }, - "isShown": { - "description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", - "$ref": "#/definitions/TagRenderingConfigJson" - }, - "minzoom": { - "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", - "type": "number" - }, - "shownByDefault": { - "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", - "type": "boolean" - }, - "minzoomVisible": { - "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", - "type": "number" - }, - "title": { - "description": "The title shown in a popup for elements of this layer.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "titleIcons": { - "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { + "description": "Configuration for a single layer", + "type": "object", + "properties": { + "id": { + "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", "type": "string" - } - ] - } - }, - "mapRendering": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_3" - }, - { - "$ref": "#/definitions/default_4" - } - ] - } - }, - "passAllFeatures": { - "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", - "type": "boolean" - }, - "presets": { - "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "description": "The title - shown on the 'add-new'-button." - }, - "tags": { - "description": "The tags to add. It determines the icon too", + }, + "name": { + "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control" + }, + "description": { + "description": "A description for this layer.\nShown in the layer selections and in the personel theme" + }, + "source": { + "description": "This determines where the data for the layer is fetched.\nThere are some options:\n\n# Query OSM directly\nsource: {osmTags: \"key=value\"}\n will fetch all objects with given tags from OSM.\n Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API\n\n# Query OSM Via the overpass API with a custom script\nsource: {overpassScript: \"\"} when you want to do special things. _This should be really rare_.\n This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query\n However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...\n\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\nSome API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nNote that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too\n\n\nNOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: \"key=value\"}\n While still supported, this is considered deprecated", + "anyOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "overpassScript": { + "type": "string" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "geoJson": { + "type": "string" + }, + "geoJsonZoomLevel": { + "type": "number" + }, + "isOsmCache": { + "type": "boolean" + }, + "mercatorCrs": { + "type": "boolean" + } + }, + "required": [ + "geoJson", + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]", "type": "array", "items": { - "type": "string" + "type": "string" } - }, - "description": { - "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)" - }, - "preciseInput": { - "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", + "type": "boolean" + }, + "isShown": { + "description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", + "$ref": "#/definitions/TagRenderingConfigJson" + }, + "minzoom": { + "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", + "type": "number" + }, + "shownByDefault": { + "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", + "type": "boolean" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", + "type": "number" + }, + "title": { + "description": "The title shown in a popup for elements of this layer.", "anyOf": [ - { + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "mapRendering": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "$ref": "#/definitions/default_4" + } + ] + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", + "type": "array", + "items": { "type": "object", "properties": { - "preferredBackground": { - "description": "The type of background picture", - "anyOf": [ - { + "title": { + "description": "The title - shown on the 'add-new'-button." + }, + "tags": { + "description": "The tags to add. It determines the icon too", "type": "array", "items": { - "type": "string" + "type": "string" } - }, - { - "type": "string" - } - ] - }, - "snapToLayer": { - "description": "If specified, these layers will be shown to and the new point will be snapped towards it", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "maxSnapDistance": { - "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", - "type": "number" - } + }, + "description": { + "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)" + }, + "preciseInput": { + "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", + "anyOf": [ + { + "type": "object", + "properties": { + "preferredBackground": { + "description": "The type of background picture", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "snapToLayer": { + "description": "If specified, these layers will be shown to and the new point will be snapped towards it", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "maxSnapDistance": { + "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", + "type": "number" + } + }, + "required": [ + "preferredBackground" + ] + }, + { + "enum": [ + true + ], + "type": "boolean" + } + ] + } }, "required": [ - "preferredBackground" + "tags", + "title" ] - }, - { - "enum": [ - true - ], - "type": "boolean" - } - ] - } + } }, - "required": [ - "tags", - "title" - ] - } - }, - "tagRenderings": { - "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "object", - "properties": { - "builtin": { - "type": "string" - }, - "override": {} - }, - "required": [ - "builtin", - "override" - ] - }, - { - "type": "object", - "properties": { - "rewrite": { - "type": "array", - "items": { - "type": "object", - "properties": { - "sourceString": { - "type": "string" - }, - "into": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "into", - "sourceString" - ] - } - }, - "renderings": { - "type": "array", - "items": { - "anyOf": [ + "tagRenderings": { + "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", + "type": "array", + "items": { + "anyOf": [ { - "$ref": "#/definitions/TagRenderingConfigJson" + "$ref": "#/definitions/TagRenderingConfigJson" }, { - "type": "object", - "properties": { - "builtin": { - "type": "string" + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} }, - "override": {} - }, - "required": [ - "builtin", - "override" - ] + "required": [ + "builtin", + "override" + ] }, { - "type": "string" + "type": "object", + "properties": { + "rewrite": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sourceString": { + "type": "string" + }, + "into": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "into", + "sourceString" + ] + } + }, + "renderings": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + } + }, + "required": [ + "renderings", + "rewrite" + ] + }, + { + "type": "string" } - ] + ] + } + }, + "filter": { + "description": "All the extra questions for filtering", + "type": "array", + "items": { + "$ref": "#/definitions/default" + } + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", + "anyOf": [ + { + "$ref": "#/definitions/default_2" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "IF set, a 'split this road' button is shown", + "type": "boolean" + }, + "units": { + "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", + "type": "array", + "items": { + "$ref": "#/definitions/default_1" + } + } + }, + "required": [ + "id", + "mapRendering", + "source" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" } - } }, "required": [ - "renderings", - "rewrite" + "canonicalDenomination" ] - }, - { - "type": "string" - } - ] - } - }, - "filter": { - "description": "All the extra questions for filtering", - "type": "array", - "items": { - "$ref": "#/definitions/default" - } - }, - "deletion": { - "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", - "anyOf": [ - { - "$ref": "#/definitions/DeleteConfigJson" }, - { - "type": "boolean" - } - ] - }, - "allowMove": { - "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", - "anyOf": [ - { - "$ref": "#/definitions/default_2" + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } }, - { - "type": "boolean" - } - ] - }, - "allowSplit": { - "description": "IF set, a 'split this road' button is shown", - "type": "boolean" - }, - "units": { - "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", - "type": "array", - "items": { - "$ref": "#/definitions/default_1" - } - } - }, - "required": [ - "id", - "mapRendering", - "source" - ], - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" ] - } }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - } - } - }, - "ApplicableUnitJson": { - "type": "object", - "properties": { - "canonicalDenomination": { - "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", - "type": "string" - }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.", - "type": "array", - "items": { - "type": "string" - } - }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" - }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" - }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + } }, "default": { - "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", - "type": "boolean" - } - }, - "required": [ - "canonicalDenomination" - ] - }, - "TagRenderingConfigJson": { - "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" - }, - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" - }, - "condition": { - "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { "type": "object", "properties": { - "if": { - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", "type": "string" - } - ] - }, - "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" - }, - "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": [ - "string", - "boolean" - ] - } - ] - }, - "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", - "type": "array", - "items": { - "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } } - } }, "required": [ - "if", - "then" + "id", + "options" ] - } - } - } - }, - "default_3": { - "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", - "type": "object", - "properties": { - "location": { - "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", - "type": "array", - "items": { - "enum": [ - "centroid", - "end", - "point", - "start" - ], - "type": "string" - } }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", - "type": "array", - "items": { + "DeleteConfigJson": { "type": "object", "properties": { - "if": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "then": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "if", - "then" - ] - } - }, - "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } } - ] }, - "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "location" - ] - }, - "default_4": { - "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", - "type": "object", - "properties": { - "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "width": { - "description": "The stroke-width for way-elements", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "lineCap": { - "description": "The form at the end of a line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "fill": { - "description": "Wehter or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, - "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "number" - } - ] - } - } - }, - "default": { - "type": "object", - "properties": { - "id": { - "description": "An id/name for this filter, used to set the URL parameters", - "type": "string" - }, - "options": { - "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", - "type": "array", - "items": { + "default_2": { "type": "object", "properties": { - "question": {}, - "osmTags": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "question" - ] - } - } - }, - "required": [ - "id", - "options" - ] - }, - "DeleteConfigJson": { - "type": "object", - "properties": { - "extraDeleteReasons": { - "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", - "type": "array", - "items": { - "type": "object", - "properties": { - "explanation": { - "description": "The text that will be shown to the user - translatable" - }, - "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", - "type": "string" - } - }, - "required": [ - "changesetMessage", - "explanation" - ] - } - }, - "nonDeleteMappings": { - "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - "then": {} - }, - "required": [ - "if", - "then" - ] - } - }, - "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } } - ] }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ] } - } }, - "default_2": { - "type": "object", - "properties": { - "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", - "type": "boolean" - }, - "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", - "type": "boolean" - } - } - }, - "default_1": { - "type": "object", - "properties": { - "appliesToKey": { - "description": "Every key from this list will be normalized", - "type": "array", - "items": { - "type": "string" - } - }, - "eraseInvalidValues": { - "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", - "type": "boolean" - }, - "applicableUnits": { - "description": "The possible denominations", - "type": "array", - "items": { - "$ref": "#/definitions/ApplicableUnitJson" - } - } - }, - "required": [ - "applicableUnits", - "appliesToKey" - ] - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/LayoutConfigJsonJSC.ts b/Docs/Schemas/LayoutConfigJsonJSC.ts index 9a33094f0..72f2666c2 100644 --- a/Docs/Schemas/LayoutConfigJsonJSC.ts +++ b/Docs/Schemas/LayoutConfigJsonJSC.ts @@ -1,1207 +1,1207 @@ export default { - "description": "Defines the entire theme.\n\nA theme is the collection of the layers that are shown; the intro text, the icon, ...\nIt more or less defines the entire experience.\n\nMost of the fields defined here are metadata about the theme, such as its name, description, supported languages, default starting location, ...\n\nThe main chunk of the json will however be the 'layers'-array, where the details of your layers are.\n\nGeneral remark: a type (string | any) indicates either a fixed or a translatable string.", - "type": "object", - "properties": { - "id": { - "description": "The id of this layout.\n\nThis is used as hashtag in the changeset message, which will read something like \"Adding data with #mapcomplete for theme #\"\nMake sure it is something decent and descriptive, it should be a simple, lowercase string.\n\nOn official themes, it'll become the name of the page, e.g.\n'cyclestreets' which become 'cyclestreets.html'", - "type": "string" - }, - "credits": { - "description": "Who helped to create this theme and should be attributed?", - "type": "string" - }, - "maintainer": { - "description": "Who does maintian this preset?", - "type": "string" - }, - "version": { - "description": "A version number, either semantically or by date.\nShould be sortable, where the higher value is the later version", - "type": "string" - }, - "language": { - "description": "The supported language(s).\nThis should be a two-letter, lowercase code which identifies the language, e.g. \"en\", \"nl\", ...\nIf the theme supports multiple languages, use a list: `[\"en\",\"nl\",\"fr\"]` to allow the user to pick any of them", - "anyOf": [ - { - "type": "array", - "items": { + "description": "Defines the entire theme.\n\nA theme is the collection of the layers that are shown; the intro text, the icon, ...\nIt more or less defines the entire experience.\n\nMost of the fields defined here are metadata about the theme, such as its name, description, supported languages, default starting location, ...\n\nThe main chunk of the json will however be the 'layers'-array, where the details of your layers are.\n\nGeneral remark: a type (string | any) indicates either a fixed or a translatable string.", + "type": "object", + "properties": { + "id": { + "description": "The id of this layout.\n\nThis is used as hashtag in the changeset message, which will read something like \"Adding data with #mapcomplete for theme #\"\nMake sure it is something decent and descriptive, it should be a simple, lowercase string.\n\nOn official themes, it'll become the name of the page, e.g.\n'cyclestreets' which become 'cyclestreets.html'", "type": "string" - } }, - { - "type": "string" - } - ] - }, - "mustHaveLanguage": { - "description": "Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated", - "type": "array", - "items": { - "type": "string" - } - }, - "title": { - "description": "The title, as shown in the welcome message and the more-screen" - }, - "shortDescription": { - "description": "A short description, showed as social description and in the 'more theme'-buttons.\nNote that if this one is not defined, the first sentence of 'description' is used" - }, - "description": { - "description": "The description, as shown in the welcome message and the more-screen" - }, - "descriptionTail": { - "description": "A part of the description, shown under the login-button." - }, - "icon": { - "description": "The icon representing this theme.\nUsed as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ...\nEither a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64)", - "type": "string" - }, - "socialImage": { - "description": "Link to a 'social image' which is included as og:image-tag on official themes.\nUseful to share the theme on social media.\nSee https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information", - "type": "string" - }, - "startZoom": { - "description": "Default location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used", - "type": "number" - }, - "startLat": { - "type": "number" - }, - "startLon": { - "type": "number" - }, - "widenFactor": { - "description": "When a query is run, the data within bounds of the visible map is loaded.\nHowever, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data.\nFor this, the bounds are widened in order to make a small pan still within bounds of the loaded data.\n\nIF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3", - "type": "number" - }, - "overpassMaxZoom": { - "description": "At low zoom levels, overpass is used to query features.\nAt high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile.\nThe overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used.", - "type": "number" - }, - "osmApiTileSize": { - "description": "When the OSM-api is used to fetch features, it does so in a tiled fashion.\nThese tiles are using a ceratin zoom level, that can be controlled here\nDefault: overpassMaxZoom + 1", - "type": "number" - }, - "overrideAll": { - "description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer" - }, - "defaultBackgroundId": { - "description": "The id of the default background. BY default: vanilla OSM", - "type": "string" - }, - "tileLayerSources": { - "description": "Define some (overlay) slippy map tilesources", - "type": "array", - "items": { - "$ref": "#/definitions/default_5" - } - }, - "layers": { - "description": "The layers to display.\n\nEvery layer contains a description of which feature to display - the overpassTags which are queried.\nInstead of running one query for every layer, the query is fused.\n\nAfterwards, every layer is given the list of features.\nEvery layer takes away the features that match with them*, and give the leftovers to the next layers.\n\nThis implies that the _order_ of the layers is important in the case of features with the same tags;\nas the later layers might never receive their feature.\n\n*layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself\n\nNote that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: \"layername\", override: ...}\n\nThe 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer\n\nFor example: If you would like to use layer nature reserves, but only from a specific operator (eg. Natuurpunt) you would use the following in your theme:\n\n```\n\"layer\": {\n \"builtin\": \"nature_reserve\",\n \"override\": {\"source\": \n {\"osmTags\": {\n \"+and\":[\"operator=Natuurpunt\"]\n }\n }\n }\n}\n```\n\nIt's also possible to load multiple layers at once, for example, if you would like for both drinking water and benches to start at the zoomlevel at 12, you would use the following:\n\n```\n\"layer\": {\n \"builtin\": [\"benches\", \"drinking_water\"],\n \"override\": {\"minzoom\": 12}\n}\n```", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/LayerConfigJson" - }, - { - "type": "object", - "properties": { - "builtin": { - "anyOf": [ - { + "credits": { + "description": "Who helped to create this theme and should be attributed?", + "type": "string" + }, + "maintainer": { + "description": "Who does maintian this preset?", + "type": "string" + }, + "version": { + "description": "A version number, either semantically or by date.\nShould be sortable, where the higher value is the later version", + "type": "string" + }, + "language": { + "description": "The supported language(s).\nThis should be a two-letter, lowercase code which identifies the language, e.g. \"en\", \"nl\", ...\nIf the theme supports multiple languages, use a list: `[\"en\",\"nl\",\"fr\"]` to allow the user to pick any of them", + "anyOf": [ + { "type": "array", "items": { - "type": "string" + "type": "string" } - }, - { + }, + { "type": "string" - } - ] - }, - "override": {} - }, - "required": [ - "builtin", - "override" + } ] - }, - { - "type": "string" - } - ] - } - }, - "clustering": { - "description": "If defined, data will be clustered.\nDefaults to {maxZoom: 16, minNeeded: 500}", - "type": "object", - "properties": { - "maxZoom": { - "description": "All zoom levels above 'maxzoom' are not clustered anymore.\nDefaults to 18", - "type": "number" }, - "minNeededElements": { - "description": "The number of elements per tile needed to start clustering\nIf clustering is defined, defaults to 25", - "type": "number" - } - } - }, - "customCss": { - "description": "The URL of a custom CSS stylesheet to modify the layout", - "type": "string" - }, - "hideFromOverview": { - "description": "If set to true, this layout will not be shown in the overview with more themes", - "type": "boolean" - }, - "lockLocation": { - "description": "If set to true, the basemap will not scroll outside of the area visible on initial zoom.\nIf set to [[lat0, lon0], [lat1, lon1]], the map will not scroll outside of those bounds.\nOff by default, which will enable panning to the entire world", - "anyOf": [ - { - "type": "array", - "items": [ - { - "type": "array", - "items": [ - { - "type": "number" - }, - { - "type": "number" - } - ], - "minItems": 2, - "maxItems": 2 - }, - { - "type": "array", - "items": [ - { - "type": "number" - }, - { - "type": "number" - } - ], - "minItems": 2, - "maxItems": 2 - } - ], - "minItems": 2, - "maxItems": 2 - }, - { - "type": "array", - "items": { + "mustHaveLanguage": { + "description": "Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated", "type": "array", "items": { - "type": "number" - } - } - }, - { - "type": "boolean" - } - ] - }, - "enableUserBadge": { - "type": "boolean" - }, - "enableShareScreen": { - "type": "boolean" - }, - "enableMoreQuests": { - "type": "boolean" - }, - "enableLayers": { - "type": "boolean" - }, - "enableSearch": { - "type": "boolean" - }, - "enableAddNewPoints": { - "type": "boolean" - }, - "enableGeolocation": { - "type": "boolean" - }, - "enableBackgroundLayerSelection": { - "type": "boolean" - }, - "enableShowAllQuestions": { - "type": "boolean" - }, - "enableDownload": { - "type": "boolean" - }, - "enablePdfDownload": { - "type": "boolean" - }, - "enableIframePopout": { - "type": "boolean" - }, - "overpassUrl": { - "description": "Set one or more overpass URLs to use for this theme..", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "overpassTimeout": { - "description": "Set a different timeout for overpass queries - in seconds. Default: 30s", - "type": "number" - } - }, - "required": [ - "description", - "icon", - "id", - "language", - "layers", - "maintainer", - "startLat", - "startLon", - "startZoom", - "title", - "version" - ], - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { "type": "string" - } - ] - } - }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - } - } - }, - "ApplicableUnitJson": { - "type": "object", - "properties": { - "canonicalDenomination": { - "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", - "type": "string" - }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.", - "type": "array", - "items": { - "type": "string" - } - }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" - }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" - }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" - }, - "default": { - "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", - "type": "boolean" - } - }, - "required": [ - "canonicalDenomination" - ] - }, - "TagRenderingConfigJson": { - "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" - }, - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" - }, - "condition": { - "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" - }, - "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": [ - "string", - "boolean" - ] - } - ] - }, - "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "if", - "then" - ] - } - } - } - }, - "default_3": { - "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", - "type": "object", - "properties": { - "location": { - "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", - "type": "array", - "items": { - "enum": [ - "centroid", - "end", - "point", - "start" - ], - "type": "string" - } - }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "then": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "if", - "then" - ] - } - }, - "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "location" - ] - }, - "default_4": { - "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", - "type": "object", - "properties": { - "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "width": { - "description": "The stroke-width for way-elements", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "lineCap": { - "description": "The form at the end of a line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "fill": { - "description": "Wehter or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, - "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "number" - } - ] - } - } - }, - "default": { - "type": "object", - "properties": { - "id": { - "description": "An id/name for this filter, used to set the URL parameters", - "type": "string" - }, - "options": { - "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", - "type": "array", - "items": { - "type": "object", - "properties": { - "question": {}, - "osmTags": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "question" - ] - } - } - }, - "required": [ - "id", - "options" - ] - }, - "DeleteConfigJson": { - "type": "object", - "properties": { - "extraDeleteReasons": { - "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", - "type": "array", - "items": { - "type": "object", - "properties": { - "explanation": { - "description": "The text that will be shown to the user - translatable" - }, - "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", - "type": "string" - } - }, - "required": [ - "changesetMessage", - "explanation" - ] - } - }, - "nonDeleteMappings": { - "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - "then": {} - }, - "required": [ - "if", - "then" - ] - } - }, - "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" - } - } - }, - "default_2": { - "type": "object", - "properties": { - "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", - "type": "boolean" - }, - "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", - "type": "boolean" - } - } - }, - "default_1": { - "type": "object", - "properties": { - "appliesToKey": { - "description": "Every key from this list will be normalized", - "type": "array", - "items": { - "type": "string" - } - }, - "eraseInvalidValues": { - "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", - "type": "boolean" - }, - "applicableUnits": { - "description": "The possible denominations", - "type": "array", - "items": { - "$ref": "#/definitions/ApplicableUnitJson" - } - } - }, - "required": [ - "applicableUnits", - "appliesToKey" - ] - }, - "default_5": { - "description": "Configuration for a tilesource config", - "type": "object", - "properties": { - "id": { - "description": "Id of this overlay, used in the URL-parameters to set the state", - "type": "string" - }, - "source": { - "description": "The path, where {x}, {y} and {z} will be substituted", - "type": "string" - }, - "isOverlay": { - "description": "Wether or not this is an overlay. Default: true", - "type": "boolean" - }, - "name": { - "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" - }, - "minZoom": { - "description": "Only visible at this or a higher zoom level", - "type": "number" - }, - "maxZoom": { - "description": "Only visible at this or a lower zoom level", - "type": "number" - }, - "defaultState": { - "description": "The default state, set to false to hide by default", - "type": "boolean" - } - }, - "required": [ - "defaultState", - "id", - "source" - ] - }, - "LayerConfigJson": { - "description": "Configuration for a single layer", - "type": "object", - "properties": { - "id": { - "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", - "type": "string" - }, - "name": { - "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control" - }, - "description": { - "description": "A description for this layer.\nShown in the layer selections and in the personel theme" - }, - "source": { - "description": "This determines where the data for the layer is fetched.\nThere are some options:\n\n# Query OSM directly\nsource: {osmTags: \"key=value\"}\n will fetch all objects with given tags from OSM.\n Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API\n\n# Query OSM Via the overpass API with a custom script\nsource: {overpassScript: \"\"} when you want to do special things. _This should be really rare_.\n This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query\n However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...\n\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\nSome API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nNote that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too\n\n\nNOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: \"key=value\"}\n While still supported, this is considered deprecated", - "anyOf": [ - { - "allOf": [ - { - "type": "object", - "properties": { - "osmTags": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "overpassScript": { - "type": "string" - } - }, - "required": [ - "osmTags" - ] - }, - { - "type": "object", - "properties": { - "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", - "type": "number" - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "properties": { - "osmTags": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "geoJson": { - "type": "string" - }, - "geoJsonZoomLevel": { - "type": "number" - }, - "isOsmCache": { - "type": "boolean" - }, - "mercatorCrs": { - "type": "boolean" - } - }, - "required": [ - "geoJson", - "osmTags" - ] - }, - { - "type": "object", - "properties": { - "maxCacheAge": { - "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", - "type": "number" - } - } - } - ] - } - ] - }, - "calculatedTags": { - "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]", - "type": "array", - "items": { - "type": "string" - } - }, - "doNotDownload": { - "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", - "type": "boolean" - }, - "isShown": { - "description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", - "$ref": "#/definitions/TagRenderingConfigJson" - }, - "minzoom": { - "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", - "type": "number" - }, - "shownByDefault": { - "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", - "type": "boolean" - }, - "minzoomVisible": { - "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", - "type": "number" }, "title": { - "description": "The title shown in a popup for elements of this layer.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" + "description": "The title, as shown in the welcome message and the more-screen" + }, + "shortDescription": { + "description": "A short description, showed as social description and in the 'more theme'-buttons.\nNote that if this one is not defined, the first sentence of 'description' is used" + }, + "description": { + "description": "The description, as shown in the welcome message and the more-screen" + }, + "descriptionTail": { + "description": "A part of the description, shown under the login-button." + }, + "icon": { + "description": "The icon representing this theme.\nUsed as logo in the more-screen and (for official themes) as favicon, webmanifest logo, ...\nEither a URL or a base64 encoded value (which should include 'data:image/svg+xml;base64)", + "type": "string" + }, + "socialImage": { + "description": "Link to a 'social image' which is included as og:image-tag on official themes.\nUseful to share the theme on social media.\nSee https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit for more information", + "type": "string" + }, + "startZoom": { + "description": "Default location and zoom to start.\nNote that this is barely used. Once the user has visited mapcomplete at least once, the previous location of the user will be used", + "type": "number" + }, + "startLat": { + "type": "number" + }, + "startLon": { + "type": "number" + }, + "widenFactor": { + "description": "When a query is run, the data within bounds of the visible map is loaded.\nHowever, users tend to pan and zoom a lot. It is pretty annoying if every single pan means a reloading of the data.\nFor this, the bounds are widened in order to make a small pan still within bounds of the loaded data.\n\nIF widenfactor is 1, this feature is disabled. A recommended value is between 1 and 3", + "type": "number" + }, + "overpassMaxZoom": { + "description": "At low zoom levels, overpass is used to query features.\nAt high zoom level, the OSM api is used to fetch one or more BBOX aligning with a slippy tile.\nThe overpassMaxZoom controls the flipoverpoint: if the zoom is this or lower, overpass is used.", + "type": "number" + }, + "osmApiTileSize": { + "description": "When the OSM-api is used to fetch features, it does so in a tiled fashion.\nThese tiles are using a ceratin zoom level, that can be controlled here\nDefault: overpassMaxZoom + 1", + "type": "number" + }, + "overrideAll": { + "description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer" + }, + "defaultBackgroundId": { + "description": "The id of the default background. BY default: vanilla OSM", + "type": "string" + }, + "tileLayerSources": { + "description": "Define some (overlay) slippy map tilesources", + "type": "array", + "items": { + "$ref": "#/definitions/default_5" } - ] }, - "titleIcons": { - "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "mapRendering": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/default_3" - }, - { - "$ref": "#/definitions/default_4" - } - ] - } - }, - "passAllFeatures": { - "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", - "type": "boolean" - }, - "presets": { - "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "description": "The title - shown on the 'add-new'-button." - }, - "tags": { - "description": "The tags to add. It determines the icon too", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)" - }, - "preciseInput": { - "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", + "layers": { + "description": "The layers to display.\n\nEvery layer contains a description of which feature to display - the overpassTags which are queried.\nInstead of running one query for every layer, the query is fused.\n\nAfterwards, every layer is given the list of features.\nEvery layer takes away the features that match with them*, and give the leftovers to the next layers.\n\nThis implies that the _order_ of the layers is important in the case of features with the same tags;\nas the later layers might never receive their feature.\n\n*layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself\n\nNote that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: \"layername\", override: ...}\n\nThe 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer\n\nFor example: If you would like to use layer nature reserves, but only from a specific operator (eg. Natuurpunt) you would use the following in your theme:\n\n```\n\"layer\": {\n \"builtin\": \"nature_reserve\",\n \"override\": {\"source\": \n {\"osmTags\": {\n \"+and\":[\"operator=Natuurpunt\"]\n }\n }\n }\n}\n```\n\nIt's also possible to load multiple layers at once, for example, if you would like for both drinking water and benches to start at the zoomlevel at 12, you would use the following:\n\n```\n\"layer\": {\n \"builtin\": [\"benches\", \"drinking_water\"],\n \"override\": {\"minzoom\": 12}\n}\n```", + "type": "array", + "items": { "anyOf": [ - { - "type": "object", - "properties": { - "preferredBackground": { - "description": "The type of background picture", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "snapToLayer": { - "description": "If specified, these layers will be shown to and the new point will be snapped towards it", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - } - ] - }, - "maxSnapDistance": { - "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", - "type": "number" - } + { + "$ref": "#/definitions/LayerConfigJson" }, - "required": [ - "preferredBackground" - ] - }, - { - "enum": [ - true - ], - "type": "boolean" - } - ] - } - }, - "required": [ - "tags", - "title" - ] - } - }, - "tagRenderings": { - "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "object", - "properties": { - "builtin": { - "type": "string" - }, - "override": {} - }, - "required": [ - "builtin", - "override" - ] - }, - { - "type": "object", - "properties": { - "rewrite": { - "type": "array", - "items": { - "type": "object", - "properties": { - "sourceString": { - "type": "string" - }, - "into": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "into", - "sourceString" - ] - } - }, - "renderings": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "object", - "properties": { + { + "type": "object", + "properties": { "builtin": { - "type": "string" + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] }, "override": {} - }, - "required": [ + }, + "required": [ "builtin", "override" - ] + ] + }, + { + "type": "string" + } + ] + } + }, + "clustering": { + "description": "If defined, data will be clustered.\nDefaults to {maxZoom: 16, minNeeded: 500}", + "type": "object", + "properties": { + "maxZoom": { + "description": "All zoom levels above 'maxzoom' are not clustered anymore.\nDefaults to 18", + "type": "number" + }, + "minNeededElements": { + "description": "The number of elements per tile needed to start clustering\nIf clustering is defined, defaults to 25", + "type": "number" + } + } + }, + "customCss": { + "description": "The URL of a custom CSS stylesheet to modify the layout", + "type": "string" + }, + "hideFromOverview": { + "description": "If set to true, this layout will not be shown in the overview with more themes", + "type": "boolean" + }, + "lockLocation": { + "description": "If set to true, the basemap will not scroll outside of the area visible on initial zoom.\nIf set to [[lat0, lon0], [lat1, lon1]], the map will not scroll outside of those bounds.\nOff by default, which will enable panning to the entire world", + "anyOf": [ + { + "type": "array", + "items": [ + { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "minItems": 2, + "maxItems": 2 }, { - "type": "string" + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "minItems": 2, + "maxItems": 2 } - ] - } - } + ], + "minItems": 2, + "maxItems": 2 }, - "required": [ - "renderings", - "rewrite" - ] - }, - { - "type": "string" - } + { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "number" + } + } + }, + { + "type": "boolean" + } ] - } }, - "filter": { - "description": "All the extra questions for filtering", - "type": "array", - "items": { - "$ref": "#/definitions/default" - } + "enableUserBadge": { + "type": "boolean" }, - "deletion": { - "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", - "anyOf": [ - { - "$ref": "#/definitions/DeleteConfigJson" - }, - { - "type": "boolean" - } - ] + "enableShareScreen": { + "type": "boolean" }, - "allowMove": { - "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", - "anyOf": [ - { - "$ref": "#/definitions/default_2" - }, - { - "type": "boolean" - } - ] + "enableMoreQuests": { + "type": "boolean" }, - "allowSplit": { - "description": "IF set, a 'split this road' button is shown", - "type": "boolean" + "enableLayers": { + "type": "boolean" }, - "units": { - "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", - "type": "array", - "items": { - "$ref": "#/definitions/default_1" - } + "enableSearch": { + "type": "boolean" + }, + "enableAddNewPoints": { + "type": "boolean" + }, + "enableGeolocation": { + "type": "boolean" + }, + "enableBackgroundLayerSelection": { + "type": "boolean" + }, + "enableShowAllQuestions": { + "type": "boolean" + }, + "enableDownload": { + "type": "boolean" + }, + "enablePdfDownload": { + "type": "boolean" + }, + "enableIframePopout": { + "type": "boolean" + }, + "overpassUrl": { + "description": "Set one or more overpass URLs to use for this theme..", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "overpassTimeout": { + "description": "Set a different timeout for overpass queries - in seconds. Default: 30s", + "type": "number" } - }, - "required": [ + }, + "required": [ + "description", + "icon", "id", - "mapRendering", - "source" - ] - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + "language", + "layers", + "maintainer", + "startLat", + "startLon", + "startZoom", + "title", + "version" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ] + }, + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + } + }, + "default": { + "type": "object", + "properties": { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", + "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } + } + }, + "required": [ + "id", + "options" + ] + }, + "DeleteConfigJson": { + "type": "object", + "properties": { + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } + } + }, + "default_2": { + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } + } + }, + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ] + }, + "default_5": { + "description": "Configuration for a tilesource config", + "type": "object", + "properties": { + "id": { + "description": "Id of this overlay, used in the URL-parameters to set the state", + "type": "string" + }, + "source": { + "description": "The path, where {x}, {y} and {z} will be substituted", + "type": "string" + }, + "isOverlay": { + "description": "Wether or not this is an overlay. Default: true", + "type": "boolean" + }, + "name": { + "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" + }, + "minZoom": { + "description": "Only visible at this or a higher zoom level", + "type": "number" + }, + "maxZoom": { + "description": "Only visible at this or a lower zoom level", + "type": "number" + }, + "defaultState": { + "description": "The default state, set to false to hide by default", + "type": "boolean" + } + }, + "required": [ + "defaultState", + "id", + "source" + ] + }, + "LayerConfigJson": { + "description": "Configuration for a single layer", + "type": "object", + "properties": { + "id": { + "description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.", + "type": "string" + }, + "name": { + "description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control" + }, + "description": { + "description": "A description for this layer.\nShown in the layer selections and in the personel theme" + }, + "source": { + "description": "This determines where the data for the layer is fetched.\nThere are some options:\n\n# Query OSM directly\nsource: {osmTags: \"key=value\"}\n will fetch all objects with given tags from OSM.\n Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API\n\n# Query OSM Via the overpass API with a custom script\nsource: {overpassScript: \"\"} when you want to do special things. _This should be really rare_.\n This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query\n However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...\n\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}\nSome API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this\n\nNote that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too\n\n\nNOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: \"key=value\"}\n While still supported, this is considered deprecated", + "anyOf": [ + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "overpassScript": { + "type": "string" + } + }, + "required": [ + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "properties": { + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "geoJson": { + "type": "string" + }, + "geoJsonZoomLevel": { + "type": "number" + }, + "isOsmCache": { + "type": "boolean" + }, + "mercatorCrs": { + "type": "boolean" + } + }, + "required": [ + "geoJson", + "osmTags" + ] + }, + { + "type": "object", + "properties": { + "maxCacheAge": { + "description": "The maximum amount of seconds that a tile is allowed to linger in the cache", + "type": "number" + } + } + } + ] + } + ] + }, + "calculatedTags": { + "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]", + "type": "array", + "items": { + "type": "string" + } + }, + "doNotDownload": { + "description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration", + "type": "boolean" + }, + "isShown": { + "description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'", + "$ref": "#/definitions/TagRenderingConfigJson" + }, + "minzoom": { + "description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0", + "type": "number" + }, + "shownByDefault": { + "description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)", + "type": "boolean" + }, + "minzoomVisible": { + "description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible", + "type": "number" + }, + "title": { + "description": "The title shown in a popup for elements of this layer.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "titleIcons": { + "description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "mapRendering": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/default_3" + }, + { + "$ref": "#/definitions/default_4" + } + ] + } + }, + "passAllFeatures": { + "description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras", + "type": "boolean" + }, + "presets": { + "description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all", + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title - shown on the 'add-new'-button." + }, + "tags": { + "description": "The tags to add. It determines the icon too", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)" + }, + "preciseInput": { + "description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.", + "anyOf": [ + { + "type": "object", + "properties": { + "preferredBackground": { + "description": "The type of background picture", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "snapToLayer": { + "description": "If specified, these layers will be shown to and the new point will be snapped towards it", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "maxSnapDistance": { + "description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10", + "type": "number" + } + }, + "required": [ + "preferredBackground" + ] + }, + { + "enum": [ + true + ], + "type": "boolean" + } + ] + } + }, + "required": [ + "tags", + "title" + ] + } + }, + "tagRenderings": { + "description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "object", + "properties": { + "rewrite": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sourceString": { + "type": "string" + }, + "into": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "into", + "sourceString" + ] + } + }, + "renderings": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "object", + "properties": { + "builtin": { + "type": "string" + }, + "override": {} + }, + "required": [ + "builtin", + "override" + ] + }, + { + "type": "string" + } + ] + } + } + }, + "required": [ + "renderings", + "rewrite" + ] + }, + { + "type": "string" + } + ] + } + }, + "filter": { + "description": "All the extra questions for filtering", + "type": "array", + "items": { + "$ref": "#/definitions/default" + } + }, + "deletion": { + "description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.", + "anyOf": [ + { + "$ref": "#/definitions/DeleteConfigJson" + }, + { + "type": "boolean" + } + ] + }, + "allowMove": { + "description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.", + "anyOf": [ + { + "$ref": "#/definitions/default_2" + }, + { + "type": "boolean" + } + ] + }, + "allowSplit": { + "description": "IF set, a 'split this road' button is shown", + "type": "boolean" + }, + "units": { + "description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given", + "type": "array", + "items": { + "$ref": "#/definitions/default_1" + } + } + }, + "required": [ + "id", + "mapRendering", + "source" + ] + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/LineRenderingConfigJsonJSC.ts b/Docs/Schemas/LineRenderingConfigJsonJSC.ts index c561894ae..ed2970ca4 100644 --- a/Docs/Schemas/LineRenderingConfigJsonJSC.ts +++ b/Docs/Schemas/LineRenderingConfigJsonJSC.ts @@ -1,289 +1,289 @@ export default { - "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", - "type": "object", - "properties": { - "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "width": { - "description": "The stroke-width for way-elements", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "lineCap": { - "description": "The form at the end of a line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "fill": { - "description": "Wehter or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, - "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "number" - } - ] - } - }, - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } ] - } }, - "or": { - "type": "array", - "items": { + "width": { + "description": "The stroke-width for way-elements", "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } ] - } } - } }, - "ApplicableUnitJson": { - "type": "object", - "properties": { - "canonicalDenomination": { - "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", - "type": "string" - }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.", - "type": "array", - "items": { - "type": "string" - } - }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" - }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" - }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" - }, - "default": { - "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", - "type": "boolean" - } - }, - "required": [ - "canonicalDenomination" - ] - }, - "TagRenderingConfigJson": { - "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" - }, - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" - }, - "condition": { - "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { + "definitions": { + "AndOrTagConfigJson": { "type": "object", "properties": { - "if": { - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" - }, - "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": [ - "string", - "boolean" - ] - } - ] - }, - "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", - "type": "array", - "items": { - "type": "string" + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" } - } }, "required": [ - "if", - "then" + "canonicalDenomination" ] - } + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } } - } - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/MoveConfigJsonJSC.ts b/Docs/Schemas/MoveConfigJsonJSC.ts index 23f191109..0d7dede65 100644 --- a/Docs/Schemas/MoveConfigJsonJSC.ts +++ b/Docs/Schemas/MoveConfigJsonJSC.ts @@ -1,84 +1,84 @@ export default { - "type": "object", - "properties": { - "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", - "type": "boolean" - }, - "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", - "type": "boolean" - } - }, - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } + "type": "object", + "properties": { + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" } - } }, - "ApplicableUnitJson": { - "type": "object", - "properties": { - "canonicalDenomination": { - "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", - "type": "string" + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.", - "type": "array", - "items": { - "type": "string" - } - }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" - }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" - }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" - }, - "default": { - "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", - "type": "boolean" + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] } - }, - "required": [ - "canonicalDenomination" - ] - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/PointRenderingConfigJsonJSC.ts b/Docs/Schemas/PointRenderingConfigJsonJSC.ts index c2f6a5b49..d34f61a4c 100644 --- a/Docs/Schemas/PointRenderingConfigJsonJSC.ts +++ b/Docs/Schemas/PointRenderingConfigJsonJSC.ts @@ -1,301 +1,301 @@ export default { - "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", - "type": "object", - "properties": { - "location": { - "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", - "type": "array", - "items": { - "enum": [ - "centroid", - "end", - "point", - "start" - ], - "type": "string" - } - }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], "type": "string" - } - ] - }, - "then": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "if", - "then" - ] - } - }, - "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "location" - ], - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - } - } - }, - "ApplicableUnitJson": { - "type": "object", - "properties": { - "canonicalDenomination": { - "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", - "type": "string" - }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.", - "type": "array", - "items": { - "type": "string" - } - }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" - }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" - }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" - }, - "default": { - "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", - "type": "boolean" - } - }, - "required": [ - "canonicalDenomination" - ] - }, - "TagRenderingConfigJson": { - "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" - }, - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" - }, - "condition": { - "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" } - ] }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] } - }, - "required": [ - "key" - ] }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ], + "definitions": { + "AndOrTagConfigJson": { "type": "object", "properties": { - "if": { - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" - }, - "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": [ - "string", - "boolean" - ] - } - ] - }, - "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", - "type": "array", - "items": { - "type": "string" + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" } - } }, "required": [ - "if", - "then" + "canonicalDenomination" ] - } + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } } - } - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/TagRenderingConfigJsonJSC.ts b/Docs/Schemas/TagRenderingConfigJsonJSC.ts index e9decfe53..653e30dd0 100644 --- a/Docs/Schemas/TagRenderingConfigJsonJSC.ts +++ b/Docs/Schemas/TagRenderingConfigJsonJSC.ts @@ -1,165 +1,165 @@ export default { - "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" - }, - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" - }, - "condition": { - "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", "type": "string" - } }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } ] - }, - "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" - }, - "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": [ - "string", - "boolean" - ] - } + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" ] - }, - "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", "type": "array", "items": { - "type": "string" + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] } - } - }, - "required": [ - "if", - "then" - ] - } - } - }, - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } } - } - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + }, + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/TilesourceConfigJsonJSC.ts b/Docs/Schemas/TilesourceConfigJsonJSC.ts index 61e69a834..bc46ba28c 100644 --- a/Docs/Schemas/TilesourceConfigJsonJSC.ts +++ b/Docs/Schemas/TilesourceConfigJsonJSC.ts @@ -1,559 +1,559 @@ export default { - "description": "Configuration for a tilesource config", - "type": "object", - "properties": { - "id": { - "description": "Id of this overlay, used in the URL-parameters to set the state", - "type": "string" - }, - "source": { - "description": "The path, where {x}, {y} and {z} will be substituted", - "type": "string" - }, - "isOverlay": { - "description": "Wether or not this is an overlay. Default: true", - "type": "boolean" - }, - "name": { - "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" - }, - "minZoom": { - "description": "Only visible at this or a higher zoom level", - "type": "number" - }, - "maxZoom": { - "description": "Only visible at this or a lower zoom level", - "type": "number" - }, - "defaultState": { - "description": "The default state, set to false to hide by default", - "type": "boolean" - } - }, - "required": [ - "defaultState", - "id", - "source" - ], - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - } - } - }, - "ApplicableUnitJson": { - "type": "object", - "properties": { - "canonicalDenomination": { - "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", - "type": "string" - }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.", - "type": "array", - "items": { + "description": "Configuration for a tilesource config", + "type": "object", + "properties": { + "id": { + "description": "Id of this overlay, used in the URL-parameters to set the state", "type": "string" - } }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + "source": { + "description": "The path, where {x}, {y} and {z} will be substituted", + "type": "string" }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + "isOverlay": { + "description": "Wether or not this is an overlay. Default: true", + "type": "boolean" }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" + "name": { + "description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled" + }, + "minZoom": { + "description": "Only visible at this or a higher zoom level", + "type": "number" + }, + "maxZoom": { + "description": "Only visible at this or a lower zoom level", + "type": "number" + }, + "defaultState": { + "description": "The default state, set to false to hide by default", + "type": "boolean" + } + }, + "required": [ + "defaultState", + "id", + "source" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } + }, + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] + }, + "TagRenderingConfigJson": { + "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", + "type": "object", + "properties": { + "id": { + "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", + "type": "string" + }, + "group": { + "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", + "type": "string" + }, + "render": { + "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" + }, + "question": { + "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" + }, + "condition": { + "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "freeform": { + "description": "Allow freeform text input from the user", + "type": "object", + "properties": { + "key": { + "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", + "type": "string" + }, + "type": { + "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", + "type": "string" + }, + "helperArgs": { + "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", + "type": "array", + "items": {} + }, + "addExtraTags": { + "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", + "type": "array", + "items": { + "type": "string" + } + }, + "inline": { + "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", + "type": "boolean" + }, + "default": { + "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", + "type": "string" + } + }, + "required": [ + "key" + ] + }, + "multiAnswer": { + "description": "If true, use checkboxes instead of radio buttons when asking the question", + "type": "boolean" + }, + "mappings": { + "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" + }, + "hideInAnswer": { + "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": [ + "string", + "boolean" + ] + } + ] + }, + "ifnot": { + "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "addExtraTags": { + "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "if", + "then" + ] + } + } + } + }, + "default_3": { + "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", + "type": "object", + "properties": { + "location": { + "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", + "type": "array", + "items": { + "enum": [ + "centroid", + "end", + "point", + "start" + ], + "type": "string" + } + }, + "icon": { + "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "iconBadges": { + "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "then": { + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "if", + "then" + ] + } + }, + "iconSize": { + "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "rotation": { + "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "label": { + "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "location" + ] + }, + "default_4": { + "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", + "type": "object", + "properties": { + "color": { + "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "width": { + "description": "The stroke-width for way-elements", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "dashArray": { + "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "lineCap": { + "description": "The form at the end of a line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "fill": { + "description": "Wehter or not to fill polygons", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "enum": [ + "no", + "yes" + ], + "type": "string" + } + ] + }, + "fillColor": { + "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "string" + } + ] + }, + "offset": { + "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", + "anyOf": [ + { + "$ref": "#/definitions/TagRenderingConfigJson" + }, + { + "type": "number" + } + ] + } + } }, "default": { - "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", - "type": "boolean" - } - }, - "required": [ - "canonicalDenomination" - ] - }, - "TagRenderingConfigJson": { - "description": "A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.\nIf the desired tags are missing and a question is defined, a question will be shown instead.", - "type": "object", - "properties": { - "id": { - "description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)", - "type": "string" - }, - "group": { - "description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.", - "type": "string" - }, - "render": { - "description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '{website}' or include images such as `This is of type A
`" - }, - "question": { - "description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only" - }, - "condition": { - "description": "Only show this question if the object also matches the following tags.\n\nThis is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "freeform": { - "description": "Allow freeform text input from the user", - "type": "object", - "properties": { - "key": { - "description": "If this key is present, then 'render' is used to display the value.\nIf this is undefined, the rendering is _always_ shown", - "type": "string" - }, - "type": { - "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values", - "type": "string" - }, - "helperArgs": { - "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'", - "type": "array", - "items": {} - }, - "addExtraTags": { - "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'", - "type": "array", - "items": { - "type": "string" - } - }, - "inline": { - "description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.", - "type": "boolean" - }, - "default": { - "description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)", - "type": "string" - } - }, - "required": [ - "key" - ] - }, - "multiAnswer": { - "description": "If true, use checkboxes instead of radio buttons when asking the question", - "type": "boolean" - }, - "mappings": { - "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes", - "type": "array", - "items": { "type": "object", "properties": { - "if": { - "description": "If this condition is met, then the text under `then` will be shown.\nIf no value matches, and the user selects this mapping as an option, then these tags will be uploaded to OSM.\n\nFor example: {'if': 'diet:vegetarion=yes', 'then':'A vegetarian option is offered here'}\n\nThis can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { + "id": { + "description": "An id/name for this filter, used to set the URL parameters", "type": "string" - } - ] - }, - "then": { - "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option" - }, - "hideInAnswer": { - "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": [ - "string", - "boolean" - ] - } - ] - }, - "ifnot": { - "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "addExtraTags": { - "description": "If chosen as answer, these tags will be applied as well onto the object.\nNot compatible with multiAnswer", - "type": "array", - "items": { - "type": "string" + }, + "options": { + "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", + "type": "array", + "items": { + "type": "object", + "properties": { + "question": {}, + "osmTags": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "question" + ] + } } - } }, "required": [ - "if", - "then" + "id", + "options" ] - } - } - } - }, - "default_3": { - "description": "The PointRenderingConfig gives all details onto how to render a single point of a feature.\n\nThis can be used if:\n\n- The feature is a point\n- To render something at the centroid of an area, or at the start, end or projected centroid of a way", - "type": "object", - "properties": { - "location": { - "description": "All the locations that this point should be rendered at.\nUsing `location: [\"point\", \"centroid\"] will always render centerpoint", - "type": "array", - "items": { - "enum": [ - "centroid", - "end", - "point", - "start" - ], - "type": "string" - } }, - "icon": { - "description": "The icon for an element.\nNote that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.\n\nThe result of the icon is rendered as follows:\nthe resulting string is interpreted as a _list_ of items, separated by \";\". The bottommost layer is the first layer.\nAs a result, on could use a generic pin, then overlay it with a specific icon.\nTo make things even more practical, one can use all SVG's from the folder \"assets/svg\" and _substitute the color_ in it.\nE.g. to draw a red pin, use \"pin:#f00\", to have a green circle with your icon on top, use `circle:#0f0;`", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "iconBadges": { - "description": "A list of extra badges to show next to the icon as small badge\nThey will be added as a 25% height icon at the bottom right of the icon, with all the badges in a flex layout.\n\nNote: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle", - "type": "array", - "items": { + "DeleteConfigJson": { "type": "object", "properties": { - "if": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - }, - "then": { - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "if", - "then" - ] - } - }, - "iconSize": { - "description": "A string containing \"width,height\" or \"width,height,anchorpoint\" where anchorpoint is any of 'center', 'top', 'bottom', 'left', 'right', 'bottomleft','topright', ...\nDefault is '40,40,center'", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" + "extraDeleteReasons": { + "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", + "type": "array", + "items": { + "type": "object", + "properties": { + "explanation": { + "description": "The text that will be shown to the user - translatable" + }, + "changesetMessage": { + "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", + "type": "string" + } + }, + "required": [ + "changesetMessage", + "explanation" + ] + } + }, + "nonDeleteMappings": { + "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", + "type": "array", + "items": { + "type": "object", + "properties": { + "if": { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + "then": {} + }, + "required": [ + "if", + "then" + ] + } + }, + "softDeletionTags": { + "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + }, + "neededChangesets": { + "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", + "type": "number" + } } - ] }, - "rotation": { - "description": "The rotation of an icon, useful for e.g. directions.\nUsage: as if it were a css property for 'rotate', thus has to end with 'deg', e.g. `90deg`, `{direction}deg`, `calc(90deg - {camera:direction}deg)``", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "label": { - "description": "A HTML-fragment that is shown below the icon, for example:\n
{name}
\n\nIf the icon is undefined, then the label is shown in the center of the feature.\nNote that, if the wayhandling hides the icon then no label is shown as well.", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "location" - ] - }, - "default_4": { - "description": "The LineRenderingConfig gives all details onto how to render a single line of a feature.\n\nThis can be used if:\n\n- The feature is a line\n- The feature is an area", - "type": "object", - "properties": { - "color": { - "description": "The color for way-elements and SVG-elements.\nIf the value starts with \"--\", the style of the body element will be queried for the corresponding variable instead", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "width": { - "description": "The stroke-width for way-elements", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "dashArray": { - "description": "A dasharray, e.g. \"5 6\"\nThe dasharray defines 'pixels of line, pixels of gap, pixels of line, pixels of gap',\nDefault value: \"\" (empty string == full line)", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "lineCap": { - "description": "The form at the end of a line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "fill": { - "description": "Wehter or not to fill polygons", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "enum": [ - "no", - "yes" - ], - "type": "string" - } - ] - }, - "fillColor": { - "description": "The color to fill a polygon with.\nIf undefined, this will be slightly more opaque version of the stroke line", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "string" - } - ] - }, - "offset": { - "description": "The number of pixels this line should be moved.\nUse a positive numbe to move to the right, a negative to move to the left (left/right as defined by the drawing direction of the line).\n\nIMPORTANT: MapComplete will already normalize 'key:both:property' and 'key:both' into the corresponding 'key:left' and 'key:right' tagging (same for 'sidewalk=left/right/both' which is rewritten to 'sidewalk:left' and 'sidewalk:right')\nThis simplifies programming. Refer to the CalculatedTags.md-documentation for more details", - "anyOf": [ - { - "$ref": "#/definitions/TagRenderingConfigJson" - }, - { - "type": "number" - } - ] - } - } - }, - "default": { - "type": "object", - "properties": { - "id": { - "description": "An id/name for this filter, used to set the URL parameters", - "type": "string" - }, - "options": { - "description": "The options for a filter\nIf there are multiple options these will be a list of radio buttons\nIf there is only one option this will be a checkbox\nFiltering is done based on the given osmTags that are compared to the objects in that layer.", - "type": "array", - "items": { + "default_2": { "type": "object", "properties": { - "question": {}, - "osmTags": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } - }, - "required": [ - "question" - ] - } - } - }, - "required": [ - "id", - "options" - ] - }, - "DeleteConfigJson": { - "type": "object", - "properties": { - "extraDeleteReasons": { - "description": "*\nBy default, three reasons to delete a point are shown:\n\n- The point does not exist anymore\n- The point was a testing point\n- THe point could not be found\n\nHowever, for some layers, there might be different or more specific reasons for deletion which can be user friendly to set, e.g.:\n\n- the shop has closed\n- the climbing route has been closed of for nature conservation reasons\n- ...\n\nThese reasons can be stated here and will be shown in the list of options the user can choose from", - "type": "array", - "items": { - "type": "object", - "properties": { - "explanation": { - "description": "The text that will be shown to the user - translatable" - }, - "changesetMessage": { - "description": "The text that will be uploaded into the changeset or will be used in the fixme in case of a soft deletion\nShould be a few words, in english", - "type": "string" - } - }, - "required": [ - "changesetMessage", - "explanation" - ] - } - }, - "nonDeleteMappings": { - "description": "In some cases, a (starting) contributor might wish to delete a feature even though deletion is not appropriate.\n(The most relevant case are small paths running over private property. These should be marked as 'private' instead of deleted, as the community might trace the path again from aerial imagery, gettting us back to the original situation).\n\nBy adding a 'nonDeleteMapping', an option can be added into the list which will retag the feature.\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!", - "type": "array", - "items": { - "type": "object", - "properties": { - "if": { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - "then": {} - }, - "required": [ - "if", - "then" - ] - } - }, - "softDeletionTags": { - "description": "In some cases, the contributor is not allowed to delete the current feature (e.g. because it isn't a point, the point is referenced by a relation or the user isn't experienced enough).\nTo still offer the user a 'delete'-option, the feature is retagged with these tags. This is a soft deletion, as the point isn't actually removed from OSM but rather marked as 'disused'\nIt is important that the feature will be retagged in such a way that it won't be picked up by the layer anymore!\n\nExample (note that \"amenity=\" erases the 'amenity'-key alltogether):\n```\n{\n \"and\": [\"disussed:amenity=public_bookcase\", \"amenity=\"]\n}\n```\n\nor (notice the use of the ':='-tag to copy the old value of 'shop=*' into 'disused:shop='):\n```\n{\n \"and\": [\"disused:shop:={shop}\", \"shop=\"]\n}\n```", - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" + "enableImproveAccuracy": { + "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", + "type": "boolean" + }, + "enableRelocation": { + "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", + "type": "boolean" + } } - ] }, - "neededChangesets": { - "description": "*\nBy default, the contributor needs 20 previous changesets to delete points edited by others.\nFor some small features (e.g. bicycle racks) this is too much and this requirement can be lowered or dropped, which can be done here.", - "type": "number" + "default_1": { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { + "type": "string" + } + }, + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } + } + }, + "required": [ + "applicableUnits", + "appliesToKey" + ] } - } }, - "default_2": { - "type": "object", - "properties": { - "enableImproveAccuracy": { - "description": "One default reason to move a point is to improve accuracy.\nSet to false to disable this reason", - "type": "boolean" - }, - "enableRelocation": { - "description": "One default reason to move a point is because it has relocated\nSet to false to disable this reason", - "type": "boolean" - } - } - }, - "default_1": { - "type": "object", - "properties": { - "appliesToKey": { - "description": "Every key from this list will be normalized", - "type": "array", - "items": { - "type": "string" - } - }, - "eraseInvalidValues": { - "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", - "type": "boolean" - }, - "applicableUnits": { - "description": "The possible denominations", - "type": "array", - "items": { - "$ref": "#/definitions/ApplicableUnitJson" - } - } - }, - "required": [ - "applicableUnits", - "appliesToKey" - ] - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/Schemas/UnitConfigJsonJSC.ts b/Docs/Schemas/UnitConfigJsonJSC.ts index 9e8fa3c0d..8c141bffe 100644 --- a/Docs/Schemas/UnitConfigJsonJSC.ts +++ b/Docs/Schemas/UnitConfigJsonJSC.ts @@ -1,98 +1,98 @@ export default { - "type": "object", - "properties": { - "appliesToKey": { - "description": "Every key from this list will be normalized", - "type": "array", - "items": { - "type": "string" - } - }, - "eraseInvalidValues": { - "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", - "type": "boolean" - }, - "applicableUnits": { - "description": "The possible denominations", - "type": "array", - "items": { - "$ref": "#/definitions/ApplicableUnitJson" - } - } - }, - "required": [ - "applicableUnits", - "appliesToKey" - ], - "definitions": { - "AndOrTagConfigJson": { - "type": "object", - "properties": { - "and": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { + "type": "object", + "properties": { + "appliesToKey": { + "description": "Every key from this list will be normalized", + "type": "array", + "items": { "type": "string" - } - ] - } + } }, - "or": { - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/definitions/AndOrTagConfigJson" - }, - { - "type": "string" - } - ] - } + "eraseInvalidValues": { + "description": "If set, invalid values will be erased in the MC application (but not in OSM of course!)\nBe careful with setting this", + "type": "boolean" + }, + "applicableUnits": { + "description": "The possible denominations", + "type": "array", + "items": { + "$ref": "#/definitions/ApplicableUnitJson" + } } - } }, - "ApplicableUnitJson": { - "type": "object", - "properties": { - "canonicalDenomination": { - "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", - "type": "string" + "required": [ + "applicableUnits", + "appliesToKey" + ], + "definitions": { + "AndOrTagConfigJson": { + "type": "object", + "properties": { + "and": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + }, + "or": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/AndOrTagConfigJson" + }, + { + "type": "string" + } + ] + } + } + } }, - "canonicalDenominationSingular": { - "description": "The canonical denomination in the case that the unit is precisely '1'", - "type": "string" - }, - "alternativeDenomination": { - "description": "A list of alternative values which can occur in the OSM database - used for parsing.", - "type": "array", - "items": { - "type": "string" - } - }, - "human": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" - }, - "humanSingular": { - "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" - }, - "prefix": { - "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", - "type": "boolean" - }, - "default": { - "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", - "type": "boolean" + "ApplicableUnitJson": { + "type": "object", + "properties": { + "canonicalDenomination": { + "description": "The canonical value which will be added to the text.\ne.g. \"m\" for meters\nIf the user inputs '42', the canonical value will be added and it'll become '42m'", + "type": "string" + }, + "canonicalDenominationSingular": { + "description": "The canonical denomination in the case that the unit is precisely '1'", + "type": "string" + }, + "alternativeDenomination": { + "description": "A list of alternative values which can occur in the OSM database - used for parsing.", + "type": "array", + "items": { + "type": "string" + } + }, + "human": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"meter\",\n \"fr\": \"metre\"\n}" + }, + "humanSingular": { + "description": "The value for humans in the dropdown. This should not use abbreviations and should be translated, e.g.\n{\n \"en\": \"minute\",\n \"nl\": \"minuut\"x²\n}" + }, + "prefix": { + "description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field", + "type": "boolean" + }, + "default": { + "description": "The default interpretation - only one can be set.\nIf none is set, the first unit will be considered the default interpretation of a value without a unit", + "type": "boolean" + } + }, + "required": [ + "canonicalDenomination" + ] } - }, - "required": [ - "canonicalDenomination" - ] - } - }, - "$schema": "http://json-schema.org/draft-07/schema#" + }, + "$schema": "http://json-schema.org/draft-07/schema#" } \ No newline at end of file diff --git a/Docs/SpecialInputElements.md b/Docs/SpecialInputElements.md index f9f701cad..bfb724bb9 100644 --- a/Docs/SpecialInputElements.md +++ b/Docs/SpecialInputElements.md @@ -1,10 +1,6 @@ - - - Available types for text fields +Available types for text fields ================================= - - ## Table of contents 1. [Available types for text fields](#available-types-for-text-fields) @@ -25,77 +21,50 @@ + [opening_hours](#opening_hours) + [color](#color) +The listed types here trigger a special input element. Use them in `tagrendering.freeform.type` of your tagrendering to +activate them - -The listed types here trigger a special input element. Use them in `tagrendering.freeform.type` of your tagrendering to activate them - - - -### string - - +### string A basic string - - -### text - - +### text A string, but allows input of longer strings more comfortably and supports newlines (a text area) - - -### date - - +### date A date - - -### direction - - +### direction A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl) +### length +A geographical length in meters (rounded at two points). Will give an extra minimap with a measurement tool. +Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `["21", "map,photo"] -### length +### wikidata +A wikidata identifier, e.g. Q42. - -A geographical length in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `["21", "map,photo"] - - - -### wikidata - - - -A wikidata identifier, e.g. Q42. - -### Helper arguments - - +### Helper arguments name | doc ------ | ----- key | the value of this tag will initialize search (default: name) -options | A JSON-object of type `{ removePrefixes: string[], removePostfixes: string[] }`. +options | A JSON-object of type `{ removePrefixes: string[], removePostfixes: string[] }`. subarg | doc -------- | ----- removePrefixes | remove these snippets of text from the start of the passed string to search removePostfixes | remove these snippets of text from the end of the passed string to search - +### Example usage -### Example usage - - The following is the 'freeform'-part of a layer config which will trigger a search for the wikidata item corresponding with the name of the selected feature. It will also remove '-street', '-square', ... if found at the end of the name +The following is the 'freeform'-part of a layer config which will trigger a search for the wikidata item corresponding +with the name of the selected feature. It will also remove '-street', '-square', ... if found at the end of the name ``` "freeform": { @@ -116,96 +85,57 @@ removePostfixes | remove these snippets of text from the end of the passed strin } ``` - - -### int - - +### int A number - - -### nat - - +### nat A positive number or zero - - -### pnat - - +### pnat A strict positive number - - -### float - - +### float A decimal - - -### pfloat - - +### pfloat A positive decimal (incl zero) - - -### email - - +### email An email adress +### url +The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will +be hidden from the user -### url - - - -The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user - - - -### phone - - +### phone A phone number +### opening_hours +Has extra elements to easily input when a POI is opened. -### opening_hours - - - -Has extra elements to easily input when a POI is opened. - -### Helper arguments - - +### Helper arguments name | doc ------ | ----- -options | A JSON-object of type `{ prefix: string, postfix: string }`. +options | A JSON-object of type `{ prefix: string, postfix: string }`. subarg | doc -------- | ----- prefix | Piece of text that will always be added to the front of the generated opening hours. If the OSM-data does not start with this, it will fail to parse postfix | Piece of text that will always be added to the end of the generated opening hours - +### Example usage -### Example usage - - To add a conditional (based on time) access restriction: +To add a conditional (based on time) access restriction: ``` @@ -221,14 +151,11 @@ postfix | Piece of text that will always be added to the end of the generated op } ``` -*Don't forget to pass the prefix and postfix in the rendering as well*: `{opening_hours_table(opening_hours,yes @ &LPARENS, &RPARENS )` +*Don't forget to pass the prefix and postfix in the rendering as +well*: `{opening_hours_table(opening_hours,yes @ &LPARENS, &RPARENS )` +### color - -### color - - - -Shows a color picker +Shows a color picker This document is autogenerated from ValidatedTextField.ts \ No newline at end of file diff --git a/Docs/SpecialRenderings.md b/Docs/SpecialRenderings.md index 740c452b7..22a362509 100644 --- a/Docs/SpecialRenderings.md +++ b/Docs/SpecialRenderings.md @@ -1,545 +1,541 @@ - - - Special tag renderings +Special tag renderings ======================== - - ## Table of contents 1. [Special tag renderings](#special-tag-renderings) + [all_tags](#all_tags) - * [Example usage of all_tags](#example-usage-of-all_tags) + * [Example usage of all_tags](#example-usage-of-all_tags) + [image_carousel](#image_carousel) - * [Example usage of image_carousel](#example-usage-of-image_carousel) + * [Example usage of image_carousel](#example-usage-of-image_carousel) + [image_upload](#image_upload) - * [Example usage of image_upload](#example-usage-of-image_upload) + * [Example usage of image_upload](#example-usage-of-image_upload) + [wikipedia](#wikipedia) - * [Example usage of wikipedia](#example-usage-of-wikipedia) + * [Example usage of wikipedia](#example-usage-of-wikipedia) + [minimap](#minimap) - * [Example usage of minimap](#example-usage-of-minimap) + * [Example usage of minimap](#example-usage-of-minimap) + [sided_minimap](#sided_minimap) - * [Example usage of sided_minimap](#example-usage-of-sided_minimap) + * [Example usage of sided_minimap](#example-usage-of-sided_minimap) + [reviews](#reviews) - * [Example usage of reviews](#example-usage-of-reviews) + * [Example usage of reviews](#example-usage-of-reviews) + [opening_hours_table](#opening_hours_table) - * [Example usage of opening_hours_table](#example-usage-of-opening_hours_table) + * [Example usage of opening_hours_table](#example-usage-of-opening_hours_table) + [live](#live) - * [Example usage of live](#example-usage-of-live) + * [Example usage of live](#example-usage-of-live) + [histogram](#histogram) - * [Example usage of histogram](#example-usage-of-histogram) + * [Example usage of histogram](#example-usage-of-histogram) + [share_link](#share_link) - * [Example usage of share_link](#example-usage-of-share_link) + * [Example usage of share_link](#example-usage-of-share_link) + [canonical](#canonical) - * [Example usage of canonical](#example-usage-of-canonical) + * [Example usage of canonical](#example-usage-of-canonical) + [import_button](#import_button) - * [Example usage of import_button](#example-usage-of-import_button) + * [Example usage of import_button](#example-usage-of-import_button) + [import_way_button](#import_way_button) - * [Example usage of import_way_button](#example-usage-of-import_way_button) + * [Example usage of import_way_button](#example-usage-of-import_way_button) + [conflate_button](#conflate_button) - * [Example usage of conflate_button](#example-usage-of-conflate_button) + * [Example usage of conflate_button](#example-usage-of-conflate_button) + [multi_apply](#multi_apply) - * [Example usage of multi_apply](#example-usage-of-multi_apply) + * [Example usage of multi_apply](#example-usage-of-multi_apply) + [tag_apply](#tag_apply) - * [Example usage of tag_apply](#example-usage-of-tag_apply) + * [Example usage of tag_apply](#example-usage-of-tag_apply) + [export_as_gpx](#export_as_gpx) - * [Example usage of export_as_gpx](#example-usage-of-export_as_gpx) + * [Example usage of export_as_gpx](#example-usage-of-export_as_gpx) + [export_as_geojson](#export_as_geojson) - * [Example usage of export_as_geojson](#example-usage-of-export_as_geojson) + * [Example usage of export_as_geojson](#example-usage-of-export_as_geojson) + [open_in_iD](#open_in_id) - * [Example usage of open_in_iD](#example-usage-of-open_in_id) + * [Example usage of open_in_iD](#example-usage-of-open_in_id) + [clear_location_history](#clear_location_history) - * [Example usage of clear_location_history](#example-usage-of-clear_location_history) + * [Example usage of clear_location_history](#example-usage-of-clear_location_history) + [close_note](#close_note) - * [Example usage of close_note](#example-usage-of-close_note) + * [Example usage of close_note](#example-usage-of-close_note) + [add_note_comment](#add_note_comment) - * [Example usage of add_note_comment](#example-usage-of-add_note_comment) + * [Example usage of add_note_comment](#example-usage-of-add_note_comment) + [visualize_note_comments](#visualize_note_comments) - * [Example usage of visualize_note_comments](#example-usage-of-visualize_note_comments) + * [Example usage of visualize_note_comments](#example-usage-of-visualize_note_comments) + [add_image_to_note](#add_image_to_note) - * [Example usage of add_image_to_note](#example-usage-of-add_image_to_note) + * [Example usage of add_image_to_note](#example-usage-of-add_image_to_note) + [auto_apply](#auto_apply) - * [Example usage of auto_apply](#example-usage-of-auto_apply) + * [Example usage of auto_apply](#example-usage-of-auto_apply) +In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and +visualizations to be reused by custom themes or even to query third-party API's. +General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do +not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a +comma in your args -In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's. +### all_tags -General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args +Prints all key-value pairs of the object - used for debugging +#### Example usage of all_tags +`{all_tags()}` -### all_tags +### image_carousel - Prints all key-value pairs of the object - used for debugging - -#### Example usage of all_tags - - `{all_tags()}` - - - -### image_carousel - - Creates an image carousel for the given sources. An attempt will be made to guess what source is used. Supported: Wikidata identifiers, Wikipedia pages, Wikimedia categories, IMGUR (with attribution, direct links) +Creates an image carousel for the given sources. An attempt will be made to guess what source is used. Supported: +Wikidata identifiers, Wikipedia pages, Wikimedia categories, IMGUR (with attribution, direct links) name | default | description ------ | --------- | ------------- -image key/prefix (multiple values allowed if comma-seperated) | image,mapillary,image,wikidata,wikimedia_commons,image,image | The keys given to the images, e.g. if image is given, the first picture URL will be added as image, the second as image:0, the third as image:1, etc... - +image key/prefix (multiple values allowed if comma-seperated) | image,mapillary,image,wikidata,wikimedia_commons,image,image | The keys given to the images, e.g. if image is given, the first picture URL will be added as image, the second as image:0, the third as image:1, etc... -#### Example usage of image_carousel +#### Example usage of image_carousel - `{image_carousel(image,mapillary,image,wikidata,wikimedia_commons,image,image)}` +`{image_carousel(image,mapillary,image,wikidata,wikimedia_commons,image,image)}` +### image_upload - -### image_upload - - Creates a button where a user can upload an image to IMGUR +Creates a button where a user can upload an image to IMGUR name | default | description ------ | --------- | ------------- image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added) label | Add image | The text to show on the button - -#### Example usage of image_upload +#### Example usage of image_upload - `{image_upload(image,Add image)}` +`{image_upload(image,Add image)}` +### wikipedia - -### wikipedia - - A box showing the corresponding wikipedia article - based on the wikidata tag +A box showing the corresponding wikipedia article - based on the wikidata tag name | default | description ------ | --------- | ------------- keyToShowWikipediaFor | wikidata | Use the wikidata entry from this key to show the wikipedia article for - -#### Example usage of wikipedia +#### Example usage of wikipedia - `{wikipedia()}` is a basic example, `{wikipedia(name:etymology:wikidata)}` to show the wikipedia page of whom the feature was named after. Also remember that these can be styled, e.g. `{wikipedia():max-height: 10rem}` to limit the height +`{wikipedia()}` is a basic example, `{wikipedia(name:etymology:wikidata)}` to show the wikipedia page of whom the +feature was named after. Also remember that these can be styled, e.g. `{wikipedia():max-height: 10rem}` to limit the +height +### minimap - -### minimap - - A small map showing the selected feature. +A small map showing the selected feature. name | default | description ------ | --------- | ------------- zoomlevel | 18 | The (maximum) zoomlevel: the target zoomlevel after fitting the entire feature. The minimap will fit the entire feature, then zoom out to this zoom level. The higher, the more zoomed in with 1 being the entire world and 19 being really close idKey | id | (Matches all resting arguments) This argument should be the key of a property of the feature. The corresponding value is interpreted as either the id or the a list of ID's. The features with these ID's will be shown on this minimap. - -#### Example usage of minimap +#### Example usage of minimap - `{minimap()}`, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}` +`{minimap()}` +, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}` +### sided_minimap - -### sided_minimap - - A small map showing _only one side_ the selected feature. *This features requires to have linerenderings with offset* as only linerenderings with a postive or negative offset will be shown. Note: in most cases, this map will be automatically introduced +A small map showing _only one side_ the selected feature. *This features requires to have linerenderings with offset* as +only linerenderings with a postive or negative offset will be shown. Note: in most cases, this map will be automatically +introduced name | default | description ------ | --------- | ------------- side | _undefined_ | The side to show, either `left` or `right` - -#### Example usage of sided_minimap +#### Example usage of sided_minimap - `{sided_minimap(left)}` +`{sided_minimap(left)}` +### reviews - -### reviews - - Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs - in order to identify the reviewed object - a coordinate and a name. By default, the name of the object is given, but this can be overwritten +Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs - in order to identify the reviewed +object - a coordinate and a name. By default, the name of the object is given, but this can be overwritten name | default | description ------ | --------- | ------------- subjectKey | name | The key to use to determine the subject. If specified, the subject will be tags[subjectKey] -fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value - +fallback | _ +undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value -#### Example usage of reviews +#### Example usage of reviews - `{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used +`{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name +will be used as identifier, otherwise 'play_forest' is used +### opening_hours_table - -### opening_hours_table - - Creates an opening-hours table. Usage: {opening_hours_table(opening_hours)} to create a table of the tag 'opening_hours'. +Creates an opening-hours table. Usage: {opening_hours_table(opening_hours)} to create a table of the tag ' +opening_hours'. name | default | description ------ | --------- | ------------- key | opening_hours | The tagkey from which the table is constructed. -prefix | _empty string_ | Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__ -postfix | _empty string_ | Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__ - +prefix | _empty string_ | Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to +indicate `(` if needed__ +postfix | _empty string_ | Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to +indicate `)` if needed__ -#### Example usage of opening_hours_table +#### Example usage of opening_hours_table - A normal opening hours table can be invoked with `{opening_hours_table()}`. A table for e.g. conditional access with opening hours can be `{opening_hours_table(access:conditional, no @ &LPARENS, &RPARENS)}` +A normal opening hours table can be invoked with `{opening_hours_table()}`. A table for e.g. conditional access with +opening hours can be `{opening_hours_table(access:conditional, no @ &LPARENS, &RPARENS)}` +### live - -### live - - Downloads a JSON from the given URL, e.g. '{live(example.org/data.json, shorthand:x.y.z, other:a.b.c, shorthand)}' will download the given file, will create an object {shorthand: json[x][y][z], other: json[a][b][c] out of it and will return 'other' or 'json[a][b][c]. This is made to use in combination with tags, e.g. {live({url}, {url:format}, needed_value)} +Downloads a JSON from the given URL, e.g. '{live(example.org/data.json, shorthand:x.y.z, other:a.b.c, shorthand)}' will +download the given file, will create an object {shorthand: json[x][y][z], other: json[a][b][c] out of it and will +return 'other' or 'json[a][b][c]. This is made to use in combination with tags, e.g. {live({url}, {url:format}, +needed_value)} name | default | description ------ | --------- | ------------- Url | _undefined_ | The URL to load Shorthands | _undefined_ | A list of shorthands, of the format 'shorthandname:path.path.path'. separated by ; path | _undefined_ | The path (or shorthand) that should be returned - -#### Example usage of live +#### Example usage of live - {live({url},{url:format},hour)} {live(https://data.mobility.brussels/bike/api/counts/?request=live&featureID=CB2105,hour:data.hour_cnt;day:data.day_cnt;year:data.year_cnt,hour)} +{live({url},{url:format},hour)} +{live(https://data.mobility.brussels/bike/api/counts/?request=live&featureID=CB2105,hour:data.hour_cnt;day:data.day_cnt;year:data.year_cnt,hour)} +### histogram - -### histogram - - Create a histogram for a list of given values, read from the properties. +Create a histogram for a list of given values, read from the properties. name | default | description ------ | --------- | ------------- key | _undefined_ | The key to be read and to generate a histogram from title | _empty string_ | This text will be placed above the texts (in the first column of the visulasition) countHeader | _empty string_ | This text will be placed above the bars -colors* | _undefined_ | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33` - +colors* | _ +undefined_ | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33` -#### Example usage of histogram +#### Example usage of histogram - `{histogram('some_key')}` with properties being `{some_key: ['a','b','a','c']} to create a histogram +`{histogram('some_key')}` with properties being `{some_key: ['a','b','a','c']} to create a histogram +### share_link - -### share_link - - Creates a link that (attempts to) open the native 'share'-screen +Creates a link that (attempts to) open the native 'share'-screen name | default | description ------ | --------- | ------------- url | _undefined_ | The url to share (default: current URL) - -#### Example usage of share_link +#### Example usage of share_link - {share_link()} to share the current page, {share_link()} to share the given url +{share_link()} to share the current page, {share_link()} to share the given url +### canonical - -### canonical - - Converts a short, canonical value into the long, translated text +Converts a short, canonical value into the long, translated text name | default | description ------ | --------- | ------------- key | _undefined_ | The key of the tag to give the canonical text for - -#### Example usage of canonical +#### Example usage of canonical - {canonical(length)} will give 42 metre (in french) +{canonical(length)} will give 42 metre (in french) +### import_button +This button will copy the point from an external dataset into OpenStreetMap -### import_button - - This button will copy the point from an external dataset into OpenStreetMap - -Note that the contributor must zoom to at least zoomlevel 18 to be able to use this functionality. -It is only functional in official themes, but can be tested in unoffical themes. +Note that the contributor must zoom to at least zoomlevel 18 to be able to use this functionality. It is only functional +in official themes, but can be tested in unoffical themes. #### Specifying which tags to copy or add -The argument `tags` of the import button takes a `;`-seperated list of tags to add (or the name of a property which contains a JSON-list of properties). +The argument `tags` of the import button takes a `;`-seperated list of tags to add (or the name of a property which +contains a JSON-list of properties). -These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. -This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. +These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number` +. This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved +in `number` in the original feature. If a value to substitute is undefined, empty string will be used instead. This supports multiple values, e.g. `ref=$source:geometry:type/$source:geometry:ref` -Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special rendering... +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name ( +matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special +rendering... + +Note that these values can be prepare with javascript in the theme by using +a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) -Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) - #### Importing a dataset into OpenStreetMap: requirements If you want to import a dataset, make sure that: 1. The dataset to import has a suitable license 2. The community has been informed of the import -3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been followed +3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been + followed There are also some technicalities in your theme to keep in mind: -1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. - This means that there should be a layer which will match the new tags and which will display it. -2. The original feature from your geojson layer will gain the tag '_imported=yes'. - This should be used to change the appearance or even to hide it (eg by changing the icon size to zero) -3. There should be a way for the theme to detect previously imported points, even after reloading. - A reference number to the original dataset is an excellent way to do this -4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. - +1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. This + means that there should be a layer which will match the new tags and which will display it. +2. The original feature from your geojson layer will gain the tag '_imported=yes'. This should be used to change the + appearance or even to hide it (eg by changing the icon size to zero) +3. There should be a way for the theme to detect previously imported points, even after reloading. A reference number to + the original dataset is an excellent way to do this +4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. + #### Disabled in unofficial themes -The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` as [URL-paramter](URL_Parameters.md). -The import button will show up then. If in testmode, you can read the changeset-XML directly in the web console. -In the case that MapComplete is pointed to the testing grounds, the edit will be made on https://master.apis.dev.openstreetmap.org - +The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` +as [URL-paramter](URL_Parameters.md). The import button will show up then. If in testmode, you can read the +changeset-XML directly in the web console. In the case that MapComplete is pointed to the testing grounds, the edit will +be made on https://master.apis.dev.openstreetmap.org name | default | description ------ | --------- | ------------- -targetLayer | _undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements -tags | _undefined_ | The tags to add onto the new object - see specification above. If this is a key (a single word occuring in the properties of the object), the corresponding value is taken and expanded instead +targetLayer | _ +undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements +tags | _ +undefined_ | The tags to add onto the new object - see specification above. If this is a key (a single word occuring in the properties of the object), the corresponding value is taken and expanded instead text | Import this data into OpenStreetMap | The text to show on the button icon | ./assets/svg/addSmall.svg | A nice icon to show in the button -snap_onto_layers | _undefined_ | If a way of the given layer(s) is closeby, will snap the new point onto this way (similar as preset might snap). To show multiple layers to snap onto, use a `;`-seperated list +snap_onto_layers | _ +undefined_ | If a way of the given layer(s) is closeby, will snap the new point onto this way (similar as preset might snap). To show multiple layers to snap onto, use a `;`-seperated list max_snap_distance | 5 | The maximum distance that the imported point will be moved to snap onto a way in an already existing layer (in meters). This is previewed to the contributor, similar to the 'add new point'-action of MapComplete -note_id | _undefined_ | If given, this key will be read. The corresponding note on OSM will be closed, stating 'imported' - +note_id | _ +undefined_ | If given, this key will be read. The corresponding note on OSM will be closed, stating 'imported' -#### Example usage of import_button +#### Example usage of import_button - `{import_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,,5,)}` +`{import_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,,5,)}` +### import_way_button +This button will copy the data from an external dataset into OpenStreetMap -### import_way_button - - This button will copy the data from an external dataset into OpenStreetMap - -Note that the contributor must zoom to at least zoomlevel 18 to be able to use this functionality. -It is only functional in official themes, but can be tested in unoffical themes. +Note that the contributor must zoom to at least zoomlevel 18 to be able to use this functionality. It is only functional +in official themes, but can be tested in unoffical themes. #### Specifying which tags to copy or add -The argument `tags` of the import button takes a `;`-seperated list of tags to add (or the name of a property which contains a JSON-list of properties). +The argument `tags` of the import button takes a `;`-seperated list of tags to add (or the name of a property which +contains a JSON-list of properties). -These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. -This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. +These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number` +. This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved +in `number` in the original feature. If a value to substitute is undefined, empty string will be used instead. This supports multiple values, e.g. `ref=$source:geometry:type/$source:geometry:ref` -Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special rendering... +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name ( +matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special +rendering... + +Note that these values can be prepare with javascript in the theme by using +a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) -Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) - #### Importing a dataset into OpenStreetMap: requirements If you want to import a dataset, make sure that: 1. The dataset to import has a suitable license 2. The community has been informed of the import -3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been followed +3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been + followed There are also some technicalities in your theme to keep in mind: -1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. - This means that there should be a layer which will match the new tags and which will display it. -2. The original feature from your geojson layer will gain the tag '_imported=yes'. - This should be used to change the appearance or even to hide it (eg by changing the icon size to zero) -3. There should be a way for the theme to detect previously imported points, even after reloading. - A reference number to the original dataset is an excellent way to do this -4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. - +1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. This + means that there should be a layer which will match the new tags and which will display it. +2. The original feature from your geojson layer will gain the tag '_imported=yes'. This should be used to change the + appearance or even to hide it (eg by changing the icon size to zero) +3. There should be a way for the theme to detect previously imported points, even after reloading. A reference number to + the original dataset is an excellent way to do this +4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. + #### Disabled in unofficial themes -The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` as [URL-paramter](URL_Parameters.md). -The import button will show up then. If in testmode, you can read the changeset-XML directly in the web console. -In the case that MapComplete is pointed to the testing grounds, the edit will be made on https://master.apis.dev.openstreetmap.org - +The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` +as [URL-paramter](URL_Parameters.md). The import button will show up then. If in testmode, you can read the +changeset-XML directly in the web console. In the case that MapComplete is pointed to the testing grounds, the edit will +be made on https://master.apis.dev.openstreetmap.org name | default | description ------ | --------- | ------------- -targetLayer | _undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements -tags | _undefined_ | The tags to add onto the new object - see specification above. If this is a key (a single word occuring in the properties of the object), the corresponding value is taken and expanded instead +targetLayer | _ +undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements +tags | _ +undefined_ | The tags to add onto the new object - see specification above. If this is a key (a single word occuring in the properties of the object), the corresponding value is taken and expanded instead text | Import this data into OpenStreetMap | The text to show on the button icon | ./assets/svg/addSmall.svg | A nice icon to show in the button snap_to_point_if | _undefined_ | Points with the given tags will be snapped to or moved max_snap_distance | 5 | If the imported object is a LineString or (Multi)Polygon, already existing OSM-points will be reused to construct the geometry of the newly imported way move_osm_point_if | _undefined_ | Moves the OSM-point to the newly imported point if these conditions are met max_move_distance | 1 | If an OSM-point is moved, the maximum amount of meters it is moved. Capped on 20m -snap_onto_layers | _undefined_ | If no existing nearby point exists, but a line of a specified layer is closeby, snap to this layer instead +snap_onto_layers | _ +undefined_ | If no existing nearby point exists, but a line of a specified layer is closeby, snap to this layer instead snap_to_layer_max_distance | 0.1 | Distance to distort the geometry to snap to this layer - -#### Example usage of import_way_button +#### Example usage of import_way_button - `{import_way_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,,5,,1,,0.1)}` +`{import_way_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,,5,,1,,0.1)}` +### conflate_button +This button will modify the geometry of an existing OSM way to match the specified geometry. This can conflate OSM-ways +with LineStrings and Polygons (only simple polygons with one single ring). An attempt is made to move points with +special values to a decent new location (e.g. entrances) -### conflate_button - - This button will modify the geometry of an existing OSM way to match the specified geometry. This can conflate OSM-ways with LineStrings and Polygons (only simple polygons with one single ring). An attempt is made to move points with special values to a decent new location (e.g. entrances) - -Note that the contributor must zoom to at least zoomlevel 18 to be able to use this functionality. -It is only functional in official themes, but can be tested in unoffical themes. +Note that the contributor must zoom to at least zoomlevel 18 to be able to use this functionality. It is only functional +in official themes, but can be tested in unoffical themes. #### Specifying which tags to copy or add -The argument `tags` of the import button takes a `;`-seperated list of tags to add (or the name of a property which contains a JSON-list of properties). +The argument `tags` of the import button takes a `;`-seperated list of tags to add (or the name of a property which +contains a JSON-list of properties). -These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. -This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. +These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number` +. This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved +in `number` in the original feature. If a value to substitute is undefined, empty string will be used instead. This supports multiple values, e.g. `ref=$source:geometry:type/$source:geometry:ref` -Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special rendering... +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name ( +matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special +rendering... + +Note that these values can be prepare with javascript in the theme by using +a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) -Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) - #### Importing a dataset into OpenStreetMap: requirements If you want to import a dataset, make sure that: 1. The dataset to import has a suitable license 2. The community has been informed of the import -3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been followed +3. All other requirements of the [import guidelines](https://wiki.openstreetmap.org/wiki/Import/Guidelines) have been + followed There are also some technicalities in your theme to keep in mind: -1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. - This means that there should be a layer which will match the new tags and which will display it. -2. The original feature from your geojson layer will gain the tag '_imported=yes'. - This should be used to change the appearance or even to hide it (eg by changing the icon size to zero) -3. There should be a way for the theme to detect previously imported points, even after reloading. - A reference number to the original dataset is an excellent way to do this -4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. - +1. The new feature will be added and will flow through the program as any other new point as if it came from OSM. This + means that there should be a layer which will match the new tags and which will display it. +2. The original feature from your geojson layer will gain the tag '_imported=yes'. This should be used to change the + appearance or even to hide it (eg by changing the icon size to zero) +3. There should be a way for the theme to detect previously imported points, even after reloading. A reference number to + the original dataset is an excellent way to do this +4. When importing ways, the theme creator is also responsible of avoiding overlapping ways. + #### Disabled in unofficial themes -The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` as [URL-paramter](URL_Parameters.md). -The import button will show up then. If in testmode, you can read the changeset-XML directly in the web console. -In the case that MapComplete is pointed to the testing grounds, the edit will be made on https://master.apis.dev.openstreetmap.org - +The import button can be tested in an unofficial theme by adding `test=true` or `backend=osm-test` +as [URL-paramter](URL_Parameters.md). The import button will show up then. If in testmode, you can read the +changeset-XML directly in the web console. In the case that MapComplete is pointed to the testing grounds, the edit will +be made on https://master.apis.dev.openstreetmap.org name | default | description ------ | --------- | ------------- -targetLayer | _undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements -tags | _undefined_ | The tags to add onto the new object - see specification above. If this is a key (a single word occuring in the properties of the object), the corresponding value is taken and expanded instead +targetLayer | _ +undefined_ | The id of the layer where this point should end up. This is not very strict, it will simply result in checking that this layer is shown preventing possible duplicate elements +tags | _ +undefined_ | The tags to add onto the new object - see specification above. If this is a key (a single word occuring in the properties of the object), the corresponding value is taken and expanded instead text | Import this data into OpenStreetMap | The text to show on the button icon | ./assets/svg/addSmall.svg | A nice icon to show in the button -way_to_conflate | _undefined_ | The key, of which the corresponding value is the id of the OSM-way that must be conflated; typically a calculatedTag - +way_to_conflate | _ +undefined_ | The key, of which the corresponding value is the id of the OSM-way that must be conflated; typically a calculatedTag -#### Example usage of conflate_button +#### Example usage of conflate_button - `{conflate_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,)}` +`{conflate_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,)}` +### multi_apply - -### multi_apply - - A button to apply the tagging of this object onto a list of other features. This is an advanced feature for which you'll need calculatedTags +A button to apply the tagging of this object onto a list of other features. This is an advanced feature for which you'll +need calculatedTags name | default | description ------ | --------- | ------------- feature_ids | _undefined_ | A JSOn-serialized list of IDs of features to apply the tagging on -keys | _undefined_ | One key (or multiple keys, seperated by ';') of the attribute that should be copied onto the other features. +keys | _ +undefined_ | One key (or multiple keys, seperated by ';') of the attribute that should be copied onto the other features. text | _undefined_ | The text to show on the button -autoapply | _undefined_ | A boolean indicating wether this tagging should be applied automatically if the relevant tags on this object are changed. A visual element indicating the multi_apply is still shown -overwrite | _undefined_ | If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change - +autoapply | _ +undefined_ | A boolean indicating wether this tagging should be applied automatically if the relevant tags on this object are changed. A visual element indicating the multi_apply is still shown +overwrite | _ +undefined_ | If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change -#### Example usage of multi_apply +#### Example usage of multi_apply - {multi_apply(_features_with_the_same_name_within_100m, name:etymology:wikidata;name:etymology, Apply etymology information on all nearby objects with the same name)} +{multi_apply(_features_with_the_same_name_within_100m, name:etymology:wikidata;name:etymology, Apply etymology +information on all nearby objects with the same name)} +### tag_apply +Shows a big button; clicking this button will apply certain tags onto the feature. -### tag_apply - - Shows a big button; clicking this button will apply certain tags onto the feature. - -The first argument takes a specification of which tags to add. -These can either be a tag to add, such as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. -This new point will then have the tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. +The first argument takes a specification of which tags to add. These can either be a tag to add, such +as `amenity=fast_food` or can use a substitution, e.g. `addr:housenumber=$number`. This new point will then have the +tags `amenity=fast_food` and `addr:housenumber` with the value that was saved in `number` in the original feature. If a value to substitute is undefined, empty string will be used instead. This supports multiple values, e.g. `ref=$source:geometry:type/$source:geometry:ref` -Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name (matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special rendering... +Remark that the syntax is slightly different then expected; it uses '$' to note a value to copy, followed by a name ( +matched with `[a-zA-Z0-9_:]*`). Sadly, delimiting with `{}` as these already mark the boundaries of the special +rendering... -Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) - +Note that these values can be prepare with javascript in the theme by using +a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) name | default | description ------ | --------- | ------------- tags_to_apply | _undefined_ | A specification of the tags to apply message | _undefined_ | The text to show to the contributor image | _undefined_ | An image to show to the contributor on the button -id_of_object_to_apply_this_one | _undefined_ | If specified, applies the the tags onto _another_ object. The id will be read from properties[id_of_object_to_apply_this_one] of the selected object. The tags are still calculated based on the tags of the _selected_ element - +id_of_object_to_apply_this_one | _undefined_ | If specified, applies the the tags onto _ +another_ object. The id will be read from properties[id_of_object_to_apply_this_one] of the selected object. The tags are still calculated based on the tags of the _ +selected_ element -#### Example usage of tag_apply +#### Example usage of tag_apply - `{tag_apply(survey_date=$_now:date, Surveyed today!)}`, `{tag_apply(addr:street=$addr:street, Apply the address, apply_icon.svg, _closest_osm_id) +`{tag_apply(survey_date=$_now:date, Surveyed today!)}`, `{tag_apply(addr:street=$addr:street, Apply the address, +apply_icon.svg, _closest_osm_id) +### export_as_gpx +Exports the selected feature as GPX-file -### export_as_gpx +#### Example usage of export_as_gpx - Exports the selected feature as GPX-file +`{export_as_gpx()}` -#### Example usage of export_as_gpx +### export_as_geojson - `{export_as_gpx()}` +Exports the selected feature as GeoJson-file +#### Example usage of export_as_geojson +`{export_as_geojson()}` -### export_as_geojson +### open_in_iD - Exports the selected feature as GeoJson-file +Opens the current view in the iD-editor -#### Example usage of export_as_geojson +#### Example usage of open_in_iD - `{export_as_geojson()}` +`{open_in_iD()}` +### clear_location_history +A button to remove the travelled track information from the device -### open_in_iD +#### Example usage of clear_location_history - Opens the current view in the iD-editor +`{clear_location_history()}` -#### Example usage of open_in_iD +### close_note - `{open_in_iD()}` - - - -### clear_location_history - - A button to remove the travelled track information from the device - -#### Example usage of clear_location_history - - `{clear_location_history()}` - - - -### close_note - - Button to close a note. A predifined text can be defined to close the note with. If the note is already closed, will show a small text. +Button to close a note. A predifined text can be defined to close the note with. If the note is already closed, will +show a small text. name | default | description ------ | --------- | ------------- @@ -547,81 +543,72 @@ text | _undefined_ | Text to show on this button icon | checkmark.svg | Icon to show Id-key | id | The property name where the ID of the note to close can be found comment | _undefined_ | Text to add onto the note when closing - -#### Example usage of close_note +#### Example usage of close_note - `{close_note(,checkmark.svg,id,)}` +`{close_note(,checkmark.svg,id,)}` +### add_note_comment - -### add_note_comment - - A textfield to add a comment to a node (with the option to close the note). +A textfield to add a comment to a node (with the option to close the note). name | default | description ------ | --------- | ------------- Id-key | id | The property name where the ID of the note to close can be found - -#### Example usage of add_note_comment +#### Example usage of add_note_comment - `{add_note_comment(id)}` +`{add_note_comment(id)}` +### visualize_note_comments - -### visualize_note_comments - - Visualises the comments for notes +Visualises the comments for notes name | default | description ------ | --------- | ------------- commentsKey | comments | The property name of the comments, which should be stringified json start | 0 | Drop the first 'start' comments - -#### Example usage of visualize_note_comments +#### Example usage of visualize_note_comments - `{visualize_note_comments(comments,0)}` +`{visualize_note_comments(comments,0)}` +### add_image_to_note - -### add_image_to_note - - Adds an image to a node +Adds an image to a node name | default | description ------ | --------- | ------------- Id-key | id | The property name where the ID of the note to close can be found - -#### Example usage of add_image_to_note +#### Example usage of add_image_to_note - `{add_image_to_note(id)}` +`{add_image_to_note(id)}` +### auto_apply - -### auto_apply - - A button to run many actions for many features at once. +A button to run many actions for many features at once. To effectively use this button, you'll need some ingredients: -- A target layer with features for which an action is defined in a tag rendering. The following special visualisations support an autoAction: tag_apply -- A host feature to place the auto-action on. This can be a big outline (such as a city). Another good option for this is the [current_view](./BuiltinLayers.md#current_view) + +- A target layer with features for which an action is defined in a tag rendering. The following special visualisations + support an autoAction: tag_apply +- A host feature to place the auto-action on. This can be a big outline (such as a city). Another good option for this + is the [current_view](./BuiltinLayers.md#current_view) - Then, use a calculated tag on the host feature to determine the overlapping object ids -- At last, add this component +- At last, add this component name | default | description ------ | --------- | ------------- target_layer | _undefined_ | The layer that the target features will reside in target_feature_ids | _undefined_ | The key, of which the value contains a list of ids -tag_rendering_id | _undefined_ | The ID of the tagRendering containing the autoAction. This tagrendering will be calculated. The embedded actions will be executed +tag_rendering_id | _ +undefined_ | The ID of the tagRendering containing the autoAction. This tagrendering will be calculated. The embedded actions will be executed text | _undefined_ | The text to show on the button icon | ./assets/svg/robot.svg | The icon to show on the button - -#### Example usage of auto_apply +#### Example usage of auto_apply - `{auto_apply(,,,,./assets/svg/robot.svg)}` +`{auto_apply(,,,,./assets/svg/robot.svg)}` This document is autogenerated from UI/SpecialVisualisations.ts \ No newline at end of file diff --git a/Docs/Tags_format.md b/Docs/Tags_format.md index 7531d89b6..bf5587959 100644 --- a/Docs/Tags_format.md +++ b/Docs/Tags_format.md @@ -90,4 +90,5 @@ To mitigate this, use: ] ``` -One can use `key!:=prefix-{other_key}-postfix` as well, to match if `key` is _not_ the same as `prefix-{other_key}-postfix` (with other_key substituted by the value) \ No newline at end of file +One can use `key!:=prefix-{other_key}-postfix` as well, to match if `key` is _not_ the same +as `prefix-{other_key}-postfix` (with other_key substituted by the value) \ No newline at end of file diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md index feff2b83d..76e792809 100644 --- a/Docs/URL_Parameters.md +++ b/Docs/URL_Parameters.md @@ -1,222 +1,221 @@ - - - URL-parameters and URL-hash +URL-parameters and URL-hash ============================= - - ## Table of contents 1. [URL-parameters and URL-hash](#url-parameters-and-url-hash) - - [What is a URL parameter?](#what-is-a-url-parameter) - - [fs-userbadge](#fs-userbadge) - - [fs-search](#fs-search) - - [fs-background](#fs-background) - - [fs-filter](#fs-filter) - - [fs-add-new](#fs-add-new) - - [fs-welcome-message](#fs-welcome-message) - - [fs-iframe-popout](#fs-iframe-popout) - - [fs-more-quests](#fs-more-quests) - - [fs-share-screen](#fs-share-screen) - - [fs-geolocation](#fs-geolocation) - - [fs-all-questions](#fs-all-questions) - - [fs-export](#fs-export) - - [fs-pdf](#fs-pdf) - - [backend](#backend) - - [test](#test) - - [debug](#debug) - - [fake-user](#fake-user) - - [overpassUrl](#overpassurl) - - [overpassTimeout](#overpasstimeout) - - [overpassMaxZoom](#overpassmaxzoom) - - [osmApiTileSize](#osmapitilesize) - - [background](#background) - - [layer-<layer-id>](#layer-<layer-id>) - +- [What is a URL parameter?](#what-is-a-url-parameter) +- [fs-userbadge](#fs-userbadge) +- [fs-search](#fs-search) +- [fs-background](#fs-background) +- [fs-filter](#fs-filter) +- [fs-add-new](#fs-add-new) +- [fs-welcome-message](#fs-welcome-message) +- [fs-iframe-popout](#fs-iframe-popout) +- [fs-more-quests](#fs-more-quests) +- [fs-share-screen](#fs-share-screen) +- [fs-geolocation](#fs-geolocation) +- [fs-all-questions](#fs-all-questions) +- [fs-export](#fs-export) +- [fs-pdf](#fs-pdf) +- [backend](#backend) +- [test](#test) +- [debug](#debug) +- [fake-user](#fake-user) +- [overpassUrl](#overpassurl) +- [overpassTimeout](#overpasstimeout) +- [overpassMaxZoom](#overpassmaxzoom) +- [osmApiTileSize](#osmapitilesize) +- [background](#background) +- [layer-<layer-id>](#layer-<layer-id>) This document gives an overview of which URL-parameters can be used to influence MapComplete. - What is a URL parameter? +What is a URL parameter? -------------------------- "URL-parameters are extra parts of the URL used to set the state. -For example, if the url is `https://mapcomplete.osm.be/cyclofix?lat=51.0&lon=4.3&z=5&test=true#node/1234`, the URL-parameters are stated in the part between the `?` and the `#`. There are multiple, all separated by `&`, namely: - - - - - The url-parameter `lat` is `51.0` in this instance - - The url-parameter `lon` is `4.3` in this instance - - The url-parameter `z` is `5` in this instance - - The url-parameter `test` is `true` in this instance +For example, if the url is `https://mapcomplete.osm.be/cyclofix?lat=51.0&lon=4.3&z=5&test=true#node/1234`, the +URL-parameters are stated in the part between the `?` and the `#`. There are multiple, all separated by `&`, namely: +- The url-parameter `lat` is `51.0` in this instance +- The url-parameter `lon` is `4.3` in this instance +- The url-parameter `z` is `5` in this instance +- The url-parameter `test` is `true` in this instance Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case. - fs-userbadge +fs-userbadge -------------- - Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode. The default value is _true_ +Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus +disables editing all together, effectively putting MapComplete into read-only mode. The default value is _true_ - fs-search +fs-search ----------- - Disables/Enables the search bar The default value is _true_ +Disables/Enables the search bar The default value is _true_ - fs-background +fs-background --------------- - Disables/Enables the background layer control The default value is _true_ +Disables/Enables the background layer control The default value is _true_ - fs-filter +fs-filter ----------- - Disables/Enables the filter The default value is _true_ +Disables/Enables the filter The default value is _true_ - fs-add-new +fs-add-new ------------ - Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) The default value is _true_ +Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) The default +value is _true_ - fs-welcome-message +fs-welcome-message -------------------- - Disables/enables the help menu or welcome message The default value is _true_ +Disables/enables the help menu or welcome message The default value is _true_ - fs-iframe-popout +fs-iframe-popout ------------------ - Disables/Enables the iframe-popout button. If in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch) The default value is _true_ +Disables/Enables the iframe-popout button. If in iframe mode and the welcome message is hidden, a popout button to the +full mapcomplete instance is shown instead (unless disabled with this switch) The default value is _true_ - fs-more-quests +fs-more-quests ---------------- - Disables/Enables the 'More Quests'-tab in the welcome message The default value is _true_ +Disables/Enables the 'More Quests'-tab in the welcome message The default value is _true_ - fs-share-screen +fs-share-screen ----------------- - Disables/Enables the 'Share-screen'-tab in the welcome message The default value is _true_ +Disables/Enables the 'Share-screen'-tab in the welcome message The default value is _true_ - fs-geolocation +fs-geolocation ---------------- - Disables/Enables the geolocation button The default value is _true_ +Disables/Enables the geolocation button The default value is _true_ - fs-all-questions +fs-all-questions ------------------ - Always show all questions The default value is _false_ +Always show all questions The default value is _false_ - fs-export +fs-export ----------- - Enable the export as GeoJSON and CSV button The default value is _false_ +Enable the export as GeoJSON and CSV button The default value is _false_ - fs-pdf +fs-pdf -------- - Enable the PDF download button The default value is _false_ +Enable the PDF download button The default value is _false_ - backend +backend --------- - The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test' The default value is _osm_ +The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test' The default +value is _osm_ - test +test ------ - If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org The default value is _false_ +If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the +console instead of actually uploaded to osm.org The default value is _false_ - debug +debug ------- - If true, shows some extra debugging help such as all the available tags on every object The default value is _false_ +If true, shows some extra debugging help such as all the available tags on every object The default value is _false_ - fake-user +fake-user ----------- - If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_ +If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_ - overpassUrl +overpassUrl ------------- - Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_ +Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter The default value +is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_ - overpassTimeout +overpassTimeout ----------------- - Set a different timeout (in seconds) for queries in overpass The default value is _30_ +Set a different timeout (in seconds) for queries in overpass The default value is _30_ - overpassMaxZoom +overpassMaxZoom ----------------- - point to switch between OSM-api and overpass The default value is _16_ +point to switch between OSM-api and overpass The default value is _16_ - osmApiTileSize +osmApiTileSize ---------------- - Tilesize when the OSM-API is used to fetch data within a BBOX The default value is _17_ +Tilesize when the OSM-API is used to fetch data within a BBOX The default value is _17_ - background +background ------------ - The id of the background layer to start with The default value is _osm_ +The id of the background layer to start with The default value is _osm_ - layer-<layer-id> +layer-<layer-id> ------------------------ - Wether or not the layer with id is shown The default value is _true_ +Wether or not the layer with id is shown The default value is _true_ This document is autogenerated from QueryParameters \ No newline at end of file diff --git a/Docs/warning.svg b/Docs/warning.svg index 82f1f8acd..f02006c9f 100644 --- a/Docs/warning.svg +++ b/Docs/warning.svg @@ -1,28 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Logic/Actors/AvailableBaseLayersImplementation.ts b/Logic/Actors/AvailableBaseLayersImplementation.ts index 39dcdc4b1..27ec0ea71 100644 --- a/Logic/Actors/AvailableBaseLayersImplementation.ts +++ b/Logic/Actors/AvailableBaseLayersImplementation.ts @@ -64,7 +64,7 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL console.warn("Editor layer index: name not defined on ", props) continue } - + const leafletLayer: () => TileLayer = () => AvailableBaseLayersImplementation.CreateBackgroundLayer( props.id, @@ -189,13 +189,13 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL attribution: attribution, maxZoom: Math.max(21, maxZoom ?? 19), maxNativeZoom: maxZoom ?? 19, - minZoom: 1, + minZoom: 1, // @ts-ignore wmts: isWMTS ?? false, subdomains: domains }); } - + public AvailableLayersAt(location: UIEventSource): UIEventSource { return UIEventSource.ListStabilized(location.map( (currentLocation) => { @@ -209,50 +209,50 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL public SelectBestLayerAccordingTo(location: UIEventSource, preferedCategory: UIEventSource): UIEventSource { return this.AvailableLayersAt(location) .map(available => { - // First float all 'best layers' to the top - available.sort((a, b) => { - if (a.isBest && b.isBest) { - return 0; - } - if (!a.isBest) { - return 1 - } - - return -1; - } - ) - - if (preferedCategory.data === undefined) { - return available[0] - } - - let prefered: string [] - if (typeof preferedCategory.data === "string") { - prefered = [preferedCategory.data] - } else { - prefered = preferedCategory.data; - } - - prefered.reverse(); - for (const category of prefered) { - //Then sort all 'photo'-layers to the top. Stability of the sorting will force a 'best' photo layer on top + // First float all 'best layers' to the top available.sort((a, b) => { - if (a.category === category && b.category === category) { + if (a.isBest && b.isBest) { return 0; } - if (a.category !== category) { + if (!a.isBest) { return 1 } return -1; } ) - } - return available[0] - }, [preferedCategory]) + + if (preferedCategory.data === undefined) { + return available[0] + } + + let prefered: string [] + if (typeof preferedCategory.data === "string") { + prefered = [preferedCategory.data] + } else { + prefered = preferedCategory.data; + } + + prefered.reverse(); + for (const category of prefered) { + //Then sort all 'photo'-layers to the top. Stability of the sorting will force a 'best' photo layer on top + available.sort((a, b) => { + if (a.category === category && b.category === category) { + return 0; + } + if (a.category !== category) { + return 1 + } + + return -1; + } + ) + } + return available[0] + }, [preferedCategory]) } - + private CalculateAvailableLayersAt(lon: number, lat: number): BaseLayer[] { const availableLayers = [this.osmCarto] const globalLayers = []; diff --git a/Logic/Actors/GeoLocationHandler.ts b/Logic/Actors/GeoLocationHandler.ts index 2d1166e51..7d3aca2c3 100644 --- a/Logic/Actors/GeoLocationHandler.ts +++ b/Logic/Actors/GeoLocationHandler.ts @@ -11,11 +11,11 @@ export interface GeoLocationPointProperties { "user:location": "yes", "date": string, "latitude": number - "longitude":number, + "longitude": number, "speed": number, "accuracy": number "heading": number - "altitude":number + "altitude": number } export default class GeoLocationHandler extends VariableUiElement { diff --git a/Logic/DetermineLayout.ts b/Logic/DetermineLayout.ts index 76852726b..bc1e2794d 100644 --- a/Logic/DetermineLayout.ts +++ b/Logic/DetermineLayout.ts @@ -64,22 +64,6 @@ export default class DetermineLayout { return layoutToUse } - private static prepCustomTheme(json: any): LayoutConfigJson{ - const knownLayersDict = new Map() - for (const key in known_layers["default"]) { - const layer = known_layers["default"][key] - knownLayersDict.set(layer.id, layer) - } - const converState = { - tagRenderings: SharedTagRenderings.SharedTagRenderingJson, - sharedLayers: knownLayersDict - } - json = new FixLegacyTheme().convertStrict(converState, json, "While loading a dynamic theme") - json = new PrepareTheme().convertStrict(converState, json, "While preparing a dynamic theme") - console.log("The layoutconfig is ", json) - return json - } - public static LoadLayoutFromHash( userLayoutParam: UIEventSource ): LayoutConfig | null { @@ -148,6 +132,22 @@ export default class DetermineLayout { .AttachTo("centermessage"); } + private static prepCustomTheme(json: any): LayoutConfigJson { + const knownLayersDict = new Map() + for (const key in known_layers["default"]) { + const layer = known_layers["default"][key] + knownLayersDict.set(layer.id, layer) + } + const converState = { + tagRenderings: SharedTagRenderings.SharedTagRenderingJson, + sharedLayers: knownLayersDict + } + json = new FixLegacyTheme().convertStrict(converState, json, "While loading a dynamic theme") + json = new PrepareTheme().convertStrict(converState, json, "While preparing a dynamic theme") + console.log("The layoutconfig is ", json) + return json + } + private static async LoadRemoteTheme(link: string): Promise { console.log("Downloading map theme from ", link); @@ -160,7 +160,7 @@ export default class DetermineLayout { try { parsed.id = link; const layoutToUse = DetermineLayout.prepCustomTheme(parsed) - return new LayoutConfig(layoutToUse,false) + return new LayoutConfig(layoutToUse, false) } catch (e) { console.error(e) DetermineLayout.ShowErrorOnCustomTheme( diff --git a/Logic/ExtraFunctions.ts b/Logic/ExtraFunctions.ts index f8da9a1d1..242e323e8 100644 --- a/Logic/ExtraFunctions.ts +++ b/Logic/ExtraFunctions.ts @@ -94,7 +94,7 @@ class IntersectionFunc implements ExtraFunction { for (const otherFeature of tile) { const intersections = GeoOperations.LineIntersections(feat, otherFeature) - if(intersections.length === 0){ + if (intersections.length === 0) { continue } result.push({feat: otherFeature, intersections}) @@ -154,28 +154,12 @@ class ClosestObjectFunc implements ExtraFunction { class ClosestNObjectFunc implements ExtraFunction { - _f(params, feature) { - - return (features, amount, uniqueTag, maxDistanceInMeters) => { - let distance: number = Number(maxDistanceInMeters) - if (isNaN(distance)) { - distance = undefined - } - return ClosestNObjectFunc.GetClosestNFeatures(params, feature, features, { - maxFeatures: Number(amount), - uniqueTag: uniqueTag, - maxDistance: distance - }); - } - } - _name = "closestn" _doc = "Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. " + "Returns a list of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded)\n\n" + "If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will have a different name)" _args = ["list of features or layer name or '*' to get all features", "amount of features", "unique tag key (optional)", "maxDistanceInMeters (optional)"] - /** * Gets the closes N features, sorted by ascending distance. * @@ -311,6 +295,21 @@ class ClosestNObjectFunc implements ExtraFunction { return closestFeatures; } + _f(params, feature) { + + return (features, amount, uniqueTag, maxDistanceInMeters) => { + let distance: number = Number(maxDistanceInMeters) + if (isNaN(distance)) { + distance = undefined + } + return ClosestNObjectFunc.GetClosestNFeatures(params, feature, features, { + maxFeatures: Number(amount), + uniqueTag: uniqueTag, + maxDistance: distance + }); + } + } + } @@ -401,7 +400,7 @@ export class ExtraFunctions { ]; public static FullPatchFeature(params: ExtraFuncParams, feature) { - if(feature._is_patched){ + if (feature._is_patched) { return } feature._is_patched = true diff --git a/Logic/FeatureSource/Actors/MetaTagRecalculator.ts b/Logic/FeatureSource/Actors/MetaTagRecalculator.ts index 139091b05..6e1284ba9 100644 --- a/Logic/FeatureSource/Actors/MetaTagRecalculator.ts +++ b/Logic/FeatureSource/Actors/MetaTagRecalculator.ts @@ -14,7 +14,7 @@ class MetatagUpdater { private source: FeatureSourceForLayer & Tiled; private readonly params: ExtraFuncParams private state: { allElements?: ElementStorage }; - + private readonly isDirty = new UIEventSource(false) constructor(source: FeatureSourceForLayer & Tiled, state: { allElements?: ElementStorage }, featurePipeline: FeaturePipeline) { @@ -31,14 +31,14 @@ class MetatagUpdater { if (oldBbox === undefined) { self.neededLayerBboxes.set(layerId, bbox); } else if (!bbox.isContainedIn(oldBbox)) { - self.neededLayerBboxes.set(layerId,oldBbox.unionWith(bbox)) + self.neededLayerBboxes.set(layerId, oldBbox.unionWith(bbox)) } return featurePipeline.GetFeaturesWithin(layerId, bbox) }, memberships: featurePipeline.relationTracker } this.isDirty.stabilized(100).addCallback(dirty => { - if(dirty){ + if (dirty) { self.updateMetaTags() } }) @@ -46,10 +46,10 @@ class MetatagUpdater { } - public requestUpdate(){ + public requestUpdate() { this.isDirty.setData(true) } - + private updateMetaTags() { const features = this.source.features.data @@ -74,7 +74,8 @@ export default class MetaTagRecalculator { }; private _featurePipeline: FeaturePipeline; private readonly _alreadyRegistered: Set = new Set() -private readonly _notifiers : MetatagUpdater[] = [] + private readonly _notifiers: MetatagUpdater[] = [] + /** * The meta tag recalculator receives tiles of layers. * It keeps track of which sources have had their share calculated, and which should be re-updated if some other data is loaded @@ -92,16 +93,16 @@ private readonly _notifiers : MetatagUpdater[] = [] return; } this._alreadyRegistered.add(source) - this._notifiers.push(new MetatagUpdater(source,this._state,this._featurePipeline)) + this._notifiers.push(new MetatagUpdater(source, this._state, this._featurePipeline)) const self = this; source.features.addCallbackAndRunD(_ => { const layerName = source.layer.layerDef.id - for (const updater of self._notifiers ) { + for (const updater of self._notifiers) { const neededBbox = updater.neededLayerBboxes.get(layerName) - if(neededBbox == undefined){ + if (neededBbox == undefined) { continue } - if(source.bbox === undefined || neededBbox.overlapsWith(source.bbox)){ + if (source.bbox === undefined || neededBbox.overlapsWith(source.bbox)) { updater.requestUpdate() } } diff --git a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts index ad19b6f1c..b49a55483 100644 --- a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts +++ b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts @@ -41,7 +41,7 @@ export default class SaveTileToLocalStorageActor { }) } - + public LoadTilesFromDisk(currentBounds: UIEventSource, location: UIEventSource, registerFreshness: (tileId: number, freshness: Date) => void, registerTile: ((src: FeatureSource & Tiled) => void)) { @@ -55,7 +55,7 @@ export default class SaveTileToLocalStorageActor { } currentBounds.addCallbackAndRunD(bbox => { - if(self._layer.minzoomVisible > location.data.zoom){ + if (self._layer.minzoomVisible > location.data.zoom) { // Not enough zoom return; } @@ -119,9 +119,9 @@ export default class SaveTileToLocalStorageActor { } private SetIdb(tileIndex, data) { - try{ + try { IdbLocalStorage.SetDirectly(this._layer.id + "_" + tileIndex, data) - }catch(e){ + } catch (e) { console.error("Could not save tile to indexed-db: ", e, "tileIndex is:", tileIndex, "for layer", this._layer.id) } } diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts index 9eb233c36..53827acc5 100644 --- a/Logic/FeatureSource/FeaturePipeline.ts +++ b/Logic/FeatureSource/FeaturePipeline.ts @@ -43,40 +43,33 @@ export default class FeaturePipeline { public readonly timeout: UIEventSource; public readonly somethingLoaded: UIEventSource = new UIEventSource(false) public readonly newDataLoadedSignal: UIEventSource = new UIEventSource(undefined) - - - + public readonly relationTracker: RelationsTracker + /** + * Keeps track of all raw OSM-nodes. + * Only initialized if 'type_node' is defined as layer + */ + public readonly fullNodeDatabase?: FullNodeDatabaseSource private readonly overpassUpdater: OverpassFeatureSource private state: MapState; - public readonly relationTracker: RelationsTracker private readonly perLayerHierarchy: Map; - /** * Keeps track of the age of the loaded data. * Has one freshness-Calculator for every layer * @private */ private readonly freshnesses = new Map(); - private readonly oldestAllowedDate: Date; private readonly osmSourceZoomLevel - private readonly localStorageSavers = new Map() - - /** - * Keeps track of all raw OSM-nodes. - * Only initialized if 'type_node' is defined as layer - */ - public readonly fullNodeDatabase? : FullNodeDatabaseSource - + constructor( handleFeatureSource: (source: FeatureSourceForLayer & Tiled) => void, state: MapState, - options? : { + options?: { /*Used for metatagging - will receive all the sources with changeGeometry applied but without filtering*/ handleRawFeatureSource: (source: FeatureSourceForLayer) => void } - ) { + ) { this.state = state; const self = this @@ -104,7 +97,7 @@ export default class FeaturePipeline { return location.zoom >= minzoom; } ); - + const neededTilesFromOsm = this.getNeededTilesFromOsm(this.sufficientlyZoomed) const perLayerHierarchy = new Map() @@ -114,10 +107,10 @@ export default class FeaturePipeline { function patchedHandleFeatureSource(src: FeatureSourceForLayer & IndexedFeatureSource & Tiled) { // This will already contain the merged features for this tile. In other words, this will only be triggered once for every tile const withChanges = new ChangeGeometryApplicator(src, state.changes); - const srcFiltered = new FilteringFeatureSource(state, src.tileIndex,withChanges) + const srcFiltered = new FilteringFeatureSource(state, src.tileIndex, withChanges) handleFeatureSource(srcFiltered) - if(options?.handleRawFeatureSource){ + if (options?.handleRawFeatureSource) { options.handleRawFeatureSource(withChanges) } self.somethingLoaded.setData(true) @@ -267,7 +260,7 @@ export default class FeaturePipeline { }) }) - if(this.fullNodeDatabase !== undefined){ + if (this.fullNodeDatabase !== undefined) { osmFeatureSource.rawDataHandlers.push((osmJson, tileId) => this.fullNodeDatabase.handleOsmJson(osmJson, tileId)) } @@ -289,7 +282,7 @@ export default class FeaturePipeline { self.localStorageSavers.get(tile.layer.layerDef.id)?.addTile(tile) perLayerHierarchy.get(source.layer.layerDef.id).registerTile(new RememberingSource(tile)) tile.features.addCallbackAndRunD(f => { - if(f.length === 0){ + if (f.length === 0) { return } self.onNewDataLoaded(tile) @@ -298,9 +291,11 @@ export default class FeaturePipeline { } }), updater, - {handleLeftovers: (leftOvers) => { - console.warn("Overpass returned a few non-matched features:", leftOvers) - }}) + { + handleLeftovers: (leftOvers) => { + console.warn("Overpass returned a few non-matched features:", leftOvers) + } + }) // Also load points/lines that are newly added. @@ -308,7 +303,7 @@ export default class FeaturePipeline { newGeometry.features.addCallbackAndRun(geometries => { console.debug("New geometries are:", geometries) }) - + new RegisteringAllFromFeatureSourceActor(newGeometry, state.allElements) // A NewGeometryFromChangesFeatureSource does not split per layer, so we do this next new PerLayerFeatureSourceSplitter(state.filteredLayers, @@ -322,9 +317,11 @@ export default class FeaturePipeline { }, newGeometry, - {handleLeftovers: (leftOvers) => { - console.warn("Got some leftovers from the filteredLayers: ", leftOvers) - }} + { + handleLeftovers: (leftOvers) => { + console.warn("Got some leftovers from the filteredLayers: ", leftOvers) + } + } ) this.runningQuery = updater.runningQuery.map( @@ -337,10 +334,6 @@ export default class FeaturePipeline { } - private onNewDataLoaded(src: FeatureSource){ - this.newDataLoadedSignal.setData(src) - } - public GetAllFeaturesWithin(bbox: BBox): any[][] { const self = this const tiles = [] @@ -369,6 +362,10 @@ export default class FeaturePipeline { }) } + private onNewDataLoaded(src: FeatureSource) { + this.newDataLoadedSignal.setData(src) + } + private freshnessForVisibleLayers(z: number, x: number, y: number): Date { let oldestDate = undefined; for (const flayer of this.state.filteredLayers.data) { @@ -378,11 +375,11 @@ export default class FeaturePipeline { if (this.state.locationControl.data.zoom < flayer.layerDef.minzoom) { continue; } - if(flayer.layerDef.maxAgeOfCache === 0){ + if (flayer.layerDef.maxAgeOfCache === 0) { return undefined; } const freshnessCalc = this.freshnesses.get(flayer.layerDef.id) - if(freshnessCalc === undefined){ + if (freshnessCalc === undefined) { console.warn("No freshness tracker found for ", flayer.layerDef.id) return undefined } diff --git a/Logic/FeatureSource/Sources/FilteringFeatureSource.ts b/Logic/FeatureSource/Sources/FilteringFeatureSource.ts index 8671517aa..5609bfed6 100644 --- a/Logic/FeatureSource/Sources/FilteringFeatureSource.ts +++ b/Logic/FeatureSource/Sources/FilteringFeatureSource.ts @@ -19,8 +19,8 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti }; private readonly _alreadyRegistered = new Set>(); private readonly _is_dirty = new UIEventSource(false) - private previousFeatureSet : Set = undefined; - + private previousFeatureSet: Set = undefined; + constructor( state: { locationControl: UIEventSource<{ zoom: number }>, @@ -54,7 +54,7 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti self.update() } }) - + metataggingUpdated?.addCallback(_ => { self._is_dirty.setData(true) }) @@ -66,7 +66,7 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti const self = this; const layer = this.upstream.layer; const features: { feature: any; freshness: Date }[] = (this.upstream.features.data ?? []); - const includedFeatureIds = new Set(); + const includedFeatureIds = new Set(); const newFeatures = (features ?? []).filter((f) => { self.registerCallback(f.feature) @@ -97,29 +97,29 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti const previousSet = this.previousFeatureSet; this._is_dirty.setData(false) - + // Is there any difference between the two sets? - if(previousSet !== undefined && previousSet.size === includedFeatureIds.size){ + if (previousSet !== undefined && previousSet.size === includedFeatureIds.size) { // The size of the sets is the same - they _might_ be identical const newItemFound = Array.from(includedFeatureIds).some(id => !previousSet.has(id)) - if(!newItemFound){ + if (!newItemFound) { // We know that: // - The sets have the same size // - Every item from the new set has been found in the old set // which means they are identical! return; } - + } - + // Something new has been found! this.features.setData(newFeatures); - + } private registerCallback(feature: any) { const src = this.state?.allElements?.addOrGetElement(feature) - if(src == undefined){ + if (src == undefined) { return } if (this._alreadyRegistered.has(src)) { diff --git a/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts b/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts index 2fa47c2b3..ca5cf703d 100644 --- a/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts +++ b/Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts @@ -65,7 +65,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { for (const kv of change.tags) { feat.tags[kv.k] = kv.v } - const geojson= feat.asGeoJson(); + const geojson = feat.asGeoJson(); allElementStorage.addOrGetElement(geojson) self.features.data.push({feature: geojson, freshness: new Date()}) self.features.ping() @@ -81,7 +81,7 @@ export class NewGeometryFromChangesFeatureSource implements FeatureSource { continue; } - + try { const tags = {} for (const kv of change.tags) { diff --git a/Logic/FeatureSource/Sources/SimpleFeatureSource.ts b/Logic/FeatureSource/Sources/SimpleFeatureSource.ts index 138a3465e..52007d2f5 100644 --- a/Logic/FeatureSource/Sources/SimpleFeatureSource.ts +++ b/Logic/FeatureSource/Sources/SimpleFeatureSource.ts @@ -10,7 +10,7 @@ export default class SimpleFeatureSource implements FeatureSourceForLayer, Tiled public readonly bbox: BBox = BBox.global; public readonly tileIndex: number; - constructor(layer: FilteredLayer, tileIndex: number, featureSource?: UIEventSource<{ feature:any; freshness: Date }[]>) { + constructor(layer: FilteredLayer, tileIndex: number, featureSource?: UIEventSource<{ feature: any; freshness: Date }[]>) { this.name = "SimpleFeatureSource(" + layer.layerDef.id + ")" this.layer = layer this.tileIndex = tileIndex ?? 0; diff --git a/Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts b/Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts index 09b0b5852..7bc3bf924 100644 --- a/Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts @@ -40,7 +40,7 @@ export default class DynamicGeoJsonTileSource extends DynamicTileSource { json => { const data = new Map>(); for (const x in json) { - if(x === "zoom"){ + if (x === "zoom") { continue } data.set(Number(x), new Set(json[x])) @@ -91,7 +91,7 @@ export default class DynamicGeoJsonTileSource extends DynamicTileSource { public static RegisterWhitelist(url: string, json: any) { const data = new Map>(); for (const x in json) { - if(x === "zoom"){ + if (x === "zoom") { continue } data.set(Number(x), new Set(json[x])) diff --git a/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts b/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts index 7019364aa..1b583a175 100644 --- a/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts @@ -44,11 +44,11 @@ export default class DynamicTileSource implements TileHierarchy 10000){ + if (tileRange.total > 10000) { console.error("Got a really big tilerange, bounds and location might be out of sync") return undefined } - + const needed = Tiles.MapRange(tileRange, (x, y) => Tiles.tile_index(zoomlevel, x, y)).filter(i => !self._loadedTiles.has(i)) if (needed.length === 0) { return undefined diff --git a/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts b/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts index b56b1eb14..6561b234d 100644 --- a/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts @@ -45,8 +45,8 @@ export default class FullNodeDatabaseSource implements TileHierarchy([]) - this.parentWays.set(nodeId,src) + const src = new UIEventSource([]) + this.parentWays.set(nodeId, src) src.addCallback(parentWays => { const tgs = nodesById.get(nodeId).tags tgs ["parent_ways"] = JSON.stringify(parentWays.map(w => w.tags)) diff --git a/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts b/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts index 9c3f1fd2d..68190d909 100644 --- a/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts @@ -89,8 +89,8 @@ export default class OsmFeatureSource { if (z > 20) { throw "This is an absurd high zoom level" } - - if( z < 14){ + + if (z < 14) { throw `Zoom ${z} is too much for OSM to handle! Use a higher zoom level!` } diff --git a/Logic/GeoOperations.ts b/Logic/GeoOperations.ts index 0a4152aef..a6f17c773 100644 --- a/Logic/GeoOperations.ts +++ b/Logic/GeoOperations.ts @@ -558,19 +558,19 @@ export class GeoOperations { const prevCoordinate = coordinates[i - 1] const distP = GeoOperations.distanceBetween(coordinate, prevCoordinate) - if(distP < 0.1){ + if (distP < 0.1) { coordinates.splice(i, 1) continue } - - if(i == coordinates.length - 2){ + + if (i == coordinates.length - 2) { const distN = GeoOperations.distanceBetween(coordinate, nextCoordinate) - if(distN < 0.1){ + if (distN < 0.1) { coordinates.splice(i, 1) continue } } - + const bearingN = turf.bearing(coordinate, nextCoordinate) const bearingP = turf.bearing(prevCoordinate, coordinate) const diff = Math.abs(bearingN - bearingP) @@ -683,8 +683,8 @@ export class GeoOperations { throw "CalculateIntersection fallthrough: can not calculate an intersection between features" } - - + + } diff --git a/Logic/MetaTagging.ts b/Logic/MetaTagging.ts index 6479a2221..3cca4b76a 100644 --- a/Logic/MetaTagging.ts +++ b/Logic/MetaTagging.ts @@ -14,6 +14,7 @@ export default class MetaTagging { private static errorPrintCount = 0; private static readonly stopErrorOutputAt = 10; + private static retaggingFuncCache = new Map void)[]>() /** * This method (re)calculates all metatags and calculated tags on every given object. @@ -24,7 +25,7 @@ export default class MetaTagging { public static addMetatags(features: { feature: any; freshness: Date }[], params: ExtraFuncParams, layer: LayerConfig, - state?: {allElements?: ElementStorage}, + state?: { allElements?: ElementStorage }, options?: { includeDates?: true | boolean, includeNonDates?: true | boolean @@ -56,7 +57,7 @@ export default class MetaTagging { const feature = ff.feature const freshness = ff.freshness let somethingChanged = false - let definedTags = new Set(Object.getOwnPropertyNames( feature.properties )) + let definedTags = new Set(Object.getOwnPropertyNames(feature.properties)) for (const metatag of metatagsToApply) { try { if (!metatag.keys.some(key => feature.properties[key] === undefined)) { @@ -65,7 +66,7 @@ export default class MetaTagging { } if (metatag.isLazy) { - if(!metatag.keys.some(key => !definedTags.has(key))) { + if (!metatag.keys.some(key => !definedTags.has(key))) { // All keys are defined - lets skip! continue } @@ -104,7 +105,7 @@ export default class MetaTagging { } return atLeastOneFeatureChanged } - + private static createFunctionsForFeature(layerId: string, calculatedTags: [string, string, boolean][]): ((feature: any) => void)[] { const functions: ((feature: any) => any)[] = []; for (const entry of calculatedTags) { @@ -128,7 +129,7 @@ export default class MetaTagging { delete feat.properties[key] feat.properties[key] = result; return result - }catch(e){ + } catch (e) { if (MetaTagging.errorPrintCount < MetaTagging.stopErrorOutputAt) { console.warn("Could not calculate a " + (isStrict ? "strict " : "") + " calculated tag for key " + key + " defined by " + code + " (in layer" + layerId + ") due to \n" + e + "\n. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", e, e.stack) MetaTagging.errorPrintCount++; @@ -138,10 +139,10 @@ export default class MetaTagging { } return undefined; } - } - - - if(isStrict){ + } + + + if (isStrict) { functions.push(calculateAndAssign) continue } @@ -166,8 +167,6 @@ export default class MetaTagging { return functions; } - private static retaggingFuncCache = new Map void)[]>() - /** * Creates the function which adds all the calculated tags to a feature. Called once per layer * @param layer @@ -182,7 +181,7 @@ export default class MetaTagging { return undefined; } - let functions :((feature: any) => void)[] = MetaTagging.retaggingFuncCache.get(layer.id); + let functions: ((feature: any) => void)[] = MetaTagging.retaggingFuncCache.get(layer.id); if (functions === undefined) { functions = MetaTagging.createFunctionsForFeature(layer.id, calculatedTags) MetaTagging.retaggingFuncCache.set(layer.id, functions) diff --git a/Logic/Osm/Actions/ChangeLocationAction.ts b/Logic/Osm/Actions/ChangeLocationAction.ts index 54141d548..429bfb596 100644 --- a/Logic/Osm/Actions/ChangeLocationAction.ts +++ b/Logic/Osm/Actions/ChangeLocationAction.ts @@ -11,7 +11,7 @@ export default class ChangeLocationAction extends OsmChangeAction { theme: string, reason: string }) { - super(id,true); + super(id, true); if (!id.startsWith("node/")) { throw "Invalid ID: only 'node/number' is accepted" } @@ -19,7 +19,7 @@ export default class ChangeLocationAction extends OsmChangeAction { this._newLonLat = newLonLat; this._meta = meta; } - + protected async CreateChangeDescriptions(changes: Changes): Promise { const d: ChangeDescription = { diff --git a/Logic/Osm/Actions/ChangeTagAction.ts b/Logic/Osm/Actions/ChangeTagAction.ts index 013b90a46..963e8e946 100644 --- a/Logic/Osm/Actions/ChangeTagAction.ts +++ b/Logic/Osm/Actions/ChangeTagAction.ts @@ -19,7 +19,7 @@ export default class ChangeTagAction extends OsmChangeAction { this._currentTags = currentTags; this._meta = meta; } - + /** * Doublechecks that no stupid values are added */ diff --git a/Logic/Osm/Actions/CreateMultiPolygonWithPointReuseAction.ts b/Logic/Osm/Actions/CreateMultiPolygonWithPointReuseAction.ts index 4723a2b11..d5e3f53ec 100644 --- a/Logic/Osm/Actions/CreateMultiPolygonWithPointReuseAction.ts +++ b/Logic/Osm/Actions/CreateMultiPolygonWithPointReuseAction.ts @@ -14,35 +14,36 @@ import {TagUtils} from "../../Tags/TagUtils"; * More or less the same as 'CreateNewWay', except that it'll try to reuse already existing points */ export default class CreateMultiPolygonWithPointReuseAction extends OsmCreateAction { - private readonly _tags: Tag[]; public newElementId: string = undefined; - public newElementIdNumber: number = undefined; + public newElementIdNumber: number = undefined; + private readonly _tags: Tag[]; private readonly createOuterWay: CreateWayWithPointReuseAction - private readonly createInnerWays : CreateNewWayAction[] -private readonly geojsonPreview: any; + private readonly createInnerWays: CreateNewWayAction[] + private readonly geojsonPreview: any; private readonly theme: string; private readonly changeType: "import" | "create" | string; + constructor(tags: Tag[], outerRingCoordinates: [number, number][], - innerRingsCoordinates: [number, number][][], + innerRingsCoordinates: [number, number][][], state: FeaturePipelineState, config: MergePointConfig[], changeType: "import" | "create" | string ) { - super(null,true); - this._tags = [...tags, new Tag("type","multipolygon")]; + super(null, true); + this._tags = [...tags, new Tag("type", "multipolygon")]; this.changeType = changeType; this.theme = state.layoutToUse.id - this. createOuterWay = new CreateWayWithPointReuseAction([], outerRingCoordinates, state, config) - this. createInnerWays = innerRingsCoordinates.map(ringCoordinates => - new CreateNewWayAction([], - ringCoordinates.map(([lon, lat] )=> ({lat, lon})), - {theme: state.layoutToUse.id})) - - this.geojsonPreview = { + this.createOuterWay = new CreateWayWithPointReuseAction([], outerRingCoordinates, state, config) + this.createInnerWays = innerRingsCoordinates.map(ringCoordinates => + new CreateNewWayAction([], + ringCoordinates.map(([lon, lat]) => ({lat, lon})), + {theme: state.layoutToUse.id})) + + this.geojsonPreview = { type: "Feature", properties: TagUtils.changeAsProperties(new And(this._tags).asChange({})), - geometry:{ + geometry: { type: "Polygon", coordinates: [ outerRingCoordinates, @@ -59,7 +60,7 @@ private readonly geojsonPreview: any; freshness: new Date(), feature: this.geojsonPreview }) - return outerPreview + return outerPreview } protected async CreateChangeDescriptions(changes: Changes): Promise { @@ -72,14 +73,14 @@ private readonly geojsonPreview: any; this.newElementIdNumber = changes.getNewID(); - this.newElementId = "relation/"+this.newElementIdNumber + this.newElementId = "relation/" + this.newElementIdNumber descriptions.push({ - type:"relation", + type: "relation", id: this.newElementIdNumber, tags: new And(this._tags).asChange({}), meta: { theme: this.theme, - changeType:this.changeType + changeType: this.changeType }, changes: { members: [ @@ -93,8 +94,8 @@ private readonly geojsonPreview: any; ] } }) - - + + return descriptions } diff --git a/Logic/Osm/Actions/CreateNewNodeAction.ts b/Logic/Osm/Actions/CreateNewNodeAction.ts index 69621a563..beea08298 100644 --- a/Logic/Osm/Actions/CreateNewNodeAction.ts +++ b/Logic/Osm/Actions/CreateNewNodeAction.ts @@ -33,7 +33,7 @@ export default class CreateNewNodeAction extends OsmCreateAction { changeType: "create" | "import" | null, specialMotivation?: string }) { - super(null,basicTags !== undefined && basicTags.length > 0) + super(null, basicTags !== undefined && basicTags.length > 0) this._basicTags = basicTags; this._lat = lat; this._lon = lon; @@ -46,7 +46,7 @@ export default class CreateNewNodeAction extends OsmCreateAction { this.meta = { theme: options.theme, changeType: options.changeType, - + } } diff --git a/Logic/Osm/Actions/CreateNewWayAction.ts b/Logic/Osm/Actions/CreateNewWayAction.ts index ad8d2a2a3..335227c0b 100644 --- a/Logic/Osm/Actions/CreateNewWayAction.ts +++ b/Logic/Osm/Actions/CreateNewWayAction.ts @@ -25,7 +25,7 @@ export default class CreateNewWayAction extends OsmCreateAction { options: { theme: string }) { - super(null,true) + super(null, true) this.coordinates = coordinates; this.tags = tags; this._options = options; @@ -56,7 +56,7 @@ export default class CreateNewWayAction extends OsmCreateAction { const id = changes.getNewID() - this.newElementIdNumber = id + this.newElementIdNumber = id const newWay = { id, type: "way", diff --git a/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts b/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts index a6578dfab..afcdab4a1 100644 --- a/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts +++ b/Logic/Osm/Actions/CreateWayWithPointReuseAction.ts @@ -20,14 +20,14 @@ export interface MergePointConfig { /** * CreateWayWithPointreuse will create a 'CoordinateInfo' for _every_ point in the way to be created. - * + * * The CoordinateInfo indicates the action to take, e.g.: - * + * * - Create a new point * - Reuse an existing OSM point (and don't move it) * - Reuse an existing OSM point (and leave it where it is) * - Reuse another Coordinate info (and don't do anything else with it) - * + * */ interface CoordinateInfo { /** @@ -56,6 +56,8 @@ interface CoordinateInfo { * More or less the same as 'CreateNewWay', except that it'll try to reuse already existing points */ export default class CreateWayWithPointReuseAction extends OsmCreateAction { + public newElementId: string = undefined; + public newElementIdNumber: number = undefined private readonly _tags: Tag[]; /** * lngLat-coordinates @@ -64,20 +66,17 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction { private _coordinateInfo: CoordinateInfo[]; private _state: FeaturePipelineState; private _config: MergePointConfig[]; - - public newElementId: string = undefined; - public newElementIdNumber: number = undefined constructor(tags: Tag[], coordinates: [number, number][], state: FeaturePipelineState, config: MergePointConfig[] ) { - super(null,true); + super(null, true); this._tags = tags; this._state = state; this._config = config; - + // The main logic of this class: the coordinateInfo contains all the changes this._coordinateInfo = this.CalculateClosebyNodes(coordinates); @@ -117,7 +116,7 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction { "move": "yes", "osm-id": reusedPoint.node.properties.id, "id": "new-geometry-move-existing" + i, - "distance":GeoOperations.distanceBetween(coordinateInfo.lngLat, reusedPoint.node.geometry.coordinates) + "distance": GeoOperations.distanceBetween(coordinateInfo.lngLat, reusedPoint.node.geometry.coordinates) }, geometry: { type: "LineString", @@ -136,7 +135,7 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction { "move": "no", "osm-id": reusedPoint.node.properties.id, "id": "new-geometry-reuse-existing" + i, - "distance":GeoOperations.distanceBetween(coordinateInfo.lngLat, reusedPoint.node.geometry.coordinates) + "distance": GeoOperations.distanceBetween(coordinateInfo.lngLat, reusedPoint.node.geometry.coordinates) }, geometry: { type: "LineString", @@ -238,7 +237,7 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction { const newWay = new CreateNewWayAction(this._tags, nodeIdsToUse, { theme }) - + allChanges.push(...(await newWay.CreateChangeDescriptions(changes))) this.newElementId = newWay.newElementId this.newElementIdNumber = newWay.newElementIdNumber @@ -266,7 +265,7 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction { }[] }[] = coordinates.map(_ => undefined) - + // First loop: gather all information... for (let i = 0; i < coordinates.length; i++) { @@ -328,7 +327,7 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction { } - + // Second loop: figure out which point moves where without creating conflicts let conflictFree = true; do { @@ -348,8 +347,8 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction { if (other.closebyNodes === undefined || other.closebyNodes[0] === undefined) { continue } - - if(coorInfo.closebyNodes[0] === undefined){ + + if (coorInfo.closebyNodes[0] === undefined) { continue } diff --git a/Logic/Osm/Actions/DeleteAction.ts b/Logic/Osm/Actions/DeleteAction.ts index a9d404ca3..e5cd05ddb 100644 --- a/Logic/Osm/Actions/DeleteAction.ts +++ b/Logic/Osm/Actions/DeleteAction.ts @@ -26,7 +26,7 @@ export default class DeleteAction extends OsmChangeAction { specialMotivation: string }, hardDelete: boolean) { - super(id,true) + super(id, true) this._id = id; this._hardDelete = hardDelete; this.meta = {...meta, changeType: "deletion"}; @@ -51,7 +51,7 @@ export default class DeleteAction extends OsmChangeAction { return await new ChangeTagAction( this._id, this._softDeletionTags, osmObject.tags, { - ... this.meta, + ...this.meta, changeType: "soft-delete" } ).CreateChangeDescriptions(changes) diff --git a/Logic/Osm/Actions/OsmChangeAction.ts b/Logic/Osm/Actions/OsmChangeAction.ts index dc1a8e591..120870f73 100644 --- a/Logic/Osm/Actions/OsmChangeAction.ts +++ b/Logic/Osm/Actions/OsmChangeAction.ts @@ -7,7 +7,6 @@ import {ChangeDescription} from "./ChangeDescription"; export default abstract class OsmChangeAction { - private isUsed = false public readonly trackStatistics: boolean; /** * The ID of the object that is the center of this change. @@ -15,7 +14,8 @@ export default abstract class OsmChangeAction { * Undefined if such an id does not make sense */ public readonly mainObjectId: string; - + private isUsed = false + constructor(mainObjectId: string, trackStatistics: boolean = true) { this.trackStatistics = trackStatistics; this.mainObjectId = mainObjectId @@ -32,9 +32,9 @@ export default abstract class OsmChangeAction { protected abstract CreateChangeDescriptions(changes: Changes): Promise } -export abstract class OsmCreateAction extends OsmChangeAction{ +export abstract class OsmCreateAction extends OsmChangeAction { - public newElementId : string + public newElementId: string public newElementIdNumber: number - + } diff --git a/Logic/Osm/Actions/RelationSplitHandler.ts b/Logic/Osm/Actions/RelationSplitHandler.ts index 4cc5a0d0e..8e8f081fa 100644 --- a/Logic/Osm/Actions/RelationSplitHandler.ts +++ b/Logic/Osm/Actions/RelationSplitHandler.ts @@ -16,10 +16,11 @@ abstract class AbstractRelationSplitHandler extends OsmChangeAction { protected readonly _theme: string; constructor(input: RelationSplitInput, theme: string) { - super("relation/"+input.relation.id, false) + super("relation/" + input.relation.id, false) this._input = input; this._theme = theme; } + /** * Returns which node should border the member at the given index */ diff --git a/Logic/Osm/Actions/ReplaceGeometryAction.ts b/Logic/Osm/Actions/ReplaceGeometryAction.ts index 876ce2e96..5146e5574 100644 --- a/Logic/Osm/Actions/ReplaceGeometryAction.ts +++ b/Logic/Osm/Actions/ReplaceGeometryAction.ts @@ -468,12 +468,12 @@ export default class ReplaceGeometryAction extends OsmChangeAction { proj.sort((a, b) => { // Sort descending const diff = b.projectAfterIndex - a.projectAfterIndex; - if(diff !== 0){ + if (diff !== 0) { return diff } return b.distance - a.distance; - - + + }) for (const reprojectedNode of proj) { diff --git a/Logic/Osm/Actions/SplitAction.ts b/Logic/Osm/Actions/SplitAction.ts index 3928ed405..0b97e593f 100644 --- a/Logic/Osm/Actions/SplitAction.ts +++ b/Logic/Osm/Actions/SplitAction.ts @@ -26,7 +26,7 @@ export default class SplitAction extends OsmChangeAction { * @param toleranceInMeters: if a splitpoint closer then this amount of meters to an existing point, the existing point will be used to split the line instead of a new point */ constructor(wayId: string, splitPointCoordinates: [number, number][], meta: { theme: string }, toleranceInMeters = 5) { - super(wayId,true) + super(wayId, true) this.wayId = wayId; this._splitPointsCoordinates = splitPointCoordinates this._toleranceInMeters = toleranceInMeters; diff --git a/Logic/Osm/Changes.ts b/Logic/Osm/Changes.ts index 8bcfe9654..f928cc9fd 100644 --- a/Logic/Osm/Changes.ts +++ b/Logic/Osm/Changes.ts @@ -27,16 +27,13 @@ export class Changes { public features = new UIEventSource<{ feature: any, freshness: Date }[]>([]); public readonly pendingChanges: UIEventSource = LocalStorageSource.GetParsed("pending-changes", []) public readonly allChanges = new UIEventSource(undefined) + public readonly state: { allElements: ElementStorage; historicalUserLocations: FeatureSource; osmConnection: OsmConnection } + public readonly extraComment: UIEventSource = new UIEventSource(undefined) private _nextId: number = -1; // Newly assigned ID's are negative private readonly isUploading = new UIEventSource(false); - private readonly previouslyCreated: OsmObject[] = [] private readonly _leftRightSensitive: boolean; - public readonly state: { allElements: ElementStorage; historicalUserLocations: FeatureSource; osmConnection: OsmConnection } - - public readonly extraComment:UIEventSource = new UIEventSource(undefined) - constructor( state?: { allElements: ElementStorage, @@ -107,7 +104,7 @@ export class Changes { * Uploads all the pending changes in one go. * Triggered by the 'PendingChangeUploader'-actor in Actors */ - public async flushChanges(flushreason: string = undefined, openChangeset?: UIEventSource) : Promise{ + public async flushChanges(flushreason: string = undefined, openChangeset?: UIEventSource): Promise { if (this.pendingChanges.data.length === 0) { return; } @@ -116,19 +113,37 @@ export class Changes { return; } - + console.log("Uploading changes due to: ", flushreason) this.isUploading.setData(true) try { const csNumber = await this.flushChangesAsync(openChangeset) this.isUploading.setData(false) - console.log("Changes flushed. Your changeset is "+csNumber); + console.log("Changes flushed. Your changeset is " + csNumber); } catch (e) { this.isUploading.setData(false) console.error("Flushing changes failed due to", e); } } + public async applyAction(action: OsmChangeAction): Promise { + const changeDescriptions = await action.Perform(this) + changeDescriptions[0].meta.distanceToObject = this.calculateDistanceToChanges(action, changeDescriptions) + this.applyChanges(changeDescriptions) + } + + public applyChanges(changes: ChangeDescription[]) { + console.log("Received changes:", changes) + this.pendingChanges.data.push(...changes); + this.pendingChanges.ping(); + this.allChanges.data.push(...changes) + this.allChanges.ping() + } + + public registerIdRewrites(mappings: Map): void { + CreateNewNodeAction.registerIdRewrites(mappings) + } + private calculateDistanceToChanges(change: OsmChangeAction, changeDescriptions: ChangeDescription[]) { const locations = this.state?.historicalUserLocations?.features?.data @@ -140,7 +155,7 @@ export class Changes { // Probably irrelevant, such as a new helper node return; } - + const now = new Date() const recentLocationPoints = locations.map(ff => ff.feature) .filter(feat => feat.geometry.type === "Point") @@ -188,26 +203,6 @@ export class Changes { )) } - public async applyAction(action: OsmChangeAction): Promise { - const changeDescriptions = await action.Perform(this) - changeDescriptions[0].meta.distanceToObject = this.calculateDistanceToChanges(action, changeDescriptions) - this.applyChanges(changeDescriptions) - } - - public applyChanges(changes: ChangeDescription[]) { - console.log("Received changes:", changes) - this.pendingChanges.data.push(...changes); - this.pendingChanges.ping(); - this.allChanges.data.push(...changes) - this.allChanges.ping() - } - - - public registerIdRewrites(mappings: Map): void { - CreateNewNodeAction.registerIdRewrites(mappings) - } - - /** * UPload the selected changes to OSM. * Returns 'true' if successfull and if they can be removed @@ -287,10 +282,10 @@ export class Changes { // This method is only called with changedescriptions for this theme const theme = pending[0].meta.theme let comment = "Adding data with #MapComplete for theme #" + theme - if(this.extraComment.data !== undefined){ - comment+="\n\n"+this.extraComment.data + if (this.extraComment.data !== undefined) { + comment += "\n\n" + this.extraComment.data } - + const metatags: ChangesetTag[] = [{ key: "comment", value: comment @@ -329,10 +324,10 @@ export class Changes { pendingPerTheme.get(theme).push(changeDescription) } - const successes = await Promise.all(Array.from(pendingPerTheme, - async ([theme, pendingChanges]) => { + const successes = await Promise.all(Array.from(pendingPerTheme, + async ([theme, pendingChanges]) => { try { - if(openChangeset === undefined){ + if (openChangeset === undefined) { openChangeset = this.state.osmConnection.GetPreference("current-open-changeset-" + theme).map( str => { const n = Number(str); @@ -342,9 +337,9 @@ export class Changes { return n }, [], n => "" + n ); - console.log("Using current-open-changeset-"+theme+" from the preferences, got "+openChangeset.data) + console.log("Using current-open-changeset-" + theme + " from the preferences, got " + openChangeset.data) } - + return await self.flushSelectChanges(pendingChanges, openChangeset); } catch (e) { console.error("Could not upload some changes:", e) @@ -395,7 +390,7 @@ export class Changes { // Might be a failed fetch for simply this object throw "Did not get an object that should be known: " + id } - if(change.changes === undefined){ + if (change.changes === undefined) { // This object is a change to a newly created object. However, we have not seen the creation changedescription yet! throw "Not a creation of the object" } @@ -522,7 +517,7 @@ export class Changes { }) - console.debug("Calculated the pending changes: ", result.newObjects.length,"new; ", result.modifiedObjects.length,"modified;",result.deletedObjects,"deleted") + console.debug("Calculated the pending changes: ", result.newObjects.length, "new; ", result.modifiedObjects.length, "modified;", result.deletedObjects, "deleted") return result } } \ No newline at end of file diff --git a/Logic/Osm/ChangesetHandler.ts b/Logic/Osm/ChangesetHandler.ts index 5f08a8d05..35266c1b9 100644 --- a/Logic/Osm/ChangesetHandler.ts +++ b/Logic/Osm/ChangesetHandler.ts @@ -61,7 +61,7 @@ export class ChangesetHandler { if (!extraMetaTags.some(tag => tag.key === "comment") || !extraMetaTags.some(tag => tag.key === "theme")) { throw "The meta tags should at least contain a `comment` and a `theme`" } - + if (this.userDetails.data.csCount == 0) { // The user became a contributor! this.userDetails.data.csCount = 1; diff --git a/Logic/Osm/OsmPreferences.ts b/Logic/Osm/OsmPreferences.ts index 356615fe7..3a212ade5 100644 --- a/Logic/Osm/OsmPreferences.ts +++ b/Logic/Osm/OsmPreferences.ts @@ -122,6 +122,34 @@ export class OsmPreferences { return pref; } + public ClearPreferences() { + let isRunning = false; + const self = this; + this.preferences.addCallbackAndRun(prefs => { + if (Object.keys(prefs).length == 0) { + return; + } + if (isRunning) { + return + } + isRunning = true + const prefixes = ["mapcomplete-installed-theme", "mapcomplete-installed-themes-", "mapcomplete-current-open-changeset", "mapcomplete-personal-theme-layer"] + for (const key in prefs) { + for (const prefix of prefixes) { + // console.log(key) + if (key.startsWith(prefix)) { + console.log("Clearing ", key) + self.GetPreference(key, "").setData("") + + } + } + } + isRunning = false; + return true; + + }) + } + private UpdatePreferences() { const self = this; this.auth.xhr({ @@ -184,34 +212,6 @@ export class OsmPreferences { console.debug(`Preference ${k} written!`); }); } - - public ClearPreferences(){ - let isRunning = false; - const self = this; - this.preferences.addCallbackAndRun(prefs => { - if(Object.keys(prefs).length == 0){ - return; - } - if (isRunning) { - return - } - isRunning = true - const prefixes = ["mapcomplete-installed-theme","mapcomplete-installed-themes-","mapcomplete-current-open-changeset","mapcomplete-personal-theme-layer"] - for (const key in prefs) { - for (const prefix of prefixes) { - // console.log(key) - if (key.startsWith(prefix)) { - console.log("Clearing ", key) - self.GetPreference(key, "").setData("") - - } - } - } - isRunning = false; - return true; - - }) - } } \ No newline at end of file diff --git a/Logic/SimpleMetaTagger.ts b/Logic/SimpleMetaTagger.ts index f0b28605d..b15e7e1e0 100644 --- a/Logic/SimpleMetaTagger.ts +++ b/Logic/SimpleMetaTagger.ts @@ -125,7 +125,8 @@ export default class SimpleMetaTaggers { return changed } ) - + public static readonly lazyTags: string[] = [].concat(...SimpleMetaTaggers.metatags.filter(tagger => tagger.isLazy) + .map(tagger => tagger.keys)); private static readonly cardinalDirections = { N: 0, NNE: 22.5, NE: 45, ENE: 67.5, E: 90, ESE: 112.5, SE: 135, SSE: 157.5, @@ -290,27 +291,27 @@ export default class SimpleMetaTaggers { // isOpen is irrelevant return false } - if(feature.properties.opening_hours === "24/7"){ + if (feature.properties.opening_hours === "24/7") { feature.properties._isOpen = "yes" return true; } - + Object.defineProperty(feature.properties, "_isOpen", { enumerable: false, configurable: true, get: () => { - if(feature.properties.id === "node/7464543832"){ - console.log("Getting _isOpen for ", feature.properties.i) + if (feature.properties.id === "node/7464543832") { + console.log("Getting _isOpen for ", feature.properties.i) } delete feature.properties._isOpen feature.properties._isOpen = undefined const tagsSource = state.allElements.getEventSourceById(feature.properties.id); tagsSource.addCallbackAndRunD(tags => { // Install a listener to the tags... - if (tags.opening_hours === undefined){ + if (tags.opening_hours === undefined) { return; } - if(tags._country === undefined) { + if (tags._country === undefined) { return; } try { @@ -322,7 +323,7 @@ export default class SimpleMetaTaggers { country_code: tags._country.toLowerCase() } }, {tag_key: "opening_hours"}); - + // AUtomatically triggered on the next change (and a bit below) const updateTags = () => { const oldValueIsOpen = tags["_isOpen"]; @@ -442,8 +443,6 @@ export default class SimpleMetaTaggers { SimpleMetaTaggers.geometryType ]; - public static readonly lazyTags: string[] = [].concat(...SimpleMetaTaggers.metatags.filter(tagger => tagger.isLazy) - .map(tagger => tagger.keys)); /** * Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme. diff --git a/Logic/State/ElementsState.ts b/Logic/State/ElementsState.ts index 8167f7cb2..496d1fd51 100644 --- a/Logic/State/ElementsState.ts +++ b/Logic/State/ElementsState.ts @@ -49,7 +49,7 @@ export default class ElementsState extends FeatureSwitchState { super(layoutToUse); // @ts-ignore - this.changes = new Changes(this,layoutToUse?.isLeftRightSensitive() ?? false) + this.changes = new Changes(this, layoutToUse?.isLeftRightSensitive() ?? false) { // -- Location control initialization const zoom = UIEventSource.asFloat( diff --git a/Logic/State/FeaturePipelineState.ts b/Logic/State/FeaturePipelineState.ts index 35d43bb9d..2c2c2a81f 100644 --- a/Logic/State/FeaturePipelineState.ts +++ b/Logic/State/FeaturePipelineState.ts @@ -20,7 +20,8 @@ export default class FeaturePipelineState extends MapState { */ public readonly featurePipeline: FeaturePipeline; private readonly featureAggregator: TileHierarchyAggregator; -private readonly metatagRecalculator : MetaTagRecalculator + private readonly metatagRecalculator: MetaTagRecalculator + constructor(layoutToUse: LayoutConfig) { super(layoutToUse); @@ -33,21 +34,21 @@ private readonly metatagRecalculator : MetaTagRecalculator * We are a bit in a bind: * There is the featurePipeline, which creates some sources during construction * THere is the metatagger, which needs to have these sources registered AND which takes a FeaturePipeline as argument - * + * * This is a bit of a catch-22 (except that it isn't) - * The sources that are registered in the constructor are saved into 'registeredSources' temporary - * + * The sources that are registered in the constructor are saved into 'registeredSources' temporary + * */ const sourcesToRegister = [] - - function registerRaw(source: FeatureSourceForLayer & Tiled){ - if(self.metatagRecalculator === undefined){ + + function registerRaw(source: FeatureSourceForLayer & Tiled) { + if (self.metatagRecalculator === undefined) { sourcesToRegister.push(source) - }else{ + } else { self.metatagRecalculator.registerSource(source) } } - + function registerSource(source: FeatureSourceForLayer & Tiled) { clusterCounter.addTile(source) @@ -127,7 +128,7 @@ private readonly metatagRecalculator : MetaTagRecalculator this.metatagRecalculator.registerSource(this.currentView, true) sourcesToRegister.forEach(source => self.metatagRecalculator.registerSource(source)) - + new SelectedFeatureHandler(Hash.hash, this) this.AddClusteringToMap(this.leafletMap) diff --git a/Logic/State/MapState.ts b/Logic/State/MapState.ts index b5e7bb178..48e145d35 100644 --- a/Logic/State/MapState.ts +++ b/Logic/State/MapState.ts @@ -223,7 +223,7 @@ export default class MapState extends UserRelatedState { private initGpsLocation() { // Initialize the gps layer data. This is emtpy for now, the actual writing happens in the Geolocationhandler let gpsLayerDef: FilteredLayer = this.filteredLayers.data.filter(l => l.layerDef.id === "gps_location")[0] - if(gpsLayerDef === undefined){ + if (gpsLayerDef === undefined) { return } this.currentUserLocation = new SimpleFeatureSource(gpsLayerDef, Tiles.tile_index(0, 0, 0)); @@ -269,7 +269,7 @@ export default class MapState extends UserRelatedState { let gpsLayerDef: FilteredLayer = this.filteredLayers.data.filter(l => l.layerDef.id === "gps_location_history")[0] - if(gpsLayerDef !== undefined){ + if (gpsLayerDef !== undefined) { this.historicalUserLocations = new SimpleFeatureSource(gpsLayerDef, Tiles.tile_index(0, 0, 0), features); } @@ -299,7 +299,7 @@ export default class MapState extends UserRelatedState { }] }) let gpsLineLayerDef: FilteredLayer = this.filteredLayers.data.filter(l => l.layerDef.id === "gps_track")[0] - if(gpsLineLayerDef !== undefined){ + if (gpsLineLayerDef !== undefined) { this.historicalUserLocationsTrack = new SimpleFeatureSource(gpsLineLayerDef, Tiles.tile_index(0, 0, 0), asLine); } } diff --git a/Logic/State/UserRelatedState.ts b/Logic/State/UserRelatedState.ts index 8e0e2ce3a..663edc0d2 100644 --- a/Logic/State/UserRelatedState.ts +++ b/Logic/State/UserRelatedState.ts @@ -96,14 +96,14 @@ export default class UserRelatedState extends ElementsState { // We wait till we are logged in return } - - if(self.osmConnection.isLoggedIn.data == false){ + + if (self.osmConnection.isLoggedIn.data == false) { return; } if (currentThemes.some(installed => installed.id === this.layoutToUse.id)) { // Already added to the 'installed theme' list - return; + return; } console.log("Current installed themes are", this.installedThemes.data) @@ -115,13 +115,11 @@ export default class UserRelatedState extends ElementsState { }) self.installedThemes.ping() console.log("Registered " + self.layoutToUse.id + " as installed themes") - + }) } - - // Important: the favourite layers are initialized _after_ the installed themes, as these might contain an installedTheme this.favouriteLayers = LocalStorageSource.Get("favouriteLayers") .syncWith(this.osmConnection.GetLongPreference("favouriteLayers")) diff --git a/Logic/Tags/And.ts b/Logic/Tags/And.ts index d3a1cbac6..3a4a8e20f 100644 --- a/Logic/Tags/And.ts +++ b/Logic/Tags/And.ts @@ -117,7 +117,7 @@ export class And extends TagsFilter { } return result; } - + AsJson() { return { and: this.and.map(a => a.AsJson()) diff --git a/Logic/Tags/ComparingTag.ts b/Logic/Tags/ComparingTag.ts index c09b19fcc..36979f71b 100644 --- a/Logic/Tags/ComparingTag.ts +++ b/Logic/Tags/ComparingTag.ts @@ -38,7 +38,7 @@ export default class ComparingTag implements TagsFilter { usedKeys(): string[] { return [this._key]; } - + AsJson() { return this.asHumanString(false, false, {}) } diff --git a/Logic/Tags/Or.ts b/Logic/Tags/Or.ts index d7d0788b4..341cfc030 100644 --- a/Logic/Tags/Or.ts +++ b/Logic/Tags/Or.ts @@ -65,7 +65,7 @@ export class Or extends TagsFilter { } return result; } - + AsJson() { return { or: this.or.map(o => o.AsJson()) diff --git a/Logic/Tags/Tag.ts b/Logic/Tags/Tag.ts index bdf3235ad..d2fd818e3 100644 --- a/Logic/Tags/Tag.ts +++ b/Logic/Tags/Tag.ts @@ -46,13 +46,13 @@ export class Tag extends TagsFilter { if (shorten) { v = Utils.EllipsesAfter(v, 25); } - if(v === "" || v === undefined){ + if (v === "" || v === undefined) { // This tag will be removed if in the properties, so we indicate this with special rendering - if(currentProperties !== undefined && (currentProperties[this.key] ?? "") === ""){ + if (currentProperties !== undefined && (currentProperties[this.key] ?? "") === "") { // This tag is not present in the current properties, so this tag doesn't change anything return "" } - return ""+this.key+"" + return "" + this.key + "" } if (linkToWiki) { return `${this.key}` + @@ -83,7 +83,7 @@ export class Tag extends TagsFilter { asChange(properties: any): { k: string; v: string }[] { return [{k: this.key, v: this.value}]; } - + AsJson() { return this.asHumanString(false, false) } diff --git a/Logic/Tags/TagUtils.ts b/Logic/Tags/TagUtils.ts index d5b532119..e5e48f5b0 100644 --- a/Logic/Tags/TagUtils.ts +++ b/Logic/Tags/TagUtils.ts @@ -245,7 +245,7 @@ export class TagUtils { } return new RegexTag( split[0], - new RegExp("^" + split[1] + "$"), + new RegExp("^" + split[1] + "$"), true ); } diff --git a/Logic/UIEventSource.ts b/Logic/UIEventSource.ts index e5b92efef..b0646b117 100644 --- a/Logic/UIEventSource.ts +++ b/Logic/UIEventSource.ts @@ -11,7 +11,7 @@ export class UIEventSource { constructor(data: T, tag: string = "") { this.tag = tag; this.data = data; - if(tag === undefined || tag === ""){ + if (tag === undefined || tag === "") { const callstack = new Error().stack.split("\n") this.tag = callstack[1] } @@ -42,7 +42,7 @@ export class UIEventSource { source.addCallback((latestData) => { sink.setData(latestData?.data); latestData.addCallback(data => { - if(source.data !== latestData){ + if (source.data !== latestData) { return true; } sink.setData(data) @@ -243,8 +243,8 @@ export class UIEventSource { } } let endTime = new Date().getTime() / 1000 - if((endTime - startTime) > 500){ - console.trace("Warning: a ping of ",this.tag," took more then 500ms; this is probably a performance issue") + if ((endTime - startTime) > 500) { + console.trace("Warning: a ping of ", this.tag, " took more then 500ms; this is probably a performance issue") } if (toDelete !== undefined) { for (const toDeleteElement of toDelete) { @@ -297,10 +297,10 @@ export class UIEventSource { const stack = new Error().stack.split("\n"); const callee = stack[1] - + const newSource = new UIEventSource( f(this.data), - "map(" + this.tag + ")@"+callee + "map(" + this.tag + ")@" + callee ); const update = function () { diff --git a/Logic/Web/IdbLocalStorage.ts b/Logic/Web/IdbLocalStorage.ts index 28300a305..1a7ac4544 100644 --- a/Logic/Web/IdbLocalStorage.ts +++ b/Logic/Web/IdbLocalStorage.ts @@ -7,24 +7,24 @@ import {Utils} from "../../Utils"; */ export class IdbLocalStorage { - - public static Get(key: string, options?: { defaultValue?: T , whenLoaded?: (t: T) => void}): UIEventSource{ - const src = new UIEventSource(options?.defaultValue, "idb-local-storage:"+key) - if(Utils.runningFromConsole){ + + public static Get(key: string, options?: { defaultValue?: T, whenLoaded?: (t: T) => void }): UIEventSource { + const src = new UIEventSource(options?.defaultValue, "idb-local-storage:" + key) + if (Utils.runningFromConsole) { return src; } idb.get(key).then(v => { src.setData(v ?? options?.defaultValue); - if(options?.whenLoaded !== undefined){ + if (options?.whenLoaded !== undefined) { options?.whenLoaded(v) } }) src.addCallback(v => idb.set(key, v)) return src; - + } - - public static SetDirectly(key: string, value){ + + public static SetDirectly(key: string, value) { idb.set(key, value) } diff --git a/Logic/Web/QueryParameters.ts b/Logic/Web/QueryParameters.ts index 9824145c5..489b14cb3 100644 --- a/Logic/Web/QueryParameters.ts +++ b/Logic/Web/QueryParameters.ts @@ -7,15 +7,12 @@ import {Utils} from "../../Utils"; export class QueryParameters { + static defaults = {} + static documentation = {} private static order: string [] = ["layout", "test", "z", "lat", "lon"]; private static _wasInitialized: Set = new Set() private static knownSources = {}; private static initialized = false; - static defaults = {} - - static documentation = {} - - public static GetQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource { if (!this.initialized) { @@ -40,7 +37,6 @@ export class QueryParameters { } - public static wasInitialized(key: string): boolean { return QueryParameters._wasInitialized.has(key) } diff --git a/Models/Constants.ts b/Models/Constants.ts index 6feb4f669..28823b1a9 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -19,13 +19,13 @@ export default class Constants { public static readonly added_by_default: string[] = ["gps_location", "gps_location_history", "home_location", "gps_track"] - public static readonly no_include: string[] = ["conflation", "left_right_style", "split_point","current_view","matchpoint"] + public static readonly no_include: string[] = ["conflation", "left_right_style", "split_point", "current_view", "matchpoint"] /** * Layer IDs of layers which have special properties through built-in hooks */ - public static readonly priviliged_layers: string[] = [...Constants.added_by_default, "type_node", "note","import_candidate", ...Constants.no_include] + public static readonly priviliged_layers: string[] = [...Constants.added_by_default, "type_node", "note", "import_candidate", ...Constants.no_include] + - // The user journey states thresholds when a new feature gets unlocked public static userJourney = { moreScreenUnlock: 1, @@ -54,13 +54,13 @@ export default class Constants { * The point closest to the changed feature will be considered and this distance will be tracked. * ALl these distances are used to calculate a nearby-score */ - static nearbyVisitTime: number= 30 * 60; + static nearbyVisitTime: number = 30 * 60; /** * If a user makes a change, the distance to the changed object is calculated. * If a user makes multiple changes, all these distances are put into multiple bins, depending on this distance. * For every bin, the totals are uploaded as metadata */ - static distanceToChangeObjectBins = [25,50,100,500,1000,5000, Number.MAX_VALUE] + static distanceToChangeObjectBins = [25, 50, 100, 500, 1000, 5000, Number.MAX_VALUE] static themeOrder = ["personal", "cyclofix", "hailhydrant", "bookcases", "toilets", "aed"]; private static isRetina(): boolean { diff --git a/Models/FilteredLayer.ts b/Models/FilteredLayer.ts index 0c4e163a3..6890915f8 100644 --- a/Models/FilteredLayer.ts +++ b/Models/FilteredLayer.ts @@ -3,7 +3,8 @@ import LayerConfig from "./ThemeConfig/LayerConfig"; import {TagsFilter} from "../Logic/Tags/TagsFilter"; export interface FilterState { - currentFilter: TagsFilter, state: string | number + currentFilter: TagsFilter, + state: string | number } export default interface FilteredLayer { diff --git a/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts b/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts index 0491fb696..c65580285 100644 --- a/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts +++ b/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts @@ -12,7 +12,7 @@ export default class CreateNoteImportLayer extends Conversion r!== null && r["location"] !== undefined); - const firstRender = (pointRenderings [0]) + + const pointRenderings = (layerJson.mapRendering ?? []).filter(r => r !== null && r["location"] !== undefined); + const firstRender = (pointRenderings [0]) const icon = firstRender.icon const iconBadges = [] const title = layer.presets[0].title - if(icon !== undefined){ + if (icon !== undefined) { iconBadges.push({ - if: {and:[]}, - then:icon + if: {and: []}, + then: icon }) } - + const importButton = {} { - const translations = t.importButton.Subs({layerId: layer.id, title: layer.presets[0].title}).translations + const translations = t.importButton.Subs({layerId: layer.id, title: layer.presets[0].title}).translations for (const key in translations) { - importButton[key] = "{"+translations[key]+"}" - } + importButton[key] = "{" + translations[key] + "}" + } } - - function embed(prefix, translation: Translation, postfix){ + + function embed(prefix, translation: Translation, postfix) { const result = {} for (const language in translation.translations) { - result[language] = prefix+translation.translations[language] + postfix + result[language] = prefix + translation.translations[language] + postfix } return result } - - const result : LayerConfigJson = { - "id": "note_import_"+layer.id, + + const result: LayerConfigJson = { + "id": "note_import_" + layer.id, // By disabling the name, the import-layers won't pollute the filter view "name": t.layerName.Subs({title: layer.title.render}).translations, "description": t.description.Subs({title: layer.title.render}).translations, "source": { @@ -81,7 +81,7 @@ export default class CreateNoteImportLayer extends Conversion { convert(state: DesugaringContext, json: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors: string[]; warnings: string[] } { const errors = [] const warnings = [] - + json = {...json} const allLayers: LayerConfigJson[] = json.layers; json.layers = [...json.layers] - + const creator = new CreateNoteImportLayer() for (let i1 = 0; i1 < allLayers.length; i1++) { const layer = allLayers[i1]; @@ -191,10 +190,10 @@ export class AddMiniMap extends DesugaringStep { static hasMinimap(renderingConfig: TagRenderingConfigJson): boolean { const translations: any[] = Utils.NoNull([renderingConfig.render, ...(renderingConfig.mappings ?? []).map(m => m.then)]); for (let translation of translations) { - if(typeof translation == "string"){ + if (typeof translation == "string") { translation = {"*": translation} } - + for (const key in translation) { if (!translation.hasOwnProperty(key)) { continue @@ -341,7 +340,7 @@ export class PrepareTheme extends Fuse { constructor() { super( "Fully prepares and expands a theme", - + new OnEveryConcat("layers", new SubstituteLayer()), new SetDefault("socialImage", "assets/SocialImage.png", true), new OnEvery("layers", new PrepareLayer()), diff --git a/Models/ThemeConfig/DependencyCalculator.ts b/Models/ThemeConfig/DependencyCalculator.ts index 93a3ed131..c4d3663d3 100644 --- a/Models/ThemeConfig/DependencyCalculator.ts +++ b/Models/ThemeConfig/DependencyCalculator.ts @@ -8,7 +8,7 @@ export default class DependencyCalculator { public static GetTagRenderingDependencies(tr: TagRenderingConfig): string[] { - if(tr === undefined){ + if (tr === undefined) { throw "Got undefined tag rendering in getTagRenderingDependencies" } const deps: string[] = [] @@ -74,11 +74,11 @@ export default class DependencyCalculator { getFeatureById: _ => undefined, getFeaturesWithin: (layerId, _) => { - if(layerId === '*'){ + if (layerId === '*') { // This is a wildcard return [] } - + // The important line: steal the dependencies! deps.push({ neededLayer: layerId, reason: "A calculated tag loads features from this layer", diff --git a/Models/ThemeConfig/Json/FilterConfigJson.ts b/Models/ThemeConfig/Json/FilterConfigJson.ts index 25bcd1ea8..be1bc7e68 100644 --- a/Models/ThemeConfig/Json/FilterConfigJson.ts +++ b/Models/ThemeConfig/Json/FilterConfigJson.ts @@ -12,8 +12,8 @@ export default interface FilterConfigJson { * Filtering is done based on the given osmTags that are compared to the objects in that layer. */ options: { - question: string | any; - osmTags?: AndOrTagConfigJson | string, + question: string | any; + osmTags?: AndOrTagConfigJson | string, fields?: { name: string, type?: string | "string" diff --git a/Models/ThemeConfig/Json/LayerConfigJson.ts b/Models/ThemeConfig/Json/LayerConfigJson.ts index 6cc02f195..e425d4cac 100644 --- a/Models/ThemeConfig/Json/LayerConfigJson.ts +++ b/Models/ThemeConfig/Json/LayerConfigJson.ts @@ -84,13 +84,13 @@ export interface LayerConfigJson { * * The specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features), * the expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded. - * + * * If a tag has to be evaluated strictly, use ':=' instead: - * + * * [ * "_some_key:=some_javascript_expression" * ] - * + * */ calculatedTags?: string[]; @@ -124,7 +124,7 @@ export interface LayerConfigJson { * can be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it) */ shownByDefault?: true | boolean; - + /** * The zoom level at which point the data is hidden again * Default: 100 (thus: always visible diff --git a/Models/ThemeConfig/Json/TagRenderingConfigJson.ts b/Models/ThemeConfig/Json/TagRenderingConfigJson.ts index 75f91018c..d47a7b047 100644 --- a/Models/ThemeConfig/Json/TagRenderingConfigJson.ts +++ b/Models/ThemeConfig/Json/TagRenderingConfigJson.ts @@ -9,7 +9,7 @@ export interface TagRenderingConfigJson { /** * The id of the tagrendering, should be an unique string. * Used to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise. - * + * * Use 'questions' to trigger the question box of this group (if a group is defined) */ id?: string, diff --git a/Models/ThemeConfig/LayerConfig.ts b/Models/ThemeConfig/LayerConfig.ts index fabbd47b6..065c0b74d 100644 --- a/Models/ThemeConfig/LayerConfig.ts +++ b/Models/ThemeConfig/LayerConfig.ts @@ -67,9 +67,9 @@ export default class LayerConfig extends WithContextLoader { context = context + "." + json.id; super(json, context) this.id = json.id; - - if(json.id === undefined){ - throw "Not a valid layer: id is undefined: "+JSON.stringify(json) + + if (json.id === undefined) { + throw "Not a valid layer: id is undefined: " + JSON.stringify(json) } if (json.source === undefined) { @@ -259,7 +259,7 @@ export default class LayerConfig extends WithContextLoader { } - this.titleIcons = this.ParseTagRenderings(( json.titleIcons), { + this.titleIcons = this.ParseTagRenderings((json.titleIcons), { readOnlyMode: true }); @@ -375,9 +375,9 @@ export default class LayerConfig extends WithContextLoader { return [ new Combine([ new Link( - "", - "https://taginfo.openstreetmap.org/keys/"+values.key+"#values" - ),Link.OsmWiki(values.key) + "", + "https://taginfo.openstreetmap.org/keys/" + values.key + "#values" + ), Link.OsmWiki(values.key) ]), values.type === undefined ? "Multiple choice" : new Link(values.type, "../SpecialInputElements.md#" + values.type), new Combine(embedded) diff --git a/Models/ThemeConfig/LayoutConfig.ts b/Models/ThemeConfig/LayoutConfig.ts index 763782532..4fb833612 100644 --- a/Models/ThemeConfig/LayoutConfig.ts +++ b/Models/ThemeConfig/LayoutConfig.ts @@ -54,12 +54,12 @@ export default class LayoutConfig { constructor(json: LayoutConfigJson, official = true, context?: string) { this.official = official; this.id = json.id; - if(official){ - if(json.id.toLowerCase() !== json.id){ - throw "The id of a theme should be lowercase: "+json.id + if (official) { + if (json.id.toLowerCase() !== json.id) { + throw "The id of a theme should be lowercase: " + json.id } - if(json.id.match(/[a-z0-9-_]/) == null){ - throw "The id of a theme should match [a-z0-9-_]*: "+json.id + if (json.id.match(/[a-z0-9-_]/) == null) { + throw "The id of a theme should match [a-z0-9-_]*: " + json.id } } context = (context ?? "") + "." + this.id; @@ -102,9 +102,9 @@ export default class LayoutConfig { this.descriptionTail = json.descriptionTail === undefined ? undefined : new Translation(json.descriptionTail, context + ".descriptionTail"); this.icon = json.icon; this.socialImage = json.socialImage; - if(this.socialImage === null || this.socialImage === "" || this.socialImage === undefined){ - if(official){ - throw "Theme "+json.id+" has no social image defined" + if (this.socialImage === null || this.socialImage === "" || this.socialImage === undefined) { + if (official) { + throw "Theme " + json.id + " has no social image defined" } } this.startZoom = json.startZoom; diff --git a/Models/ThemeConfig/LineRenderingConfig.ts b/Models/ThemeConfig/LineRenderingConfig.ts index f2eed60d1..6b7f8082b 100644 --- a/Models/ThemeConfig/LineRenderingConfig.ts +++ b/Models/ThemeConfig/LineRenderingConfig.ts @@ -44,7 +44,9 @@ export default class LineRenderingConfig extends WithContextLoader { if (tags === undefined) { return deflt } - if(tr === undefined){return deflt} + if (tr === undefined) { + return deflt + } const str = tr?.GetRenderValue(tags)?.txt ?? deflt; if (str === "") { return deflt @@ -59,7 +61,7 @@ export default class LineRenderingConfig extends WithContextLoader { "--catch-detail-color" ); } - + const style = { color, dashArray, @@ -73,13 +75,13 @@ export default class LineRenderingConfig extends WithContextLoader { if (fillStr !== undefined && fillStr !== "") { style["fill"] = fillStr === "yes" || fillStr === "true" } - + const fillColorStr = render(this.fillColor, undefined) - if(fillColorStr !== undefined){ + if (fillColorStr !== undefined) { style["fillColor"] = fillColorStr } return style - + } } \ No newline at end of file diff --git a/Models/ThemeConfig/PointRenderingConfig.ts b/Models/ThemeConfig/PointRenderingConfig.ts index 650dd5066..ac957a985 100644 --- a/Models/ThemeConfig/PointRenderingConfig.ts +++ b/Models/ThemeConfig/PointRenderingConfig.ts @@ -69,7 +69,7 @@ export default class PointRenderingConfig extends WithContextLoader { if (iconPath !== undefined && iconPath.startsWith(Utils.assets_path)) { const iconKey = iconPath.substr(Utils.assets_path.length); if (Svg.All[iconKey] === undefined) { - throw context+": builtin SVG asset not found: " + iconPath; + throw context + ": builtin SVG asset not found: " + iconPath; } } this.iconSize = this.tr("iconSize", "40,40,center"); @@ -209,16 +209,16 @@ export default class PointRenderingConfig extends WithContextLoader { } else { iconAndBadges.SetClass("w-full h-full") } - + let label = this.GetLabel(tags) - let htmlEl : BaseUIElement; - if(icon === undefined && label === undefined){ + let htmlEl: BaseUIElement; + if (icon === undefined && label === undefined) { htmlEl = undefined - }else if(icon === undefined){ + } else if (icon === undefined) { htmlEl = new Combine([label]) - }else if(label === undefined){ - htmlEl = new Combine([iconAndBadges]) - }else { + } else if (label === undefined) { + htmlEl = new Combine([iconAndBadges]) + } else { htmlEl = new Combine([iconAndBadges, label]).SetStyle("flex flex-col") } diff --git a/Models/ThemeConfig/TagRenderingConfig.ts b/Models/ThemeConfig/TagRenderingConfig.ts index f85f6b19a..c8da02f33 100644 --- a/Models/ThemeConfig/TagRenderingConfig.ts +++ b/Models/ThemeConfig/TagRenderingConfig.ts @@ -45,6 +45,7 @@ export default class TagRenderingConfig { readonly hideInAnswer: boolean | TagsFilter readonly addExtraTags: Tag[] }[] + constructor(json: string | TagRenderingConfigJson, context?: string) { if (json === undefined) { throw "Initing a TagRenderingConfig with undefined in " + context; @@ -373,8 +374,8 @@ export default class TagRenderingConfig { return mapping.then; } if (mapping.if.matchesProperties(tags)) { - if(this.id === "uk_addresses_placename"){ - console.log("Matched",mapping.if,"with ",tags["addr:place"]) + if (this.id === "uk_addresses_placename") { + console.log("Matched", mapping.if, "with ", tags["addr:place"]) } return mapping.then; } @@ -487,12 +488,11 @@ export default class TagRenderingConfig { mappings = new List( this.mappings.map(m => { let txt = "**" + m.then.txt + "** corresponds with " + m.if.asHumanString(true, false, {}); - if(m.hideInAnswer === true) - { + if (m.hideInAnswer === true) { txt += "_This option cannot be chosen as answer_" } - if(m.ifnot !== undefined){ - txt += "Unselecting this answer will add "+m.ifnot.asHumanString(true, false, {}) + if (m.ifnot !== undefined) { + txt += "Unselecting this answer will add " + m.ifnot.asHumanString(true, false, {}) } return txt; } diff --git a/README.md b/README.md index a7640a580..900dd00c1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,8 @@ sent back to directly to OpenStreetMap. Furthermore, it shows images present in the `image` tag or, if a `wikidata` or `wikimedia_commons`-tag is present, it follows those to get these images too. -**An explicit non-goal** of MapComplete is to modify geometries of ways, especially generic geometry-editing. (Splitting roads is possible and in some restricted themes is geometry-conflation possible too) +**An explicit non-goal** of MapComplete is to modify geometries of ways, especially generic geometry-editing. (Splitting +roads is possible and in some restricted themes is geometry-conflation possible too) **More about MapComplete:** [Watch Pieter's talk on the 2021 State Of The Map Conference](https://media.ccc.de/v/sotm2021-9448-introduction-and-review-of-mapcomplete) ([YouTube](https://www.youtube.com/watch?v=zTtMn6fNbYY)) diff --git a/UI/AllThemesGui.ts b/UI/AllThemesGui.ts index fb3bf2fdb..eb5e738f1 100644 --- a/UI/AllThemesGui.ts +++ b/UI/AllThemesGui.ts @@ -11,7 +11,6 @@ import FeaturedMessage from "./BigComponents/FeaturedMessage"; import Toggle from "./Input/Toggle"; import {SubtleButton} from "./Base/SubtleButton"; import {VariableUiElement} from "./Base/VariableUIElement"; -import Title from "./Base/Title"; import Svg from "../Svg"; export default class AllThemesGui { @@ -36,12 +35,12 @@ export default class AllThemesGui { new SubtleButton(undefined, Translations.t.index.logIn).SetStyle("height:min-content").onClick(() => state.osmConnection.AttemptLogin()), state.osmConnection.isLoggedIn), new VariableUiElement(state.osmConnection.userDetails.map(ud => { - if(ud.csCount < Constants.userJourney.importHelperUnlock){ + if (ud.csCount < Constants.userJourney.importHelperUnlock) { return undefined; } return new Combine([ - new SubtleButton( undefined, Translations.t.importHelper.title, {url: "import_helper.html"}), - new SubtleButton( Svg.note_svg(), Translations.t.importInspector.title, {url: "import_viewer.html"}) + new SubtleButton(undefined, Translations.t.importHelper.title, {url: "import_helper.html"}), + new SubtleButton(Svg.note_svg(), Translations.t.importInspector.title, {url: "import_viewer.html"}) ]).SetClass("p-4 border-2 border-gray-500 m-4 block") })), Translations.t.general.aboutMapcomplete diff --git a/UI/AutomatonGui.ts b/UI/AutomatonGui.ts index 6bcafbd73..385a354e9 100644 --- a/UI/AutomatonGui.ts +++ b/UI/AutomatonGui.ts @@ -30,7 +30,7 @@ import DynamicGeoJsonTileSource from "../Logic/FeatureSource/TiledFeatureSource/ import * as themeOverview from "../assets/generated/theme_overview.json" -class AutomationPanel extends Combine{ +class AutomationPanel extends Combine { private static readonly openChangeset = new UIEventSource(undefined); constructor(layoutToUse: LayoutConfig, indices: number[], extraCommentText: UIEventSource, tagRenderingToAutomate: { layer: LayerConfig, tagRendering: TagRenderingConfig }) { @@ -39,10 +39,10 @@ class AutomationPanel extends Combine{ const tileState = LocalStorageSource.GetParsed("automation-tile_state-" + layerId + "-" + trId, {}) const logMessages = new UIEventSource([]) if (indices === undefined) { - throw ("No tiles loaded - can not automate") + throw ("No tiles loaded - can not automate") } const openChangeset = AutomationPanel.openChangeset; - + openChangeset.addCallbackAndRun(cs => console.trace("Sync current open changeset to:", cs)) const nextTileToHandle = tileState.map(handledTiles => { @@ -62,22 +62,22 @@ class AutomationPanel extends Combine{ if (tileIndex === undefined) { return new FixedUiElement("All done!").SetClass("thanks") } - console.warn("Triggered map on nextTileToHandle",tileIndex) + console.warn("Triggered map on nextTileToHandle", tileIndex) const start = new Date() return AutomationPanel.TileHandler(layoutToUse, tileIndex, layerId, tagRenderingToAutomate.tagRendering, extraCommentText, openChangeset, (result, logMessage) => { - const end = new Date() - const timeNeeded = (end.getTime() - start.getTime()) / 1000; - neededTimes.data.push(timeNeeded) - neededTimes.ping() - tileState.data[tileIndex] = result - tileState.ping(); - if(logMessage !== undefined){ - logMessages.data.push(logMessage) - logMessages.ping(); - } - }); + const end = new Date() + const timeNeeded = (end.getTime() - start.getTime()) / 1000; + neededTimes.data.push(timeNeeded) + neededTimes.ping() + tileState.data[tileIndex] = result + tileState.ping(); + if (logMessage !== undefined) { + logMessages.data.push(logMessage) + logMessages.ping(); + } + }); })) @@ -102,27 +102,27 @@ class AutomationPanel extends Combine{ ]).SetClass("flex flex-col") })) - super([statistics, automaton, - new SubtleButton(undefined, "Clear fixed").onClick(() => { + super([statistics, automaton, + new SubtleButton(undefined, "Clear fixed").onClick(() => { const st = tileState.data - for (const tileIndex in st) { - if(st[tileIndex] === "fixed"){ - delete st[tileIndex] - } - } - - tileState.ping(); - }), - new VariableUiElement(logMessages.map(logMessages => new List(logMessages)))]) - this.SetClass("flex flex-col") + for (const tileIndex in st) { + if (st[tileIndex] === "fixed") { + delete st[tileIndex] + } + } + + tileState.ping(); + }), + new VariableUiElement(logMessages.map(logMessages => new List(logMessages)))]) + this.SetClass("flex flex-col") } - private static TileHandler(layoutToUse: LayoutConfig, tileIndex: number, targetLayer: string, targetAction: TagRenderingConfig, extraCommentText: UIEventSource, + private static TileHandler(layoutToUse: LayoutConfig, tileIndex: number, targetLayer: string, targetAction: TagRenderingConfig, extraCommentText: UIEventSource, openChangeset: UIEventSource, whenDone: ((result: string, logMessage?: string) => void)): BaseUIElement { const state = new MapState(layoutToUse, {attemptLogin: false}) - extraCommentText.syncWith( state.changes.extraComment) + extraCommentText.syncWith(state.changes.extraComment) const [z, x, y] = Tiles.tile_from_index(tileIndex) state.locationControl.setData({ zoom: z, @@ -176,7 +176,7 @@ class AutomationPanel extends Combine{ const feature = ffs.feature const renderingTr = targetAction.GetRenderValue(feature.properties) const rendering = renderingTr.txt - log.push(""+feature.properties.id+": "+new SubstitutedTranslation(renderingTr, new UIEventSource(feature.properties), undefined).ConstructElement().innerText) + log.push("" + feature.properties.id + ": " + new SubstitutedTranslation(renderingTr, new UIEventSource(feature.properties), undefined).ConstructElement().innerText) const actions = Utils.NoNull(SubstitutedTranslation.ExtractSpecialComponents(rendering) .map(obj => obj.special)) for (const action of actions) { @@ -201,11 +201,11 @@ class AutomationPanel extends Combine{ } if (handled === 0) { - whenDone("no-action","Inspected "+inspected+" elements: "+log.join("; ")) - }else{ + whenDone("no-action", "Inspected " + inspected + " elements: " + log.join("; ")) + } else { state.osmConnection.AttemptLogin() state.changes.flushChanges("handled tile automatically, time to flush!", openChangeset) - whenDone("fixed", "Updated " + handled+" elements, inspected "+inspected+": "+log.join("; ")) + whenDone("fixed", "Updated " + handled + " elements, inspected " + inspected + ": " + log.join("; ")) } return true; @@ -219,7 +219,6 @@ class AutomationPanel extends Combine{ } - class AutomatonGui { constructor() { @@ -242,7 +241,7 @@ class AutomatonGui { AutomatonGui.GenerateMainPanel(), new SubtleButton(Svg.osm_logo_svg(), "Login to get started").onClick(() => osmConnection.AttemptLogin()), osmConnection.isLoggedIn - )]) .SetClass("block p-4") + )]).SetClass("block p-4") .AttachTo("main") } @@ -250,7 +249,7 @@ class AutomatonGui { private static GenerateMainPanel(): BaseUIElement { const themeSelect = new DropDown("Select a theme", - Array.from(themeOverview).map(l => ({value: l.id, shown: l.id})) + Array.from(themeOverview).map(l => ({value: l.id, shown: l.id})) ) LocalStorageSource.Get("automation-theme-id", "missing_streets").syncWith(themeSelect.GetValue()) @@ -262,24 +261,24 @@ class AutomatonGui { tilepath.SetClass("w-full") LocalStorageSource.Get("automation-tile_path").syncWith(tilepath.GetValue(), true) - + let tilesToRunOver = tilepath.GetValue().bind(path => { if (path === undefined) { return undefined } - return UIEventSource.FromPromiseWithErr(Utils.downloadJsonCached(path,1000*60*60)) + return UIEventSource.FromPromiseWithErr(Utils.downloadJsonCached(path, 1000 * 60 * 60)) }) - + const targetZoom = 14 const tilesPerIndex = tilesToRunOver.map(tiles => { - + if (tiles === undefined || tiles["error"] !== undefined) { return undefined } - let indexes : number[] = []; + let indexes: number[] = []; const tilesS = tiles["success"] - DynamicGeoJsonTileSource.RegisterWhitelist(tilepath.GetValue().data , tilesS) + DynamicGeoJsonTileSource.RegisterWhitelist(tilepath.GetValue().data, tilesS) const z = Number(tilesS["zoom"]) for (const key in tilesS) { if (key === "zoom") { @@ -315,7 +314,7 @@ class AutomatonGui { tilepath, "Add an extra comment:", extraComment, - new VariableUiElement(extraComment.GetValue().map(c => "Your comment is "+(c?.length??0)+"/200 characters long")).SetClass("subtle"), + new VariableUiElement(extraComment.GetValue().map(c => "Your comment is " + (c?.length ?? 0) + "/200 characters long")).SetClass("subtle"), new VariableUiElement(tilesToRunOver.map(t => { if (t === undefined) { return "No path given or still loading..." diff --git a/UI/Base/Combine.ts b/UI/Base/Combine.ts index cead86ecb..87eb30f5b 100644 --- a/UI/Base/Combine.ts +++ b/UI/Base/Combine.ts @@ -31,6 +31,10 @@ export default class Combine extends BaseUIElement { } } + public getElements(): BaseUIElement[] { + return this.uiElements + } + protected InnerConstructElement(): HTMLElement { const el = document.createElement("span") try { @@ -57,9 +61,5 @@ export default class Combine extends BaseUIElement { return el; } - public getElements(): BaseUIElement[] { - return this.uiElements - } - } \ No newline at end of file diff --git a/UI/Base/Img.ts b/UI/Base/Img.ts index c2d85768a..96d93593e 100644 --- a/UI/Base/Img.ts +++ b/UI/Base/Img.ts @@ -29,6 +29,18 @@ export default class Img extends BaseUIElement { return ``; } + AsMarkdown(): string { + if (this._rawSvg === true) { + console.warn("Converting raw svgs to markdown is not supported"); + return undefined + } + let src = this._src + if (this._src.startsWith("./")) { + src = "https://mapcomplete.osm.be/" + src + } + return "![](" + src + ")"; + } + protected InnerConstructElement(): HTMLElement { const self = this; if (this._rawSvg) { @@ -53,17 +65,5 @@ export default class Img extends BaseUIElement { } return el; } - - AsMarkdown(): string { - if (this._rawSvg === true) { - console.warn("Converting raw svgs to markdown is not supported"); - return undefined - } - let src = this._src - if (this._src.startsWith("./")) { - src = "https://mapcomplete.osm.be/" + src - } - return "![](" + src + ")"; - } } diff --git a/UI/Base/LeftIndex.ts b/UI/Base/LeftIndex.ts index 6c734ab01..9cd61c6c2 100644 --- a/UI/Base/LeftIndex.ts +++ b/UI/Base/LeftIndex.ts @@ -2,15 +2,15 @@ import BaseUIElement from "../BaseUIElement"; import Combine from "./Combine"; import BackToIndex from "../BigComponents/BackToIndex"; -export default class LeftIndex extends Combine{ - - - constructor(leftContents: BaseUIElement[], mainContent: BaseUIElement, options?:{ - hideBackButton : false | boolean - } ) { - - let back : BaseUIElement = undefined; - if(options?.hideBackButton ?? true){ +export default class LeftIndex extends Combine { + + + constructor(leftContents: BaseUIElement[], mainContent: BaseUIElement, options?: { + hideBackButton: false | boolean + }) { + + let back: BaseUIElement = undefined; + if (options?.hideBackButton ?? true) { back = new BackToIndex() } super([ @@ -21,5 +21,5 @@ export default class LeftIndex extends Combine{ ]) this.SetClass("h-full block md:flex") } - + } \ No newline at end of file diff --git a/UI/Base/Link.ts b/UI/Base/Link.ts index bfcb268e9..d0c40faa4 100644 --- a/UI/Base/Link.ts +++ b/UI/Base/Link.ts @@ -19,6 +19,17 @@ export default class Link extends BaseUIElement { } + public static OsmWiki(key: string, value?: string, hideKey = false) { + if (value !== undefined) { + let k = ""; + if (!hideKey) { + k = key + "=" + } + return new Link(k + value, `https://wiki.openstreetmap.org/wiki/Tag:${key}%3D${value}`) + } + return new Link(key, "https://wiki.openstreetmap.org/wiki/Key:" + key) + } + AsMarkdown(): string { // @ts-ignore return `[${this._embeddedShow.AsMarkdown()}](${this._href.data ?? this._href})`; @@ -44,15 +55,4 @@ export default class Link extends BaseUIElement { return el; } - public static OsmWiki(key: string, value?: string, hideKey = false) { - if (value !== undefined) { - let k = ""; - if (!hideKey) { - k = key + "=" - } - return new Link(k + value, `https://wiki.openstreetmap.org/wiki/Tag:${key}%3D${value}`) - } - return new Link(key, "https://wiki.openstreetmap.org/wiki/Key:" + key) - } - } \ No newline at end of file diff --git a/UI/Base/Minimap.ts b/UI/Base/Minimap.ts index 09f11130a..03480a61c 100644 --- a/UI/Base/Minimap.ts +++ b/UI/Base/Minimap.ts @@ -34,6 +34,9 @@ export default class Minimap { * importing leaflet crashes node-ts, which is pretty annoying considering the fact that a lot of scripts use it */ + private constructor() { + } + /** * Construct a minimap */ @@ -41,8 +44,5 @@ export default class Minimap { throw "CreateMinimap hasn't been initialized yet. Please call MinimapImplementation.initialize()" } - private constructor() { - } - } \ No newline at end of file diff --git a/UI/Base/MinimapImplementation.ts b/UI/Base/MinimapImplementation.ts index ec7a8499b..a9d97e2a0 100644 --- a/UI/Base/MinimapImplementation.ts +++ b/UI/Base/MinimapImplementation.ts @@ -16,15 +16,15 @@ import AvailableBaseLayersImplementation from "../../Logic/Actors/AvailableBaseL export default class MinimapImplementation extends BaseUIElement implements MinimapObj { private static _nextId = 0; public readonly leafletMap: UIEventSource + public readonly location: UIEventSource; + public readonly bounds: UIEventSource | undefined; private readonly _id: string; private readonly _background: UIEventSource; - public readonly location: UIEventSource; private _isInited = false; private _allowMoving: boolean; private readonly _leafletoptions: any; private readonly _onFullyLoaded: (leaflet: L.Map) => void private readonly _attribution: BaseUIElement | boolean; - public readonly bounds: UIEventSource | undefined; private readonly _addLayerControl: boolean; private readonly _options: MinimapOptions; diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts index 4d2db1bae..66cdd4455 100644 --- a/UI/Base/ScrollableFullScreen.ts +++ b/UI/Base/ScrollableFullScreen.ts @@ -43,7 +43,7 @@ export default class ScrollableFullScreen extends UIElement { const self = this; Hash.hash.addCallback(h => { - if(h === undefined){ + if (h === undefined) { isShown.setData(false) } }) @@ -55,18 +55,17 @@ export default class ScrollableFullScreen extends UIElement { self.Activate(); } else { // Some cleanup... - + const fs = document.getElementById("fullscreen"); - if(fs !== null){ + if (fs !== null) { ScrollableFullScreen.empty.AttachTo("fullscreen") fs.classList.add("hidden") } - + ScrollableFullScreen._currentlyOpen?.isShown?.setData(false); } }) - - + } diff --git a/UI/Base/TableOfContents.ts b/UI/Base/TableOfContents.ts index d80f63156..3a3555093 100644 --- a/UI/Base/TableOfContents.ts +++ b/UI/Base/TableOfContents.ts @@ -22,7 +22,7 @@ export default class TableOfContents extends Combine { } else { titles = elements ?? [] } - + let els: { level: number, content: BaseUIElement }[] = [] for (const title of titles) { let content: BaseUIElement @@ -33,9 +33,9 @@ export default class TableOfContents extends Combine { content = new FixedUiElement(title.title.content) } else if (Utils.runningFromConsole) { content = new FixedUiElement(title.AsMarkdown()) - } else if(title["title"] !== undefined) { + } else if (title["title"] !== undefined) { content = new FixedUiElement(title.title.ConstructElement().innerText) - }else{ + } else { console.log("Not generating a title for ", title) continue } diff --git a/UI/Base/Title.ts b/UI/Base/Title.ts index f187818bc..8c4d3f8f1 100644 --- a/UI/Base/Title.ts +++ b/UI/Base/Title.ts @@ -3,12 +3,11 @@ import {FixedUiElement} from "./FixedUiElement"; import {Utils} from "../../Utils"; export default class Title extends BaseUIElement { + private static readonly defaultClassesPerLevel = ["", "text-3xl font-bold", "text-2xl font-bold", "text-xl font-bold", "text-lg font-bold"] public readonly title: BaseUIElement; public readonly level: number; public readonly id: string - private static readonly defaultClassesPerLevel = ["", "text-3xl font-bold", "text-2xl font-bold", "text-xl font-bold", "text-lg font-bold"] - constructor(embedded: string | BaseUIElement, level: number = 3) { super() if (embedded === undefined) { diff --git a/UI/Base/Toggleable.ts b/UI/Base/Toggleable.ts index ea821577d..848fc80b6 100644 --- a/UI/Base/Toggleable.ts +++ b/UI/Base/Toggleable.ts @@ -33,19 +33,19 @@ export default class Toggleable extends Combine { title.SetClass("background-subtle rounded-lg") const self = this this.onClick(() => { - if(self.isVisible.data){ - if(options?.closeOnClick ?? true){ + if (self.isVisible.data) { + if (options?.closeOnClick ?? true) { self.isVisible.setData(false) } - }else{ + } else { self.isVisible.setData(true) } }) const contentElement = content.ConstructElement() - - if(title instanceof Combine){ - for(const el of title.getElements()){ - if(el instanceof Title){ + + if (title instanceof Combine) { + for (const el of title.getElements()) { + if (el instanceof Title) { title = el; break; } @@ -54,7 +54,7 @@ export default class Toggleable extends Combine { if (title instanceof Title) { Hash.hash.addCallbackAndRun(h => { - if (h === ( title).id) { + if (h === (<Title>title).id) { self.isVisible.setData(true) content.RemoveClass("border-gray-300") content.SetClass("border-red-300") @@ -82,9 +82,9 @@ export default class Toggleable extends Combine { }) } - public Collapse() : Toggleable{ + public Collapse(): Toggleable { this.isVisible.setData(false) return this; } - + } \ No newline at end of file diff --git a/UI/Base/VariableUIElement.ts b/UI/Base/VariableUIElement.ts index 8427170de..55538f2ce 100644 --- a/UI/Base/VariableUIElement.ts +++ b/UI/Base/VariableUIElement.ts @@ -15,6 +15,17 @@ export class VariableUiElement extends BaseUIElement { this.isDestroyed = true; } + AsMarkdown(): string { + const d = this._contents.data; + if (typeof d === "string") { + return d; + } + if (d instanceof BaseUIElement) { + return d.AsMarkdown() + } + return new Combine(<BaseUIElement[]>d).AsMarkdown() + } + protected InnerConstructElement(): HTMLElement { const el = document.createElement("span"); const self = this; @@ -47,15 +58,4 @@ export class VariableUiElement extends BaseUIElement { }); return el; } - - AsMarkdown(): string { - const d = this._contents.data; - if (typeof d === "string") { - return d; - } - if (d instanceof BaseUIElement) { - return d.AsMarkdown() - } - return new Combine(<BaseUIElement[]>d).AsMarkdown() - } } diff --git a/UI/BaseUIElement.ts b/UI/BaseUIElement.ts index eb33637a8..4b431959b 100644 --- a/UI/BaseUIElement.ts +++ b/UI/BaseUIElement.ts @@ -8,10 +8,10 @@ import {Utils} from "../Utils"; export default abstract class BaseUIElement { protected _constructedHtmlElement: HTMLElement; + protected isDestroyed = false; private clss: Set<string> = new Set<string>(); private style: string; private _onClick: () => void; - protected isDestroyed = false; public onClick(f: (() => void)) { this._onClick = f; @@ -148,10 +148,10 @@ export default abstract class BaseUIElement { } public AsMarkdown(): string { - throw "AsMarkdown is not implemented by " + this.constructor.name+"; implement it in the subclass" + throw "AsMarkdown is not implemented by " + this.constructor.name + "; implement it in the subclass" } - - public Destroy(){ + + public Destroy() { this.isDestroyed = true; } diff --git a/UI/BigComponents/AddNewMarker.ts b/UI/BigComponents/AddNewMarker.ts index ccee99b50..a8e9a141a 100644 --- a/UI/BigComponents/AddNewMarker.ts +++ b/UI/BigComponents/AddNewMarker.ts @@ -27,8 +27,8 @@ export default class AddNewMarker extends Combine { } } } - if(icons.length === 0){ - return undefined + if (icons.length === 0) { + return undefined } if (icons.length === 1) { return icons[0] diff --git a/UI/BigComponents/BackToIndex.ts b/UI/BigComponents/BackToIndex.ts index 648bd90bf..40f866bc4 100644 --- a/UI/BigComponents/BackToIndex.ts +++ b/UI/BigComponents/BackToIndex.ts @@ -1,20 +1,19 @@ import {SubtleButton} from "../Base/SubtleButton"; -import Combine from "../Base/Combine"; import Svg from "../../Svg"; import Translations from "../i18n/Translations"; import BaseUIElement from "../BaseUIElement"; export default class BackToIndex extends SubtleButton { - - constructor(message? : string | BaseUIElement) { + + constructor(message?: string | BaseUIElement) { super( Svg.back_svg().SetStyle("height: 1.5rem;"), - message ?? Translations.t.general.backToMapcomplete, + message ?? Translations.t.general.backToMapcomplete, { url: "index.html" } ) } - - + + } \ No newline at end of file diff --git a/UI/BigComponents/BackgroundMapSwitch.ts b/UI/BigComponents/BackgroundMapSwitch.ts index b675567fd..fa601b3d3 100644 --- a/UI/BigComponents/BackgroundMapSwitch.ts +++ b/UI/BigComponents/BackgroundMapSwitch.ts @@ -84,7 +84,7 @@ class SingleLayerSelectionButton extends Toggle { previousLayer.setData(previousLayer.data ?? available.data) options.currentBackground.setData(previousLayer.data) }) - + options.currentBackground.addCallbackAndRunD(background => { if (background.category === options.preferredType) { previousLayer.setData(background) @@ -103,9 +103,9 @@ class SingleLayerSelectionButton extends Toggle { // The previously used layer doesn't match the current layer -> no need to switch return; } - + // Is the previous layer still valid? If so, we don't bother to switch - if(previousLayer.data.feature === null || GeoOperations.inside(locationControl.data, previousLayer.data.feature)){ + if (previousLayer.data.feature === null || GeoOperations.inside(locationControl.data, previousLayer.data.feature)) { return } diff --git a/UI/BigComponents/CopyrightPanel.ts b/UI/BigComponents/CopyrightPanel.ts index 187d21e36..ec1b1cfd0 100644 --- a/UI/BigComponents/CopyrightPanel.ts +++ b/UI/BigComponents/CopyrightPanel.ts @@ -22,15 +22,15 @@ import Constants from "../../Models/Constants"; import ContributorCount from "../../Logic/ContributorCount"; export class OpenIdEditor extends VariableUiElement { - constructor(state : {locationControl: UIEventSource<Loc>}, iconStyle? : string, objectId?: string) { + constructor(state: { locationControl: UIEventSource<Loc> }, iconStyle?: string, objectId?: string) { const t = Translations.t.general.attribution super(state.locationControl.map(location => { let elementSelect = ""; - if(objectId !== undefined){ - const parts = objectId.split("/") + if (objectId !== undefined) { + const parts = objectId.split("/") const tp = parts[0] - if(parts.length === 2 && !isNaN(Number(parts[1])) && (tp === "node" || tp === "way" || tp === "relation")){ - elementSelect = "&"+ tp+"="+parts[1] + if (parts.length === 2 && !isNaN(Number(parts[1])) && (tp === "node" || tp === "way" || tp === "relation")) { + elementSelect = "&" + tp + "=" + parts[1] } } const idLink = `https://www.openstreetmap.org/edit?editor=id${elementSelect}#map=${location?.zoom ?? 0}/${location?.lat ?? 0}/${location?.lon ?? 0}` @@ -41,9 +41,9 @@ export class OpenIdEditor extends VariableUiElement { } export class OpenMapillary extends VariableUiElement { - constructor(state : {locationControl: UIEventSource<Loc>}, iconStyle? : string) { + constructor(state: { locationControl: UIEventSource<Loc> }, iconStyle?: string) { const t = Translations.t.general.attribution - super( state.locationControl.map(location => { + super(state.locationControl.map(location => { const mapillaryLink = `https://www.mapillary.com/app/?focus=map&lat=${location?.lat ?? 0}&lng=${location?.lon ?? 0}&z=${Math.max((location?.zoom ?? 2) - 1, 1)}` return new SubtleButton(Svg.mapillary_black_ui().SetStyle(iconStyle), t.openMapillary, { url: mapillaryLink, @@ -55,13 +55,13 @@ export class OpenMapillary extends VariableUiElement { export class OpenJosm extends Combine { - constructor(state : {osmConnection: OsmConnection, currentBounds: UIEventSource<BBox>,}, iconStyle? : string) { - const t = Translations.t.general.attribution - + constructor(state: { osmConnection: OsmConnection, currentBounds: UIEventSource<BBox>, }, iconStyle?: string) { + const t = Translations.t.general.attribution + const josmState = new UIEventSource<string>(undefined) // Reset after 15s josmState.stabilized(15000).addCallbackD(_ => josmState.setData(undefined)) - + const stateIndication = new VariableUiElement(josmState.map(state => { if (state === undefined) { return undefined @@ -72,23 +72,23 @@ export class OpenJosm extends Combine { } return t.josmNotOpened.SetClass("alert") })); - - const toggle = new Toggle( - new SubtleButton(Svg.josm_logo_ui().SetStyle(iconStyle), t.editJosm).onClick(() => { - const bounds: any = state.currentBounds.data; - if (bounds === undefined) { - return undefined - } - const top = bounds.getNorth(); - const bottom = bounds.getSouth(); - const right = bounds.getEast(); - const left = bounds.getWest(); - const josmLink = `http://127.0.0.1:8111/load_and_zoom?left=${left}&right=${right}&top=${top}&bottom=${bottom}` - Utils.download(josmLink).then(answer => josmState.setData(answer.replace(/\n/g, '').trim())).catch(_ => josmState.setData("ERROR")) - }), undefined, state.osmConnection.userDetails.map(ud => ud.loggedIn && ud.csCount >= Constants.userJourney.historyLinkVisible)) + + const toggle = new Toggle( + new SubtleButton(Svg.josm_logo_ui().SetStyle(iconStyle), t.editJosm).onClick(() => { + const bounds: any = state.currentBounds.data; + if (bounds === undefined) { + return undefined + } + const top = bounds.getNorth(); + const bottom = bounds.getSouth(); + const right = bounds.getEast(); + const left = bounds.getWest(); + const josmLink = `http://127.0.0.1:8111/load_and_zoom?left=${left}&right=${right}&top=${top}&bottom=${bottom}` + Utils.download(josmLink).then(answer => josmState.setData(answer.replace(/\n/g, '').trim())).catch(_ => josmState.setData("ERROR")) + }), undefined, state.osmConnection.userDetails.map(ud => ud.loggedIn && ud.csCount >= Constants.userJourney.historyLinkVisible)) super([stateIndication, toggle]); - + } @@ -112,7 +112,7 @@ export default class CopyrightPanel extends Combine { const t = Translations.t.general.attribution const layoutToUse = state.layoutToUse - const iconStyle = "height: 1.5rem; width: auto" + const iconStyle = "height: 1.5rem; width: auto" const actionButtons = [ new SubtleButton(Svg.liberapay_ui().SetStyle(iconStyle), t.donate, { url: "https://liberapay.com/pietervdvn/", @@ -139,11 +139,11 @@ export default class CopyrightPanel extends Combine { maintainer = Translations.t.general.attribution.themeBy.Subs({author: layoutToUse.maintainer}) } - const contributions = new ContributorCount(state).Contributors - + const contributions = new ContributorCount(state).Contributors + super([ Translations.t.general.attribution.attributionContent, - new FixedUiElement("MapComplete "+Constants.vNumber).SetClass("font-bold"), + new FixedUiElement("MapComplete " + Constants.vNumber).SetClass("font-bold"), maintainer, new Combine(actionButtons).SetClass("block w-full"), new FixedUiElement(layoutToUse.credits), diff --git a/UI/BigComponents/FeaturedMessage.ts b/UI/BigComponents/FeaturedMessage.ts index f1a3af01e..aa3e2cf7d 100644 --- a/UI/BigComponents/FeaturedMessage.ts +++ b/UI/BigComponents/FeaturedMessage.ts @@ -33,12 +33,12 @@ export default class FeaturedMessage extends Combine { public static WelcomeMessages(): { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] { const all_messages: { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] = [] - - const themesById = new Map<string, {id: string, title: any, shortDescription: any}>(); + + const themesById = new Map<string, { id: string, title: any, shortDescription: any }>(); for (const theme of themeOverview["default"]) { themesById.set(theme.id, theme); } - + for (const i in welcome_messages) { if (isNaN(Number(i))) { continue @@ -78,9 +78,9 @@ export default class FeaturedMessage extends Combine { const msg = new FixedUiElement(welcome_message.message).SetClass("link-underline font-lg") els.push(new Combine([title, msg]).SetClass("m-4")) if (welcome_message.featured_theme !== undefined) { - + const theme = themeOverview["default"].filter(th => th.id === welcome_message.featured_theme)[0]; - + els.push(MoreScreen.createLinkButton({}, theme) .SetClass("m-4 self-center md:w-160") .SetStyle("height: min-content;")) diff --git a/UI/BigComponents/FilterView.ts b/UI/BigComponents/FilterView.ts index 678203e69..fe1ecec8e 100644 --- a/UI/BigComponents/FilterView.ts +++ b/UI/BigComponents/FilterView.ts @@ -145,14 +145,14 @@ export default class FilterView extends VariableUiElement { if (layer.filters.length === 0) { return undefined; } - - - const toShow : BaseUIElement [] = [] + + + const toShow: BaseUIElement [] = [] for (const filter of layer.filters) { - + const [ui, actualTags] = FilterView.createFilter(filter) - + ui.SetClass("mt-3") toShow.push(ui) actualTags.addCallback(tagsToFilterFor => { @@ -161,15 +161,15 @@ export default class FilterView extends VariableUiElement { }) flayer.appliedFilters.map(dict => dict.get(filter.id)) .addCallbackAndRun(filters => actualTags.setData(filters)) - - + + } return new Combine(toShow) .SetClass("flex flex-col ml-8 bg-gray-300 rounded-xl p-2") } - + // Filter which uses one or more textfields private static createFilterWithFields(filterConfig: FilterConfig): [BaseUIElement, UIEventSource<FilterState>] { @@ -191,7 +191,7 @@ export default class FilterView extends VariableUiElement { allValid = allValid.map(previous => previous && field.IsValid(stable.data) && stable.data !== "", [stable]) } const tr = new SubstitutedTranslation(filter.question, new UIEventSource<any>({id: filterConfig.id}), State.state, mappings) - const trigger : UIEventSource<FilterState>= allValid.map(isValid => { + const trigger: UIEventSource<FilterState> = allValid.map(isValid => { if (!isValid) { return undefined } @@ -204,9 +204,9 @@ export default class FilterView extends VariableUiElement { } for (const key in props) { - v = (<string>v).replace("{"+key+"}", props[key]) + v = (<string>v).replace("{" + key + "}", props[key]) } - + return v } ) @@ -216,11 +216,11 @@ export default class FilterView extends VariableUiElement { state: JSON.stringify(props) } }, [properties]) - + return [tr, trigger]; } - - private static createCheckboxFilter(filterConfig: FilterConfig): [BaseUIElement, UIEventSource<FilterState>] { + + private static createCheckboxFilter(filterConfig: FilterConfig): [BaseUIElement, UIEventSource<FilterState>] { let option = filterConfig.options[0]; const icon = Svg.checkbox_filled_svg().SetClass("block mr-2 w-6"); @@ -233,21 +233,25 @@ export default class FilterView extends VariableUiElement { .ToggleOnClick() .SetClass("block m-1") - return [toggle, toggle.isEnabled.map(enabled => enabled ? {currentFilter: option.osmTags, state: "true"} : undefined, [], + return [toggle, toggle.isEnabled.map(enabled => enabled ? { + currentFilter: option.osmTags, + state: "true" + } : undefined, [], f => f !== undefined) ] } + private static createMultiFilter(filterConfig: FilterConfig): [BaseUIElement, UIEventSource<FilterState>] { let options = filterConfig.options; - const values : FilterState[] = options.map((f, i) => ({ + const values: FilterState[] = options.map((f, i) => ({ currentFilter: f.osmTags, state: i })) - let filterPicker : InputElement<number> - - if(options.length <= 6){ - filterPicker = new RadioButton( + let filterPicker: InputElement<number> + + if (options.length <= 6) { + filterPicker = new RadioButton( options.map( (option, i) => new FixedInputElement(option.question.Clone().SetClass("block"), i) @@ -256,25 +260,26 @@ export default class FilterView extends VariableUiElement { dontStyle: true } ); - }else{ + } else { filterPicker = new DropDown("", options.map((option, i) => ({ value: i, shown: option.question.Clone() }))) } - + return [filterPicker, filterPicker.GetValue().map( i => values[i], [], selected => { const v = selected?.state - if(v === undefined || typeof v === "string"){ + if (v === undefined || typeof v === "string") { return undefined } return v } )] } + private static createFilter(filterConfig: FilterConfig): [BaseUIElement, UIEventSource<FilterState>] { if (filterConfig.options[0].fields.length > 0) { @@ -283,7 +288,7 @@ export default class FilterView extends VariableUiElement { if (filterConfig.options.length === 1) { - return FilterView.createCheckboxFilter(filterConfig) + return FilterView.createCheckboxFilter(filterConfig) } return FilterView.createMultiFilter(filterConfig) diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts index 957998b2e..9654eef1c 100644 --- a/UI/BigComponents/FullWelcomePaneWithTabs.ts +++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts @@ -92,7 +92,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { ) } tabs.push(copyright) - + const privacy = { header: Svg.eye_svg(), content: new PrivacyPolicy() diff --git a/UI/BigComponents/Histogram.ts b/UI/BigComponents/Histogram.ts index 919f8f516..81daeef55 100644 --- a/UI/BigComponents/Histogram.ts +++ b/UI/BigComponents/Histogram.ts @@ -22,12 +22,12 @@ export default class Histogram<T> extends VariableUiElement { constructor(values: UIEventSource<string[]>, title: string | BaseUIElement, countTitle: string | BaseUIElement, - options?:{ - assignColor?: (t0: string) => string, + options?: { + assignColor?: (t0: string) => string, sortMode?: "name" | "name-rev" | "count" | "count-rev" } ) { - const sortMode = new UIEventSource<"name" | "name-rev" | "count" | "count-rev">(options?.sortMode ??"name") + const sortMode = new UIEventSource<"name" | "name-rev" | "count" | "count-rev">(options?.sortMode ?? "name") const sortName = new VariableUiElement(sortMode.map(m => { switch (m) { case "name": diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts index e3dc0b151..389aa5597 100644 --- a/UI/BigComponents/LeftControls.ts +++ b/UI/BigComponents/LeftControls.ts @@ -50,7 +50,7 @@ export default class LeftControls extends Combine { } return new Lazy(() => { const tagsSource = state.allElements.getEventSourceById(feature.properties.id) - return new FeatureInfoBox(tagsSource, currentViewFL.layerDef,state, "currentview", guiState.currentViewControlIsOpened) + return new FeatureInfoBox(tagsSource, currentViewFL.layerDef, state, "currentview", guiState.currentViewControlIsOpened) .SetClass("md:floating-element-width") }) })) diff --git a/UI/BigComponents/LicensePicker.ts b/UI/BigComponents/LicensePicker.ts index 7afe4d827..19c608141 100644 --- a/UI/BigComponents/LicensePicker.ts +++ b/UI/BigComponents/LicensePicker.ts @@ -10,26 +10,26 @@ export default class LicensePicker extends DropDown<string> { private static readonly ccbysa = "CC-BY-SA 4.0" private static readonly ccby = "CC-BY 4.0" - constructor(state: {osmConnection: OsmConnection}) { + constructor(state: { osmConnection: OsmConnection }) { super(Translations.t.image.willBePublished.Clone(), [ - {value:LicensePicker. cc0, shown: Translations.t.image.cco.Clone()}, - {value:LicensePicker. ccbysa, shown: Translations.t.image.ccbs.Clone()}, - {value: LicensePicker. ccby, shown: Translations.t.image.ccb.Clone()} + {value: LicensePicker.cc0, shown: Translations.t.image.cco.Clone()}, + {value: LicensePicker.ccbysa, shown: Translations.t.image.ccbs.Clone()}, + {value: LicensePicker.ccby, shown: Translations.t.image.ccb.Clone()} ], state?.osmConnection?.GetPreference("pictures-license") ?? new UIEventSource<string>("CC0") ) this.SetClass("flex flex-col sm:flex-row").SetStyle("float:left"); } - public static LicenseExplanations() : Map<string, Translation>{ + public static LicenseExplanations(): Map<string, Translation> { let dict = new Map<string, Translation>(); - - dict.set(LicensePicker. cc0, Translations.t.image.ccoExplanation) - dict.set(LicensePicker. ccby, Translations.t.image.ccbExplanation) - dict.set(LicensePicker. ccbysa, Translations.t.image.ccbsExplanation) + + dict.set(LicensePicker.cc0, Translations.t.image.ccoExplanation) + dict.set(LicensePicker.ccby, Translations.t.image.ccbExplanation) + dict.set(LicensePicker.ccbysa, Translations.t.image.ccbsExplanation) return dict } - + } \ No newline at end of file diff --git a/UI/BigComponents/MoreScreen.ts b/UI/BigComponents/MoreScreen.ts index e8ddc957c..f984bba2c 100644 --- a/UI/BigComponents/MoreScreen.ts +++ b/UI/BigComponents/MoreScreen.ts @@ -198,7 +198,7 @@ export default class MoreScreen extends Combine { } return button; }) - + const professional = MoreScreen.CreateProffessionalSerivesButton(); const customGeneratorLink = MoreScreen.createCustomGeneratorButton(state) buttons.splice(0, 0, customGeneratorLink, professional); diff --git a/UI/BigComponents/SimpleAddUI.ts b/UI/BigComponents/SimpleAddUI.ts index b18cb5a01..3e61338ed 100644 --- a/UI/BigComponents/SimpleAddUI.ts +++ b/UI/BigComponents/SimpleAddUI.ts @@ -94,7 +94,7 @@ export default class SimpleAddUI extends Toggle { return presetsOverview } - function confirm(tags:any[], location: {lat: number, lon:number}, snapOntoWayId?: string) { + function confirm(tags: any[], location: { lat: number, lon: number }, snapOntoWayId?: string) { if (snapOntoWayId === undefined) { createNewPoint(tags, location, undefined) } else { diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts index b7cf6a738..989a5a77a 100644 --- a/UI/DefaultGUI.ts +++ b/UI/DefaultGUI.ts @@ -93,11 +93,11 @@ export default class DefaultGUI { state.LastClickLocation.setData(undefined); } }); - + let noteMarker = undefined; - if(!hasPresets && addNewNoteDialog !== undefined){ + if (!hasPresets && addNewNoteDialog !== undefined) { noteMarker = new Combine( - [Svg.note_svg().SetClass("absolute bottom-0").SetStyle("height: 40px"), + [Svg.note_svg().SetClass("absolute bottom-0").SetStyle("height: 40px"), Svg.addSmall_svg().SetClass("absolute w-6 animate-pulse") .SetStyle("right: 10px; bottom: -8px;") ]) diff --git a/UI/DefaultGuiState.ts b/UI/DefaultGuiState.ts index 34b8cc668..21d471474 100644 --- a/UI/DefaultGuiState.ts +++ b/UI/DefaultGuiState.ts @@ -56,7 +56,7 @@ export class DefaultGuiState { hash = hash.toLowerCase() states[hash]?.setData(true) }) - + if (Hash.hash.data === "" || Hash.hash.data === undefined) { this.welcomeMessageIsOpened.setData(true) } diff --git a/UI/Image/DeleteImage.ts b/UI/Image/DeleteImage.ts index 23178dcc3..381317921 100644 --- a/UI/Image/DeleteImage.ts +++ b/UI/Image/DeleteImage.ts @@ -11,7 +11,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; export default class DeleteImage extends Toggle { - constructor(key: string, tags: UIEventSource<any>, state: {layoutToUse: LayoutConfig, changes?: Changes, osmConnection?: OsmConnection}) { + constructor(key: string, tags: UIEventSource<any>, state: { layoutToUse: LayoutConfig, changes?: Changes, osmConnection?: OsmConnection }) { const oldValue = tags.data[key] const isDeletedBadge = Translations.t.image.isDeleted.Clone() .SetClass("rounded-full p-1") diff --git a/UI/Image/ImageCarousel.ts b/UI/Image/ImageCarousel.ts index ffa880bf0..92a7136fb 100644 --- a/UI/Image/ImageCarousel.ts +++ b/UI/Image/ImageCarousel.ts @@ -12,9 +12,9 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; export class ImageCarousel extends Toggle { - constructor(images: UIEventSource<{ key: string, url: string, provider: ImageProvider}[]>, + constructor(images: UIEventSource<{ key: string, url: string, provider: ImageProvider }[]>, tags: UIEventSource<any>, - state: {osmConnection?: OsmConnection, changes?: Changes, layoutToUse: LayoutConfig }) { + state: { osmConnection?: OsmConnection, changes?: Changes, layoutToUse: LayoutConfig }) { const uiElements = images.map((imageURLS: { key: string, url: string, provider: ImageProvider }[]) => { const uiElements: BaseUIElement[] = []; for (const url of imageURLS) { diff --git a/UI/Image/ImageUploadFlow.ts b/UI/Image/ImageUploadFlow.ts index 25bfe9c7a..1924dbab7 100644 --- a/UI/Image/ImageUploadFlow.ts +++ b/UI/Image/ImageUploadFlow.ts @@ -21,7 +21,7 @@ export class ImageUploadFlow extends Toggle { private static readonly uploadCountsPerId = new Map<string, UIEventSource<number>>() - constructor(tagsSource: UIEventSource<any>, + constructor(tagsSource: UIEventSource<any>, state: { osmConnection: OsmConnection; layoutToUse: LayoutConfig; diff --git a/UI/ImportFlow/AskMetadata.ts b/UI/ImportFlow/AskMetadata.ts index 87875f250..5f7066f26 100644 --- a/UI/ImportFlow/AskMetadata.ts +++ b/UI/ImportFlow/AskMetadata.ts @@ -44,22 +44,22 @@ export class AskMetadata extends Combine implements FlowStep<{ inputStyle: "width: 100%" }) - let options : {value: string, shown: BaseUIElement}[]= AllKnownLayouts.layoutsList + let options: { value: string, shown: BaseUIElement }[] = AllKnownLayouts.layoutsList .filter(th => th.layers.some(l => l.id === params.layer.id)) .filter(th => th.id !== "personal") .map(th => ({ value: th.id, shown: th.title })) - - options.splice(0,0, { + + options.splice(0, 0, { shown: new FixedUiElement("Select a theme"), - value: undefined + value: undefined }) - - const theme = new DropDown("Which theme should be linked in the note?",options) - - ValidatedTextField.InputForType("string", { + + const theme = new DropDown("Which theme should be linked in the note?", options) + + ValidatedTextField.InputForType("string", { value: LocalStorageSource.Get("import-helper-theme-text"), inputStyle: "width: 100%" }) @@ -89,7 +89,7 @@ export class AskMetadata extends Combine implements FlowStep<{ }, [wikilink.GetValue(), source.GetValue(), theme.GetValue()]) this.IsValid = this.Value.map(obj => { - if(obj === undefined){ + if (obj === undefined) { return false; } return obj.theme !== undefined && obj.features !== undefined && obj.wikilink !== undefined && obj.intro !== undefined && obj.source !== undefined; diff --git a/UI/ImportFlow/CompareToAlreadyExistingNotes.ts b/UI/ImportFlow/CompareToAlreadyExistingNotes.ts index 564b62a1e..f058eae01 100644 --- a/UI/ImportFlow/CompareToAlreadyExistingNotes.ts +++ b/UI/ImportFlow/CompareToAlreadyExistingNotes.ts @@ -40,12 +40,12 @@ export class CompareToAlreadyExistingNotes extends Combine implements FlowStep<{ tagRenderings: new Map() } - + const layerConfig = known_layers.layers.filter(l => l.id === params.layer.id)[0] - if(layerConfig === undefined){ + if (layerConfig === undefined) { console.error("WEIRD: layer not found in the builtin layer overview") } - const importLayerJson = new CreateNoteImportLayer(365).convertStrict(convertState, <LayerConfigJson> layerConfig, "CompareToAlreadyExistingNotes") + const importLayerJson = new CreateNoteImportLayer(365).convertStrict(convertState, <LayerConfigJson>layerConfig, "CompareToAlreadyExistingNotes") const importLayer = new LayerConfig(importLayerJson, "import-layer-dynamic") const flayer: FilteredLayer = { appliedFilters: new UIEventSource<Map<string, FilterState>>(new Map<string, FilterState>()), @@ -108,11 +108,11 @@ export class CompareToAlreadyExistingNotes extends Combine implements FlowStep<{ super([ new Title("Compare with already existing 'to-import'-notes"), new VariableUiElement( - alreadyOpenImportNotes.features.map(notesWithImport => { - if(allNotesWithinBbox.features.data === undefined || allNotesWithinBbox.features.data.length === 0){ - return new Loading("Fetching notes from OSM") + alreadyOpenImportNotes.features.map(notesWithImport => { + if (allNotesWithinBbox.features.data === undefined || allNotesWithinBbox.features.data.length === 0) { + return new Loading("Fetching notes from OSM") } - if(notesWithImport.length === 0){ + if (notesWithImport.length === 0) { return new FixedUiElement("No previous note to import found").SetClass("thanks") } return new Combine([ @@ -126,7 +126,7 @@ export class CompareToAlreadyExistingNotes extends Combine implements FlowStep<{ ).SetClass("w-full"), comparisonMap, ]).SetClass("flex flex-col") - + }, [allNotesWithinBbox.features]) ), @@ -140,15 +140,15 @@ export class CompareToAlreadyExistingNotes extends Combine implements FlowStep<{ })) this.IsValid = alreadyOpenImportNotes.features.map(ff => { - if(allNotesWithinBbox.features.data.length === 0){ + if (allNotesWithinBbox.features.data.length === 0) { // Not yet loaded return false } - if(ff.length == 0){ + if (ff.length == 0) { // No import notes at all return true; } - + return partitionedImportPoints.data.noNearby.length > 0; // at least _something_ can be imported }, [partitionedImportPoints, allNotesWithinBbox.features]) } diff --git a/UI/ImportFlow/ConflationChecker.ts b/UI/ImportFlow/ConflationChecker.ts index e2501b7b3..7d56d1c40 100644 --- a/UI/ImportFlow/ConflationChecker.ts +++ b/UI/ImportFlow/ConflationChecker.ts @@ -32,7 +32,7 @@ import {ImportUtils} from "./ImportUtils"; /** * Given the data to import, the bbox and the layer, will query overpass for similar items */ -export default class ConflationChecker extends Combine implements FlowStep<{features: any[], layer: LayerConfig}> { +export default class ConflationChecker extends Combine implements FlowStep<{ features: any[], layer: LayerConfig }> { public readonly IsValid public readonly Value @@ -40,12 +40,12 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat constructor( state, params: { bbox: BBox, layer: LayerConfig, geojson: any }) { - - + + const bbox = params.bbox.padAbsolute(0.0001) const layer = params.layer; const toImport = params.geojson; - let overpassStatus = new UIEventSource<{ error: string } | "running" | "success" | "idle" | "cached" >("idle") + let overpassStatus = new UIEventSource<{ error: string } | "running" | "success" | "idle" | "cached">("idle") const cacheAge = new UIEventSource<number>(undefined); const fromLocalStorage = IdbLocalStorage.Get<[any, Date]>("importer-overpass-cache-" + layer.id, { whenLoaded: (v) => { @@ -53,7 +53,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat console.log("Loaded from local storage:", v) const [geojson, date] = v; const timeDiff = (new Date().getTime() - date.getTime()) / 1000; - console.log("Loaded ", geojson.features.length," features; cache is ", timeDiff, "seconds old") + console.log("Loaded ", geojson.features.length, " features; cache is ", timeDiff, "seconds old") cacheAge.setData(timeDiff) if (timeDiff < 24 * 60 * 60) { // Recently cached! @@ -69,18 +69,20 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat console.log("Loading from overpass!") overpassStatus.setData("running") overpass.queryGeoJson(bbox).then( - ([data, date] ) => { - console.log("Received overpass-data: ", data.features.length,"features are loaded at ", date); + ([data, date]) => { + console.log("Received overpass-data: ", data.features.length, "features are loaded at ", date); overpassStatus.setData("success") fromLocalStorage.setData([data, date]) - }, - (error) => {overpassStatus.setData({error})}) + }, + (error) => { + overpassStatus.setData({error}) + }) } }); - const geojson : UIEventSource<any> = fromLocalStorage.map(d => { + const geojson: UIEventSource<any> = fromLocalStorage.map(d => { if (d === undefined) { return undefined } @@ -102,21 +104,20 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat }) osmLiveData.SetClass("w-full").SetStyle("height: 500px") const preview = new StaticFeatureSource(geojson.map(geojson => { - if(geojson?.features === undefined){ + if (geojson?.features === undefined) { return [] } const zoomedEnough: boolean = osmLiveData.location.data.zoom >= Number(zoomLevel.GetValue().data) - if(!zoomedEnough){ + if (!zoomedEnough) { return [] } const bounds = osmLiveData.bounds.data return geojson.features.filter(f => BBox.get(f).overlapsWith(bounds)) }, [osmLiveData.bounds, zoomLevel.GetValue()]), false); - - - + + new ShowDataLayer({ - layerToShow:new LayerConfig(currentview), + layerToShow: new LayerConfig(currentview), state, leafletMap: osmLiveData.leafletMap, popup: undefined, @@ -128,7 +129,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat new ShowDataLayer({ - layerToShow:layer, + layerToShow: layer, state, leafletMap: osmLiveData.leafletMap, popup: (tags, layer) => new FeatureInfoBox(tags, layer, state), @@ -137,18 +138,18 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat }) new ShowDataLayer({ - layerToShow:new LayerConfig(import_candidate), + layerToShow: new LayerConfig(import_candidate), state, leafletMap: osmLiveData.leafletMap, popup: (tags, layer) => new FeatureInfoBox(tags, layer, state), zoomToFeatures: false, features: new StaticFeatureSource(toImport.features, false) }) - + const nearbyCutoff = ValidatedTextField.InputForType("pnat") nearbyCutoff.SetClass("ml-1 border border-black") nearbyCutoff.GetValue().syncWith(LocalStorageSource.Get("importer-cutoff", "25"), true) - + const matchedFeaturesMap = Minimap.createMiniMap({ allowMoving: true, background @@ -157,21 +158,21 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat // Featuresource showing OSM-features which are nearby a toImport-feature const nearbyFeatures = new StaticFeatureSource(geojson.map(osmData => { - if(osmData?.features === undefined){ + if (osmData?.features === undefined) { return [] } const maxDist = Number(nearbyCutoff.GetValue().data) - return osmData.features.filter(f => - toImport.features.some(imp => - maxDist >= GeoOperations.distanceBetween(imp.geometry.coordinates, GeoOperations.centerpointCoordinates(f))) ) + return osmData.features.filter(f => + toImport.features.some(imp => + maxDist >= GeoOperations.distanceBetween(imp.geometry.coordinates, GeoOperations.centerpointCoordinates(f)))) }, [nearbyCutoff.GetValue()]), false); const paritionedImport = ImportUtils.partitionFeaturesIfNearby(toImport, geojson, nearbyCutoff.GetValue().map(Number)); // Featuresource showing OSM-features which are nearby a toImport-feature - const toImportWithNearby = new StaticFeatureSource(paritionedImport.map(els =>els?.hasNearby ?? []), false); + const toImportWithNearby = new StaticFeatureSource(paritionedImport.map(els => els?.hasNearby ?? []), false); new ShowDataLayer({ - layerToShow:layer, + layerToShow: layer, state, leafletMap: matchedFeaturesMap.leafletMap, popup: (tags, layer) => new FeatureInfoBox(tags, layer, state), @@ -180,47 +181,47 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat }) new ShowDataLayer({ - layerToShow:new LayerConfig(import_candidate), + layerToShow: new LayerConfig(import_candidate), state, leafletMap: matchedFeaturesMap.leafletMap, popup: (tags, layer) => new FeatureInfoBox(tags, layer, state), zoomToFeatures: false, features: toImportWithNearby }) - - - const conflationMaps = new Combine([ + + + const conflationMaps = new Combine([ new VariableUiElement( - geojson.map(geojson => { - if (geojson === undefined) { - return undefined; - } - return new SubtleButton(Svg.download_svg(), "Download the loaded geojson from overpass").onClick(() => { - Utils.offerContentsAsDownloadableFile(JSON.stringify(geojson, null, " "), "mapcomplete-" + layer.id + ".geojson", { - mimetype: "application/json+geo" - }) - }); - })), + geojson.map(geojson => { + if (geojson === undefined) { + return undefined; + } + return new SubtleButton(Svg.download_svg(), "Download the loaded geojson from overpass").onClick(() => { + Utils.offerContentsAsDownloadableFile(JSON.stringify(geojson, null, " "), "mapcomplete-" + layer.id + ".geojson", { + mimetype: "application/json+geo" + }) + }); + })), new VariableUiElement(cacheAge.map(age => { - if(age === undefined){ + if (age === undefined) { return undefined; } - if(age < 0){ + if (age < 0) { return new FixedUiElement("Cache was expired") } - return new FixedUiElement("Loaded data is from the cache and is "+Utils.toHumanTime(age)+" old") + return new FixedUiElement("Loaded data is from the cache and is " + Utils.toHumanTime(age) + " old") })), new Title("Live data on OSM"), osmLiveData, - new Combine(["The live data is shown if the zoomlevel is at least ", zoomLevel, ". The current zoom level is ", new VariableUiElement(osmLiveData.location.map(l => ""+l.zoom))]).SetClass("flex"), + new Combine(["The live data is shown if the zoomlevel is at least ", zoomLevel, ". The current zoom level is ", new VariableUiElement(osmLiveData.location.map(l => "" + l.zoom))]).SetClass("flex"), new Title("Nearby features"), - new Combine([ "The following map shows features to import which have an OSM-feature within ", nearbyCutoff, "meter"]).SetClass("flex"), + new Combine(["The following map shows features to import which have an OSM-feature within ", nearbyCutoff, "meter"]).SetClass("flex"), new FixedUiElement("The red elements on the following map will <b>not</b> be imported!").SetClass("alert"), "Set the range to 0 or 1 if you want to import them all", matchedFeaturesMap]).SetClass("flex flex-col") - + super([ new Title("Comparison with existing data"), new VariableUiElement(overpassStatus.map(d => { @@ -230,16 +231,16 @@ export default class ConflationChecker extends Combine implements FlowStep<{feat if (d["error"] !== undefined) { return new FixedUiElement("Could not load latest data from overpass: " + d["error"]).SetClass("alert") } - if(d === "running"){ + if (d === "running") { return new Loading("Querying overpass...") } - if(d === "cached"){ + if (d === "cached") { return conflationMaps } - if(d === "success"){ + if (d === "success") { return conflationMaps } - return new FixedUiElement("Unexpected state "+d).SetClass("alert") + return new FixedUiElement("Unexpected state " + d).SetClass("alert") })) ]) diff --git a/UI/ImportFlow/CreateNotes.ts b/UI/ImportFlow/CreateNotes.ts index f398c9808..f364196f0 100644 --- a/UI/ImportFlow/CreateNotes.ts +++ b/UI/ImportFlow/CreateNotes.ts @@ -23,8 +23,8 @@ export class CreateNotes extends Combine { delete f.properties["source"] delete f.properties["src"] let extraNote = "" - if(f.properties["note"]){ - extraNote = f.properties["note"]+"\n" + if (f.properties["note"]) { + extraNote = f.properties["note"] + "\n" delete f.properties["note"] } diff --git a/UI/ImportFlow/FlowStep.ts b/UI/ImportFlow/FlowStep.ts index c8773b1c9..e0fde7b60 100644 --- a/UI/ImportFlow/FlowStep.ts +++ b/UI/ImportFlow/FlowStep.ts @@ -101,7 +101,7 @@ export class FlowPanel<T> extends Toggle { // Startup the flow elements = [ initial, - + new Combine([ backbutton, new Toggle( diff --git a/UI/ImportFlow/ImportHelperGui.ts b/UI/ImportFlow/ImportHelperGui.ts index 824f0f9c2..294a28049 100644 --- a/UI/ImportFlow/ImportHelperGui.ts +++ b/UI/ImportFlow/ImportHelperGui.ts @@ -27,7 +27,7 @@ export default class ImportHelperGui extends LeftIndex { constructor() { const state = new UserRelatedState(undefined) - const {flow, furthestStep, titles} = + const {flow, furthestStep, titles} = FlowPanelFactory .start("Introduction", new Introdution()) .then("Login", _ => new LoginToImport(state)) @@ -37,28 +37,28 @@ export default class ImportHelperGui extends LeftIndex { .then("Compare with open notes", v => new CompareToAlreadyExistingNotes(state, v)) .then("Compare with existing data", v => new ConflationChecker(state, v)) .then("License and community check", v => new ConfirmProcess(v)) - .then("Metadata", (v:{features:any[], layer: LayerConfig}) => new AskMetadata(v)) + .then("Metadata", (v: { features: any[], layer: LayerConfig }) => new AskMetadata(v)) .finish("Note creation", v => new CreateNotes(state, v)); - + const toc = new List( titles.map((title, i) => new VariableUiElement(furthestStep.map(currentStep => { - if(i > currentStep){ + if (i > currentStep) { return new Combine([title]).SetClass("subtle"); } - if(i == currentStep){ + if (i == currentStep) { return new Combine([title]).SetClass("font-bold"); } - if(i < currentStep){ + if (i < currentStep) { return title } - - + + }))) , true) - + const leftContents: BaseUIElement[] = [ - new SubtleButton(undefined,"Inspect your preview imports", { - url:"import_viewer.html" + new SubtleButton(undefined, "Inspect your preview imports", { + url: "import_viewer.html" }), toc, new Toggle(new FixedUiElement("Testmode - won't actually import notes").SetClass("alert"), undefined, state.featureSwitchIsTesting), diff --git a/UI/ImportFlow/ImportUtils.ts b/UI/ImportFlow/ImportUtils.ts index be8957d01..db881a709 100644 --- a/UI/ImportFlow/ImportUtils.ts +++ b/UI/ImportFlow/ImportUtils.ts @@ -7,7 +7,7 @@ export class ImportUtils { if (osmData?.features === undefined) { return undefined } - if(osmData.features.length === 0){ + if (osmData.features.length === 0) { return {noNearby: toPartitionFeatureCollection.features, hasNearby: []} } const maxDist = cutoffDistanceInMeters.data diff --git a/UI/ImportFlow/Introdution.ts b/UI/ImportFlow/Introdution.ts index 602f87af0..859fd8e4b 100644 --- a/UI/ImportFlow/Introdution.ts +++ b/UI/ImportFlow/Introdution.ts @@ -7,14 +7,14 @@ import Title from "../Base/Title"; export default class Introdution extends Combine implements FlowStep<void> { readonly IsValid: UIEventSource<boolean> = new UIEventSource<boolean>(true); readonly Value: UIEventSource<void> = new UIEventSource<void>(undefined); - + constructor() { super([ - new Title( Translations.t.importHelper.title), + new Title(Translations.t.importHelper.title), Translations.t.importHelper.description, Translations.t.importHelper.importFormat, ]); this.SetClass("flex flex-col") } - + } \ No newline at end of file diff --git a/UI/ImportFlow/MapPreview.ts b/UI/ImportFlow/MapPreview.ts index 3e66095d8..16f531fd9 100644 --- a/UI/ImportFlow/MapPreview.ts +++ b/UI/ImportFlow/MapPreview.ts @@ -26,26 +26,26 @@ import Title from "../Base/Title"; import CheckBoxes from "../Input/Checkboxes"; class PreviewPanel extends ScrollableFullScreen { - + constructor(tags, layer) { super( _ => new FixedUiElement("Element to import"), - _ => new Combine(["The tags are:", + _ => new Combine(["The tags are:", new AllTagsPanel(tags) ]).SetClass("flex flex-col"), "element" ); } - + } /** * Shows the data to import on a map, asks for the correct layer to be selected */ -export class MapPreview extends Combine implements FlowStep<{ bbox: BBox, layer: LayerConfig, geojson: any }>{ +export class MapPreview extends Combine implements FlowStep<{ bbox: BBox, layer: LayerConfig, geojson: any }> { public readonly IsValid: UIEventSource<boolean>; public readonly Value: UIEventSource<{ bbox: BBox, layer: LayerConfig, geojson: any }> - + constructor( state: UserRelatedState, geojson: { features: { properties: any, geometry: { coordinates: [number, number] } }[] }) { @@ -115,10 +115,10 @@ export class MapPreview extends Combine implements FlowStep<{ bbox: BBox, layer: layers: new UIEventSource<FilteredLayer[]>(AllKnownLayouts.AllPublicLayers() .filter(l => l.source.geojsonSource === undefined) .map(l => ({ - layerDef: l, - isDisplayed: new UIEventSource<boolean>(true), - appliedFilters: new UIEventSource<Map<string, FilterState>>(undefined) - }))), + layerDef: l, + isDisplayed: new UIEventSource<boolean>(true), + appliedFilters: new UIEventSource<Map<string, FilterState>>(undefined) + }))), zoomToFeatures: true, features: new StaticFeatureSource(matching, false), leafletMap: map.leafletMap, @@ -126,8 +126,8 @@ export class MapPreview extends Combine implements FlowStep<{ bbox: BBox, layer: }) var bbox = matching.map(feats => BBox.bboxAroundAll(feats.map(f => new BBox([f.geometry.coordinates])))) - - const mismatchIndicator = new VariableUiElement(matching.map(matching => { + + const mismatchIndicator = new VariableUiElement(matching.map(matching => { if (matching === undefined) { return undefined } @@ -138,14 +138,14 @@ export class MapPreview extends Combine implements FlowStep<{ bbox: BBox, layer: const obligatory = layerPicker.GetValue().data?.source?.osmTags?.asHumanString(false, false, {}); return t.mismatch.Subs({count: diff, tags: obligatory}).SetClass("alert") })) - + const confirm = new CheckBoxes([t.confirm]); super([ new Title(t.title, 1), layerPicker, new Toggle(t.autodetected.SetClass("thank"), undefined, autodetected), - - mismatchIndicator , + + mismatchIndicator, map, confirm ]); @@ -156,17 +156,17 @@ export class MapPreview extends Combine implements FlowStep<{ bbox: BBox, layer: geojson, layer: layerPicker.GetValue().data }), [layerPicker.GetValue()]) - + this.IsValid = matching.map(matching => { if (matching === undefined) { return false } - if(confirm.GetValue().data.length !== 1){ + if (confirm.GetValue().data.length !== 1) { return false } const diff = geojson.features.length - matching.length; return diff === 0; }, [confirm.GetValue()]) - + } } \ No newline at end of file diff --git a/UI/ImportFlow/PreviewPanel.ts b/UI/ImportFlow/PreviewPanel.ts index 9c9655a38..8a917fd18 100644 --- a/UI/ImportFlow/PreviewPanel.ts +++ b/UI/ImportFlow/PreviewPanel.ts @@ -36,7 +36,7 @@ export class PreviewPanel extends Combine implements FlowStep<{ features: { prop for (const key of Array.from(propertyKeys)) { const values = Utils.NoNull(geojson.features.map(f => f.properties[key])) - console.log("There are ",values.length,"features with attribute",key, "namely",values) + console.log("There are ", values.length, "features with attribute", key, "namely", values) const allSame = !values.some(v => v !== values[0]) let countSummary: BaseUIElement if (values.length === n) { diff --git a/UI/ImportFlow/RequestFile.ts b/UI/ImportFlow/RequestFile.ts index 58bfbe4e5..f9752639e 100644 --- a/UI/ImportFlow/RequestFile.ts +++ b/UI/ImportFlow/RequestFile.ts @@ -3,13 +3,12 @@ import {UIEventSource} from "../../Logic/UIEventSource"; import Translations from "../i18n/Translations"; import {SubtleButton} from "../Base/SubtleButton"; import {VariableUiElement} from "../Base/VariableUIElement"; -import {FixedUiElement} from "../Base/FixedUiElement"; import Title from "../Base/Title"; import InputElementMap from "../Input/InputElementMap"; import BaseUIElement from "../BaseUIElement"; import FileSelectorButton from "../Input/FileSelectorButton"; import {FlowStep} from "./FlowStep"; -import { parse } from "papaparse"; +import {parse} from "papaparse"; class FileSelector extends InputElementMap<FileList, { name: string, contents: Promise<string> }> { constructor(label: BaseUIElement) { @@ -76,7 +75,7 @@ export class RequestFile extends Combine implements FlowStep<any> { } catch (e) { // Loading as CSV - var lines : string[][] = <any> parse(src).data; + var lines: string[][] = <any>parse(src).data; const header = lines[0] lines.splice(0, 1) if (header.indexOf("lat") < 0 || header.indexOf("lon") < 0) { @@ -84,26 +83,26 @@ export class RequestFile extends Combine implements FlowStep<any> { } if (header.some(h => h.trim() == "")) { - return {error:t.errNoName} + return {error: t.errNoName} } - + if (new Set(header).size !== header.length) { - return {error:t.errDuplicate} + return {error: t.errDuplicate} } - + const features = [] for (let i = 0; i < lines.length; i++) { const attrs = lines[i]; - if(attrs.length == 0 || (attrs.length == 1 && attrs[0] == "")){ + if (attrs.length == 0 || (attrs.length == 1 && attrs[0] == "")) { // empty line continue } const properties = {} for (let i = 0; i < header.length; i++) { - const v = attrs[i] - if(v === undefined || v === ""){ + const v = attrs[i] + if (v === undefined || v === "") { continue } properties[header[i]] = v; diff --git a/UI/Input/FileSelectorButton.ts b/UI/Input/FileSelectorButton.ts index 8392ca057..1c03875af 100644 --- a/UI/Input/FileSelectorButton.ts +++ b/UI/Input/FileSelectorButton.ts @@ -12,8 +12,10 @@ export default class FileSelectorButton extends InputElement<FileList> { private readonly allowMultiple: boolean; constructor(label: BaseUIElement, options?: - { acceptType: "image/*" | string, - allowMultiple: true | boolean}) { + { + acceptType: "image/*" | string, + allowMultiple: true | boolean + }) { super(); this._label = label; this._acceptType = options?.acceptType ?? "image/*"; diff --git a/UI/Input/InputElementWrapper.ts b/UI/Input/InputElementWrapper.ts index aeeb6fa6c..a671a0027 100644 --- a/UI/Input/InputElementWrapper.ts +++ b/UI/Input/InputElementWrapper.ts @@ -17,9 +17,9 @@ export default class InputElementWrapper<T> extends InputElement<T> { mapping.set(key, inputElement) // Bit of a hack: the SubstitutedTranslation expects a special rendering, but those are formatted '{key()}' instead of '{key}', so we substitute it first - const newTranslations ={} + const newTranslations = {} for (const lang in translation.translations) { - newTranslations[lang] = translation.translations[lang].replace("{"+key+"}", "{"+key+"()}") + newTranslations[lang] = translation.translations[lang].replace("{" + key + "}", "{" + key + "()}") } this._renderElement = new SubstitutedTranslation(new Translation(newTranslations), tags, state, mapping) } diff --git a/UI/Input/LocationInput.ts b/UI/Input/LocationInput.ts index 3513e9797..501e176d0 100644 --- a/UI/Input/LocationInput.ts +++ b/UI/Input/LocationInput.ts @@ -25,6 +25,8 @@ export default class LocationInput extends InputElement<Loc> implements MinimapO public readonly snappedOnto: UIEventSource<any> = new UIEventSource<any>(undefined) public readonly _matching_layer: LayerConfig; public readonly leafletMap: UIEventSource<any> + public readonly bounds; + public readonly location; private _centerLocation: UIEventSource<Loc>; private readonly mapBackground: UIEventSource<BaseLayer>; /** @@ -38,8 +40,6 @@ export default class LocationInput extends InputElement<Loc> implements MinimapO private readonly _snappedPointTags: any; private readonly _bounds: UIEventSource<BBox>; private readonly map: BaseUIElement & MinimapObj; - public readonly bounds; - public readonly location; private readonly clickLocation: UIEventSource<Loc>; private readonly _minZoom: number; diff --git a/UI/Input/RadioButton.ts b/UI/Input/RadioButton.ts index ae7cc2d72..3c9d984b2 100644 --- a/UI/Input/RadioButton.ts +++ b/UI/Input/RadioButton.ts @@ -73,7 +73,7 @@ export class RadioButton<T> extends InputElement<T> { elements[i]?.onClick(() => { selectedElementIndex.setData(i); }); - + elements[i].GetValue().addCallback(() => { selectedElementIndex.setData(i); }); diff --git a/UI/Input/ValidatedTextField.ts b/UI/Input/ValidatedTextField.ts index 93db06458..215f2e25f 100644 --- a/UI/Input/ValidatedTextField.ts +++ b/UI/Input/ValidatedTextField.ts @@ -236,9 +236,9 @@ class UrlTextfieldDef implements TextFieldDef { "fbclid",// Oh god, how I hate the fbclid. Let it burn, burn in hell! "gclid", "cmpid", "agid", "utm", "utm_source", "utm_medium", - "campaignid","campaign","AdGroupId","AdGroup","TargetId","msclkid"] + "campaignid", "campaign", "AdGroupId", "AdGroup", "TargetId", "msclkid"] for (const dontLike of blacklistedTrackingParams) { - url.searchParams.delete(dontLike.toLowerCase() ) + url.searchParams.delete(dontLike.toLowerCase()) } let cleaned = url.toString(); if (cleaned.endsWith("/") && !str.endsWith("/")) { @@ -265,7 +265,7 @@ class UrlTextfieldDef implements TextFieldDef { } const url = new URL(str); const dotIndex = url.host.indexOf(".") - return dotIndex > 0 && url.host[url.host.length - 1 ] !== "."; + return dotIndex > 0 && url.host[url.host.length - 1] !== "."; } catch (e) { return false; } diff --git a/UI/NewPoint/ConfirmLocationOfPoint.ts b/UI/NewPoint/ConfirmLocationOfPoint.ts index 82ec3fd64..d4cf22a20 100644 --- a/UI/NewPoint/ConfirmLocationOfPoint.ts +++ b/UI/NewPoint/ConfirmLocationOfPoint.ts @@ -78,7 +78,7 @@ export default class ConfirmLocationOfPoint extends Combine { // return; } - bbox = bbox.pad(Math.max(preset.boundsFactor , 2), Math.max(preset.boundsFactor , 2)); + bbox = bbox.pad(Math.max(preset.boundsFactor, 2), Math.max(preset.boundsFactor, 2)); loadedBbox = bbox; const allFeatures: { feature: any }[] = [] preset.preciseInput.snapToLayers.forEach(layerId => { @@ -139,7 +139,7 @@ export default class ConfirmLocationOfPoint extends Combine { ] ).SetClass("flex flex-col") ).onClick(() => { - + const appliedFilters = preset.layerToAddTo.appliedFilters; appliedFilters.data.forEach((_, k) => appliedFilters.data.set(k, undefined)) appliedFilters.ping() @@ -150,15 +150,14 @@ export default class ConfirmLocationOfPoint extends Combine { const hasActiveFilter = preset.layerToAddTo.appliedFilters .map(appliedFilters => { const activeFilters = Array.from(appliedFilters.values()).filter(f => f?.currentFilter !== undefined); - return activeFilters.length === 0; + return activeFilters.length === 0; }) - + // If at least one filter is active which _might_ hide a newly added item, this blocks the preset and requests the filter to be disabled const disableFiltersOrConfirm = new Toggle( openLayerOrConfirm, - disableFilter, + disableFilter, hasActiveFilter) - const tagInfo = SimpleAddUI.CreateTagInfoFor(preset, state.osmConnection); diff --git a/UI/OpeningHours/OpeningHours.ts b/UI/OpeningHours/OpeningHours.ts index b30b522bd..94f42b50f 100644 --- a/UI/OpeningHours/OpeningHours.ts +++ b/UI/OpeningHours/OpeningHours.ts @@ -298,16 +298,16 @@ export class OH { } } - public static simplify(str: string): string{ + public static simplify(str: string): string { return OH.ToString(OH.MergeTimes(OH.Parse(str))) } - - public static Parse(rules: string) : OpeningHour[] { + + public static Parse(rules: string): OpeningHour[] { if (rules === undefined || rules === "") { return [] } - const ohs : OpeningHour[] = [] + const ohs: OpeningHour[] = [] const split = rules.split(";"); diff --git a/UI/OpeningHours/OpeningHoursVisualization.ts b/UI/OpeningHours/OpeningHoursVisualization.ts index 2414fc00f..41744a489 100644 --- a/UI/OpeningHours/OpeningHoursVisualization.ts +++ b/UI/OpeningHours/OpeningHoursVisualization.ts @@ -23,7 +23,7 @@ export default class OpeningHoursVisualization extends Toggle { Translations.t.general.weekdays.abbreviations.sunday, ] - constructor(tags: UIEventSource<any>, state:{osmConnection?: OsmConnection}, key: string, prefix = "", postfix = "") { + constructor(tags: UIEventSource<any>, state: { osmConnection?: OsmConnection }, key: string, prefix = "", postfix = "") { const tagsDirect = tags.data; const ohTable = new VariableUiElement(tags .map(tags => { diff --git a/UI/Popup/AutoApplyButton.ts b/UI/Popup/AutoApplyButton.ts index 807e5239f..0ee17e721 100644 --- a/UI/Popup/AutoApplyButton.ts +++ b/UI/Popup/AutoApplyButton.ts @@ -60,13 +60,24 @@ export default class AutoApplyButton implements SpecialVisualization { this.docs = AutoApplyButton.generateDocs(allSpecialVisualisations.filter(sv => sv["supportsAutoAction"] === true).map(sv => sv.funcName)) } + private static generateDocs(supportedActions: string[]) { + return [ + "A button to run many actions for many features at once.\n", + "To effectively use this button, you'll need some ingredients:\n" + + "- A target layer with features for which an action is defined in a tag rendering. The following special visualisations support an autoAction: " + supportedActions.join(", "), + "- A host feature to place the auto-action on. This can be a big outline (such as a city). Another good option for this is the [current_view](./BuiltinLayers.md#current_view)", + "- Then, use a calculated tag on the host feature to determine the overlapping object ids", + "- At last, add this component" + ].join("\n") + } + constr(state: FeaturePipelineState, tagSource: UIEventSource<any>, argument: string[], guistate: DefaultGuiState): BaseUIElement { if (!state.layoutToUse.official && !(state.featureSwitchIsTesting.data || state.osmConnection._oauth_config.url === OsmConnection.oauth_configs["osm-test"].url)) { const t = Translations.t.general.add.import; return new Combine([new FixedUiElement("The auto-apply button is only available in official themes (or in testing mode)").SetClass("alert"), t.howToTest]) } - + const to_parse = tagSource.data[argument[1]] if (to_parse === undefined) { return new Loading("Gathering which elements support auto-apply... ") @@ -76,11 +87,11 @@ export default class AutoApplyButton implements SpecialVisualization { const target_layer_id = argument[0] const target_feature_ids = <string[]>JSON.parse(to_parse) - - if(target_feature_ids.length === 0){ + + if (target_feature_ids.length === 0) { return new FixedUiElement("No elements found to perform action") } - + const targetTagRendering = argument[2] const text = argument[3] const icon = argument[4] @@ -93,7 +104,7 @@ export default class AutoApplyButton implements SpecialVisualization { return new FixedUiElement("Target tagrendering " + targetTagRendering + " not found").SetClass("alert") } - const buttonState = new UIEventSource<"idle" | "running" | "done" | {error: string}>("idle") + const buttonState = new UIEventSource<"idle" | "running" | "done" | { error: string }>("idle") const button = new SubtleButton( new Img(icon), @@ -154,10 +165,10 @@ export default class AutoApplyButton implements SpecialVisualization { return new FixedUiElement("All done!").SetClass("thanks") } if (st === "running") { - return new Loading("Applying changes...") + return new Loading("Applying changes...") } - const error =st.error - return new Combine([new FixedUiElement("Something went wrong...").SetClass("alert"), new FixedUiElement(error).SetClass("subtle")]).SetClass("flex flex-col") + const error = st.error + return new Combine([new FixedUiElement("Something went wrong...").SetClass("alert"), new FixedUiElement(error).SetClass("subtle")]).SetClass("flex flex-col") } )) @@ -172,16 +183,5 @@ export default class AutoApplyButton implements SpecialVisualization { return [args[0]] } - private static generateDocs(supportedActions: string[]) { - return [ - "A button to run many actions for many features at once.\n", - "To effectively use this button, you'll need some ingredients:\n" + - "- A target layer with features for which an action is defined in a tag rendering. The following special visualisations support an autoAction: " + supportedActions.join(", "), - "- A host feature to place the auto-action on. This can be a big outline (such as a city). Another good option for this is the [current_view](./BuiltinLayers.md#current_view)", - "- Then, use a calculated tag on the host feature to determine the overlapping object ids", - "- At last, add this component" - ].join("\n") - } - } \ No newline at end of file diff --git a/UI/Popup/DeleteWizard.ts b/UI/Popup/DeleteWizard.ts index 7aa8a90a3..5d04f34d4 100644 --- a/UI/Popup/DeleteWizard.ts +++ b/UI/Popup/DeleteWizard.ts @@ -50,7 +50,7 @@ export default class DeleteWizard extends Toggle { }, options: DeleteConfig) { - + const deleteAbility = new DeleteabilityChecker(id, state, options.neededChangesets) const tagsSource = state.allElements.getEventSourceById(id) @@ -293,7 +293,7 @@ class DeleteabilityChecker { constructor(id: string, - state: {osmConnection: OsmConnection}, + state: { osmConnection: OsmConnection }, allowDeletionAtChangesetCount?: number) { this._id = id; this._state = state; @@ -316,7 +316,7 @@ class DeleteabilityChecker { const t = Translations.t.delete; const id = this._id; const state = this.canBeDeleted - const self = this; + const self = this; if (!id.startsWith("node")) { this.canBeDeleted.setData({ canBeDeleted: false, diff --git a/UI/Popup/EditableTagRendering.ts b/UI/Popup/EditableTagRendering.ts index 2df461bda..b7408d134 100644 --- a/UI/Popup/EditableTagRendering.ts +++ b/UI/Popup/EditableTagRendering.ts @@ -42,7 +42,7 @@ export default class EditableTagRendering extends Toggle { ) } - private static CreateRendering(state: {featureSwitchUserbadge?: UIEventSource<boolean>, osmConnection: OsmConnection}, tags: UIEventSource<any>, configuration: TagRenderingConfig, units: Unit[], editMode: UIEventSource<boolean>): BaseUIElement { + private static CreateRendering(state: { featureSwitchUserbadge?: UIEventSource<boolean>, osmConnection: OsmConnection }, tags: UIEventSource<any>, configuration: TagRenderingConfig, units: Unit[], editMode: UIEventSource<boolean>): BaseUIElement { const answer: BaseUIElement = new TagRenderingAnswer(tags, configuration, state) answer.SetClass("w-full") let rendering = answer; @@ -60,7 +60,7 @@ export default class EditableTagRendering extends Toggle { const question = new Lazy(() => - new TagRenderingQuestion(tags, configuration,state, + new TagRenderingQuestion(tags, configuration, state, { units: units, cancelButton: Translations.t.general.cancel.Clone() diff --git a/UI/Popup/MoveWizard.ts b/UI/Popup/MoveWizard.ts index 8bb889ece..6ed7d0657 100644 --- a/UI/Popup/MoveWizard.ts +++ b/UI/Popup/MoveWizard.ts @@ -139,7 +139,7 @@ export default class MoveWizard extends Toggle { minZoom: reason.minZoom, centerLocation: loc, mapBackground: new UIEventSource<BaseLayer>(preferredBackground) // We detach the layer - + }) if (reason.lockBounds) { diff --git a/UI/Popup/NewNoteUi.ts b/UI/Popup/NewNoteUi.ts index 0c526d3ca..7a6dc5dc8 100644 --- a/UI/Popup/NewNoteUi.ts +++ b/UI/Popup/NewNoteUi.ts @@ -60,7 +60,6 @@ export default class NewNoteUi extends Toggle { super( new Toggle( - new Combine( [ t.noteLayerHasFilters.SetClass("alert"), diff --git a/UI/Popup/NoteCommentElement.ts b/UI/Popup/NoteCommentElement.ts index 4251204c4..8db51ff81 100644 --- a/UI/Popup/NoteCommentElement.ts +++ b/UI/Popup/NoteCommentElement.ts @@ -70,15 +70,15 @@ export default class NoteCommentElement extends Combine { } - public static addCommentTo(txt: string, tags: UIEventSource<any>, state: {osmConnection: OsmConnection}){ + public static addCommentTo(txt: string, tags: UIEventSource<any>, state: { osmConnection: OsmConnection }) { const comments: any[] = JSON.parse(tags.data["comments"]) const username = state.osmConnection.userDetails.data.name var urlRegex = /(https?:\/\/[^\s]+)/g; - const html = txt.replace(urlRegex, function(url) { + const html = txt.replace(urlRegex, function (url) { return '<a href="' + url + '">' + url + '</a>'; }) - + comments.push({ "date": new Date().toISOString(), "uid": state.osmConnection.userDetails.data.uid, @@ -91,5 +91,5 @@ export default class NoteCommentElement extends Combine { tags.data["comments"] = JSON.stringify(comments) tags.ping() } - + } \ No newline at end of file diff --git a/UI/Popup/SplitRoadWizard.ts b/UI/Popup/SplitRoadWizard.ts index 4859763c2..5bdd70667 100644 --- a/UI/Popup/SplitRoadWizard.ts +++ b/UI/Popup/SplitRoadWizard.ts @@ -45,7 +45,8 @@ export default class SplitRoadWizard extends Toggle { featureSwitchUserbadge: UIEventSource<boolean>, changes: Changes, layoutToUse: LayoutConfig, - allElements: ElementStorage}) { + allElements: ElementStorage + }) { const t = Translations.t.split; @@ -84,7 +85,7 @@ export default class SplitRoadWizard extends Toggle { zoomToFeatures: true, state }) - + new ShowDataLayer({ features: new StaticFeatureSource(splitPoints, true), leafletMap: miniMap.leafletMap, @@ -94,7 +95,6 @@ export default class SplitRoadWizard extends Toggle { state }) - /** * Handles a click on the overleaf map. diff --git a/UI/Popup/TagApplyButton.ts b/UI/Popup/TagApplyButton.ts index e09a6b179..6bd8e774b 100644 --- a/UI/Popup/TagApplyButton.ts +++ b/UI/Popup/TagApplyButton.ts @@ -38,6 +38,7 @@ export default class TagApplyButton implements AutoAction { doc: "If specified, applies the the tags onto _another_ object. The id will be read from properties[id_of_object_to_apply_this_one] of the selected object. The tags are still calculated based on the tags of the _selected_ element" } ]; + public readonly example = "`{tag_apply(survey_date=$_now:date, Surveyed today!)}`, `{tag_apply(addr:street=$addr:street, Apply the address, apply_icon.svg, _closest_osm_id)"; public static generateTagsToApply(spec: string, tagSource: UIEventSource<any>): UIEventSource<Tag[]> { @@ -79,12 +80,10 @@ export default class TagApplyButton implements AutoAction { } - public readonly example = "`{tag_apply(survey_date=$_now:date, Surveyed today!)}`, `{tag_apply(addr:street=$addr:street, Apply the address, apply_icon.svg, _closest_osm_id)"; - async applyActionOn(state: { layoutToUse: LayoutConfig, changes: Changes - }, tags: UIEventSource<any>, args: string[]) : Promise<void>{ + }, tags: UIEventSource<any>, args: string[]): Promise<void> { const tagsToApply = TagApplyButton.generateTagsToApply(args[0], tags) const targetIdKey = args[3] diff --git a/UI/Popup/TagRenderingAnswer.ts b/UI/Popup/TagRenderingAnswer.ts index 0e8bbf57e..71f28f5a1 100644 --- a/UI/Popup/TagRenderingAnswer.ts +++ b/UI/Popup/TagRenderingAnswer.ts @@ -13,9 +13,9 @@ export default class TagRenderingAnswer extends VariableUiElement { constructor(tagsSource: UIEventSource<any>, configuration: TagRenderingConfig, state: any, - contentClasses: string = "", contentStyle: string = "", options?:{ - specialViz: Map<string, BaseUIElement> - }) { + contentClasses: string = "", contentStyle: string = "", options?: { + specialViz: Map<string, BaseUIElement> + }) { if (configuration === undefined) { throw "Trying to generate a tagRenderingAnswer without configuration..." } diff --git a/UI/ProfessionalGui.ts b/UI/ProfessionalGui.ts index 45a744e54..d4a0196bf 100644 --- a/UI/ProfessionalGui.ts +++ b/UI/ProfessionalGui.ts @@ -7,7 +7,6 @@ import List from "./Base/List"; import BaseUIElement from "./BaseUIElement"; import LanguagePicker from "./LanguagePicker"; import TableOfContents from "./Base/TableOfContents"; -import BackToIndex from "./BigComponents/BackToIndex"; import LeftIndex from "./Base/LeftIndex"; class Snippet extends Toggleable { @@ -21,26 +20,26 @@ class Snippet extends Toggleable { class SnippetContent extends Combine { - constructor(translations:any, ...extras: BaseUIElement[]) { - super([ - translations.intro, - new List([ - translations.li0, - translations.li1, - translations.li2, - translations.li3, - translations.li4, - translations.li5, - translations.li6, - ]), - translations.outro, - ...extras - ]) - this.SetClass("flex flex-col") + constructor(translations: any, ...extras: BaseUIElement[]) { + super([ + translations.intro, + new List([ + translations.li0, + translations.li1, + translations.li2, + translations.li3, + translations.li4, + translations.li5, + translations.li6, + ]), + translations.outro, + ...extras + ]) + this.SetClass("flex flex-col") } } -class ProfessionalGui extends LeftIndex{ +class ProfessionalGui extends LeftIndex { constructor() { @@ -83,11 +82,11 @@ class ProfessionalGui extends LeftIndex{ new Accordeon([ new Snippet(t.drawbacks.unsuitedData), new Snippet(t.drawbacks.licenseNuances, - new Title( t.drawbacks.licenseNuances.usecaseMapDifferentSources.title, 4), + new Title(t.drawbacks.licenseNuances.usecaseMapDifferentSources.title, 4), new SnippetContent(t.drawbacks.licenseNuances.usecaseMapDifferentSources), - new Title( t.drawbacks.licenseNuances.usecaseGatheringOpenData.title, 4), + new Title(t.drawbacks.licenseNuances.usecaseGatheringOpenData.title, 4), new SnippetContent(t.drawbacks.licenseNuances.usecaseGatheringOpenData) - ) + ) ]), ]).SetClass("flex flex-col pb-12 m-3 lg:w-3/4 lg:ml-10 link-underline") @@ -98,10 +97,10 @@ class ProfessionalGui extends LeftIndex{ noTopLevel: true, maxDepth: 2 }).SetClass("subtle"), - + LanguagePicker.CreateLanguagePicker(Translations.t.professional.title.SupportedLanguages())?.SetClass("mt-4 self-end flex-col"), ].map(el => el?.SetClass("pl-4")) - + super(leftContents, content) } diff --git a/UI/QueryParameterDocumentation.ts b/UI/QueryParameterDocumentation.ts index 684fcb32b..017ac5b77 100644 --- a/UI/QueryParameterDocumentation.ts +++ b/UI/QueryParameterDocumentation.ts @@ -23,9 +23,9 @@ export default class QueryParameterDocumentation { ), "Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case." ]) - + public static GenerateQueryParameterDocs(): BaseUIElement { - const docs : (string | BaseUIElement)[] = [...QueryParameterDocumentation.QueryParamDocsIntro]; + const docs: (string | BaseUIElement)[] = [...QueryParameterDocumentation.QueryParamDocsIntro]; for (const key in QueryParameters.documentation) { const c = new Combine([ new Title(key, 2), diff --git a/UI/ShowDataLayer/ShowDataLayer.ts b/UI/ShowDataLayer/ShowDataLayer.ts index 92db8c6db..bd9d6490e 100644 --- a/UI/ShowDataLayer/ShowDataLayer.ts +++ b/UI/ShowDataLayer/ShowDataLayer.ts @@ -44,8 +44,8 @@ export default class ShowDataLayer { */ private readonly leafletLayersPerId = new Map<string, { feature: any, leafletlayer: any }>() private readonly showDataLayerid: number; - private readonly createPopup : (tags: any, layer: LayerConfig) => ScrollableFullScreen - + private readonly createPopup: (tags: any, layer: LayerConfig) => ScrollableFullScreen + constructor(options: ShowDataLayerOptions & { layerToShow: LayerConfig }) { this._leafletMap = options.leafletMap; this.showDataLayerid = ShowDataLayer.dataLayerIds; @@ -60,7 +60,7 @@ export default class ShowDataLayer { this.allElements = options.state?.allElements; this.createPopup = undefined; this._enablePopups = options.popup !== undefined; - if(options.popup !== undefined){ + if (options.popup !== undefined) { this.createPopup = options.popup } const self = this; @@ -73,7 +73,7 @@ export default class ShowDataLayer { this._features.features.addCallback(_ => self.update(options)); options.doShowLayer?.addCallback(doShow => { const mp = options.leafletMap.data; - if(mp === null){ + if (mp === null) { self.Destroy() return true; } @@ -142,7 +142,7 @@ export default class ShowDataLayer { } } - private update(options: ShowDataLayerOptions) : boolean{ + private update(options: ShowDataLayerOptions): boolean { if (this._features.features.data === undefined) { return; } @@ -152,13 +152,13 @@ export default class ShowDataLayer { } const mp = options.leafletMap.data; - if(mp === null){ + if (mp === null) { return true; // Unregister as the map has been destroyed } if (mp === undefined) { return; } - + this._cleanCount++ // clean all the old stuff away, if any if (this.geoLayer !== undefined) { @@ -312,7 +312,7 @@ export default class ShowDataLayer { leafletLayer.on("popupopen", () => { if (infobox === undefined) { const tags = this.allElements?.getEventSourceById(feature.properties.id) ?? new UIEventSource<any>(feature.properties); - infobox = createpopup(tags, layer ); + infobox = createpopup(tags, layer); infobox.isShown.addCallback(isShown => { if (!isShown) { diff --git a/UI/ShowDataLayer/ShowDataLayerOptions.ts b/UI/ShowDataLayer/ShowDataLayerOptions.ts index cfeb31e43..e79fe00d4 100644 --- a/UI/ShowDataLayer/ShowDataLayerOptions.ts +++ b/UI/ShowDataLayer/ShowDataLayerOptions.ts @@ -1,11 +1,6 @@ import FeatureSource from "../../Logic/FeatureSource/FeatureSource"; import {UIEventSource} from "../../Logic/UIEventSource"; import {ElementStorage} from "../../Logic/ElementStorage"; -import {OsmConnection} from "../../Logic/Osm/OsmConnection"; -import {Changes} from "../../Logic/Osm/Changes"; -import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; -import FilteredLayer from "../../Models/FilteredLayer"; -import BaseLayer from "../../Models/BaseLayer"; import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; import ScrollableFullScreen from "../Base/ScrollableFullScreen"; @@ -16,5 +11,5 @@ export interface ShowDataLayerOptions { popup?: undefined | ((tags: any, layer: LayerConfig) => ScrollableFullScreen), zoomToFeatures?: false | boolean, doShowLayer?: UIEventSource<boolean>, - state?: {allElements?: ElementStorage} + state?: { allElements?: ElementStorage } } \ No newline at end of file diff --git a/UI/ShowDataLayer/ShowTileInfo.ts b/UI/ShowDataLayer/ShowTileInfo.ts index 6fd296dbe..1b6cc1d85 100644 --- a/UI/ShowDataLayer/ShowTileInfo.ts +++ b/UI/ShowDataLayer/ShowTileInfo.ts @@ -7,7 +7,6 @@ import {GeoOperations} from "../../Logic/GeoOperations"; import {Tiles} from "../../Models/TileRange"; import * as clusterstyle from "../../assets/layers/cluster_style/cluster_style.json" import State from "../../State"; -import FeatureInfoBox from "../Popup/FeatureInfoBox"; export default class ShowTileInfo { public static readonly styling = new LayerConfig(clusterstyle, "ShowTileInfo", true) diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts index 1307d9212..a61fb0f46 100644 --- a/UI/SpecialVisualizations.ts +++ b/UI/SpecialVisualizations.ts @@ -58,12 +58,12 @@ export interface SpecialVisualization { export class AllTagsPanel extends VariableUiElement { constructor(tags: UIEventSource<any>, state?) { - + const calculatedTags = [].concat( SimpleMetaTagger.lazyTags, ...(state?.layoutToUse?.layers?.map(l => l.calculatedTags?.map(c => c[0]) ?? []) ?? [])) - - + + super(tags.map(tags => { const parts = []; for (const key in tags) { @@ -76,7 +76,7 @@ export class AllTagsPanel extends VariableUiElement { } parts.push([key, v ?? "<b>undefined</b>"]); } - + for (const key of calculatedTags) { const value = tags[key] if (value === undefined) { @@ -84,12 +84,12 @@ export class AllTagsPanel extends VariableUiElement { } parts.push(["<i>" + key + "</i>", value]) } - + return new Table( ["key", "value"], parts ) - .SetStyle("border: 1px solid black; border-radius: 1em;padding:1em;display:block;").SetClass("zebra-table") + .SetStyle("border: 1px solid black; border-radius: 1em;padding:1em;display:block;").SetClass("zebra-table") })) } } @@ -697,11 +697,11 @@ export default class SpecialVisualizations { const id = tags.data[args[2] ?? "id"] state.osmConnection.closeNote(id, args[3]) ?.then(_ => { - tags.data["closed_at"] = new Date().toISOString(); - tags.ping() - }) + tags.data["closed_at"] = new Date().toISOString(); + tags.ping() + }) }) - return new LoginToggle( new Toggle( + return new LoginToggle(new Toggle( t.isClosed.SetClass("thanks"), closeButton, isClosed @@ -794,7 +794,7 @@ export default class SpecialVisualizations { }, { name: "start", - doc:"Drop the first 'start' comments", + doc: "Drop the first 'start' comments", defaultValue: "0" } ] @@ -804,7 +804,7 @@ export default class SpecialVisualizations { .map(commentsStr => { const comments: any[] = JSON.parse(commentsStr) const startLoc = Number(args[1] ?? 0) - if(!isNaN(startLoc) && startLoc > 0){ + if (!isNaN(startLoc) && startLoc > 0) { comments.splice(0, startLoc) } return new Combine(comments @@ -822,9 +822,9 @@ export default class SpecialVisualizations { defaultValue: "id" }], constr: (state, tags, args) => { - const isUploading = new UIEventSource(false); - const t = Translations.t.notes; - const id = tags.data[args[0] ?? "id"] + const isUploading = new UIEventSource(false); + const t = Translations.t.notes; + const id = tags.data[args[0] ?? "id"] const uploader = new ImgurUploader(url => { isUploading.setData(false) @@ -842,7 +842,7 @@ export default class SpecialVisualizations { fileSelector.GetValue().addCallback(filelist => { isUploading.setData(true) uploader.uploadMany("Image for osm.org/note/" + id, "CC0", filelist) - + }) const ti = Translations.t.image const uploadPanel = new Combine([ @@ -851,7 +851,7 @@ export default class SpecialVisualizations { ti.ccoExplanation.SetClass("subtle text-sm"), ti.respectPrivacy.SetClass("text-sm") ]).SetClass("flex flex-col") - return new LoginToggle( new Toggle( + return new LoginToggle(new Toggle( Translations.t.image.uploadingPicture.SetClass("alert"), uploadPanel, isUploading), t.loginToAddPicture, state) diff --git a/UI/SubstitutedTranslation.ts b/UI/SubstitutedTranslation.ts index a71598d5f..893e0df6f 100644 --- a/UI/SubstitutedTranslation.ts +++ b/UI/SubstitutedTranslation.ts @@ -72,7 +72,7 @@ export class SubstitutedTranslation extends VariableUiElement { style: string } }[] { - + for (const knownSpecial of SpecialVisualizations.specialVisualizations.concat(extraMappings)) { // Note: the '.*?' in the regex reads as 'any character, but in a non-greedy way' diff --git a/UI/Wikipedia/WikidataPreviewBox.ts b/UI/Wikipedia/WikidataPreviewBox.ts index b54ec1e18..7a94c4e02 100644 --- a/UI/Wikipedia/WikidataPreviewBox.ts +++ b/UI/Wikipedia/WikidataPreviewBox.ts @@ -81,6 +81,7 @@ export default class WikidataPreviewBox extends VariableUiElement { })) } + // @ts-ignore public static WikidataResponsePreview(wikidata: WikidataResponse): BaseUIElement { @@ -142,7 +143,7 @@ export default class WikidataPreviewBox extends VariableUiElement { continue } const value: string[] = Array.from(wikidata.claims.get(key)) - + if (display instanceof Translation) { els.push(display.Subs({value: value.join(", ")}).SetClass("m-2")) continue diff --git a/UI/i18n/Translation.ts b/UI/i18n/Translation.ts index b88cc7b37..6904ac6a9 100644 --- a/UI/i18n/Translation.ts +++ b/UI/i18n/Translation.ts @@ -7,13 +7,13 @@ export class Translation extends BaseUIElement { public static forcedLanguage = undefined; public readonly translations: object - + constructor(translations: object, context?: string) { super() if (translations === undefined) { throw `Translation without content (${context})` } - if(typeof translations === "string"){ + if (typeof translations === "string") { translations = {"*": translations}; } let count = 0; @@ -36,11 +36,6 @@ export class Translation extends BaseUIElement { get txt(): string { return this.textFor(Translation.forcedLanguage ?? Locale.language.data) } - - Destroy() { - super.Destroy(); - this.isDestroyed = true; - } static ExtractAllTranslationsFrom(object: any, context = ""): { context: string, tr: Translation }[] { const allTranslations: { context: string, tr: Translation }[] = [] @@ -74,6 +69,11 @@ export class Translation extends BaseUIElement { return new Translation(translations); } + Destroy() { + super.Destroy(); + this.isDestroyed = true; + } + public textFor(language: string): string { if (this.translations["*"]) { return this.translations["*"]; @@ -100,7 +100,7 @@ export class Translation extends BaseUIElement { const el = document.createElement("span") const self = this Locale.language.addCallbackAndRun(_ => { - if(self.isDestroyed){ + if (self.isDestroyed) { return true } el.innerHTML = this.txt @@ -124,8 +124,8 @@ export class Translation extends BaseUIElement { } return langs; } - - public AllValues(): string[]{ + + public AllValues(): string[] { return this.SupportedLanguages().map(lng => this.translations[lng]); } @@ -205,7 +205,7 @@ export class Translation extends BaseUIElement { } return allIcons.filter(icon => icon != undefined) } - + AsMarkdown(): string { return this.txt } diff --git a/Utils.ts b/Utils.ts index 2d528e734..16e7ab7e5 100644 --- a/Utils.ts +++ b/Utils.ts @@ -21,7 +21,7 @@ Remark that the syntax is slightly different then expected; it uses '$' to note Note that these values can be prepare with javascript in the theme by using a [calculatedTag](calculatedTags.md#calculating-tags-with-javascript) ` - public static readonly imageExtensions = new Set(["jpg","png","svg","jpeg",".gif"]) + public static readonly imageExtensions = new Set(["jpg", "png", "svg", "jpeg", ".gif"]) public static readonly special_visualizations_importRequirementDocs = `#### Importing a dataset into OpenStreetMap: requirements @@ -255,7 +255,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be const date: Date = el; v = date.toISOString() } - + if (useLang !== undefined && v?.translations !== undefined) { v = v.translations[useLang] ?? v.translations["*"] ?? (v.textFor !== undefined ? v.textFor(useLang) : v); } @@ -269,7 +269,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be v = "" + v } v = v.replace(/\n/g, "<br/>") - }else{ + } else { // v === undefined v = "" } @@ -344,15 +344,15 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be } static WalkJson(json: any, f: (v: number | string | boolean | undefined) => any) { - if(json === undefined){ + if (json === undefined) { return f(undefined) } const jtp = typeof json - if (jtp === "boolean" || jtp === "string" || jtp === "number"){ + if (jtp === "boolean" || jtp === "string" || jtp === "number") { return f(json) } if (json.map !== undefined) { - return json.map(sub => { + return json.map(sub => { return Utils.WalkJson(sub, f); }) } @@ -495,7 +495,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be } const data = await Utils.download(url, Utils.Merge({"accept": "application/json"}, headers ?? {})) try { - if(typeof data === "string"){ + if (typeof data === "string") { return JSON.parse(data) } return data @@ -628,8 +628,8 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be } return JSON.parse(JSON.stringify(x)); } - - public static ParseDate(str: string): Date{ + + public static ParseDate(str: string): Date { if (str.endsWith(" UTC")) { str = str.replace(" UTC", "+00") } diff --git a/all_themes_index.ts b/all_themes_index.ts index dec4d6873..12abde8c5 100644 --- a/all_themes_index.ts +++ b/all_themes_index.ts @@ -6,14 +6,14 @@ import {QueryParameters} from "./Logic/Web/QueryParameters"; const layout = QueryParameters.GetQueryParameter("layout", undefined).data ?? "" const customLayout = QueryParameters.GetQueryParameter("userlayout", undefined).data ?? "" const l = window.location; -if( layout !== ""){ - if(window.location.host.startsWith("127.0.0.1")){ - window.location.replace(l.protocol + "//" + window.location.host+"/theme.html"+ l.search + "&layout="+layout + l.hash); - }else{ - window.location.replace(l.protocol + "//" + window.location.host+"/"+layout+".html"+ l.search + l.hash); +if (layout !== "") { + if (window.location.host.startsWith("127.0.0.1")) { + window.location.replace(l.protocol + "//" + window.location.host + "/theme.html" + l.search + "&layout=" + layout + l.hash); + } else { + window.location.replace(l.protocol + "//" + window.location.host + "/" + layout + ".html" + l.search + l.hash); } -}else if (customLayout !== ""){ - window.location.replace(l.protocol + "//" + window.location.host+"/theme.html"+ l.search + l.hash); +} else if (customLayout !== "") { + window.location.replace(l.protocol + "//" + window.location.host + "/theme.html" + l.search + l.hash); } diff --git a/css/index-tailwind-output.css b/css/index-tailwind-output.css index 1f1e177a1..4fd3c6528 100644 --- a/css/index-tailwind-output.css +++ b/css/index-tailwind-output.css @@ -25,7 +25,7 @@ Use a better box model (opinionated). *, ::before, ::after { - box-sizing: border-box; + box-sizing: border-box; } /** @@ -33,9 +33,9 @@ Use a more readable tab size (opinionated). */ html { - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; } /** @@ -44,10 +44,10 @@ html { */ html { - line-height: 1.15; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ + line-height: 1.15; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ } /* @@ -60,7 +60,7 @@ Remove the margin in all browsers. */ body { - margin: 0; + margin: 0; } /** @@ -68,16 +68,14 @@ Improve consistency of default fonts in all browsers. (https://github.com/sindre */ body { - font-family: - system-ui, - -apple-system, /* Firefox supports this but not yet `system-ui` */ - 'Segoe UI', - Roboto, - Helvetica, - Arial, - sans-serif, - 'Apple Color Emoji', - 'Segoe UI Emoji'; + font-family: system-ui, + -apple-system, /* Firefox supports this but not yet `system-ui` */ 'Segoe UI', + Roboto, + Helvetica, + Arial, + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji'; } /* @@ -91,10 +89,10 @@ Grouping content */ hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ + height: 0; + /* 1 */ + color: inherit; + /* 2 */ } /* @@ -107,8 +105,8 @@ Add the correct text decoration in Chrome, Edge, and Safari. */ abbr[title] { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; } /** @@ -117,7 +115,7 @@ Add the correct font weight in Edge and Safari. b, strong { - font-weight: bolder; + font-weight: bolder; } /** @@ -129,16 +127,15 @@ code, kbd, samp, pre { - font-family: - ui-monospace, - SFMono-Regular, - Consolas, - 'Liberation Mono', - Menlo, - monospace; - /* 1 */ - font-size: 1em; - /* 2 */ + font-family: ui-monospace, + SFMono-Regular, + Consolas, + 'Liberation Mono', + Menlo, + monospace; + /* 1 */ + font-size: 1em; + /* 2 */ } /** @@ -146,7 +143,7 @@ Add the correct font size in all browsers. */ small { - font-size: 80%; + font-size: 80%; } /** @@ -155,18 +152,18 @@ Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } sub { - bottom: -0.25em; + bottom: -0.25em; } sup { - top: -0.5em; + top: -0.5em; } /* @@ -180,10 +177,10 @@ Tabular data */ table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ } /* @@ -201,14 +198,14 @@ input, optgroup, select, textarea { - font-family: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - line-height: 1.15; - /* 1 */ - margin: 0; - /* 2 */ + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ } /** @@ -218,8 +215,8 @@ Remove the inheritance of text transform in Edge and Firefox. button, select { - /* 1 */ - text-transform: none; + /* 1 */ + text-transform: none; } /** @@ -230,7 +227,7 @@ button, [type='button'], [type='reset'], [type='submit'] { - -webkit-appearance: button; + -webkit-appearance: button; } /** @@ -238,8 +235,8 @@ Remove the inner border and padding in Firefox. */ ::-moz-focus-inner { - border-style: none; - padding: 0; + border-style: none; + padding: 0; } /** @@ -247,7 +244,7 @@ Restore the focus styles unset by the previous rule. */ :-moz-focusring { - outline: 1px dotted ButtonText; + outline: 1px dotted ButtonText; } /** @@ -256,7 +253,7 @@ See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d4 */ :-moz-ui-invalid { - box-shadow: none; + box-shadow: none; } /** @@ -264,7 +261,7 @@ Remove the padding so developers are not caught out when they zero out 'fieldset */ legend { - padding: 0; + padding: 0; } /** @@ -272,7 +269,7 @@ Add the correct vertical alignment in Chrome and Firefox. */ progress { - vertical-align: baseline; + vertical-align: baseline; } /** @@ -281,7 +278,7 @@ Correct the cursor style of increment and decrement buttons in Safari. ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { - height: auto; + height: auto; } /** @@ -290,10 +287,10 @@ Correct the cursor style of increment and decrement buttons in Safari. */ [type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ } /** @@ -301,7 +298,7 @@ Remove the inner padding in Chrome and Safari on macOS. */ ::-webkit-search-decoration { - -webkit-appearance: none; + -webkit-appearance: none; } /** @@ -310,10 +307,10 @@ Remove the inner padding in Chrome and Safari on macOS. */ ::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ } /* @@ -326,7 +323,7 @@ Add the correct display in Chrome and Safari. */ summary { - display: list-item; + display: list-item; } /** @@ -352,24 +349,24 @@ hr, figure, p, pre { - margin: 0; + margin: 0; } button { - background-color: transparent; - background-image: none; + background-color: transparent; + background-image: none; } fieldset { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } ol, ul { - list-style: none; - margin: 0; - padding: 0; + list-style: none; + margin: 0; + padding: 0; } /** @@ -384,10 +381,10 @@ ul { */ html { - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 1 */ - line-height: 1.5; - /* 2 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 1 */ + line-height: 1.5; + /* 2 */ } /** @@ -396,8 +393,8 @@ html { */ body { - font-family: inherit; - line-height: inherit; + font-family: inherit; + line-height: inherit; } /** @@ -429,14 +426,14 @@ body { *, ::before, ::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: currentColor; - /* 2 */ + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: currentColor; + /* 2 */ } /* @@ -444,7 +441,7 @@ body { */ hr { - border-top-width: 1px; + border-top-width: 1px; } /** @@ -458,32 +455,32 @@ hr { */ img { - border-style: solid; + border-style: solid; } textarea { - resize: vertical; + resize: vertical; } input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - color: #9ca3af; + opacity: 1; + color: #9ca3af; } input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - color: #9ca3af; + opacity: 1; + color: #9ca3af; } input::placeholder, textarea::placeholder { - opacity: 1; - color: #9ca3af; + opacity: 1; + color: #9ca3af; } button, [role="button"] { - cursor: pointer; + cursor: pointer; } /** @@ -495,11 +492,11 @@ button, */ :-moz-focusring { - outline: auto; + outline: auto; } table { - border-collapse: collapse; + border-collapse: collapse; } h1, @@ -508,8 +505,8 @@ h3, h4, h5, h6 { - font-size: inherit; - font-weight: inherit; + font-size: inherit; + font-weight: inherit; } /** @@ -518,8 +515,8 @@ h6 { */ a { - color: inherit; - text-decoration: inherit; + color: inherit; + text-decoration: inherit; } /** @@ -535,9 +532,9 @@ input, optgroup, select, textarea { - padding: 0; - line-height: inherit; - color: inherit; + padding: 0; + line-height: inherit; + color: inherit; } /** @@ -551,7 +548,7 @@ pre, code, kbd, samp { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } /** @@ -579,10 +576,10 @@ audio, iframe, embed, object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ } /** @@ -594,8 +591,8 @@ object { img, video { - max-width: 100%; - height: auto; + max-width: 100%; + height: auto; } /** @@ -603,2061 +600,2061 @@ video { */ [hidden] { - display: none; + display: none; } *, ::before, ::after { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - --tw-border-opacity: 1; - border-color: rgba(229, 231, 235, var(--tw-border-opacity)); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgba(59, 130, 246, 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-blur: var(--tw-empty,/*!*/ /*!*/); - --tw-brightness: var(--tw-empty,/*!*/ /*!*/); - --tw-contrast: var(--tw-empty,/*!*/ /*!*/); - --tw-grayscale: var(--tw-empty,/*!*/ /*!*/); - --tw-hue-rotate: var(--tw-empty,/*!*/ /*!*/); - --tw-invert: var(--tw-empty,/*!*/ /*!*/); - --tw-saturate: var(--tw-empty,/*!*/ /*!*/); - --tw-sepia: var(--tw-empty,/*!*/ /*!*/); - --tw-drop-shadow: var(--tw-empty,/*!*/ /*!*/); - --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-border-opacity: 1; + border-color: rgba(229, 231, 235, var(--tw-border-opacity)); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgba(59, 130, 246, 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-blur: var(--tw-empty, /*!*/ /*!*/); + --tw-brightness: var(--tw-empty, /*!*/ /*!*/); + --tw-contrast: var(--tw-empty, /*!*/ /*!*/); + --tw-grayscale: var(--tw-empty, /*!*/ /*!*/); + --tw-hue-rotate: var(--tw-empty, /*!*/ /*!*/); + --tw-invert: var(--tw-empty, /*!*/ /*!*/); + --tw-saturate: var(--tw-empty, /*!*/ /*!*/); + --tw-sepia: var(--tw-empty, /*!*/ /*!*/); + --tw-drop-shadow: var(--tw-empty, /*!*/ /*!*/); + --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .container { - width: 100%; + width: 100%; } @media (min-width: 640px) { - .container { - max-width: 640px; - } + .container { + max-width: 640px; + } } @media (min-width: 768px) { - .container { - max-width: 768px; - } + .container { + max-width: 768px; + } } @media (min-width: 1024px) { - .container { - max-width: 1024px; - } + .container { + max-width: 1024px; + } } @media (min-width: 1280px) { - .container { - max-width: 1280px; - } + .container { + max-width: 1280px; + } } @media (min-width: 1536px) { - .container { - max-width: 1536px; - } + .container { + max-width: 1536px; + } } .pointer-events-none { - pointer-events: none; + pointer-events: none; } .pointer-events-auto { - pointer-events: auto; + pointer-events: auto; } .visible { - visibility: visible; + visibility: visible; } .invisible { - visibility: hidden; + visibility: hidden; } .static { - position: static; + position: static; } .fixed { - position: fixed; + position: fixed; } .absolute { - position: absolute; + position: absolute; } .relative { - position: relative; + position: relative; } .sticky { - position: sticky; + position: sticky; } .inset-0 { - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; } .left-24 { - left: 6rem; + left: 6rem; } .right-24 { - right: 6rem; + right: 6rem; } .top-56 { - top: 14rem; + top: 14rem; } .bottom-3 { - bottom: 0.75rem; + bottom: 0.75rem; } .left-3 { - left: 0.75rem; + left: 0.75rem; } .right-2 { - right: 0.5rem; + right: 0.5rem; } .top-2 { - top: 0.5rem; + top: 0.5rem; } .right-3 { - right: 0.75rem; + right: 0.75rem; } .bottom-0 { - bottom: 0px; + bottom: 0px; } .right-1\/3 { - right: 33.333333%; + right: 33.333333%; } .top-4 { - top: 1rem; + top: 1rem; } .top-0 { - top: 0px; + top: 0px; } .right-0 { - right: 0px; + right: 0px; } .left-0 { - left: 0px; + left: 0px; } .isolate { - isolation: isolate; + isolation: isolate; } .z-10 { - z-index: 10; + z-index: 10; } .z-0 { - z-index: 0; + z-index: 0; } .float-right { - float: right; + float: right; } .float-left { - float: left; + float: left; } .float-none { - float: none; + float: none; } .m-8 { - margin: 2rem; + margin: 2rem; } .m-1 { - margin: 0.25rem; + margin: 0.25rem; } .m-4 { - margin: 1rem; + margin: 1rem; } .m-5 { - margin: 1.25rem; + margin: 1.25rem; } .m-0\.5 { - margin: 0.125rem; + margin: 0.125rem; } .m-0 { - margin: 0px; + margin: 0px; } .m-3 { - margin: 0.75rem; + margin: 0.75rem; } .m-2 { - margin: 0.5rem; + margin: 0.5rem; } .m-6 { - margin: 1.5rem; + margin: 1.5rem; } .m-px { - margin: 1px; + margin: 1px; } .my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } .mx-10 { - margin-left: 2.5rem; - margin-right: 2.5rem; + margin-left: 2.5rem; + margin-right: 2.5rem; } .my-3 { - margin-top: 0.75rem; - margin-bottom: 0.75rem; + margin-top: 0.75rem; + margin-bottom: 0.75rem; } .mx-4 { - margin-left: 1rem; - margin-right: 1rem; + margin-left: 1rem; + margin-right: 1rem; } .ml-3 { - margin-left: 0.75rem; + margin-left: 0.75rem; } .mb-4 { - margin-bottom: 1rem; + margin-bottom: 1rem; } .mt-4 { - margin-top: 1rem; + margin-top: 1rem; } .mr-2 { - margin-right: 0.5rem; + margin-right: 0.5rem; } .mt-1 { - margin-top: 0.25rem; + margin-top: 0.25rem; } .ml-4 { - margin-left: 1rem; + margin-left: 1rem; } .mb-24 { - margin-bottom: 6rem; + margin-bottom: 6rem; } .mr-4 { - margin-right: 1rem; + margin-right: 1rem; } .mt-2 { - margin-top: 0.5rem; + margin-top: 0.5rem; } .ml-2 { - margin-left: 0.5rem; + margin-left: 0.5rem; } .mt-3 { - margin-top: 0.75rem; + margin-top: 0.75rem; } .ml-8 { - margin-left: 2rem; + margin-left: 2rem; } .mb-10 { - margin-bottom: 2.5rem; + margin-bottom: 2.5rem; } .mt-0 { - margin-top: 0px; + margin-top: 0px; } .mb-8 { - margin-bottom: 2rem; + margin-bottom: 2rem; } .ml-1 { - margin-left: 0.25rem; + margin-left: 0.25rem; } .mr-0 { - margin-right: 0px; + margin-right: 0px; } .mb-1 { - margin-bottom: 0.25rem; + margin-bottom: 0.25rem; } .mr-3 { - margin-right: 0.75rem; + margin-right: 0.75rem; } .mb-2 { - margin-bottom: 0.5rem; + margin-bottom: 0.5rem; } .mb-0 { - margin-bottom: 0px; + margin-bottom: 0px; } .box-border { - box-sizing: border-box; + box-sizing: border-box; } .box-content { - box-sizing: content-box; + box-sizing: content-box; } .block { - display: block; + display: block; } .inline-block { - display: inline-block; + display: inline-block; } .inline { - display: inline; + display: inline; } .flex { - display: flex; + display: flex; } .inline-flex { - display: inline-flex; + display: inline-flex; } .table { - display: table; + display: table; } .table-caption { - display: table-caption; + display: table-caption; } .table-cell { - display: table-cell; + display: table-cell; } .table-column { - display: table-column; + display: table-column; } .table-column-group { - display: table-column-group; + display: table-column-group; } .table-footer-group { - display: table-footer-group; + display: table-footer-group; } .table-header-group { - display: table-header-group; + display: table-header-group; } .table-row-group { - display: table-row-group; + display: table-row-group; } .table-row { - display: table-row; + display: table-row; } .grid { - display: grid; + display: grid; } .contents { - display: contents; + display: contents; } .list-item { - display: list-item; + display: list-item; } .hidden { - display: none; + display: none; } .h-24 { - height: 6rem; + height: 6rem; } .h-full { - height: 100%; + height: 100%; } .h-10 { - height: 2.5rem; + height: 2.5rem; } .h-12 { - height: 3rem; + height: 3rem; } .h-8 { - height: 2rem; + height: 2rem; } .h-1\/2 { - height: 50%; + height: 50%; } .h-screen { - height: 100vh; + height: 100vh; } .h-11 { - height: 2.75rem; + height: 2.75rem; } .h-32 { - height: 8rem; + height: 8rem; } .h-16 { - height: 4rem; + height: 4rem; } .h-6 { - height: 1.5rem; + height: 1.5rem; } .h-4 { - height: 1rem; + height: 1rem; } .h-0 { - height: 0px; + height: 0px; } .h-3 { - height: 0.75rem; + height: 0.75rem; } .h-48 { - height: 12rem; + height: 12rem; } .max-h-7 { - max-height: 1.75rem; + max-height: 1.75rem; } .max-h-20vh { - max-height: 20vh; + max-height: 20vh; } .max-h-32 { - max-height: 8rem; + max-height: 8rem; } .max-h-4 { - max-height: 1rem; + max-height: 1rem; } .max-h-8 { - max-height: 2rem; + max-height: 2rem; } .w-full { - width: 100%; + width: 100%; } .w-24 { - width: 6rem; + width: 6rem; } .w-6 { - width: 1.5rem; + width: 1.5rem; } .w-10 { - width: 2.5rem; + width: 2.5rem; } .w-12 { - width: 3rem; + width: 3rem; } .w-8 { - width: 2rem; + width: 2rem; } .w-0 { - width: 0px; + width: 0px; } .w-screen { - width: 100vw; + width: 100vw; } .w-11 { - width: 2.75rem; + width: 2.75rem; } .w-4 { - width: 1rem; + width: 1rem; } .w-16 { - width: 4rem; + width: 4rem; } .w-min { - width: -webkit-min-content; - width: -moz-min-content; - width: min-content; + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; } .w-max { - width: -webkit-max-content; - width: -moz-max-content; - width: max-content; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; } .min-w-min { - min-width: -webkit-min-content; - min-width: -moz-min-content; - min-width: min-content; + min-width: -webkit-min-content; + min-width: -moz-min-content; + min-width: min-content; } .min-w-\[20em\] { - min-width: 20em; + min-width: 20em; } .max-w-full { - max-width: 100%; + max-width: 100%; } .flex-none { - flex: none; + flex: none; } .flex-auto { - flex: 1 1 auto; + flex: 1 1 auto; } .flex-shrink-0 { - flex-shrink: 0; + flex-shrink: 0; } .flex-shrink { - flex-shrink: 1; + flex-shrink: 1; } .flex-grow { - flex-grow: 1; + flex-grow: 1; } .border-collapse { - border-collapse: collapse; + border-collapse: collapse; } .transform { - transform: var(--tw-transform); + transform: var(--tw-transform); } @-webkit-keyframes pulse { - 50% { - opacity: .5; - } + 50% { + opacity: .5; + } } @keyframes pulse { - 50% { - opacity: .5; - } + 50% { + opacity: .5; + } } .animate-pulse { - -webkit-animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; - animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + -webkit-animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } @-webkit-keyframes spin { - to { - transform: rotate(360deg); - } + to { + transform: rotate(360deg); + } } @keyframes spin { - to { - transform: rotate(360deg); - } + to { + transform: rotate(360deg); + } } .animate-spin { - -webkit-animation: spin 1s linear infinite; - animation: spin 1s linear infinite; + -webkit-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; } .cursor-pointer { - cursor: pointer; + cursor: pointer; } .cursor-wait { - cursor: wait; + cursor: wait; } .resize { - resize: both; + resize: both; } .flex-row { - flex-direction: row; + flex-direction: row; } .flex-col { - flex-direction: column; + flex-direction: column; } .flex-wrap { - flex-wrap: wrap; + flex-wrap: wrap; } .content-around { - align-content: space-around; + align-content: space-around; } .items-end { - align-items: flex-end; + align-items: flex-end; } .items-center { - align-items: center; + align-items: center; } .items-baseline { - align-items: baseline; + align-items: baseline; } .justify-end { - justify-content: flex-end; + justify-content: flex-end; } .justify-center { - justify-content: center; + justify-content: center; } .justify-between { - justify-content: space-between; + justify-content: space-between; } .gap-4 { - gap: 1rem; + gap: 1rem; } .space-x-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.5rem * var(--tw-space-x-reverse)); - margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); } .self-end { - align-self: flex-end; + align-self: flex-end; } .self-center { - align-self: center; + align-self: center; } .overflow-auto { - overflow: auto; + overflow: auto; } .overflow-hidden { - overflow: hidden; + overflow: hidden; } .overflow-scroll { - overflow: scroll; + overflow: scroll; } .overflow-y-auto { - overflow-y: auto; + overflow-y: auto; } .truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .overflow-ellipsis { - text-overflow: ellipsis; + text-overflow: ellipsis; } .whitespace-nowrap { - white-space: nowrap; + white-space: nowrap; } .break-normal { - overflow-wrap: normal; - word-break: normal; + overflow-wrap: normal; + word-break: normal; } .break-words { - overflow-wrap: break-word; + overflow-wrap: break-word; } .break-all { - word-break: break-all; + word-break: break-all; } .rounded-full { - border-radius: 9999px; + border-radius: 9999px; } .rounded-3xl { - border-radius: 1.5rem; + border-radius: 1.5rem; } .rounded { - border-radius: 0.25rem; + border-radius: 0.25rem; } .rounded-xl { - border-radius: 0.75rem; + border-radius: 0.75rem; } .rounded-lg { - border-radius: 0.5rem; + border-radius: 0.5rem; } .rounded-sm { - border-radius: 0.125rem; + border-radius: 0.125rem; } .rounded-l { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } .border-2 { - border-width: 2px; + border-width: 2px; } .border { - border-width: 1px; + border-width: 1px; } .border-4 { - border-width: 4px; + border-width: 4px; } .border-l-4 { - border-left-width: 4px; + border-left-width: 4px; } .border-b { - border-bottom-width: 1px; + border-bottom-width: 1px; } .border-gray-500 { - --tw-border-opacity: 1; - border-color: rgba(107, 114, 128, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(107, 114, 128, var(--tw-border-opacity)); } .border-black { - --tw-border-opacity: 1; - border-color: rgba(0, 0, 0, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(0, 0, 0, var(--tw-border-opacity)); } .border-gray-300 { - --tw-border-opacity: 1; - border-color: rgba(209, 213, 219, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(209, 213, 219, var(--tw-border-opacity)); } .border-red-300 { - --tw-border-opacity: 1; - border-color: rgba(252, 165, 165, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(252, 165, 165, var(--tw-border-opacity)); } .border-gray-400 { - --tw-border-opacity: 1; - border-color: rgba(156, 163, 175, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(156, 163, 175, var(--tw-border-opacity)); } .border-gray-200 { - --tw-border-opacity: 1; - border-color: rgba(229, 231, 235, var(--tw-border-opacity)); + --tw-border-opacity: 1; + border-color: rgba(229, 231, 235, var(--tw-border-opacity)); } .border-opacity-50 { - --tw-border-opacity: 0.5; + --tw-border-opacity: 0.5; } .bg-white { - --tw-bg-opacity: 1; - background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); } .bg-blue-100 { - --tw-bg-opacity: 1; - background-color: rgba(219, 234, 254, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(219, 234, 254, var(--tw-bg-opacity)); } .bg-gray-400 { - --tw-bg-opacity: 1; - background-color: rgba(156, 163, 175, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(156, 163, 175, var(--tw-bg-opacity)); } .bg-indigo-100 { - --tw-bg-opacity: 1; - background-color: rgba(224, 231, 255, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(224, 231, 255, var(--tw-bg-opacity)); } .bg-gray-300 { - --tw-bg-opacity: 1; - background-color: rgba(209, 213, 219, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(209, 213, 219, var(--tw-bg-opacity)); } .bg-black { - --tw-bg-opacity: 1; - background-color: rgba(0, 0, 0, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(0, 0, 0, var(--tw-bg-opacity)); } .bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgba(229, 231, 235, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(229, 231, 235, var(--tw-bg-opacity)); } .bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgba(243, 244, 246, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(243, 244, 246, var(--tw-bg-opacity)); } .bg-red-500 { - --tw-bg-opacity: 1; - background-color: rgba(239, 68, 68, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(239, 68, 68, var(--tw-bg-opacity)); } .bg-red-200 { - --tw-bg-opacity: 1; - background-color: rgba(254, 202, 202, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(254, 202, 202, var(--tw-bg-opacity)); } .p-3 { - padding: 0.75rem; + padding: 0.75rem; } .p-4 { - padding: 1rem; + padding: 1rem; } .p-1\.5 { - padding: 0.375rem; + padding: 0.375rem; } .p-1 { - padding: 0.25rem; + padding: 0.25rem; } .p-2 { - padding: 0.5rem; + padding: 0.5rem; } .p-0 { - padding: 0px; + padding: 0px; } .p-0\.5 { - padding: 0.125rem; + padding: 0.125rem; } .p-8 { - padding: 2rem; + padding: 2rem; } .pb-12 { - padding-bottom: 3rem; + padding-bottom: 3rem; } .pl-4 { - padding-left: 1rem; + padding-left: 1rem; } .pl-2 { - padding-left: 0.5rem; + padding-left: 0.5rem; } .pb-20 { - padding-bottom: 5rem; + padding-bottom: 5rem; } .pt-1 { - padding-top: 0.25rem; + padding-top: 0.25rem; } .pb-1 { - padding-bottom: 0.25rem; + padding-bottom: 0.25rem; } .pl-1 { - padding-left: 0.25rem; + padding-left: 0.25rem; } .pr-1 { - padding-right: 0.25rem; + padding-right: 0.25rem; } .pl-5 { - padding-left: 1.25rem; + padding-left: 1.25rem; } .pr-3 { - padding-right: 0.75rem; + padding-right: 0.75rem; } .pr-4 { - padding-right: 1rem; + padding-right: 1rem; } .pl-3 { - padding-left: 0.75rem; + padding-left: 0.75rem; } .pr-2 { - padding-right: 0.5rem; + padding-right: 0.5rem; } .pr-0 { - padding-right: 0px; + padding-right: 0px; } .pt-0\.5 { - padding-top: 0.125rem; + padding-top: 0.125rem; } .pt-0 { - padding-top: 0px; + padding-top: 0px; } .pb-2 { - padding-bottom: 0.5rem; + padding-bottom: 0.5rem; } .pl-6 { - padding-left: 1.5rem; + padding-left: 1.5rem; } .pt-2 { - padding-top: 0.5rem; + padding-top: 0.5rem; } .text-center { - text-align: center; + text-align: center; } .align-baseline { - vertical-align: baseline; + vertical-align: baseline; } .align-middle { - vertical-align: middle; + vertical-align: middle; } .text-xl { - font-size: 1.25rem; - line-height: 1.75rem; + font-size: 1.25rem; + line-height: 1.75rem; } .text-lg { - font-size: 1.125rem; - line-height: 1.75rem; + font-size: 1.125rem; + line-height: 1.75rem; } .text-2xl { - font-size: 1.5rem; - line-height: 2rem; + font-size: 1.5rem; + line-height: 2rem; } .text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; + font-size: 2.25rem; + line-height: 2.5rem; } .text-sm { - font-size: 0.875rem; - line-height: 1.25rem; + font-size: 0.875rem; + line-height: 1.25rem; } .text-3xl { - font-size: 1.875rem; - line-height: 2.25rem; + font-size: 1.875rem; + line-height: 2.25rem; } .text-base { - font-size: 1rem; - line-height: 1.5rem; + font-size: 1rem; + line-height: 1.5rem; } .font-bold { - font-weight: 700; + font-weight: 700; } .font-extrabold { - font-weight: 800; + font-weight: 800; } .font-semibold { - font-weight: 600; + font-weight: 600; } .font-medium { - font-weight: 500; + font-weight: 500; } .uppercase { - text-transform: uppercase; + text-transform: uppercase; } .lowercase { - text-transform: lowercase; + text-transform: lowercase; } .capitalize { - text-transform: capitalize; + text-transform: capitalize; } .italic { - font-style: italic; + font-style: italic; } .ordinal, .slashed-zero, .lining-nums, .oldstyle-nums, .proportional-nums, .tabular-nums, .diagonal-fractions, .stacked-fractions { - --tw-ordinal: var(--tw-empty,/*!*/ /*!*/); - --tw-slashed-zero: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-figure: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-spacing: var(--tw-empty,/*!*/ /*!*/); - --tw-numeric-fraction: var(--tw-empty,/*!*/ /*!*/); - font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); + --tw-ordinal: var(--tw-empty, /*!*/ /*!*/); + --tw-slashed-zero: var(--tw-empty, /*!*/ /*!*/); + --tw-numeric-figure: var(--tw-empty, /*!*/ /*!*/); + --tw-numeric-spacing: var(--tw-empty, /*!*/ /*!*/); + --tw-numeric-fraction: var(--tw-empty, /*!*/ /*!*/); + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); } .ordinal { - --tw-ordinal: ordinal; + --tw-ordinal: ordinal; } .leading-6 { - line-height: 1.5rem; + line-height: 1.5rem; } .tracking-tight { - letter-spacing: -0.025em; + letter-spacing: -0.025em; } .text-white { - --tw-text-opacity: 1; - color: rgba(255, 255, 255, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(255, 255, 255, var(--tw-text-opacity)); } .text-gray-900 { - --tw-text-opacity: 1; - color: rgba(17, 24, 39, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(17, 24, 39, var(--tw-text-opacity)); } .text-gray-800 { - --tw-text-opacity: 1; - color: rgba(31, 41, 55, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(31, 41, 55, var(--tw-text-opacity)); } .text-gray-500 { - --tw-text-opacity: 1; - color: rgba(107, 114, 128, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(107, 114, 128, var(--tw-text-opacity)); } .text-green-600 { - --tw-text-opacity: 1; - color: rgba(5, 150, 105, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(5, 150, 105, var(--tw-text-opacity)); } .underline { - text-decoration: underline; + text-decoration: underline; } .line-through { - text-decoration: line-through; + text-decoration: line-through; } .opacity-50 { - opacity: 0.5; + opacity: 0.5; } .opacity-0 { - opacity: 0; + opacity: 0; } .opacity-40 { - opacity: 0.4; + opacity: 0.4; } .shadow { - --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .ring { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } .blur { - --tw-blur: blur(8px); - filter: var(--tw-filter); + --tw-blur: blur(8px); + filter: var(--tw-filter); } .drop-shadow { - --tw-drop-shadow: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1)) drop-shadow(0 1px 1px rgba(0, 0, 0, 0.06)); - filter: var(--tw-filter); + --tw-drop-shadow: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1)) drop-shadow(0 1px 1px rgba(0, 0, 0, 0.06)); + filter: var(--tw-filter); } .invert { - --tw-invert: invert(100%); - filter: var(--tw-filter); + --tw-invert: invert(100%); + filter: var(--tw-filter); } .filter { - filter: var(--tw-filter); + filter: var(--tw-filter); } .transition { - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; } .transition-colors { - transition-property: background-color, border-color, color, fill, stroke; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; + transition-property: background-color, border-color, color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; } .transition-opacity { - transition-property: opacity; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; } .duration-500 { - transition-duration: 500ms; + transition-duration: 500ms; } .ease-in { - transition-timing-function: cubic-bezier(0.4, 0, 1, 1); + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } .z-above-map { - z-index: 10000 + z-index: 10000 } .z-above-controls { - z-index: 10001 + z-index: 10001 } .btn { - display: inline-flex; - justify-content: center; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - padding-right: 1rem; - border-width: 1px; - border-color: transparent; - --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - border-radius: 1.5rem; - --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); - --tw-ring-opacity: 1; - --tw-ring-color: rgba(191, 219, 254, var(--tw-ring-opacity)); + display: inline-flex; + justify-content: center; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + padding-right: 1rem; + border-width: 1px; + border-color: transparent; + --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + border-radius: 1.5rem; + --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(191, 219, 254, var(--tw-ring-opacity)); } .btn:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(147, 197, 253, var(--tw-ring-opacity)); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(147, 197, 253, var(--tw-ring-opacity)); } .btn { - margin-top: 0.25rem; - margin-right: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 500; - --tw-text-opacity: 1; - color: rgba(255, 255, 255, var(--tw-text-opacity)); - --tw-bg-opacity: 1; - background-color: rgba(37, 99, 235, var(--tw-bg-opacity)); + margin-top: 0.25rem; + margin-right: 0.25rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 500; + --tw-text-opacity: 1; + color: rgba(255, 255, 255, var(--tw-text-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(37, 99, 235, var(--tw-bg-opacity)); } .btn:hover { - --tw-bg-opacity: 1; - background-color: rgba(29, 78, 216, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(29, 78, 216, var(--tw-bg-opacity)); } .btn:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-opacity: 1; - --tw-ring-color: rgba(29, 78, 216, var(--tw-ring-opacity)); + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-opacity: 1; + --tw-ring-color: rgba(29, 78, 216, var(--tw-ring-opacity)); } .btn-secondary { - --tw-bg-opacity: 1; - background-color: rgba(75, 85, 99, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(75, 85, 99, var(--tw-bg-opacity)); } .btn-secondary:hover { - --tw-bg-opacity: 1; - background-color: rgba(55, 65, 81, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(55, 65, 81, var(--tw-bg-opacity)); } .btn-disabled { - --tw-bg-opacity: 1; - background-color: rgba(107, 114, 128, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(107, 114, 128, var(--tw-bg-opacity)); } .btn-disabled:hover { - --tw-bg-opacity: 1; - background-color: rgba(107, 114, 128, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(107, 114, 128, var(--tw-bg-opacity)); } .btn-disabled { - --tw-text-opacity: 1; - color: rgba(209, 213, 219, var(--tw-text-opacity)); - --tw-ring-opacity: 1; - --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); + --tw-text-opacity: 1; + color: rgba(209, 213, 219, var(--tw-text-opacity)); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); } .btn-disabled:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); } .btn-disabled:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); + --tw-ring-opacity: 1; + --tw-ring-color: rgba(229, 231, 235, var(--tw-ring-opacity)); } .btn-disabled { - cursor: default; + cursor: default; } :root { - --subtle-detail-color: #e5f5ff; - --subtle-detail-color-contrast: black; - --subtle-detail-color-light-contrast: lightgrey; - --catch-detail-color: #3a3aeb; - --catch-detail-color-contrast: white; - --alert-color: #fee4d1; - --background-color: white; - --foreground-color: black; - --popup-border: white; - --shadow-color: #00000066; - --variable-title-height: 0px; - /* Set by javascript */ - --return-to-the-map-height: 2em; - --image-carousel-height: 350px; + --subtle-detail-color: #e5f5ff; + --subtle-detail-color-contrast: black; + --subtle-detail-color-light-contrast: lightgrey; + --catch-detail-color: #3a3aeb; + --catch-detail-color-contrast: white; + --alert-color: #fee4d1; + --background-color: white; + --foreground-color: black; + --popup-border: white; + --shadow-color: #00000066; + --variable-title-height: 0px; + /* Set by javascript */ + --return-to-the-map-height: 2em; + --image-carousel-height: 350px; } html, body { - height: 100%; - min-height: 100vh; - min-height: -webkit-fill-available; - margin: 0; - padding: 0; - background-color: var(--background-color); - color: var(--foreground-color); - font-family: 'Helvetica Neue', Arial, sans-serif; + height: 100%; + min-height: 100vh; + min-height: -webkit-fill-available; + margin: 0; + padding: 0; + background-color: var(--background-color); + color: var(--foreground-color); + font-family: 'Helvetica Neue', Arial, sans-serif; } .leaflet-overlay-pane .leaflet-zoom-animated { - /* Another workaround to keep leaflet working */ - width: initial !important; - height: initial !important; - box-sizing: initial !important; + /* Another workaround to keep leaflet working */ + width: initial !important; + height: initial !important; + box-sizing: initial !important; } .leaflet-control-attribution { - display: block ruby; + display: block ruby; } .badge { } .badge svg { - /*Workaround for leaflet*/ - width: unset !important; - height: 100% !important; + /*Workaround for leaflet*/ + width: unset !important; + height: 100% !important; } svg, img { - box-sizing: content-box; - width: 100%; - height: 100%; + box-sizing: content-box; + width: 100%; + height: 100%; } .no-images img { - display: none; + display: none; } .mapcontrol svg path { - fill: var(--subtle-detail-color-contrast) !important; + fill: var(--subtle-detail-color-contrast) !important; } .red-svg svg path { - stroke: #d71010 !important; + stroke: #d71010 !important; } a { - color: var(--foreground-color); + color: var(--foreground-color); } btn { - margin-top: 0.25rem; - margin-right: 0.25rem; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 500; - --tw-text-opacity: 1; - color: var(--catch-detail-color-contrast); - --tw-bg-opacity: 1; - background-color: var(--catch-detail-color); + margin-top: 0.25rem; + margin-right: 0.25rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 500; + --tw-text-opacity: 1; + color: var(--catch-detail-color-contrast); + --tw-bg-opacity: 1; + background-color: var(--catch-detail-color); } .h-min { - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; } .w-min { - width: -webkit-min-content; - width: -moz-min-content; - width: min-content; + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; } .w-16-imp { - width: 4rem !important; + width: 4rem !important; } .link-underline a { - -webkit-text-decoration: underline 1px #0078a855; - text-decoration: underline 1px #0078a855; - color: #0078A8; + -webkit-text-decoration: underline 1px #0078a855; + text-decoration: underline 1px #0078a855; + color: #0078A8; } .link-no-underline a { - text-decoration: none; + text-decoration: none; } li { - margin-left: 0.5em; - padding-left: 0.2em; - margin-top: 0.1em; + margin-left: 0.5em; + padding-left: 0.2em; + margin-top: 0.1em; } h2 { - font-size: large; - margin-top: 0.5em; - margin-bottom: 0.3em; - font-weight: bold; + font-size: large; + margin-top: 0.5em; + margin-bottom: 0.3em; + font-weight: bold; } h3 { - font-size: larger; - margin-top: 0.6em; - margin-bottom: 0; - font-weight: bold; - font-size: larger; - margin-top: 0.6em; - margin-bottom: 0; - font-weight: bolder; + font-size: larger; + margin-top: 0.6em; + margin-bottom: 0; + font-weight: bold; + font-size: larger; + margin-top: 0.6em; + margin-bottom: 0; + font-weight: bolder; } p { - padding-top: 0.1em; + padding-top: 0.1em; } li::marker { - content: "•" + content: "•" } .subtle-background { - background: var(--subtle-detail-color); - color: var(--subtle-detail-color-contrast); + background: var(--subtle-detail-color); + color: var(--subtle-detail-color-contrast); } .normal-background { - background: var(--background-color); - color: var(--foreground-color) + background: var(--background-color); + color: var(--foreground-color) } .subtle-lighter { - color: var(--subtle-detail-color-light-contrast); + color: var(--subtle-detail-color-light-contrast); } .border-attention-catch { - border: 5px solid var(--catch-detail-color); + border: 5px solid var(--catch-detail-color); } .border-invisible { - border: 5px solid #00000000; + border: 5px solid #00000000; } .border-attention { - border-color: var(--catch-detail-color); + border-color: var(--catch-detail-color); } .direction-svg svg path { - fill: var(--catch-detail-color) !important; + fill: var(--catch-detail-color) !important; } #leafletDiv { - height: 100%; + height: 100%; } .leaflet-popup-content-wrapper { - background-color: var(--background-color); - color: var(--foreground-color); - border: 2px solid var(--popup-border); - box-shadow: 0 3px 14px var(--shadow-color) !important; + background-color: var(--background-color); + color: var(--foreground-color); + border: 2px solid var(--popup-border); + box-shadow: 0 3px 14px var(--shadow-color) !important; } .leaflet-container { - background-color: var(--background-color) !important; + background-color: var(--background-color) !important; } .leaflet-popup-tip { - background-color: var(--popup-border) !important; - color: var(--popup-border) !important; - box-shadow: 0 3px 14px var(--shadow-color) !important; + background-color: var(--popup-border) !important; + color: var(--popup-border) !important; + box-shadow: 0 3px 14px var(--shadow-color) !important; } .single-layer-selection-toggle { - position: relative; - width: 2em; - height: 2em; - flex-shrink: 0; + position: relative; + width: 2em; + height: 2em; + flex-shrink: 0; } .single-layer-selection-toggle img { - max-height: 2em !important; - max-width: 2em !important; + max-height: 2em !important; + max-width: 2em !important; } .single-layer-selection-toggle svg { - max-height: 2em !important; - max-width: 2em !important; + max-height: 2em !important; + max-width: 2em !important; } .block-ruby { - display: block ruby; + display: block ruby; } .disable-links a { - pointer-events: none; - text-decoration: none !important; - color: var(--subtle-detail-color-contrast) !important; + pointer-events: none; + text-decoration: none !important; + color: var(--subtle-detail-color-contrast) !important; } .enable-links a { - pointer-events: unset; - text-decoration: underline !important; - color: unset !important; + pointer-events: unset; + text-decoration: underline !important; + color: unset !important; } .disable-links a.must-link, .disable-links .must-link a { - /* Hide links if they are disabled */ - display: none; + /* Hide links if they are disabled */ + display: none; } /**************** GENERIC ****************/ .alert { - background-color: var(--alert-color); - font-weight: bold; - border-radius: 1em; - margin: 0.25em; - text-align: center; - padding: 0.15em 0.3em; + background-color: var(--alert-color); + font-weight: bold; + border-radius: 1em; + margin: 0.25em; + text-align: center; + padding: 0.15em 0.3em; } .invalid { - box-shadow: 0 0 10px #ff5353; - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; + box-shadow: 0 0 10px #ff5353; + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; } .shadow { - box-shadow: 0 0 10px var(--shadow-color); + box-shadow: 0 0 10px var(--shadow-color); } .title-font span { - font-size: xx-large !important; - font-weight: bold; + font-size: xx-large !important; + font-weight: bold; } .soft { - background-color: var(--subtle-detail-color); - color: var(--subtle-detail-color-contrast); - font-weight: bold; - border-radius: 1em; - margin: 0.25em; - text-align: center; - padding: 0.15em 0.3em; + background-color: var(--subtle-detail-color); + color: var(--subtle-detail-color-contrast); + font-weight: bold; + border-radius: 1em; + margin: 0.25em; + text-align: center; + padding: 0.15em 0.3em; } .subtle { - color: #999; + color: #999; } .link-underline .subtle a { - -webkit-text-decoration: underline 1px #7193bb88; - text-decoration: underline 1px #7193bb88; - color: #7193bb; + -webkit-text-decoration: underline 1px #7193bb88; + text-decoration: underline 1px #7193bb88; + color: #7193bb; } .thanks { - background-color: #43d904; - font-weight: bold; - border-radius: 1em; - margin: 0.25em; - text-align: center; - padding: 0.15em 0.3em; + background-color: #43d904; + font-weight: bold; + border-radius: 1em; + margin: 0.25em; + text-align: center; + padding: 0.15em 0.3em; } .clickable { - pointer-events: all; + pointer-events: all; } .unclickable { - pointer-events: none !important; + pointer-events: none !important; } @-webkit-keyframes slide { - /* This is the animation on the marker to add a new point - it slides through all the possible presets */ + /* This is the animation on the marker to add a new point - it slides through all the possible presets */ - from { - transform: translateX(0%); - } + from { + transform: translateX(0%); + } - to { - transform: translateX(calc(-100% + 42px)); - } + to { + transform: translateX(calc(-100% + 42px)); + } } @keyframes slide { - /* This is the animation on the marker to add a new point - it slides through all the possible presets */ + /* This is the animation on the marker to add a new point - it slides through all the possible presets */ - from { - transform: translateX(0%); - } + from { + transform: translateX(0%); + } - to { - transform: translateX(calc(-100% + 42px)); - } + to { + transform: translateX(calc(-100% + 42px)); + } } .hand-drag-animation { - -webkit-animation: hand-drag-animation 6s ease-in-out infinite; - animation: hand-drag-animation 6s ease-in-out infinite; - transform-origin: 50% 125%; + -webkit-animation: hand-drag-animation 6s ease-in-out infinite; + animation: hand-drag-animation 6s ease-in-out infinite; + transform-origin: 50% 125%; } @-webkit-keyframes hand-drag-animation { - /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */ + /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */ - 0% { - opacity: 0; - transform: rotate(-30deg); - } + 0% { + opacity: 0; + transform: rotate(-30deg); + } - 6% { - opacity: 1; - transform: rotate(-30deg); - } + 6% { + opacity: 1; + transform: rotate(-30deg); + } - 12% { - opacity: 1; - transform: rotate(-45deg); - } + 12% { + opacity: 1; + transform: rotate(-45deg); + } - 24% { - opacity: 1; - transform: rotate(-00deg); - } + 24% { + opacity: 1; + transform: rotate(-00deg); + } - 30% { - opacity: 1; - transform: rotate(-30deg); - } + 30% { + opacity: 1; + transform: rotate(-30deg); + } - 36% { - opacity: 0; - transform: rotate(-30deg); - } + 36% { + opacity: 0; + transform: rotate(-30deg); + } - 100% { - opacity: 0; - transform: rotate(-30deg); - } + 100% { + opacity: 0; + transform: rotate(-30deg); + } } @keyframes hand-drag-animation { - /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */ + /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */ - 0% { - opacity: 0; - transform: rotate(-30deg); - } + 0% { + opacity: 0; + transform: rotate(-30deg); + } - 6% { - opacity: 1; - transform: rotate(-30deg); - } + 6% { + opacity: 1; + transform: rotate(-30deg); + } - 12% { - opacity: 1; - transform: rotate(-45deg); - } + 12% { + opacity: 1; + transform: rotate(-45deg); + } - 24% { - opacity: 1; - transform: rotate(-00deg); - } + 24% { + opacity: 1; + transform: rotate(-00deg); + } - 30% { - opacity: 1; - transform: rotate(-30deg); - } + 30% { + opacity: 1; + transform: rotate(-30deg); + } - 36% { - opacity: 0; - transform: rotate(-30deg); - } + 36% { + opacity: 0; + transform: rotate(-30deg); + } - 100% { - opacity: 0; - transform: rotate(-30deg); - } + 100% { + opacity: 0; + transform: rotate(-30deg); + } } /**************************************/ #topleft-tools { - display: block; - position: absolute; - z-index: 5000; - transition: all 500ms linear; - left: 0; - right: 0; + display: block; + position: absolute; + z-index: 5000; + transition: all 500ms linear; + left: 0; + right: 0; } .welcomeMessage { - display: block; - max-width: calc(100vw - 5em); - width: 40em; - max-height: calc(100vh - 15em); - overflow-y: auto; - border-radius: 1em; - background-color: var(--background-color); - color: var(--foreground-color); + display: block; + max-width: calc(100vw - 5em); + width: 40em; + max-height: calc(100vh - 15em); + overflow-y: auto; + border-radius: 1em; + background-color: var(--background-color); + color: var(--foreground-color); } /***************** Info box (box containing features and questions ******************/ .leaflet-popup-content { - width: 45em !important; - margin: 0.25rem !important; + width: 45em !important; + margin: 0.25rem !important; } .leaflet-div-icon { - background-color: unset !important; - border: unset !important; + background-color: unset !important; + border: unset !important; } .floating-element-width { - max-width: calc(100vw - 5em); - width: 40em; + max-width: calc(100vw - 5em); + width: 40em; } .leaflet-div-icon svg { - width: calc(100%); - height: calc(100%); + width: calc(100%); + height: calc(100%); } /****** ShareScreen *****/ .literal-code { - display: inline-block; - background-color: lightgray; - padding: 0.5em; - word-break: break-word; - color: black; - box-sizing: border-box; + display: inline-block; + background-color: lightgray; + padding: 0.5em; + word-break: break-word; + color: black; + box-sizing: border-box; } /** Switch layout **/ .small-image img { - height: 1em; - max-width: 1em; + height: 1em; + max-width: 1em; } .small-image { - height: 1em; - max-width: 1em; + height: 1em; + max-width: 1em; } .slideshow-item img { - height: var(--image-carousel-height); - width: unset; + height: var(--image-carousel-height); + width: unset; } .animate-height { - transition: max-height .5s ease-in-out; - overflow-y: hidden; + transition: max-height .5s ease-in-out; + overflow-y: hidden; } .zebra-table tr:nth-child(even) { - background-color: #f2f2f2; + background-color: #f2f2f2; } .hover\:bg-blue-200:hover { - --tw-bg-opacity: 1; - background-color: rgba(191, 219, 254, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(191, 219, 254, var(--tw-bg-opacity)); } .hover\:bg-indigo-200:hover { - --tw-bg-opacity: 1; - background-color: rgba(199, 210, 254, var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + background-color: rgba(199, 210, 254, var(--tw-bg-opacity)); } .hover\:text-blue-800:hover { - --tw-text-opacity: 1; - color: rgba(30, 64, 175, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(30, 64, 175, var(--tw-text-opacity)); } .hover\:opacity-100:hover { - opacity: 1; + opacity: 1; } .hover\:shadow-xl:hover { - --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .group:hover .group-hover\:text-blue-800 { - --tw-text-opacity: 1; - color: rgba(30, 64, 175, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(30, 64, 175, var(--tw-text-opacity)); } .group:hover .group-hover\:text-blue-900 { - --tw-text-opacity: 1; - color: rgba(30, 58, 138, var(--tw-text-opacity)); + --tw-text-opacity: 1; + color: rgba(30, 58, 138, var(--tw-text-opacity)); } @media (min-width: 640px) { - .sm\:mx-auto { - margin-left: auto; - margin-right: auto; - } + .sm\:mx-auto { + margin-left: auto; + margin-right: auto; + } - .sm\:mt-5 { - margin-top: 1.25rem; - } + .sm\:mt-5 { + margin-top: 1.25rem; + } - .sm\:h-24 { - height: 6rem; - } + .sm\:h-24 { + height: 6rem; + } - .sm\:w-24 { - width: 6rem; - } + .sm\:w-24 { + width: 6rem; + } - .sm\:w-auto { - width: auto; - } + .sm\:w-auto { + width: auto; + } - .sm\:max-w-sm { - max-width: 24rem; - } + .sm\:max-w-sm { + max-width: 24rem; + } - .sm\:max-w-xl { - max-width: 36rem; - } + .sm\:max-w-xl { + max-width: 36rem; + } - .sm\:flex-row { - flex-direction: row; - } + .sm\:flex-row { + flex-direction: row; + } - .sm\:flex-wrap { - flex-wrap: wrap; - } + .sm\:flex-wrap { + flex-wrap: wrap; + } - .sm\:items-start { - align-items: flex-start; - } + .sm\:items-start { + align-items: flex-start; + } - .sm\:justify-between { - justify-content: space-between; - } + .sm\:justify-between { + justify-content: space-between; + } - .sm\:border-4 { - border-width: 4px; - } + .sm\:border-4 { + border-width: 4px; + } - .sm\:p-0\.5 { - padding: 0.125rem; - } + .sm\:p-0\.5 { + padding: 0.125rem; + } - .sm\:p-1\.5 { - padding: 0.375rem; - } + .sm\:p-1\.5 { + padding: 0.375rem; + } - .sm\:p-0 { - padding: 0px; - } + .sm\:p-0 { + padding: 0px; + } - .sm\:p-1 { - padding: 0.25rem; - } + .sm\:p-1 { + padding: 0.25rem; + } - .sm\:p-2 { - padding: 0.5rem; - } + .sm\:p-2 { + padding: 0.5rem; + } - .sm\:pl-2 { - padding-left: 0.5rem; - } + .sm\:pl-2 { + padding-left: 0.5rem; + } - .sm\:pt-1 { - padding-top: 0.25rem; - } + .sm\:pt-1 { + padding-top: 0.25rem; + } - .sm\:text-center { - text-align: center; - } + .sm\:text-center { + text-align: center; + } - .sm\:text-xl { - font-size: 1.25rem; - line-height: 1.75rem; - } + .sm\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem; + } - .sm\:text-5xl { - font-size: 3rem; - line-height: 1; - } + .sm\:text-5xl { + font-size: 3rem; + line-height: 1; + } - .sm\:text-lg { - font-size: 1.125rem; - line-height: 1.75rem; - } + .sm\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem; + } } @media (min-width: 768px) { - .md\:relative { - position: relative; - } + .md\:relative { + position: relative; + } - .md\:m-1 { - margin: 0.25rem; - } + .md\:m-1 { + margin: 0.25rem; + } - .md\:m-2 { - margin: 0.5rem; - } + .md\:m-2 { + margin: 0.5rem; + } - .md\:mt-5 { - margin-top: 1.25rem; - } + .md\:mt-5 { + margin-top: 1.25rem; + } - .md\:mt-4 { - margin-top: 1rem; - } + .md\:mt-4 { + margin-top: 1rem; + } - .md\:block { - display: block; - } + .md\:block { + display: block; + } - .md\:flex { - display: flex; - } + .md\:flex { + display: flex; + } - .md\:grid { - display: grid; - } + .md\:grid { + display: grid; + } - .md\:hidden { - display: none; - } + .md\:hidden { + display: none; + } - .md\:h-12 { - height: 3rem; - } + .md\:h-12 { + height: 3rem; + } - .md\:max-h-65vh { - max-height: 65vh; - } + .md\:max-h-65vh { + max-height: 65vh; + } - .md\:w-2\/6 { - width: 33.333333%; - } + .md\:w-2\/6 { + width: 33.333333%; + } - .md\:w-auto { - width: auto; - } + .md\:w-auto { + width: auto; + } - .md\:w-max { - width: -webkit-max-content; - width: -moz-max-content; - width: max-content; - } + .md\:w-max { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + } - .md\:grid-flow-row { - grid-auto-flow: row; - } + .md\:grid-flow-row { + grid-auto-flow: row; + } - .md\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } - .md\:flex-row { - flex-direction: row; - } + .md\:flex-row { + flex-direction: row; + } - .md\:rounded-xl { - border-radius: 0.75rem; - } + .md\:rounded-xl { + border-radius: 0.75rem; + } - .md\:p-1 { - padding: 0.25rem; - } + .md\:p-1 { + padding: 0.25rem; + } - .md\:p-2 { - padding: 0.5rem; - } + .md\:p-2 { + padding: 0.5rem; + } - .md\:p-4 { - padding: 1rem; - } + .md\:p-4 { + padding: 1rem; + } - .md\:p-3 { - padding: 0.75rem; - } + .md\:p-3 { + padding: 0.75rem; + } - .md\:pt-0 { - padding-top: 0px; - } + .md\:pt-0 { + padding-top: 0px; + } - .md\:pb-0 { - padding-bottom: 0px; - } + .md\:pb-0 { + padding-bottom: 0px; + } - .md\:pt-4 { - padding-top: 1rem; - } + .md\:pt-4 { + padding-top: 1rem; + } - .md\:text-2xl { - font-size: 1.5rem; - line-height: 2rem; - } + .md\:text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } - .md\:text-6xl { - font-size: 3.75rem; - line-height: 1; - } + .md\:text-6xl { + font-size: 3.75rem; + line-height: 1; + } - .md\:text-xl { - font-size: 1.25rem; - line-height: 1.75rem; - } + .md\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem; + } - .md\:w-160 { - width: 40rem; - } + .md\:w-160 { + width: 40rem; + } } @media (min-width: 1024px) { - .lg\:mx-0 { - margin-left: 0px; - margin-right: 0px; - } + .lg\:mx-0 { + margin-left: 0px; + margin-right: 0px; + } - .lg\:ml-40 { - margin-left: 10rem; - } + .lg\:ml-40 { + margin-left: 10rem; + } - .lg\:ml-10 { - margin-left: 2.5rem; - } + .lg\:ml-10 { + margin-left: 2.5rem; + } - .lg\:w-3\/4 { - width: 75%; - } + .lg\:w-3\/4 { + width: 75%; + } - .lg\:w-1\/6 { - width: 16.666667%; - } + .lg\:w-1\/6 { + width: 16.666667%; + } - .lg\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } - .lg\:text-left { - text-align: left; - } + .lg\:text-left { + text-align: left; + } } @media (min-width: 1280px) { - .xl\:inline { - display: inline; - } + .xl\:inline { + display: inline; + } } \ No newline at end of file diff --git a/index.css b/index.css index 4acf26143..415a6925f 100644 --- a/index.css +++ b/index.css @@ -483,4 +483,6 @@ li::marker { overflow-y: hidden; } -.zebra-table tr:nth-child(even) {background-color: #f2f2f2;} \ No newline at end of file +.zebra-table tr:nth-child(even) { + background-color: #f2f2f2; +} \ No newline at end of file diff --git a/index.manifest b/index.manifest index e9ccebb12..44d7829fc 100644 --- a/index.manifest +++ b/index.manifest @@ -1,70 +1,70 @@ { - "name": "index", - "short_name": "MapComplete", - "start_url": "index.html", - "display": "standalone", - "background_color": "#fff", - "description": "A thematic map viewer and editor based on OpenStreetMap", - "orientation": "portrait-primary, landscape-primary", - "icons": [ - { - "src": "assets/generated/svg_mapcomplete_logo72.png", - "sizes": "72x72", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo96.png", - "sizes": "96x96", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo120.png", - "sizes": "120x120", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo128.png", - "sizes": "128x128", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo144.png", - "sizes": "144x144", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo152.png", - "sizes": "152x152", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo180.png", - "sizes": "180x180", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo384.png", - "sizes": "384x384", - "type": "image/png" - }, - { - "src": "assets/generated/svg_mapcomplete_logo512.png", - "sizes": "512x512", - "type": "image/png" - }, - { - "src": "assets/svg/mapcomplete_logo.svg", - "sizes": "513x513", - "type": "image/svg" - } - ], - "categories": [ - "map", - "navigation" - ] -} \ No newline at end of file + "name": "index", + "short_name": "MapComplete", + "start_url": "index.html", + "display": "standalone", + "background_color": "#fff", + "description": "A thematic map viewer and editor based on OpenStreetMap", + "orientation": "portrait-primary, landscape-primary", + "icons": [ + { + "src": "assets/generated/svg_mapcomplete_logo72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo120.png", + "sizes": "120x120", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo128.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo152.png", + "sizes": "152x152", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo180.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "assets/generated/svg_mapcomplete_logo512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "assets/svg/mapcomplete_logo.svg", + "sizes": "513x513", + "type": "image/svg" + } + ], + "categories": [ + "map", + "navigation" + ] + } \ No newline at end of file diff --git a/index.ts b/index.ts index 64cf22e97..58a0e54b7 100644 --- a/index.ts +++ b/index.ts @@ -1,6 +1,5 @@ import {FixedUiElement} from "./UI/Base/FixedUiElement"; import Combine from "./UI/Base/Combine"; -import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers"; import MinimapImplementation from "./UI/Base/MinimapImplementation"; import {Utils} from "./Utils"; import AllThemesGui from "./UI/AllThemesGui"; @@ -8,7 +7,6 @@ import DetermineLayout from "./Logic/DetermineLayout"; import LayoutConfig from "./Models/ThemeConfig/LayoutConfig"; import DefaultGUI from "./UI/DefaultGUI"; import State from "./State"; -import AvailableBaseLayersImplementation from "./Logic/Actors/AvailableBaseLayersImplementation"; import ShowOverlayLayerImplementation from "./UI/ShowDataLayer/ShowOverlayLayerImplementation"; import {DefaultGuiState} from "./UI/DefaultGuiState"; @@ -40,7 +38,7 @@ class Init { window.mapcomplete_state = State.state; new DefaultGUI(State.state, guiState) - + } } @@ -60,8 +58,8 @@ new Combine(["Initializing... <br/>", DetermineLayout.GetLayout().then(value => { console.log("Got ", value) Init.Init(value) - }).catch(err => { - console.error("Error while initializing: ", err, err.stack) - }) +}).catch(err => { + console.error("Error while initializing: ", err, err.stack) +}) diff --git a/notfound.ts b/notfound.ts index 632c57348..2c2be6c6c 100644 --- a/notfound.ts +++ b/notfound.ts @@ -3,4 +3,4 @@ import Combine from "./UI/Base/Combine"; import BackToIndex from "./UI/BigComponents/BackToIndex"; new Combine([new FixedUiElement("This page is not found"), -new BackToIndex()]).AttachTo("maindiv") \ No newline at end of file + new BackToIndex()]).AttachTo("maindiv") \ No newline at end of file diff --git a/professional.html b/professional.html index 5fb01b054..47f3cb281 100644 --- a/professional.html +++ b/professional.html @@ -23,7 +23,7 @@ width: 100%; height: 100%; } - + p { margin: 0.75rem; margin-left: 0.2rem; diff --git a/scripts/downloadFile.ts b/scripts/downloadFile.ts index 6e191919f..c119915e7 100644 --- a/scripts/downloadFile.ts +++ b/scripts/downloadFile.ts @@ -9,4 +9,4 @@ const DESTINATION = args[1]; console.log(`Downloading ${FILE_URL} to ${DESTINATION}`) const file = fs.createWriteStream(DESTINATION); -http.get(FILE_URL, response=>response.pipe(file)); +http.get(FILE_URL, response => response.pipe(file)); diff --git a/scripts/extractBikeRental.ts b/scripts/extractBikeRental.ts index 7b6a8f4b8..4ae2f6d38 100644 --- a/scripts/extractBikeRental.ts +++ b/scripts/extractBikeRental.ts @@ -3,7 +3,7 @@ import {OH} from "../UI/OpeningHours/OpeningHours"; function extractValue(vs: { __value }[]) { - if(vs === undefined){ + if (vs === undefined) { return undefined } for (const v of vs) { @@ -16,33 +16,34 @@ function extractValue(vs: { __value }[]) { } -function extract_oh_block (days) : string{ +function extract_oh_block(days): string { const oh = [] for (const day of days.day) { - const abbr = day.name.substr(0,2) + const abbr = day.name.substr(0, 2) const block = day.time_block[0] - const from = block.time_from.substr(0,5) - const to = block.time_until.substr(0,5) + const from = block.time_from.substr(0, 5) + const to = block.time_until.substr(0, 5) const by_appointment = block.by_appointment ? " \"by appointment\"" : "" oh.push(`${abbr} ${from}-${to}${by_appointment}`) } return oh.join("; ") } -function extract_oh(opening_periods){ + +function extract_oh(opening_periods) { const rules = [] - if(opening_periods === undefined){ + if (opening_periods === undefined) { return undefined; } for (const openingPeriod of opening_periods.opening_period ?? []) { let rule = extract_oh_block(openingPeriod.days) - if(openingPeriod.name.toLowerCase().indexOf("schoolvakantie") >= 0){ - rule = "SH "+rule + if (openingPeriod.name.toLowerCase().indexOf("schoolvakantie") >= 0) { + rule = "SH " + rule } rules.push(rule) } - return OH.simplify( rules.join(";")) + return OH.simplify(rules.join(";")) } - + function rewrite(obj, key) { if (obj[key] === undefined) { return @@ -109,12 +110,12 @@ for (const item of data) { metadata["addr:housenumber"] = addr.number metadata["phone"] = item.contact_info["telephone"] ?? item.contact_info["mobile"] metadata["email"] = item.contact_info["email_address"] - + const links = item.links?.link?.map(l => l.url) ?? [] metadata["website"] = item.contact_info["website"] ?? links[0] delete item["links"] - + delete item.location_info delete item.contact_info delete item.promotional_info @@ -136,25 +137,25 @@ for (const item of data) { metadata.fee = "yes" metadata.charge = extractValue(item.price_info?.extra_information?.value) const methods = item.price_info?.payment_methods?.payment_method - if(methods !== undefined){ + if (methods !== undefined) { methods.map(v => extractValue(v.value)).forEach(method => { metadata["payment:" + method.toLowerCase()] = "yes" }) } delete item.price_info - }else if(item.price_info?.prices?.length === 0){ + } else if (item.price_info?.prices?.length === 0) { delete item.price_info } - - - try{ - - if(item.labels_info?.labels_own?.label[0]?.code === "Billenkar"){ - metadata.rental = "quadricycle" - delete item.labels_info - } - }catch(e){ - + + + try { + + if (item.labels_info?.labels_own?.label[0]?.code === "Billenkar") { + metadata.rental = "quadricycle" + delete item.labels_info + } + } catch (e) { + } delete item["publishing_channels"] @@ -166,22 +167,20 @@ for (const item of data) { } delete item.media - const time_info = item.time_info?.time_info_regular - if(time_info?.permantly_open === true){ + if (time_info?.permantly_open === true) { metadata.opening_hours = "24/7" - }else{ + } else { metadata.opening_hours = extract_oh(time_info?.opening_periods) } delete item.time_info - const properties = {} for (const key in metadata) { const v = metadata[key] - if(v === null || v === undefined || v === ""){ + if (v === null || v === undefined || v === "") { delete metadata[key] continue } diff --git a/scripts/generateCache.ts b/scripts/generateCache.ts index 029e014d7..32cc04024 100644 --- a/scripts/generateCache.ts +++ b/scripts/generateCache.ts @@ -376,29 +376,28 @@ async function main(args: string[]) { const lat1 = Number(args[5]) const lon1 = Number(args[6]) - if(isNaN(lat0)){ + if (isNaN(lat0)) { throw "The first number (a latitude) is not a valid number" } - if(isNaN(lon0)){ + if (isNaN(lon0)) { throw "The second number (a longitude) is not a valid number" } - if(isNaN(lat1)){ + if (isNaN(lat1)) { throw "The third number (a latitude) is not a valid number" } - if(isNaN(lon1)){ + if (isNaN(lon1)) { throw "The first number (a longitude) is not a valid number" } - - + const tileRange = Tiles.TileRangeBetween(zoomlevel, lat0, lon0, lat1, lon1) - if(isNaN(tileRange.total)){ + if (isNaN(tileRange.total)) { throw "Something has gone wrong: tilerange is NAN" } - + if (tileRange.total === 0) { console.log("Tilerange has zero tiles - this is probably an error") return diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index 9e6bee37d..7e74ff685 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -33,7 +33,7 @@ function WriteFile(filename, html: BaseUIElement, autogenSource: string[]): void ]).AsMarkdown() md.replace(/\n\n\n+/g, "\n\n"); - + writeFileSync(filename, md); } diff --git a/scripts/generateIncludedImages.ts b/scripts/generateIncludedImages.ts index a716751de..d0902ae15 100644 --- a/scripts/generateIncludedImages.ts +++ b/scripts/generateIncludedImages.ts @@ -32,10 +32,10 @@ function genImages(dryrun = false) { } let rawName = name; - if(dryrun){ + if (dryrun) { rawName = "add"; } - + module += ` public static ${name} = "${svg}"\n` module += ` public static ${name}_img = Img.AsImageElement(Svg.${rawName})\n` module += ` public static ${name}_svg() { return new Img(Svg.${rawName}, true);}\n` diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 0812f269f..251a92f2d 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -4,10 +4,7 @@ import * as licenses from "../assets/generated/license_info.json" import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; import Constants from "../Models/Constants"; -import { - ValidateLayer, - ValidateThemeAndLayers -} from "../Models/ThemeConfig/Conversion/LegacyJsonConvert"; +import {ValidateLayer, ValidateThemeAndLayers} from "../Models/ThemeConfig/Conversion/LegacyJsonConvert"; import {Translation} from "../UI/i18n/Translation"; import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; import * as questions from "../assets/tagRenderings/questions.json"; @@ -72,14 +69,14 @@ class LayerOverviewUtils { const dict = new Map<string, TagRenderingConfigJson>(); for (const key in questions["default"]) { - if(key === "id"){ + if (key === "id") { continue } questions[key].id = key; dict.set(key, <TagRenderingConfigJson>questions[key]) } for (const key in icons["default"]) { - if(key==="id"){ + if (key === "id") { continue } if (typeof icons[key] !== "object") { @@ -90,7 +87,7 @@ class LayerOverviewUtils { } dict.forEach((value, key) => { - if(key === "id"){ + if (key === "id") { return } value.id = value.id ?? key; diff --git a/scripts/generateLayouts.ts b/scripts/generateLayouts.ts index 3922e2442..e544c8554 100644 --- a/scripts/generateLayouts.ts +++ b/scripts/generateLayouts.ts @@ -105,7 +105,7 @@ async function createManifest(layout: LayoutConfig) { description: ogDescr, orientation: "portrait-primary, landscape-primary", icons: icons, - categories: ["map","navigation"] + categories: ["map", "navigation"] }; } @@ -180,8 +180,8 @@ async function createLandingPage(layout: LayoutConfig, manifest) { return output; } -async function createIndexFor(theme: LayoutConfig){ - const filename = "index_"+theme.id+".ts" +async function createIndexFor(theme: LayoutConfig) { + const filename = "index_" + theme.id + ".ts" writeFileSync(filename, `import * as themeConfig from "./assets/generated/themes/${theme.id}.json"\n`) appendFileSync(filename, codeTemplate) } @@ -191,7 +191,7 @@ if (!existsSync(generatedDir)) { mkdirSync(generatedDir) } -const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap", "custom","theme"] +const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap", "custom", "theme"] // @ts-ignore const all: LayoutConfigJson[] = all_known_layouts.themes; for (const i in all) { diff --git a/scripts/generateLicenseInfo.ts b/scripts/generateLicenseInfo.ts index 3ff559833..9bfe5601a 100644 --- a/scripts/generateLicenseInfo.ts +++ b/scripts/generateLicenseInfo.ts @@ -99,7 +99,6 @@ knownLicenses.set("twemoji", { }) - function promptLicenseFor(path): SmallLicense { console.log("License abbreviations:") knownLicenses.forEach((value, key) => { diff --git a/scripts/generateTileOverview.ts b/scripts/generateTileOverview.ts index d93aae640..24445f2fa 100644 --- a/scripts/generateTileOverview.ts +++ b/scripts/generateTileOverview.ts @@ -19,23 +19,23 @@ function main(args: string[]) { continue } const z = match[1] - if(zoomLevel === undefined){ + if (zoomLevel === undefined) { zoomLevel = z - }else if(zoomLevel !== z){ + } else if (zoomLevel !== z) { throw "Mixed zoomlevels detected" } - + const x = match[2] const y = match[3] - if(indices[x] === undefined){ + if (indices[x] === undefined) { indices[x] = [] } indices[x].push(Number(y)) } indices["zoom"] = zoomLevel; const match = files[0].match("\(.*\)_\([0-9]*\)_\([0-9]*\)_\([0-9]*\).geojson") - const path = match[1]+"_"+zoomLevel+"_overview.json" - writeFileSync( path, JSON.stringify(indices)) + const path = match[1] + "_" + zoomLevel + "_overview.json" + writeFileSync(path, JSON.stringify(indices)) console.log("Written overview for", files.length, " tiles at", path) } diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index 9d8adb9a3..a0a5e3075 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -208,14 +208,14 @@ function compileTranslationsFromWeblate() { const allTranslations = new TranslationPart() for (const translationFile of translations) { - try{ - - const contents = JSON.parse(readFileSync(translationFile, "utf-8")); - let language = translationFile.substring(translationFile.lastIndexOf("/") + 1) - language = language.substring(0, language.length - 5) - allTranslations.add(language, contents) - }catch (e) { - throw "Could not read file "+ translationFile+" due to "+e + try { + + const contents = JSON.parse(readFileSync(translationFile, "utf-8")); + let language = translationFile.substring(translationFile.lastIndexOf("/") + 1) + language = language.substring(0, language.length - 5) + allTranslations.add(language, contents) + } catch (e) { + throw "Could not read file " + translationFile + " due to " + e } } diff --git a/scripts/generateWikiPage.ts b/scripts/generateWikiPage.ts index 7a587d7f9..1c06c0f53 100644 --- a/scripts/generateWikiPage.ts +++ b/scripts/generateWikiPage.ts @@ -2,17 +2,17 @@ import {writeFile} from "fs"; import Translations from "../UI/i18n/Translations"; import * as themeOverview from "../assets/generated/theme_overview.json" -function generateWikiEntry(layout: {hideFromOverview: boolean, id: string, shortDescription: any}) { +function generateWikiEntry(layout: { hideFromOverview: boolean, id: string, shortDescription: any }) { if (layout.hideFromOverview) { return ""; } - + const languagesInDescr = [] for (const shortDescriptionKey in layout.shortDescription) { languagesInDescr.push(shortDescriptionKey) } - - const languages = languagesInDescr .map(ln => `{{#language:${ln}|en}}`).join(", ") + + const languages = languagesInDescr.map(ln => `{{#language:${ln}|en}}`).join(", ") let auth = "Yes"; return `{{service_item |name= [https://mapcomplete.osm.be/${layout.id} ${layout.id}] diff --git a/scripts/lint.ts b/scripts/lint.ts index 7280fb693..c41ded14d 100644 --- a/scripts/lint.ts +++ b/scripts/lint.ts @@ -10,8 +10,8 @@ import {FixLegacyTheme, UpdateLegacyLayer} from "../Models/ThemeConfig/LegacyJso const layerFiles = ScriptUtils.getLayerFiles(); for (const layerFile of layerFiles) { try { - const state : any = undefined; // FIXME - const fixed = new UpdateLegacyLayer().convertStrict(state,layerFile.parsed, "While linting "+layerFile.path); + const state: any = undefined; // FIXME + const fixed = new UpdateLegacyLayer().convertStrict(state, layerFile.parsed, "While linting " + layerFile.path); writeFileSync(layerFile.path, JSON.stringify(fixed, null, " ")) } catch (e) { console.error("COULD NOT LINT LAYER" + layerFile.path + ":\n\t" + e) @@ -21,8 +21,8 @@ for (const layerFile of layerFiles) { const themeFiles = ScriptUtils.getThemeFiles() for (const themeFile of themeFiles) { try { - const state : any = undefined; // FIXME - const fixed = new FixLegacyTheme().convertStrict(state,themeFile.parsed, "While linting "+themeFile.path); + const state: any = undefined; // FIXME + const fixed = new FixLegacyTheme().convertStrict(state, themeFile.parsed, "While linting " + themeFile.path); writeFileSync(themeFile.path, JSON.stringify(fixed, null, " ")) } catch (e) { console.error("COULD NOT LINT THEME" + themeFile.path + ":\n\t" + e) diff --git a/scripts/perProperty.ts b/scripts/perProperty.ts index 953150441..9349499d1 100644 --- a/scripts/perProperty.ts +++ b/scripts/perProperty.ts @@ -1,38 +1,38 @@ import * as fs from "fs"; -function main(args){ - if(args.length < 2){ +function main(args) { + if (args.length < 2) { console.log("Given a single geojson file, generates the partitions for every found property") console.log("USAGE: perProperty `file.geojson` `property-key`") return } const path = args[0] const key = args[1] - - const data= JSON.parse(fs.readFileSync(path, "UTF8")) + + const data = JSON.parse(fs.readFileSync(path, "UTF8")) const perProperty = new Map<string, any[]>() - console.log("Partitioning",data.features.length, "features") + console.log("Partitioning", data.features.length, "features") for (const feature of data.features) { const v = feature.properties[key] - if(!perProperty.has(v)){ + if (!perProperty.has(v)) { console.log("Found a new category:", v) perProperty.set(v, []) } perProperty.get(v).push(feature) } - - const stripped = path.substr(0, path.length - ".geojson".length) + + const stripped = path.substr(0, path.length - ".geojson".length) perProperty.forEach((features, v) => { - - fs.writeFileSync(stripped+"."+v.replace(/[^a-zA-Z0-9_]/g, "_")+".geojson", + + fs.writeFileSync(stripped + "." + v.replace(/[^a-zA-Z0-9_]/g, "_") + ".geojson", JSON.stringify({ - type:"FeatureCollection", + type: "FeatureCollection", features })) }) - + } let args = [...process.argv] diff --git a/scripts/postal_code_tools/createRoutablePoint.ts b/scripts/postal_code_tools/createRoutablePoint.ts index 727030d31..4c2f2fee7 100644 --- a/scripts/postal_code_tools/createRoutablePoint.ts +++ b/scripts/postal_code_tools/createRoutablePoint.ts @@ -11,22 +11,22 @@ async function main(args: string[]) { const output = args[2] ?? "centralCoordinates.csv" const perPostCode = new Map<string, any[]>() - + const alreadyLoaded = new Set<number>() - if(existsSync(output)){ - const lines = readFileSync(output, "UTF8").split("\n") + if (existsSync(output)) { + const lines = readFileSync(output, "UTF8").split("\n") lines.shift() lines.forEach(line => { - const postalCode = Number( line.split(",")[0]) + const postalCode = Number(line.split(",")[0]) alreadyLoaded.add(postalCode) }) - }else{ - writeFileSync(output,"postal_code,lon,lat\n","UTF-8") + } else { + writeFileSync(output, "postal_code,lon,lat\n", "UTF-8") } for (const boundary of postcodes.features) { const postcode = boundary.properties.nouveau_PO - if(alreadyLoaded.has(Number(postcode))){ + if (alreadyLoaded.has(Number(postcode))) { console.log("Skipping ", postcode, "as already loaded") continue } @@ -58,29 +58,29 @@ async function main(args: string[]) { const url = "https://staging.anyways.eu/routing-api/v1/routes?access_token=postal_code_script&turn_by_turn=false&format=geojson&language=en" - const depPoints :[number,number][] = Utils.NoNull( await Promise.all(candidates.map(async candidate => { - try{ + const depPoints: [number, number][] = Utils.NoNull(await Promise.all(candidates.map(async candidate => { + try { const result = await ScriptUtils.DownloadJSON(url + "&loc=" + candidate.join("%2C") + "&loc=3.22000%2C51.21577&profile=car.short") const depPoint = result.features.filter(f => f.geometry.type === "LineString")[0].geometry.coordinates[0] - return <[number,number]>[depPoint[0], depPoint[1]] // Drop elevation - }catch(e){ + return <[number, number]>[depPoint[0], depPoint[1]] // Drop elevation + } catch (e) { console.error("No result or could not calculate a route") } }))) - + const centers = boundaries.map(b => GeoOperations.centerpointCoordinates(b)) const center = GeoOperations.centerpointCoordinates({ - type:"Feature", - geometry:{ - type:"LineString", + type: "Feature", + geometry: { + type: "LineString", coordinates: centers } }) - + depPoints.sort((c0, c1) => GeoOperations.distanceBetween(c0, center) - GeoOperations.distanceBetween(c1, center)) - console.log("Sorted departure point candidates for ",postcode," are ", JSON.stringify(depPoints)) - appendFileSync(output,[postcode, ...depPoints[0]].join(", ")+"\n","UTF-8") + console.log("Sorted departure point candidates for ", postcode, " are ", JSON.stringify(depPoints)) + appendFileSync(output, [postcode, ...depPoints[0]].join(", ") + "\n", "UTF-8") } diff --git a/scripts/postal_code_tools/openaddressestogeojson.ts b/scripts/postal_code_tools/openaddressestogeojson.ts index ee87757c6..e3264a386 100644 --- a/scripts/postal_code_tools/openaddressestogeojson.ts +++ b/scripts/postal_code_tools/openaddressestogeojson.ts @@ -29,9 +29,9 @@ async function main(args: string[]) { let i = 0; let failed = 0 - - let createdFiles : string [] = [] - if(!perPostalCode){ + + let createdFiles: string [] = [] + if (!perPostalCode) { fs.writeFileSync(outputFile, "") } // @ts-ignore @@ -63,21 +63,21 @@ async function main(args: string[]) { let targetFile = outputFile if (perPostalCode) { - if(parsed["postcode"] === ""){ + if (parsed["postcode"] === "") { continue } - if(isNaN(Number(parsed["postcode"]))){ + if (isNaN(Number(parsed["postcode"]))) { continue; } targetFile = outputFile + "-" + parsed["postcode"] + ".geojson" let isFirst = false - if(!existsSync(targetFile)){ + if (!existsSync(targetFile)) { writeFileSync(targetFile, '{ "type":"FeatureCollection", "features":[') createdFiles.push(targetFile) isFirst = true } - - if(!isFirst){ + + if (!isFirst) { fs.appendFileSync(targetFile, ",\n") } @@ -89,20 +89,20 @@ async function main(args: string[]) { coordinates: [lon, lat] } })) - - }else{ - - fs.appendFileSync(outputFile, JSON.stringify({ - type: "Feature", - properties: parsed, - geometry: { - type: "Point", - coordinates: [lon, lat] - } - }) + "\n") + } else { + + + fs.appendFileSync(outputFile, JSON.stringify({ + type: "Feature", + properties: parsed, + geometry: { + type: "Point", + coordinates: [lon, lat] + } + }) + "\n") } - + } @@ -112,7 +112,7 @@ async function main(args: string[]) { ScriptUtils.erasableLog("Closing ", createdFile, "and creating convex hull") fs.appendFileSync(createdFile, "]}") } - + console.log("Done! Converted ", i, "features (of which ", failed, "features don't have a coordinate)") } diff --git a/scripts/slice.ts b/scripts/slice.ts index ecb66ed78..9507befbf 100644 --- a/scripts/slice.ts +++ b/scripts/slice.ts @@ -6,7 +6,7 @@ import ScriptUtils from "./ScriptUtils"; import {Utils} from "../Utils"; /** - * This script slices a big newline-delimeted geojson file into tiled geojson + * This script slices a big newline-delimeted geojson file into tiled geojson * It was used to convert the CRAB-data into geojson tiles */ @@ -117,7 +117,7 @@ async function main(args: string[]) { const keysToRemove = ["STRAATNMID", "GEMEENTE", "POSTCODE"] for (const f of allFeatures) { - if(f.properties === null){ + if (f.properties === null) { console.log("Got a feature without properties!", f) continue } diff --git a/test.html b/test.html index bb618f4d0..1ec543f93 100644 --- a/test.html +++ b/test.html @@ -25,6 +25,5 @@ <script src="./test.ts"></script> - </body> </html> diff --git a/test.ts b/test.ts index 92a6a8f65..408d16ec5 100644 --- a/test.ts +++ b/test.ts @@ -4,4 +4,4 @@ import Link from "./UI/Base/Link"; import {FixedUiElement} from "./UI/Base/FixedUiElement"; const allHidden = AllKnownLayouts.layoutsList.filter(l => l.hideFromOverview) -new List(allHidden.map(th => new Link(new FixedUiElement(th.id), "theme.html?layout="+th.id))).AttachTo("maindiv") +new List(allHidden.map(th => new Link(new FixedUiElement(th.id), "theme.html?layout=" + th.id))).AttachTo("maindiv") diff --git a/test/Actors.spec.ts b/test/Actors.spec.ts index bf30297d4..84acbaa9d 100644 --- a/test/Actors.spec.ts +++ b/test/Actors.spec.ts @@ -53,7 +53,7 @@ export default class ActorsSpec extends T { [ "download latest version", () => { - const state = new UserRelatedState(new LayoutConfig(bookcaseJson, true, "tests" )) + const state = new UserRelatedState(new LayoutConfig(bookcaseJson, true, "tests")) const feature = { "type": "Feature", "id": "node/5568693115", diff --git a/test/CreateNoteImportLayer.spec.ts b/test/CreateNoteImportLayer.spec.ts index 802ce8c02..aa48d8f97 100644 --- a/test/CreateNoteImportLayer.spec.ts +++ b/test/CreateNoteImportLayer.spec.ts @@ -4,9 +4,7 @@ import * as bookcases from "../assets/layers/public_bookcase/public_bookcase.jso import {DesugaringContext} from "../Models/ThemeConfig/Conversion/Conversion"; import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; -import LayerConfig from "../Models/ThemeConfig/LayerConfig"; import {PrepareLayer} from "../Models/ThemeConfig/Conversion/PrepareLayer"; -import TagRenderingConfigJsonJSC from "../Docs/Schemas/TagRenderingConfigJsonJSC"; import {Utils} from "../Utils"; export default class CreateNoteImportLayerSpec extends T { @@ -20,12 +18,12 @@ export default class CreateNoteImportLayerSpec extends T { } const layerPrepare = new PrepareLayer() - const layer =layerPrepare.convertStrict(desugaringState, bookcases, "ImportLayerGeneratorTest:Parse bookcases") + const layer = layerPrepare.convertStrict(desugaringState, bookcases, "ImportLayerGeneratorTest:Parse bookcases") const generator = new CreateNoteImportLayer() - const generatedLayer : LayerConfigJson = generator.convertStrict(desugaringState, layer, "ImportLayerGeneratorTest: convert") + const generatedLayer: LayerConfigJson = generator.convertStrict(desugaringState, layer, "ImportLayerGeneratorTest: convert") T.equals("_tags~(^|.*;)amenity=public_bookcase($|;.*)", generatedLayer.isShown.mappings[1].if["and"][1].or[0].and[0]) let renderings = Utils.NoNull(Utils.NoNull(generatedLayer.tagRenderings - .map(tr => (<TagRenderingConfigJson> tr).render)) + .map(tr => (<TagRenderingConfigJson>tr).render)) .map(render => render["en"])) T.equals(true, renderings.some(r => r.indexOf("import_button") > 0)) }] diff --git a/test/GeoOperations.spec.ts b/test/GeoOperations.spec.ts index b7e3c2f6f..5eb64fa0e 100644 --- a/test/GeoOperations.spec.ts +++ b/test/GeoOperations.spec.ts @@ -355,7 +355,7 @@ export default class GeoOperationsSpec extends T { Assert.notEqual(p0, null) const p1 = turf.polygon(polyHouse.geometry.coordinates) Assert.notEqual(p1, null) - + const overlaps = GeoOperations.calculateOverlap(polyGrb, [polyHouse]) Assert.equal(overlaps.length, 0) const overlapsRev = GeoOperations.calculateOverlap(polyHouse, [polyGrb]) @@ -364,50 +364,52 @@ export default class GeoOperationsSpec extends T { }], ["Overnode removal test", () => { - const feature = { "geometry": { - "type": "Polygon", + const feature = { + "geometry": { + "type": "Polygon", "coordinates": [ - [ [ - 4.477944199999975, - 51.02783550000022 - ], - [ - 4.477987899999996, - 51.027818800000034 - ], - [ - 4.478004500000021, - 51.02783399999988 - ], - [ - 4.478025499999962, - 51.02782489999994 - ], - [ - 4.478079099999993, - 51.027873899999896 - ], - [ - 4.47801040000006, - 51.027903799999955 - ], - [ - 4.477964799999972, - 51.02785709999982 - ], - [ - 4.477964699999964, - 51.02785690000006 - ], - [ - 4.477944199999975, - 51.02783550000022 + [ + 4.477944199999975, + 51.02783550000022 + ], + [ + 4.477987899999996, + 51.027818800000034 + ], + [ + 4.478004500000021, + 51.02783399999988 + ], + [ + 4.478025499999962, + 51.02782489999994 + ], + [ + 4.478079099999993, + 51.027873899999896 + ], + [ + 4.47801040000006, + 51.027903799999955 + ], + [ + 4.477964799999972, + 51.02785709999982 + ], + [ + 4.477964699999964, + 51.02785690000006 + ], + [ + 4.477944199999975, + 51.02783550000022 + ] ] ] - ] - }} - + } + } + const copy = GeoOperations.removeOvernoding(feature) Assert.equal(copy.geometry.coordinates[0].length, 7) T.listIdentical([ diff --git a/test/ImageAttribution.spec.ts b/test/ImageAttribution.spec.ts index e89812017..765516bbc 100644 --- a/test/ImageAttribution.spec.ts +++ b/test/ImageAttribution.spec.ts @@ -7,38 +7,38 @@ import LayerConfig from "../Models/ThemeConfig/LayerConfig"; export default class ImageAttributionSpec extends T { constructor() { super([ - [ - "Should find all the images", - () => { - const pumps: LayerConfig = new LayerConfig(bike_repair_station) - const images = pumps.ExtractImages(); - const expectedValues = ['./assets/layers/bike_repair_station/repair_station.svg', - './assets/layers/bike_repair_station/repair_station_pump.svg', - './assets/layers/bike_repair_station/broken_pump_2.svg', - './assets/layers/bike_repair_station/pump.svg', - './assets/themes/cyclofix/fietsambassade_gent_logo_small.svg', - './assets/layers/bike_repair_station/pump_example_manual.jpg', - './assets/layers/bike_repair_station/pump_example.png', - './assets/layers/bike_repair_station/pump_example_round.jpg', - './assets/layers/bike_repair_station/repair_station_example.jpg'] - for (const expected of expectedValues) { - T.isTrue(images.has(expected), expected + " not found") - } + [ + "Should find all the images", + () => { + const pumps: LayerConfig = new LayerConfig(bike_repair_station) + const images = pumps.ExtractImages(); + const expectedValues = ['./assets/layers/bike_repair_station/repair_station.svg', + './assets/layers/bike_repair_station/repair_station_pump.svg', + './assets/layers/bike_repair_station/broken_pump_2.svg', + './assets/layers/bike_repair_station/pump.svg', + './assets/themes/cyclofix/fietsambassade_gent_logo_small.svg', + './assets/layers/bike_repair_station/pump_example_manual.jpg', + './assets/layers/bike_repair_station/pump_example.png', + './assets/layers/bike_repair_station/pump_example_round.jpg', + './assets/layers/bike_repair_station/repair_station_example.jpg'] + for (const expected of expectedValues) { + T.isTrue(images.has(expected), expected + " not found") } - ], - [ - "Test image discovery regex", - () => { - const tr = new Translation({en: "XYZ <img src='a.svg'/> XYZ <img src=\"some image.svg\"></img> XYZ <img src=b.svg/>"}) - const images = new Set<string>(tr.ExtractImages(false)); - equal(3, images.size) - T.isTrue(images.has("a.svg"), "a.svg not found") - T.isTrue(images.has("b.svg"), "b.svg not found") - T.isTrue(images.has("some image.svg"), "some image.svg not found") + } + ], + [ + "Test image discovery regex", + () => { + const tr = new Translation({en: "XYZ <img src='a.svg'/> XYZ <img src=\"some image.svg\"></img> XYZ <img src=b.svg/>"}) + const images = new Set<string>(tr.ExtractImages(false)); + equal(3, images.size) + T.isTrue(images.has("a.svg"), "a.svg not found") + T.isTrue(images.has("b.svg"), "b.svg not found") + T.isTrue(images.has("some image.svg"), "some image.svg not found") - } - ] + } + ] - ]); + ]); } } \ No newline at end of file diff --git a/test/LegacyThemeLoader.spec.ts b/test/LegacyThemeLoader.spec.ts index 9ef9b7ab9..0e0c559e9 100644 --- a/test/LegacyThemeLoader.spec.ts +++ b/test/LegacyThemeLoader.spec.ts @@ -169,17 +169,17 @@ export default class LegacyThemeLoaderSpec extends T { shouldHave({ render: "{minimap()}" - }); - shouldHave({ - render: {en:"{minimap()}"} }); shouldHave({ - render: {en:"{minimap()}",nl:"{minimap()}"} + render: {en: "{minimap()}"} }); shouldHave({ - render: {en:"{minimap()}",nl:"No map for the dutch!"} + render: {en: "{minimap()}", nl: "{minimap()}"} }); - + shouldHave({ + render: {en: "{minimap()}", nl: "No map for the dutch!"} + }); + shouldHave({ render: "{minimap()}" }) diff --git a/test/OsmObject.spec.ts b/test/OsmObject.spec.ts index 03d35e473..1e0cd3707 100644 --- a/test/OsmObject.spec.ts +++ b/test/OsmObject.spec.ts @@ -3,7 +3,7 @@ import {OsmObject} from "../Logic/Osm/OsmObject"; export default class OsmObjectSpec extends T { constructor() { - super( [ + super([ [ "Download referencing ways", () => { diff --git a/test/RelationSplitHandler.spec.ts b/test/RelationSplitHandler.spec.ts index 0920a915b..7f42577a2 100644 --- a/test/RelationSplitHandler.spec.ts +++ b/test/RelationSplitHandler.spec.ts @@ -548,7 +548,7 @@ export default class RelationSplitHandlerSpec extends T { ) - super( [ + super([ ["split 295132739", async () => { // Lets mimick a split action of https://www.openstreetmap.org/way/295132739 diff --git a/test/ReplaceGeometry.spec.ts b/test/ReplaceGeometry.spec.ts index b33442cc7..96b49d945 100644 --- a/test/ReplaceGeometry.spec.ts +++ b/test/ReplaceGeometry.spec.ts @@ -8,13 +8,13 @@ import {BBox} from "../Logic/BBox"; import Minimap from "../UI/Base/Minimap"; export default class ReplaceGeometrySpec extends T { - + private static readonly grbStripped = { "id": "grb", "title": { "nl": "GRB import helper" }, - "description":"Smaller version of the GRB theme", + "description": "Smaller version of the GRB theme", "language": [ "nl", "en" @@ -24,15 +24,15 @@ export default class ReplaceGeometrySpec extends T { "startLat": 51.0249, "startLon": 4.026489, "startZoom": 9, - "clustering":false, + "clustering": false, "overrideAll": { "minzoom": 19 }, "layers": [ { "id": "type_node", - source:{ - osmTags:"type=node" + source: { + osmTags: "type=node" }, mapRendering: null, "override": { @@ -320,12 +320,10 @@ export default class ReplaceGeometrySpec extends T { } ] } - - - - + + constructor() { - super( [ + super([ ["House replacement with connected node", async () => { Minimap.createMiniMap = () => undefined; @@ -389,20 +387,496 @@ export default class ReplaceGeometrySpec extends T { const wayId = "way/160909312" Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/map.json?bbox=3.2166673243045807,51.21467321525788,3.217007964849472,51.21482442824023" , - {"version":"0.6","generator":"CGImap 0.8.6 (1549677 spike-06.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","bounds":{"minlat":51.2146732,"minlon":3.2166673,"maxlat":51.2148244,"maxlon":3.217008},"elements":[{"type":"node","id":1612385157,"lat":51.2148016,"lon":3.2168453,"timestamp":"2018-04-30T12:26:00Z","version":3,"changeset":58553478,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":1728816256,"lat":51.2147111,"lon":3.2170233,"timestamp":"2017-07-18T22:52:44Z","version":2,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":1728816287,"lat":51.2146408,"lon":3.2167601,"timestamp":"2021-10-29T16:24:43Z","version":3,"changeset":113131915,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":1728823481,"lat":51.2146968,"lon":3.2167242,"timestamp":"2021-11-02T23:37:11Z","version":5,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":1728823499,"lat":51.2147127,"lon":3.2170302,"timestamp":"2017-07-18T22:52:45Z","version":2,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":1728823501,"lat":51.2148696,"lon":3.2168941,"timestamp":"2017-07-18T22:52:45Z","version":2,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":1728823514,"lat":51.2147863,"lon":3.2168551,"timestamp":"2021-11-02T23:37:11Z","version":5,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":1728823522,"lat":51.2148489,"lon":3.2169012,"timestamp":"2017-07-18T22:52:45Z","version":2,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":1728823523,"lat":51.2147578,"lon":3.2169995,"timestamp":"2017-07-18T22:52:45Z","version":2,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":1728823543,"lat":51.2148075,"lon":3.2166445,"timestamp":"2017-07-18T22:52:46Z","version":3,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":1728823544,"lat":51.2148553,"lon":3.2169315,"timestamp":"2017-07-18T22:52:46Z","version":2,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":1728823549,"lat":51.2147401,"lon":3.2168877,"timestamp":"2021-11-02T23:37:11Z","version":5,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978288376,"lat":51.2147306,"lon":3.2168928,"timestamp":"2017-07-18T22:52:21Z","version":1,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":4978288381,"lat":51.2147638,"lon":3.2168856,"timestamp":"2021-11-02T23:37:11Z","version":4,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978288382,"lat":51.2148189,"lon":3.216912,"timestamp":"2017-07-18T22:52:21Z","version":1,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":4978288385,"lat":51.2148835,"lon":3.2170623,"timestamp":"2017-07-18T22:52:21Z","version":1,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":4978288387,"lat":51.2148904,"lon":3.2171037,"timestamp":"2017-07-18T22:52:21Z","version":1,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":4978289383,"lat":51.2147678,"lon":3.2169969,"timestamp":"2021-11-02T23:37:11Z","version":4,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978289384,"lat":51.2147684,"lon":3.2168674,"timestamp":"2021-11-02T23:37:11Z","version":4,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978289386,"lat":51.2147716,"lon":3.2168811,"timestamp":"2021-11-02T23:37:11Z","version":4,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978289388,"lat":51.2148115,"lon":3.216966,"timestamp":"2021-11-02T23:38:13Z","version":7,"changeset":113306325,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978289391,"lat":51.2148019,"lon":3.2169194,"timestamp":"2017-07-18T22:52:21Z","version":1,"changeset":50391526,"user":"catweazle67","uid":1976209},{"type":"node","id":9219974337,"lat":51.2148449,"lon":3.2171278,"timestamp":"2021-11-02T23:40:52Z","version":1,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":9219979643,"lat":51.2147405,"lon":3.216693,"timestamp":"2021-11-02T23:37:11Z","version":1,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":9219979646,"lat":51.2148043,"lon":3.2169312,"timestamp":"2021-11-02T23:38:13Z","version":2,"changeset":113306325,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":9219979647,"lat":51.2147792,"lon":3.2169466,"timestamp":"2021-11-02T23:37:11Z","version":1,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"way","id":160909311,"timestamp":"2021-12-23T12:03:37Z","version":6,"changeset":115295690,"user":"s8evq","uid":3710738,"nodes":[1728823481,1728823549,4978288376,1728823523,1728823499,1728816256,1728816287,1728823481],"tags":{"addr:city":"Brugge","addr:country":"BE","addr:housenumber":"106","addr:postcode":"8000","addr:street":"Ezelstraat","building":"house","source:geometry:date":"2015-07-09","source:geometry:ref":"Gbg/2391617"}},{"type":"way","id":160909312,"timestamp":"2021-11-02T23:38:13Z","version":4,"changeset":113306325,"user":"Pieter Vander Vennet","uid":3818858,"nodes":[9219979643,1728823481,1728823549,4978289383,4978289388,9219979646,9219979647,4978288381,4978289386,4978289384,1728823514,9219979643],"tags":{"addr:city":"Brugge","addr:country":"BE","addr:housenumber":"108","addr:postcode":"8000","addr:street":"Ezelstraat","building":"house","source:geometry:date":"2018-10-02","source:geometry:ref":"Gbg/5926383"}},{"type":"way","id":160909315,"timestamp":"2021-12-23T12:03:37Z","version":8,"changeset":115295690,"user":"s8evq","uid":3710738,"nodes":[1728823543,1728823501,1728823522,4978288382,1612385157,1728823514,9219979643,1728823543],"tags":{"addr:city":"Brugge","addr:country":"BE","addr:housenumber":"110","addr:postcode":"8000","addr:street":"Ezelstraat","building":"house","name":"La Style","shop":"hairdresser","source:geometry:date":"2015-07-09","source:geometry:ref":"Gbg/5260837"}},{"type":"way","id":508533816,"timestamp":"2021-12-23T12:03:37Z","version":7,"changeset":115295690,"user":"s8evq","uid":3710738,"nodes":[4978288387,4978288385,1728823544,1728823522,4978288382,4978289391,9219979646,4978289388,9219974337,4978288387],"tags":{"building":"yes","source:geometry:date":"2015-07-09","source:geometry:ref":"Gbg/5260790"}}]} + "https://www.openstreetmap.org/api/0.6/map.json?bbox=3.2166673243045807,51.21467321525788,3.217007964849472,51.21482442824023", + { + "version": "0.6", + "generator": "CGImap 0.8.6 (1549677 spike-06.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "bounds": {"minlat": 51.2146732, "minlon": 3.2166673, "maxlat": 51.2148244, "maxlon": 3.217008}, + "elements": [{ + "type": "node", + "id": 1612385157, + "lat": 51.2148016, + "lon": 3.2168453, + "timestamp": "2018-04-30T12:26:00Z", + "version": 3, + "changeset": 58553478, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 1728816256, + "lat": 51.2147111, + "lon": 3.2170233, + "timestamp": "2017-07-18T22:52:44Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728816287, + "lat": 51.2146408, + "lon": 3.2167601, + "timestamp": "2021-10-29T16:24:43Z", + "version": 3, + "changeset": 113131915, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 1728823481, + "lat": 51.2146968, + "lon": 3.2167242, + "timestamp": "2021-11-02T23:37:11Z", + "version": 5, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 1728823499, + "lat": 51.2147127, + "lon": 3.2170302, + "timestamp": "2017-07-18T22:52:45Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823501, + "lat": 51.2148696, + "lon": 3.2168941, + "timestamp": "2017-07-18T22:52:45Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823514, + "lat": 51.2147863, + "lon": 3.2168551, + "timestamp": "2021-11-02T23:37:11Z", + "version": 5, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 1728823522, + "lat": 51.2148489, + "lon": 3.2169012, + "timestamp": "2017-07-18T22:52:45Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823523, + "lat": 51.2147578, + "lon": 3.2169995, + "timestamp": "2017-07-18T22:52:45Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823543, + "lat": 51.2148075, + "lon": 3.2166445, + "timestamp": "2017-07-18T22:52:46Z", + "version": 3, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823544, + "lat": 51.2148553, + "lon": 3.2169315, + "timestamp": "2017-07-18T22:52:46Z", + "version": 2, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 1728823549, + "lat": 51.2147401, + "lon": 3.2168877, + "timestamp": "2021-11-02T23:37:11Z", + "version": 5, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978288376, + "lat": 51.2147306, + "lon": 3.2168928, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978288381, + "lat": 51.2147638, + "lon": 3.2168856, + "timestamp": "2021-11-02T23:37:11Z", + "version": 4, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978288382, + "lat": 51.2148189, + "lon": 3.216912, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978288385, + "lat": 51.2148835, + "lon": 3.2170623, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978288387, + "lat": 51.2148904, + "lon": 3.2171037, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 4978289383, + "lat": 51.2147678, + "lon": 3.2169969, + "timestamp": "2021-11-02T23:37:11Z", + "version": 4, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978289384, + "lat": 51.2147684, + "lon": 3.2168674, + "timestamp": "2021-11-02T23:37:11Z", + "version": 4, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978289386, + "lat": 51.2147716, + "lon": 3.2168811, + "timestamp": "2021-11-02T23:37:11Z", + "version": 4, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978289388, + "lat": 51.2148115, + "lon": 3.216966, + "timestamp": "2021-11-02T23:38:13Z", + "version": 7, + "changeset": 113306325, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978289391, + "lat": 51.2148019, + "lon": 3.2169194, + "timestamp": "2017-07-18T22:52:21Z", + "version": 1, + "changeset": 50391526, + "user": "catweazle67", + "uid": 1976209 + }, { + "type": "node", + "id": 9219974337, + "lat": 51.2148449, + "lon": 3.2171278, + "timestamp": "2021-11-02T23:40:52Z", + "version": 1, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 9219979643, + "lat": 51.2147405, + "lon": 3.216693, + "timestamp": "2021-11-02T23:37:11Z", + "version": 1, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 9219979646, + "lat": 51.2148043, + "lon": 3.2169312, + "timestamp": "2021-11-02T23:38:13Z", + "version": 2, + "changeset": 113306325, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 9219979647, + "lat": 51.2147792, + "lon": 3.2169466, + "timestamp": "2021-11-02T23:37:11Z", + "version": 1, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "way", + "id": 160909311, + "timestamp": "2021-12-23T12:03:37Z", + "version": 6, + "changeset": 115295690, + "user": "s8evq", + "uid": 3710738, + "nodes": [1728823481, 1728823549, 4978288376, 1728823523, 1728823499, 1728816256, 1728816287, 1728823481], + "tags": { + "addr:city": "Brugge", + "addr:country": "BE", + "addr:housenumber": "106", + "addr:postcode": "8000", + "addr:street": "Ezelstraat", + "building": "house", + "source:geometry:date": "2015-07-09", + "source:geometry:ref": "Gbg/2391617" + } + }, { + "type": "way", + "id": 160909312, + "timestamp": "2021-11-02T23:38:13Z", + "version": 4, + "changeset": 113306325, + "user": "Pieter Vander Vennet", + "uid": 3818858, + "nodes": [9219979643, 1728823481, 1728823549, 4978289383, 4978289388, 9219979646, 9219979647, 4978288381, 4978289386, 4978289384, 1728823514, 9219979643], + "tags": { + "addr:city": "Brugge", + "addr:country": "BE", + "addr:housenumber": "108", + "addr:postcode": "8000", + "addr:street": "Ezelstraat", + "building": "house", + "source:geometry:date": "2018-10-02", + "source:geometry:ref": "Gbg/5926383" + } + }, { + "type": "way", + "id": 160909315, + "timestamp": "2021-12-23T12:03:37Z", + "version": 8, + "changeset": 115295690, + "user": "s8evq", + "uid": 3710738, + "nodes": [1728823543, 1728823501, 1728823522, 4978288382, 1612385157, 1728823514, 9219979643, 1728823543], + "tags": { + "addr:city": "Brugge", + "addr:country": "BE", + "addr:housenumber": "110", + "addr:postcode": "8000", + "addr:street": "Ezelstraat", + "building": "house", + "name": "La Style", + "shop": "hairdresser", + "source:geometry:date": "2015-07-09", + "source:geometry:ref": "Gbg/5260837" + } + }, { + "type": "way", + "id": 508533816, + "timestamp": "2021-12-23T12:03:37Z", + "version": 7, + "changeset": 115295690, + "user": "s8evq", + "uid": 3710738, + "nodes": [4978288387, 4978288385, 1728823544, 1728823522, 4978288382, 4978289391, 9219979646, 4978289388, 9219974337, 4978288387], + "tags": { + "building": "yes", + "source:geometry:date": "2015-07-09", + "source:geometry:ref": "Gbg/5260790" + } + }] + } ) Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/way/160909312/full" , - {"version":"0.6","generator":"CGImap 0.8.6 (2407324 spike-06.openstreetmap.org)","copyright":"OpenStreetMap and contributors","attribution":"http://www.openstreetmap.org/copyright","license":"http://opendatacommons.org/licenses/odbl/1-0/","elements":[{"type":"node","id":1728823481,"lat":51.2146968,"lon":3.2167242,"timestamp":"2021-11-02T23:37:11Z","version":5,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":1728823514,"lat":51.2147863,"lon":3.2168551,"timestamp":"2021-11-02T23:37:11Z","version":5,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":1728823549,"lat":51.2147401,"lon":3.2168877,"timestamp":"2021-11-02T23:37:11Z","version":5,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978288381,"lat":51.2147638,"lon":3.2168856,"timestamp":"2021-11-02T23:37:11Z","version":4,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978289383,"lat":51.2147678,"lon":3.2169969,"timestamp":"2021-11-02T23:37:11Z","version":4,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978289384,"lat":51.2147684,"lon":3.2168674,"timestamp":"2021-11-02T23:37:11Z","version":4,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978289386,"lat":51.2147716,"lon":3.2168811,"timestamp":"2021-11-02T23:37:11Z","version":4,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":4978289388,"lat":51.2148115,"lon":3.216966,"timestamp":"2021-11-02T23:38:13Z","version":7,"changeset":113306325,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":9219979643,"lat":51.2147405,"lon":3.216693,"timestamp":"2021-11-02T23:37:11Z","version":1,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":9219979646,"lat":51.2148043,"lon":3.2169312,"timestamp":"2021-11-02T23:38:13Z","version":2,"changeset":113306325,"user":"Pieter Vander Vennet","uid":3818858},{"type":"node","id":9219979647,"lat":51.2147792,"lon":3.2169466,"timestamp":"2021-11-02T23:37:11Z","version":1,"changeset":113305401,"user":"Pieter Vander Vennet","uid":3818858},{"type":"way","id":160909312,"timestamp":"2021-11-02T23:38:13Z","version":4,"changeset":113306325,"user":"Pieter Vander Vennet","uid":3818858,"nodes":[9219979643,1728823481,1728823549,4978289383,4978289388,9219979646,9219979647,4978288381,4978289386,4978289384,1728823514,9219979643],"tags":{"addr:city":"Brugge","addr:country":"BE","addr:housenumber":"108","addr:postcode":"8000","addr:street":"Ezelstraat","building":"house","source:geometry:date":"2018-10-02","source:geometry:ref":"Gbg/5926383"}}]} + "https://www.openstreetmap.org/api/0.6/way/160909312/full", + { + "version": "0.6", + "generator": "CGImap 0.8.6 (2407324 spike-06.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "node", + "id": 1728823481, + "lat": 51.2146968, + "lon": 3.2167242, + "timestamp": "2021-11-02T23:37:11Z", + "version": 5, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 1728823514, + "lat": 51.2147863, + "lon": 3.2168551, + "timestamp": "2021-11-02T23:37:11Z", + "version": 5, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 1728823549, + "lat": 51.2147401, + "lon": 3.2168877, + "timestamp": "2021-11-02T23:37:11Z", + "version": 5, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978288381, + "lat": 51.2147638, + "lon": 3.2168856, + "timestamp": "2021-11-02T23:37:11Z", + "version": 4, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978289383, + "lat": 51.2147678, + "lon": 3.2169969, + "timestamp": "2021-11-02T23:37:11Z", + "version": 4, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978289384, + "lat": 51.2147684, + "lon": 3.2168674, + "timestamp": "2021-11-02T23:37:11Z", + "version": 4, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978289386, + "lat": 51.2147716, + "lon": 3.2168811, + "timestamp": "2021-11-02T23:37:11Z", + "version": 4, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 4978289388, + "lat": 51.2148115, + "lon": 3.216966, + "timestamp": "2021-11-02T23:38:13Z", + "version": 7, + "changeset": 113306325, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 9219979643, + "lat": 51.2147405, + "lon": 3.216693, + "timestamp": "2021-11-02T23:37:11Z", + "version": 1, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 9219979646, + "lat": 51.2148043, + "lon": 3.2169312, + "timestamp": "2021-11-02T23:38:13Z", + "version": 2, + "changeset": 113306325, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "node", + "id": 9219979647, + "lat": 51.2147792, + "lon": 3.2169466, + "timestamp": "2021-11-02T23:37:11Z", + "version": 1, + "changeset": 113305401, + "user": "Pieter Vander Vennet", + "uid": 3818858 + }, { + "type": "way", + "id": 160909312, + "timestamp": "2021-11-02T23:38:13Z", + "version": 4, + "changeset": 113306325, + "user": "Pieter Vander Vennet", + "uid": 3818858, + "nodes": [9219979643, 1728823481, 1728823549, 4978289383, 4978289388, 9219979646, 9219979647, 4978288381, 4978289386, 4978289384, 1728823514, 9219979643], + "tags": { + "addr:city": "Brugge", + "addr:country": "BE", + "addr:housenumber": "108", + "addr:postcode": "8000", + "addr:street": "Ezelstraat", + "building": "house", + "source:geometry:date": "2018-10-02", + "source:geometry:ref": "Gbg/5926383" + } + }] + } ) - Utils.injectJsonDownloadForTests("https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/latlon2country/0.0.0.json","be") + Utils.injectJsonDownloadForTests("https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/latlon2country/0.0.0.json", "be") + + const layout = new LayoutConfig(<any>ReplaceGeometrySpec.grbStripped) + - const layout = new LayoutConfig(<any> ReplaceGeometrySpec.grbStripped) - - - const state = new State(layout) State.state = state; const bbox = new BBox( @@ -440,18 +914,18 @@ export default class ReplaceGeometrySpec extends T { 1728823514, undefined], closestIds.closestIds - ) ; - - T.equals( 1 , closestIds.reprojectedNodes.size, "Expected only a single reprojected node"); + ); + + T.equals(1, closestIds.reprojectedNodes.size, "Expected only a single reprojected node"); const reproj = closestIds.reprojectedNodes.get(1728823549) T.equals(1, reproj.projectAfterIndex) - T.equals( 3.2168880864669203, reproj.newLon); - T.equals( 51.214739524104694, reproj.newLat); + T.equals(3.2168880864669203, reproj.newLon); + T.equals(51.214739524104694, reproj.newLat); T.equals(0, closestIds.detachedNodes.size) - const changes = await action.Perform(state.changes) - T.listIdentical([[3.216690793633461,51.21474084112525],[3.2167256623506546,51.214696737309964],[3.2168880864669203,51.214739524104694],[3.2169999182224274,51.214768983537674],[3.2169650495052338,51.21480720678671],[3.2169368863105774,51.21480090625335],[3.2169489562511444,51.21478074454077],[3.216886594891548,51.214765203214625],[3.2168812304735184,51.21477192378873],[3.2168644666671753,51.214768983537674],[3.2168537378311157,51.21478746511261],[3.216690793633461,51.21474084112525]], - changes[11].changes["coordinates"]) - + const changes = await action.Perform(state.changes) + T.listIdentical([[3.216690793633461, 51.21474084112525], [3.2167256623506546, 51.214696737309964], [3.2168880864669203, 51.214739524104694], [3.2169999182224274, 51.214768983537674], [3.2169650495052338, 51.21480720678671], [3.2169368863105774, 51.21480090625335], [3.2169489562511444, 51.21478074454077], [3.216886594891548, 51.214765203214625], [3.2168812304735184, 51.21477192378873], [3.2168644666671753, 51.214768983537674], [3.2168537378311157, 51.21478746511261], [3.216690793633461, 51.21474084112525]], + changes[11].changes["coordinates"]) + }], ]); } diff --git a/test/Tag.spec.ts b/test/Tag.spec.ts index 948cb0359..0428115d8 100644 --- a/test/Tag.spec.ts +++ b/test/Tag.spec.ts @@ -13,7 +13,7 @@ import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig"; export default class TagSpec extends T { constructor() { - super( [ + super([ ["Tag replacement works in translation", () => { const tr = new Translation({ "en": "Test {key} abc" @@ -523,13 +523,13 @@ export default class TagSpec extends T { T.isTrue(filter.matchesProperties(properties), "Lazy value not matched") } ], - ["test date comparison",() => { - - const filter = TagUtils.Tag("date_created<2022-01-07") - T.isFalse(filter.matchesProperties({"date_created":"2022-01-08"}), "Date comparison: expected a match") - T.isTrue(filter.matchesProperties({"date_created":"2022-01-01"}), "Date comparison: didn't expect a match") + ["test date comparison", () => { - }]]); + const filter = TagUtils.Tag("date_created<2022-01-07") + T.isFalse(filter.matchesProperties({"date_created": "2022-01-08"}), "Date comparison: expected a match") + T.isTrue(filter.matchesProperties({"date_created": "2022-01-01"}), "Date comparison: didn't expect a match") + + }]]); } } diff --git a/test/TestAll.ts b/test/TestAll.ts index 65050367e..a32794de0 100644 --- a/test/TestAll.ts +++ b/test/TestAll.ts @@ -22,7 +22,7 @@ import CreateNoteImportLayerSpec from "./CreateNoteImportLayer.spec"; async function main() { ScriptUtils.fixUtils() - const allTests : T[] = [ + const allTests: T[] = [ new OsmObjectSpec(), new TagSpec(), new ImageAttributionSpec(), @@ -58,9 +58,9 @@ async function main() { let testsToRun = allTests if (args.length > 0) { args = args.map(a => a.toLowerCase()).map(a => { - if(!a.endsWith("spec")){ + if (!a.endsWith("spec")) { return a + "spec" - }else{ + } else { return a; } }) @@ -76,7 +76,7 @@ async function main() { for (let i = 0; i < testsToRun.length; i++) { const test = testsToRun[i]; console.log(" Running test", i, "/", testsToRun.length, test.name) - + allFailures.push(...(await test.Run() ?? [])) console.log("OK!") } diff --git a/test/TestHelper.ts b/test/TestHelper.ts index 9da668f32..c29d68a9a 100644 --- a/test/TestHelper.ts +++ b/test/TestHelper.ts @@ -45,9 +45,9 @@ export default class T { throw `ListIdentical failed: expected a list of length ${expected.length} but got a list of length ${actual.length}` } for (let i = 0; i < expected.length; i++) { - if(expected[i] !== undefined && expected[i]["length"] !== undefined ){ - T.listIdentical(<any> expected[i], <any> actual[i]) - }else if (expected[i] !== actual[i]) { + if (expected[i] !== undefined && expected[i]["length"] !== undefined) { + T.listIdentical(<any>expected[i], <any>actual[i]) + } else if (expected[i] !== actual[i]) { throw `ListIdentical failed at index ${i}: expected ${expected[i]} but got ${actual[i]}` } } diff --git a/test/Theme.spec.ts b/test/Theme.spec.ts index b05680d50..ce005bbd1 100644 --- a/test/Theme.spec.ts +++ b/test/Theme.spec.ts @@ -10,46 +10,46 @@ import {PrepareTheme} from "../Models/ThemeConfig/Conversion/PrepareTheme"; export default class ThemeSpec extends T { constructor() { - super( [ - ["Nested overrides work", () => { + super([ + ["Nested overrides work", () => { - let themeConfigJson: LayoutConfigJson = { - description: "Descr", - icon: "", - language: ["en"], - layers: [ - { - builtin: "public_bookcase", - override: { - source: { - geoJson: "xyz" - } + let themeConfigJson: LayoutConfigJson = { + description: "Descr", + icon: "", + language: ["en"], + layers: [ + { + builtin: "public_bookcase", + override: { + source: { + geoJson: "xyz" } } - ], - maintainer: "", - startLat: 0, - startLon: 0, - startZoom: 0, - title: { - en: "Title" - }, - version: "", - id: "test" - } - // TOtal cheat: disable the default layers: - Constants.added_by_default.splice(0, Constants.added_by_default.length) - const sharedLayers = new Map<string, LayerConfigJson>() - sharedLayers.set("public_bookcase", bookcaseLayer["default"]) - themeConfigJson = new PrepareTheme().convertStrict({ - tagRenderings: new Map<string, TagRenderingConfigJson>(), - sharedLayers: sharedLayers - }, themeConfigJson, "test") - const themeConfig = new LayoutConfig(themeConfigJson); - assert.equal("xyz", themeConfig.layers[0].source.geojsonSource) + } + ], + maintainer: "", + startLat: 0, + startLon: 0, + startZoom: 0, + title: { + en: "Title" + }, + version: "", + id: "test" + } + // TOtal cheat: disable the default layers: + Constants.added_by_default.splice(0, Constants.added_by_default.length) + const sharedLayers = new Map<string, LayerConfigJson>() + sharedLayers.set("public_bookcase", bookcaseLayer["default"]) + themeConfigJson = new PrepareTheme().convertStrict({ + tagRenderings: new Map<string, TagRenderingConfigJson>(), + sharedLayers: sharedLayers + }, themeConfigJson, "test") + const themeConfig = new LayoutConfig(themeConfigJson); + assert.equal("xyz", themeConfig.layers[0].source.geojsonSource) - }] - ]); + }] + ]); } } diff --git a/test/TileFreshnessCalculator.spec.ts b/test/TileFreshnessCalculator.spec.ts index b431788bb..009ba2b90 100644 --- a/test/TileFreshnessCalculator.spec.ts +++ b/test/TileFreshnessCalculator.spec.ts @@ -6,7 +6,7 @@ import {equal} from "assert"; export default class TileFreshnessCalculatorSpec extends T { constructor() { - super( [ + super([ [ "TileFresnessTests", () => { diff --git a/test/Units.spec.ts b/test/Units.spec.ts index c93d57f84..a0851fd8b 100644 --- a/test/Units.spec.ts +++ b/test/Units.spec.ts @@ -6,7 +6,7 @@ import {Denomination} from "../Models/Denomination"; export default class UnitsSpec extends T { constructor() { - super( [ + super([ ["Simple canonicalize", () => { const unit = new Denomination({ diff --git a/test/Utils.spec.ts b/test/Utils.spec.ts index 99559a534..0d0d7ebf4 100644 --- a/test/Utils.spec.ts +++ b/test/Utils.spec.ts @@ -39,7 +39,7 @@ export default class UtilsSpec extends T { } constructor() { - super( [ + super([ ["Sort object keys", () => { const o = { x: 'x', diff --git a/test/Wikidata.spec.test.ts b/test/Wikidata.spec.test.ts index 47acd1a75..903da0ad7 100644 --- a/test/Wikidata.spec.test.ts +++ b/test/Wikidata.spec.test.ts @@ -7255,533 +7255,73 @@ export default class WikidataSpecTest extends T { } constructor() { - super( [ - ["Download Lion", async () => { + super([ + ["Download Lion", async () => { + + Utils.injectJsonDownloadForTests( + "https://www.wikidata.org/wiki/Special:EntityData/Q140.json", + WikidataSpecTest.Q140 + ) + + + const wikidata = await Wikidata.LoadWikidataEntryAsync("Q140") + T.equals(2, wikidata.claims.get("P18").size) + + + }], + ["download wikidata", + async () => { Utils.injectJsonDownloadForTests( - "https://www.wikidata.org/wiki/Special:EntityData/Q140.json", - WikidataSpecTest.Q140 - ) - - - const wikidata = await Wikidata.LoadWikidataEntryAsync("Q140") - T.equals(2, wikidata.claims.get("P18").size) - - - }], - ["download wikidata", - async () => { - - Utils.injectJsonDownloadForTests( - "https://www.wikidata.org/wiki/Special:EntityData/Q14517013.json", - { - "entities": { - "Q14517013": { - "pageid": 16187848, - "ns": 0, - "title": "Q14517013", - "lastrevid": 1408823680, - "modified": "2021-04-26T07:35:01Z", - "type": "item", - "id": "Q14517013", - "labels": { - "nl": {"language": "nl", "value": "Vredesmolen"}, - "en": {"language": "en", "value": "Peace Mill"} - }, - "descriptions": {"nl": {"language": "nl", "value": "molen in West-Vlaanderen"}}, - "aliases": {}, - "claims": { - "P625": [{ - "mainsnak": { - "snaktype": "value", - "property": "P625", - "hash": "d86538f14e8cca00bbf30fb029829aacbc6903a0", - "datavalue": { - "value": { - "latitude": 50.99444, - "longitude": 2.92528, - "altitude": null, - "precision": 0.0001, - "globe": "http://www.wikidata.org/entity/Q2" - }, "type": "globecoordinate" - }, - "datatype": "globe-coordinate" - }, - "type": "statement", - "id": "Q14517013$DBFBFD69-F54D-4C92-A7F4-A44F876E5776", - "rank": "normal", - "references": [{ - "hash": "732ec1c90a6f0694c7db9a71bf09fe7f2b674172", - "snaks": { - "P143": [{ - "snaktype": "value", - "property": "P143", - "hash": "9123b0de1cc9c3954366ba797d598e4e1ea4146f", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 10000, - "id": "Q10000" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }] - }, - "snaks-order": ["P143"] - }] - }], - "P17": [{ - "mainsnak": { - "snaktype": "value", - "property": "P17", - "hash": "c2859f311753176d6bdfa7da54ceeeac7acb52c8", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 31, - "id": "Q31" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q14517013$C12E4DA5-44E1-41ED-BF3D-C84381246429", - "rank": "normal" - }], - "P18": [{ - "mainsnak": { - "snaktype": "value", - "property": "P18", - "hash": "af765166ecaa7d01ea800812b5b356886b8849a0", - "datavalue": { - "value": "Klerken Vredesmolen R01.jpg", - "type": "string" - }, - "datatype": "commonsMedia" - }, - "type": "statement", - "id": "Q14517013$5291801E-11BE-4CE7-8F42-D0D6A120F390", - "rank": "normal" - }], - "P2867": [{ - "mainsnak": { - "snaktype": "value", - "property": "P2867", - "hash": "b1c627972ba2cc71e3567d2fb56cb5f90dd64007", - "datavalue": {"value": "893", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q14517013$2aff9dcd-4d24-cd92-b5af-f6268425695f", - "rank": "normal" - }], - "P31": [{ - "mainsnak": { - "snaktype": "value", - "property": "P31", - "hash": "9b48263bb51c506553aac2281ae331353b5c9002", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 38720, - "id": "Q38720" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q14517013$46dd9d89-4999-eee6-20a4-c4f6650b1d9c", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P31", - "hash": "a1d6f3409c57de0361c68263c9397a99dabe19ea", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 3851468, - "id": "Q3851468" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q14517013$C83A8B1F-7798-493A-86C9-EC0EFEE356B3", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P31", - "hash": "ee5ba9185bdf9f0eb80b52e1cdc70c5883fac95a", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 623605, - "id": "Q623605" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q14517013$CF74DC2E-6814-4755-9BAD-6EE9FEF637DD", - "rank": "normal" - }], - "P2671": [{ - "mainsnak": { - "snaktype": "value", - "property": "P2671", - "hash": "83fb38a3c6407f7d0d7bb051d1c31cea8ae26975", - "datavalue": {"value": "/g/121cb15z", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q14517013$E6FFEF32-0131-42FD-9C66-1A406B68059A", - "rank": "normal" - }] - }, - "sitelinks": { - "commonswiki": { - "site": "commonswiki", - "title": "Category:Vredesmolen, Klerken", - "badges": [], - "url": "https://commons.wikimedia.org/wiki/Category:Vredesmolen,_Klerken" - }, - "nlwiki": { - "site": "nlwiki", - "title": "Vredesmolen", - "badges": [], - "url": "https://nl.wikipedia.org/wiki/Vredesmolen" - } - } - } - } - } - ) - - - const wdata = await Wikidata.LoadWikidataEntryAsync(14517013) - T.isTrue(wdata.wikisites.has("nl"), "dutch for wikisite not found") - equal("Vredesmolen", wdata.wikisites.get("nl")) - } - - ], - ["Download Prince", async () => { - - Utils.injectJsonDownloadForTests( - "https://www.wikidata.org/wiki/Special:EntityData/Q2747456.json", + "https://www.wikidata.org/wiki/Special:EntityData/Q14517013.json", { "entities": { - "Q2747456": { - "pageid": 2638026, + "Q14517013": { + "pageid": 16187848, "ns": 0, - "title": "Q2747456", - "lastrevid": 1507566187, - "modified": "2021-10-03T20:26:12Z", + "title": "Q14517013", + "lastrevid": 1408823680, + "modified": "2021-04-26T07:35:01Z", "type": "item", - "id": "Q2747456", + "id": "Q14517013", "labels": { - "nl": {"language": "nl", "value": "prins"}, - "am": {"language": "am", "value": "\u120d\u12d1\u120d"}, - "ar": {"language": "ar", "value": "\u0623\u0645\u064a\u0631"}, - "be": {"language": "be", "value": "\u043f\u0440\u044b\u043d\u0446"}, - "bg": {"language": "bg", "value": "\u043f\u0440\u0438\u043d\u0446"}, - "ca": {"language": "ca", "value": "pr\u00edncep"}, - "cs": {"language": "cs", "value": "princ"}, - "cy": {"language": "cy", "value": "tywysog"}, - "da": {"language": "da", "value": "prins"}, - "de": {"language": "de", "value": "Prinz"}, - "en": {"language": "en", "value": "prince"}, - "eo": {"language": "eo", "value": "princo"}, - "es": {"language": "es", "value": "pr\u00edncipe"}, - "fa": {"language": "fa", "value": "\u0634\u0627\u0647\u0632\u0627\u062f\u0647"}, - "fi": {"language": "fi", "value": "prinssi"}, - "fr": {"language": "fr", "value": "prince"}, - "he": {"language": "he", "value": "\u05e0\u05e1\u05d9\u05da"}, - "hr": {"language": "hr", "value": "princ"}, - "id": {"language": "id", "value": "pangeran"}, - "it": {"language": "it", "value": "principe"}, - "ja": {"language": "ja", "value": "\u30d7\u30ea\u30f3\u30b9"}, - "ka": { - "language": "ka", - "value": "\u10e3\u10e4\u10da\u10d8\u10e1\u10ec\u10e3\u10da\u10d8" - }, - "lv": {"language": "lv", "value": "princis"}, - "ms": {"language": "ms", "value": "putera"}, - "ne": { - "language": "ne", - "value": "\u0930\u093e\u091c\u0915\u0941\u092e\u093e\u0930" - }, - "nn": {"language": "nn", "value": "prins"}, - "pt": {"language": "pt", "value": "pr\u00edncipe"}, - "ro": {"language": "ro", "value": "prin\u021b"}, - "ru": {"language": "ru", "value": "\u043f\u0440\u0438\u043d\u0446"}, - "scn": {"language": "scn", "value": "pr\u00ecncipi"}, - "sk": {"language": "sk", "value": "princ"}, - "sl": {"language": "sl", "value": "princ"}, - "sv": {"language": "sv", "value": "prins"}, - "tr": {"language": "tr", "value": "prens"}, - "uk": {"language": "uk", "value": "\u043f\u0440\u0438\u043d\u0446"}, - "vec": {"language": "vec", "value": "principe"}, - "vi": {"language": "vi", "value": "v\u01b0\u01a1ng"}, - "ko": {"language": "ko", "value": "\uc655\uc790"}, - "th": {"language": "th", "value": "\u0e40\u0e08\u0e49\u0e32"}, - "la": {"language": "la", "value": "princeps"}, - "gl": {"language": "gl", "value": "pr\u00edncipe"}, - "nb": {"language": "nb", "value": "prins"}, - "el": { - "language": "el", - "value": "\u03c0\u03c1\u03af\u03b3\u03ba\u03b9\u03c0\u03b1\u03c2" - }, - "is": {"language": "is", "value": "prins"}, - "pl": {"language": "pl", "value": "ksi\u0105\u017c\u0119 (princeps)"}, - "nan": {"language": "nan", "value": "th\u00e2u-l\u00e2ng"}, - "be-tarask": { - "language": "be-tarask", - "value": "\u043f\u0440\u044b\u043d\u0446" - }, - "ur": {"language": "ur", "value": "\u0634\u06c1\u0632\u0627\u062f\u06c1"}, - "sco": {"language": "sco", "value": "prince"}, - "zh": {"language": "zh", "value": "\u738b\u7235"}, - "sr": {"language": "sr", "value": "\u043f\u0440\u0438\u043d\u0446"}, - "sh": {"language": "sh", "value": "princ"}, - "hy": { - "language": "hy", - "value": "\u0561\u0580\u0584\u0561\u0575\u0561\u0566\u0576" - }, - "et": {"language": "et", "value": "prints"}, - "bxr": { - "language": "bxr", - "value": "\u0445\u0430\u043d \u0445\u04af\u0431\u04af\u04af\u043d" - }, - "fy": {"language": "fy", "value": "prins"}, - "diq": {"language": "diq", "value": "prens"}, - "ba": {"language": "ba", "value": "\u043f\u0440\u0438\u043d\u0446"}, - "eu": {"language": "eu", "value": "printze"}, - "gd": {"language": "gd", "value": "prionnsa"}, - "gu": {"language": "gu", "value": "\u0a95\u0ac1\u0a82\u0ab5\u0ab0"}, - "lb": {"language": "lb", "value": "Pr\u00ebnz"}, - "ga": {"language": "ga", "value": "prionsa"}, - "hu": {"language": "hu", "value": "herceg"}, - "su": {"language": "su", "value": "pang\u00e9ran"}, - "ast": {"language": "ast", "value": "pr\u00edncipe"}, - "rmy": {"language": "rmy", "value": "rayon"}, - "yue": {"language": "yue", "value": "\u89aa\u738b"}, - "jv": {"language": "jv", "value": "pang\u00e9ran"}, - "zh-hant": {"language": "zh-hant", "value": "\u738b\u7235"}, - "se": {"language": "se", "value": "prinsa"}, - "smj": {"language": "smj", "value": "prinssa"}, - "smn": {"language": "smn", "value": "prinss\u00e2"}, - "sms": {"language": "sms", "value": "prinss"}, - "az": {"language": "az", "value": "Prens"}, - "wuu": {"language": "wuu", "value": "\u738b\u7235"}, - "yi": {"language": "yi", "value": "\u05e4\u05e8\u05d9\u05e0\u05e5"} - }, - "descriptions": { - "fr": {"language": "fr", "value": "titre de noblesse"}, - "es": {"language": "es", "value": "t\u00edtulo nobiliario"}, - "en": { - "language": "en", - "value": "son of a prince, king, queen, emperor or empress, or other high-ranking person (such as a grand duke)" - }, - "el": { - "language": "el", - "value": "\u03c4\u03af\u03c4\u03bb\u03bf\u03c2 \u03b5\u03c5\u03b3\u03b5\u03bd\u03b5\u03af\u03b1\u03c2" - }, - "de": { - "language": "de", - "value": "Adels-Titel, m\u00e4nnliches Mitglied der K\u00f6nigsfamilie" - }, - "pl": {"language": "pl", "value": "tytu\u0142 szlachecki"}, - "ca": {"language": "ca", "value": "t\u00edtol de noblesa"}, - "vi": { - "language": "vi", - "value": "con trai c\u1ee7a ho\u00e0ng t\u1eed, vua, ho\u00e0ng h\u1eadu, ho\u00e0ng \u0111\u1ebf, ho\u00e0ng h\u1eadu ho\u1eb7c nh\u1eefng ng\u01b0\u1eddi c\u00f3 \u0111\u1ecba v\u1ecb cao kh\u00e1c" - }, - "da": {"language": "da", "value": "kongelig titel"}, - "eu": {"language": "eu", "value": "noblezia titulu"}, - "hu": {"language": "hu", "value": "nemesi c\u00edm"}, - "zh": {"language": "zh", "value": "\u8cb4\u65cf\u982d\u929c"}, - "ar": { - "language": "ar", - "value": "\u0644\u0642\u0628 \u0646\u0628\u064a\u0644" - }, - "ast": {"language": "ast", "value": "t\u00edtulu de nobleza"}, - "ru": {"language": "ru", "value": "\u0442\u0438\u0442\u0443\u043b"}, - "be-tarask": { - "language": "be-tarask", - "value": "\u0448\u043b\u044f\u0445\u0435\u0446\u043a\u0456 \u0442\u044b\u0442\u0443\u043b" - }, - "zh-hant": {"language": "zh-hant", "value": "\u8cb4\u65cf\u982d\u929c"}, - "it": { - "language": "it", - "value": "figlio di un principe, re, regina, imperatore o imperatrice o altra persona di alto rango (come un granduca)" - }, - "nl": { - "language": "nl", - "value": "zoon van een prins(es), koning(in), keizer(in) of andere persoon met een adellijke rang (zoals een groothertog)" - }, - "ro": { - "language": "ro", - "value": "titlu nobiliar acordat \u00een general membrilor unei familii imperiale, regale, princiare etc." - }, - "lb": {"language": "lb", "value": "Adelstitel"}, - "id": { - "language": "id", - "value": "putra seorang pangeran, raja, ratu, kaisar atau permaisuri, atau orang berpangkat tinggi lainnya (seperti adipati agung)" - }, - "he": { - "language": "he", - "value": "\u05ea\u05d5\u05d0\u05e8 \u05d0\u05e6\u05d5\u05dc\u05d4" - }, - "fi": { - "language": "fi", - "value": "ylh\u00e4isaatelisarvo, monesti monarkin poika" - }, - "cs": { - "language": "cs", - "value": "titul potomka prince/princezny, kn\u00ed\u017eete/kn\u011b\u017eny, (velko)v\u00e9vody/v\u00e9vodkyn\u011b, kr\u00e1le/kr\u00e1lovny \u010di c\u00edsa\u0159e/c\u00edsa\u0159ovny" - }, - "uk": { - "language": "uk", - "value": "\u0434\u0438\u0442\u0438\u043d\u0430 \u043f\u0440\u0438\u043d\u0446\u0430(-\u0435\u0441\u0438), \u043a\u043e\u0440\u043e\u043b\u044f (\u043a\u043e\u0440\u043e\u043b\u0435\u0432\u0438), \u0456\u043d\u043c\u0435\u0440\u0430\u0442\u043e\u0440\u0430(-\u043a\u0438) \u0447\u0438 \u0456\u043d\u0448\u043e\u0457 \u0437\u043d\u0430\u0442\u043d\u043e\u0457 \u043e\u0441\u043e\u0431\u0438" - } - }, - "aliases": { - "es": [{"language": "es", "value": "princesa"}, { - "language": "es", - "value": "principe" - }], - "ru": [{ - "language": "ru", - "value": "\u043f\u0440\u0438\u043d\u0446\u0435\u0441\u0441\u0430" - }, {"language": "ru", "value": "\u0446\u0430\u0440\u0435\u0432\u0438\u0447"}], - "ca": [{"language": "ca", "value": "princesa"}], - "ba": [{ - "language": "ba", - "value": "\u043f\u0440\u0438\u043d\u0446\u0435\u0441\u0441\u0430" - }], - "gu": [{ - "language": "gu", - "value": "\u0aae\u0ab9\u0abe\u0ab0\u0abe\u0a9c \u0a95\u0ac1\u0a82\u0ab5\u0ab0" - }, {"language": "gu", "value": "\u0aae. \u0a95\u0ac1."}, { - "language": "gu", - "value": "\u0a8f\u0aae. \u0a95\u0ac7." - }], - "he": [{"language": "he", "value": "\u05e0\u05e1\u05d9\u05db\u05d4"}], - "de": [{"language": "de", "value": "Prinzessin"}], - "ast": [{"language": "ast", "value": "princesa"}], - "be-tarask": [{ - "language": "be-tarask", - "value": "\u043f\u0440\u044b\u043d\u0446\u044d\u0441\u0430" - }], - "nl": [{"language": "nl", "value": "prinsje"}], - "it": [{"language": "it", "value": "principessa"}], - "se": [{"language": "se", "value": "gonagasb\u00e1rdni"}], - "pl": [{"language": "pl", "value": "ksi\u0105\u017c\u0119"}], - "vi": [{"language": "vi", "value": "v\u01b0\u01a1ng t\u01b0\u1edbc"}], - "cs": [{"language": "cs", "value": "princezna"}] + "nl": {"language": "nl", "value": "Vredesmolen"}, + "en": {"language": "en", "value": "Peace Mill"} }, + "descriptions": {"nl": {"language": "nl", "value": "molen in West-Vlaanderen"}}, + "aliases": {}, "claims": { - "P31": [{ + "P625": [{ "mainsnak": { "snaktype": "value", - "property": "P31", - "hash": "a456372c8e6a681381eca31ab0662159db12ab1e", + "property": "P625", + "hash": "d86538f14e8cca00bbf30fb029829aacbc6903a0", "datavalue": { "value": { - "entity-type": "item", - "numeric-id": 355567, - "id": "Q355567" - }, "type": "wikibase-entityid" + "latitude": 50.99444, + "longitude": 2.92528, + "altitude": null, + "precision": 0.0001, + "globe": "http://www.wikidata.org/entity/Q2" + }, "type": "globecoordinate" }, - "datatype": "wikibase-item" + "datatype": "globe-coordinate" }, "type": "statement", - "id": "q2747456$ff8e76c2-47b8-d2b7-a192-9af298c36c8e", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P31", - "hash": "0ec7ed0637d631867884c8c0553e2de4b90b63ca", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 3320743, - "id": "Q3320743" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$7b3a375d-48d8-18db-12db-9be699a1c34f", - "rank": "normal" - }], - "P910": [{ - "mainsnak": { - "snaktype": "value", - "property": "P910", - "hash": "ee5be4ad914a3f79dc30c6a6ac320404d7b6bf65", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 7214172, - "id": "Q7214172" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$92971E9D-FA6B-4CFA-88C9-91EF27DDE2DC", - "rank": "normal" - }], - "P508": [{ - "mainsnak": { - "snaktype": "value", - "property": "P508", - "hash": "36109efdac97e7f035d386101fb85a397380f9ee", - "datavalue": {"value": "8468", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$cdaad4c5-4ec8-54b2-3dac-4db04f994fda", - "rank": "normal" - }], - "P1001": [{ - "mainsnak": { - "snaktype": "somevalue", - "property": "P1001", - "hash": "be44552ae528f03d39720570854717fa0ebedcef", - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$5eea869d-4f5d-99ee-90bb-471cccbf4b84", - "rank": "normal" - }], - "P373": [{ - "mainsnak": { - "snaktype": "value", - "property": "P373", - "hash": "e766c6be546f129979614c185bb172cd237a626a", - "datavalue": {"value": "Princes", "type": "string"}, - "datatype": "string" - }, - "type": "statement", - "id": "Q2747456$D4EEC77F-1F89-46DA-BD9E-FA15F29B686A", + "id": "Q14517013$DBFBFD69-F54D-4C92-A7F4-A44F876E5776", "rank": "normal", "references": [{ - "hash": "fa278ebfc458360e5aed63d5058cca83c46134f1", + "hash": "732ec1c90a6f0694c7db9a71bf09fe7f2b674172", "snaks": { "P143": [{ "snaktype": "value", "property": "P143", - "hash": "e4f6d9441d0600513c4533c672b5ab472dc73694", + "hash": "9123b0de1cc9c3954366ba797d598e4e1ea4146f", "datavalue": { "value": { "entity-type": "item", - "numeric-id": 328, - "id": "Q328" + "numeric-id": 10000, + "id": "Q10000" }, "type": "wikibase-entityid" }, "datatype": "wikibase-item" @@ -7790,305 +7330,785 @@ export default class WikidataSpecTest extends T { "snaks-order": ["P143"] }] }], - "P2521": [{ + "P17": [{ "mainsnak": { "snaktype": "value", - "property": "P2521", - "hash": "3ac9f3b0f1b60d0fbeac8ce587b3f74470a2ea00", - "datavalue": { - "value": {"text": "princesse", "language": "fr"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$9c9a7d8e-4fea-87b1-0d41-7efd98922665", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "8eef33f2c1e8a583fd498d380838e5f72cc06491", - "datavalue": { - "value": {"text": "princess", "language": "en"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$e0281f91-4b2c-053b-9900-57d12d7d4211", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "1a86a592d40223b73b7f0686672650d48c997806", - "datavalue": { - "value": {"text": "princino", "language": "eo"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$1cb248ea-490c-b5f7-b011-06845ccac2b4", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "abbaf9a41f548f9a7c58e38f91db34cb370c876a", - "datavalue": { - "value": {"text": "prinses", "language": "nl"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$1d636ed1-4f4d-0851-ca7f-66c847e7c4be", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "37efe8398a055d9ace75c625cdc286b9aadb5ab0", - "datavalue": { - "value": {"text": "princesa", "language": "ca"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$316855ff-4047-0ffb-76fb-90057b0840ef", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "7810d8cabaaaeb41fad675cd9c3bfb39ab41d00f", - "datavalue": { - "value": { - "text": "\u043f\u0440\u0438\u043d\u0446\u0435\u0441\u0441\u0430", - "language": "ru" - }, "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$fa60cb7b-460d-c8ff-b99c-c2bf515b12a0", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "e18f093988121762e3b247104eb626501d14ad2e", - "datavalue": { - "value": { - "text": "\u05e0\u05e1\u05d9\u05db\u05d4", - "language": "he" - }, "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$03851c85-4db0-ff39-7608-1dc63852b6c8", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "3f8c2d8b4e28c17d49cc1bff30990657e0ab485a", - "datavalue": { - "value": { - "text": "n\u1eef v\u01b0\u01a1ng", - "language": "vi" - }, "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$6115764d-4391-6997-ecb2-7768f18b2b45", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "106d96fa708baf606b060bdc8c6b545f477eee32", - "datavalue": { - "value": {"text": "Prinzessin", "language": "de"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$6f2c129e-413c-dead-3404-146368643ab8", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "69a2a841f26ab197dca7c5a6e2dd595b67e4188c", - "datavalue": { - "value": { - "text": "\u03c0\u03c1\u03b9\u03b3\u03ba\u03af\u03c0\u03b9\u03c3\u03c3\u03b1", - "language": "el" - }, "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$9b901d48-4e41-ba93-344e-299c69a27ac6", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "560ecce28fcadaf0e2b8a584519fe94ffbf25ec1", - "datavalue": { - "value": {"text": "princesa", "language": "ast"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$520756e7-476d-a435-bc1c-0a56fa7851a1", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "44f2eb3f4fee6f4b4b3b992407bda0f6caed2536", - "datavalue": { - "value": {"text": "tywysoges", "language": "cy"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$698beb10-4e2c-b535-a89b-e29210f2be75", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "006e13a77c798832882c84070fe8f76cdc48611c", - "datavalue": { - "value": { - "text": "\u0623\u0645\u064a\u0631\u0629", - "language": "ar" - }, "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$b75e51e5-48e5-1f4c-d99c-d83dde03e91d", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "25eb24e42c0a566023ceb354777cb1ec14492ef1", - "datavalue": { - "value": { - "text": "\u043f\u0440\u044b\u043d\u0446\u044d\u0441\u0430", - "language": "be-tarask" - }, "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$075f0038-475e-e4ba-9801-52aac2067799", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "e72b1dd598ce40db3f7e9b195a3e9345b4ae4ba5", - "datavalue": { - "value": {"text": "princezna", "language": "cs"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$1085cbb9-4cd4-8a2f-a4c7-6f29fafea206", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "70d88bc577587e2732cf37a66dfd0920b175211a", - "datavalue": { - "value": {"text": "prinsesse", "language": "da"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$33d2e452-4ca2-8dea-4f98-242c53ef1811", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "eebf786f7c2b0963b9db4c2876bb24c6afc4ce1c", - "datavalue": { - "value": {"text": "principessa", "language": "it"}, - "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$3098804a-4758-d07f-8443-24ebe96c56ec", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P2521", - "hash": "649307549f96bfe54f16e9130f014bf018cc46c4", - "datavalue": { - "value": { - "text": "\u043f\u0440\u0438\u043d\u0446\u0435\u0441\u0430", - "language": "uk" - }, "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$ff433d7c-4e07-f7c0-14af-3b3f31f8ae9a", - "rank": "normal" - }], - "P3827": [{ - "mainsnak": { - "snaktype": "value", - "property": "P3827", - "hash": "22ee9c46325acd0a1ca54f27bff5d75331211f8a", - "datavalue": {"value": "princes", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$6C64B5EA-8B74-4BF6-BB90-81C28320200A", - "rank": "normal" - }], - "P1343": [{ - "mainsnak": { - "snaktype": "value", - "property": "P1343", - "hash": "eda63bed5c3d7a3460033092338ab321a2374c7f", + "property": "P17", + "hash": "c2859f311753176d6bdfa7da54ceeeac7acb52c8", "datavalue": { "value": { "entity-type": "item", - "numeric-id": 2041543, - "id": "Q2041543" + "numeric-id": 31, + "id": "Q31" }, "type": "wikibase-entityid" }, "datatype": "wikibase-item" }, "type": "statement", - "qualifiers": { - "P805": [{ + "id": "Q14517013$C12E4DA5-44E1-41ED-BF3D-C84381246429", + "rank": "normal" + }], + "P18": [{ + "mainsnak": { + "snaktype": "value", + "property": "P18", + "hash": "af765166ecaa7d01ea800812b5b356886b8849a0", + "datavalue": { + "value": "Klerken Vredesmolen R01.jpg", + "type": "string" + }, + "datatype": "commonsMedia" + }, + "type": "statement", + "id": "Q14517013$5291801E-11BE-4CE7-8F42-D0D6A120F390", + "rank": "normal" + }], + "P2867": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2867", + "hash": "b1c627972ba2cc71e3567d2fb56cb5f90dd64007", + "datavalue": {"value": "893", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q14517013$2aff9dcd-4d24-cd92-b5af-f6268425695f", + "rank": "normal" + }], + "P31": [{ + "mainsnak": { + "snaktype": "value", + "property": "P31", + "hash": "9b48263bb51c506553aac2281ae331353b5c9002", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 38720, + "id": "Q38720" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q14517013$46dd9d89-4999-eee6-20a4-c4f6650b1d9c", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P31", + "hash": "a1d6f3409c57de0361c68263c9397a99dabe19ea", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 3851468, + "id": "Q3851468" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q14517013$C83A8B1F-7798-493A-86C9-EC0EFEE356B3", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P31", + "hash": "ee5ba9185bdf9f0eb80b52e1cdc70c5883fac95a", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 623605, + "id": "Q623605" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q14517013$CF74DC2E-6814-4755-9BAD-6EE9FEF637DD", + "rank": "normal" + }], + "P2671": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2671", + "hash": "83fb38a3c6407f7d0d7bb051d1c31cea8ae26975", + "datavalue": {"value": "/g/121cb15z", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q14517013$E6FFEF32-0131-42FD-9C66-1A406B68059A", + "rank": "normal" + }] + }, + "sitelinks": { + "commonswiki": { + "site": "commonswiki", + "title": "Category:Vredesmolen, Klerken", + "badges": [], + "url": "https://commons.wikimedia.org/wiki/Category:Vredesmolen,_Klerken" + }, + "nlwiki": { + "site": "nlwiki", + "title": "Vredesmolen", + "badges": [], + "url": "https://nl.wikipedia.org/wiki/Vredesmolen" + } + } + } + } + } + ) + + + const wdata = await Wikidata.LoadWikidataEntryAsync(14517013) + T.isTrue(wdata.wikisites.has("nl"), "dutch for wikisite not found") + equal("Vredesmolen", wdata.wikisites.get("nl")) + } + + ], + ["Download Prince", async () => { + + Utils.injectJsonDownloadForTests( + "https://www.wikidata.org/wiki/Special:EntityData/Q2747456.json", + { + "entities": { + "Q2747456": { + "pageid": 2638026, + "ns": 0, + "title": "Q2747456", + "lastrevid": 1507566187, + "modified": "2021-10-03T20:26:12Z", + "type": "item", + "id": "Q2747456", + "labels": { + "nl": {"language": "nl", "value": "prins"}, + "am": {"language": "am", "value": "\u120d\u12d1\u120d"}, + "ar": {"language": "ar", "value": "\u0623\u0645\u064a\u0631"}, + "be": {"language": "be", "value": "\u043f\u0440\u044b\u043d\u0446"}, + "bg": {"language": "bg", "value": "\u043f\u0440\u0438\u043d\u0446"}, + "ca": {"language": "ca", "value": "pr\u00edncep"}, + "cs": {"language": "cs", "value": "princ"}, + "cy": {"language": "cy", "value": "tywysog"}, + "da": {"language": "da", "value": "prins"}, + "de": {"language": "de", "value": "Prinz"}, + "en": {"language": "en", "value": "prince"}, + "eo": {"language": "eo", "value": "princo"}, + "es": {"language": "es", "value": "pr\u00edncipe"}, + "fa": {"language": "fa", "value": "\u0634\u0627\u0647\u0632\u0627\u062f\u0647"}, + "fi": {"language": "fi", "value": "prinssi"}, + "fr": {"language": "fr", "value": "prince"}, + "he": {"language": "he", "value": "\u05e0\u05e1\u05d9\u05da"}, + "hr": {"language": "hr", "value": "princ"}, + "id": {"language": "id", "value": "pangeran"}, + "it": {"language": "it", "value": "principe"}, + "ja": {"language": "ja", "value": "\u30d7\u30ea\u30f3\u30b9"}, + "ka": { + "language": "ka", + "value": "\u10e3\u10e4\u10da\u10d8\u10e1\u10ec\u10e3\u10da\u10d8" + }, + "lv": {"language": "lv", "value": "princis"}, + "ms": {"language": "ms", "value": "putera"}, + "ne": { + "language": "ne", + "value": "\u0930\u093e\u091c\u0915\u0941\u092e\u093e\u0930" + }, + "nn": {"language": "nn", "value": "prins"}, + "pt": {"language": "pt", "value": "pr\u00edncipe"}, + "ro": {"language": "ro", "value": "prin\u021b"}, + "ru": {"language": "ru", "value": "\u043f\u0440\u0438\u043d\u0446"}, + "scn": {"language": "scn", "value": "pr\u00ecncipi"}, + "sk": {"language": "sk", "value": "princ"}, + "sl": {"language": "sl", "value": "princ"}, + "sv": {"language": "sv", "value": "prins"}, + "tr": {"language": "tr", "value": "prens"}, + "uk": {"language": "uk", "value": "\u043f\u0440\u0438\u043d\u0446"}, + "vec": {"language": "vec", "value": "principe"}, + "vi": {"language": "vi", "value": "v\u01b0\u01a1ng"}, + "ko": {"language": "ko", "value": "\uc655\uc790"}, + "th": {"language": "th", "value": "\u0e40\u0e08\u0e49\u0e32"}, + "la": {"language": "la", "value": "princeps"}, + "gl": {"language": "gl", "value": "pr\u00edncipe"}, + "nb": {"language": "nb", "value": "prins"}, + "el": { + "language": "el", + "value": "\u03c0\u03c1\u03af\u03b3\u03ba\u03b9\u03c0\u03b1\u03c2" + }, + "is": {"language": "is", "value": "prins"}, + "pl": {"language": "pl", "value": "ksi\u0105\u017c\u0119 (princeps)"}, + "nan": {"language": "nan", "value": "th\u00e2u-l\u00e2ng"}, + "be-tarask": { + "language": "be-tarask", + "value": "\u043f\u0440\u044b\u043d\u0446" + }, + "ur": {"language": "ur", "value": "\u0634\u06c1\u0632\u0627\u062f\u06c1"}, + "sco": {"language": "sco", "value": "prince"}, + "zh": {"language": "zh", "value": "\u738b\u7235"}, + "sr": {"language": "sr", "value": "\u043f\u0440\u0438\u043d\u0446"}, + "sh": {"language": "sh", "value": "princ"}, + "hy": { + "language": "hy", + "value": "\u0561\u0580\u0584\u0561\u0575\u0561\u0566\u0576" + }, + "et": {"language": "et", "value": "prints"}, + "bxr": { + "language": "bxr", + "value": "\u0445\u0430\u043d \u0445\u04af\u0431\u04af\u04af\u043d" + }, + "fy": {"language": "fy", "value": "prins"}, + "diq": {"language": "diq", "value": "prens"}, + "ba": {"language": "ba", "value": "\u043f\u0440\u0438\u043d\u0446"}, + "eu": {"language": "eu", "value": "printze"}, + "gd": {"language": "gd", "value": "prionnsa"}, + "gu": {"language": "gu", "value": "\u0a95\u0ac1\u0a82\u0ab5\u0ab0"}, + "lb": {"language": "lb", "value": "Pr\u00ebnz"}, + "ga": {"language": "ga", "value": "prionsa"}, + "hu": {"language": "hu", "value": "herceg"}, + "su": {"language": "su", "value": "pang\u00e9ran"}, + "ast": {"language": "ast", "value": "pr\u00edncipe"}, + "rmy": {"language": "rmy", "value": "rayon"}, + "yue": {"language": "yue", "value": "\u89aa\u738b"}, + "jv": {"language": "jv", "value": "pang\u00e9ran"}, + "zh-hant": {"language": "zh-hant", "value": "\u738b\u7235"}, + "se": {"language": "se", "value": "prinsa"}, + "smj": {"language": "smj", "value": "prinssa"}, + "smn": {"language": "smn", "value": "prinss\u00e2"}, + "sms": {"language": "sms", "value": "prinss"}, + "az": {"language": "az", "value": "Prens"}, + "wuu": {"language": "wuu", "value": "\u738b\u7235"}, + "yi": {"language": "yi", "value": "\u05e4\u05e8\u05d9\u05e0\u05e5"} + }, + "descriptions": { + "fr": {"language": "fr", "value": "titre de noblesse"}, + "es": {"language": "es", "value": "t\u00edtulo nobiliario"}, + "en": { + "language": "en", + "value": "son of a prince, king, queen, emperor or empress, or other high-ranking person (such as a grand duke)" + }, + "el": { + "language": "el", + "value": "\u03c4\u03af\u03c4\u03bb\u03bf\u03c2 \u03b5\u03c5\u03b3\u03b5\u03bd\u03b5\u03af\u03b1\u03c2" + }, + "de": { + "language": "de", + "value": "Adels-Titel, m\u00e4nnliches Mitglied der K\u00f6nigsfamilie" + }, + "pl": {"language": "pl", "value": "tytu\u0142 szlachecki"}, + "ca": {"language": "ca", "value": "t\u00edtol de noblesa"}, + "vi": { + "language": "vi", + "value": "con trai c\u1ee7a ho\u00e0ng t\u1eed, vua, ho\u00e0ng h\u1eadu, ho\u00e0ng \u0111\u1ebf, ho\u00e0ng h\u1eadu ho\u1eb7c nh\u1eefng ng\u01b0\u1eddi c\u00f3 \u0111\u1ecba v\u1ecb cao kh\u00e1c" + }, + "da": {"language": "da", "value": "kongelig titel"}, + "eu": {"language": "eu", "value": "noblezia titulu"}, + "hu": {"language": "hu", "value": "nemesi c\u00edm"}, + "zh": {"language": "zh", "value": "\u8cb4\u65cf\u982d\u929c"}, + "ar": { + "language": "ar", + "value": "\u0644\u0642\u0628 \u0646\u0628\u064a\u0644" + }, + "ast": {"language": "ast", "value": "t\u00edtulu de nobleza"}, + "ru": {"language": "ru", "value": "\u0442\u0438\u0442\u0443\u043b"}, + "be-tarask": { + "language": "be-tarask", + "value": "\u0448\u043b\u044f\u0445\u0435\u0446\u043a\u0456 \u0442\u044b\u0442\u0443\u043b" + }, + "zh-hant": {"language": "zh-hant", "value": "\u8cb4\u65cf\u982d\u929c"}, + "it": { + "language": "it", + "value": "figlio di un principe, re, regina, imperatore o imperatrice o altra persona di alto rango (come un granduca)" + }, + "nl": { + "language": "nl", + "value": "zoon van een prins(es), koning(in), keizer(in) of andere persoon met een adellijke rang (zoals een groothertog)" + }, + "ro": { + "language": "ro", + "value": "titlu nobiliar acordat \u00een general membrilor unei familii imperiale, regale, princiare etc." + }, + "lb": {"language": "lb", "value": "Adelstitel"}, + "id": { + "language": "id", + "value": "putra seorang pangeran, raja, ratu, kaisar atau permaisuri, atau orang berpangkat tinggi lainnya (seperti adipati agung)" + }, + "he": { + "language": "he", + "value": "\u05ea\u05d5\u05d0\u05e8 \u05d0\u05e6\u05d5\u05dc\u05d4" + }, + "fi": { + "language": "fi", + "value": "ylh\u00e4isaatelisarvo, monesti monarkin poika" + }, + "cs": { + "language": "cs", + "value": "titul potomka prince/princezny, kn\u00ed\u017eete/kn\u011b\u017eny, (velko)v\u00e9vody/v\u00e9vodkyn\u011b, kr\u00e1le/kr\u00e1lovny \u010di c\u00edsa\u0159e/c\u00edsa\u0159ovny" + }, + "uk": { + "language": "uk", + "value": "\u0434\u0438\u0442\u0438\u043d\u0430 \u043f\u0440\u0438\u043d\u0446\u0430(-\u0435\u0441\u0438), \u043a\u043e\u0440\u043e\u043b\u044f (\u043a\u043e\u0440\u043e\u043b\u0435\u0432\u0438), \u0456\u043d\u043c\u0435\u0440\u0430\u0442\u043e\u0440\u0430(-\u043a\u0438) \u0447\u0438 \u0456\u043d\u0448\u043e\u0457 \u0437\u043d\u0430\u0442\u043d\u043e\u0457 \u043e\u0441\u043e\u0431\u0438" + } + }, + "aliases": { + "es": [{"language": "es", "value": "princesa"}, { + "language": "es", + "value": "principe" + }], + "ru": [{ + "language": "ru", + "value": "\u043f\u0440\u0438\u043d\u0446\u0435\u0441\u0441\u0430" + }, {"language": "ru", "value": "\u0446\u0430\u0440\u0435\u0432\u0438\u0447"}], + "ca": [{"language": "ca", "value": "princesa"}], + "ba": [{ + "language": "ba", + "value": "\u043f\u0440\u0438\u043d\u0446\u0435\u0441\u0441\u0430" + }], + "gu": [{ + "language": "gu", + "value": "\u0aae\u0ab9\u0abe\u0ab0\u0abe\u0a9c \u0a95\u0ac1\u0a82\u0ab5\u0ab0" + }, {"language": "gu", "value": "\u0aae. \u0a95\u0ac1."}, { + "language": "gu", + "value": "\u0a8f\u0aae. \u0a95\u0ac7." + }], + "he": [{"language": "he", "value": "\u05e0\u05e1\u05d9\u05db\u05d4"}], + "de": [{"language": "de", "value": "Prinzessin"}], + "ast": [{"language": "ast", "value": "princesa"}], + "be-tarask": [{ + "language": "be-tarask", + "value": "\u043f\u0440\u044b\u043d\u0446\u044d\u0441\u0430" + }], + "nl": [{"language": "nl", "value": "prinsje"}], + "it": [{"language": "it", "value": "principessa"}], + "se": [{"language": "se", "value": "gonagasb\u00e1rdni"}], + "pl": [{"language": "pl", "value": "ksi\u0105\u017c\u0119"}], + "vi": [{"language": "vi", "value": "v\u01b0\u01a1ng t\u01b0\u1edbc"}], + "cs": [{"language": "cs", "value": "princezna"}] + }, + "claims": { + "P31": [{ + "mainsnak": { + "snaktype": "value", + "property": "P31", + "hash": "a456372c8e6a681381eca31ab0662159db12ab1e", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 355567, + "id": "Q355567" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "q2747456$ff8e76c2-47b8-d2b7-a192-9af298c36c8e", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P31", + "hash": "0ec7ed0637d631867884c8c0553e2de4b90b63ca", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 3320743, + "id": "Q3320743" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$7b3a375d-48d8-18db-12db-9be699a1c34f", + "rank": "normal" + }], + "P910": [{ + "mainsnak": { + "snaktype": "value", + "property": "P910", + "hash": "ee5be4ad914a3f79dc30c6a6ac320404d7b6bf65", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 7214172, + "id": "Q7214172" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$92971E9D-FA6B-4CFA-88C9-91EF27DDE2DC", + "rank": "normal" + }], + "P508": [{ + "mainsnak": { + "snaktype": "value", + "property": "P508", + "hash": "36109efdac97e7f035d386101fb85a397380f9ee", + "datavalue": {"value": "8468", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$cdaad4c5-4ec8-54b2-3dac-4db04f994fda", + "rank": "normal" + }], + "P1001": [{ + "mainsnak": { + "snaktype": "somevalue", + "property": "P1001", + "hash": "be44552ae528f03d39720570854717fa0ebedcef", + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$5eea869d-4f5d-99ee-90bb-471cccbf4b84", + "rank": "normal" + }], + "P373": [{ + "mainsnak": { + "snaktype": "value", + "property": "P373", + "hash": "e766c6be546f129979614c185bb172cd237a626a", + "datavalue": {"value": "Princes", "type": "string"}, + "datatype": "string" + }, + "type": "statement", + "id": "Q2747456$D4EEC77F-1F89-46DA-BD9E-FA15F29B686A", + "rank": "normal", + "references": [{ + "hash": "fa278ebfc458360e5aed63d5058cca83c46134f1", + "snaks": { + "P143": [{ "snaktype": "value", - "property": "P805", - "hash": "a83263a5d43ce3636971eac0d25071e09746ed50", + "property": "P143", + "hash": "e4f6d9441d0600513c4533c672b5ab472dc73694", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 328, + "id": "Q328" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "snaks-order": ["P143"] + }] + }], + "P2521": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "3ac9f3b0f1b60d0fbeac8ce587b3f74470a2ea00", + "datavalue": { + "value": {"text": "princesse", "language": "fr"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$9c9a7d8e-4fea-87b1-0d41-7efd98922665", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "8eef33f2c1e8a583fd498d380838e5f72cc06491", + "datavalue": { + "value": {"text": "princess", "language": "en"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$e0281f91-4b2c-053b-9900-57d12d7d4211", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "1a86a592d40223b73b7f0686672650d48c997806", + "datavalue": { + "value": {"text": "princino", "language": "eo"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$1cb248ea-490c-b5f7-b011-06845ccac2b4", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "abbaf9a41f548f9a7c58e38f91db34cb370c876a", + "datavalue": { + "value": {"text": "prinses", "language": "nl"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$1d636ed1-4f4d-0851-ca7f-66c847e7c4be", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "37efe8398a055d9ace75c625cdc286b9aadb5ab0", + "datavalue": { + "value": {"text": "princesa", "language": "ca"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$316855ff-4047-0ffb-76fb-90057b0840ef", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "7810d8cabaaaeb41fad675cd9c3bfb39ab41d00f", + "datavalue": { + "value": { + "text": "\u043f\u0440\u0438\u043d\u0446\u0435\u0441\u0441\u0430", + "language": "ru" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$fa60cb7b-460d-c8ff-b99c-c2bf515b12a0", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "e18f093988121762e3b247104eb626501d14ad2e", + "datavalue": { + "value": { + "text": "\u05e0\u05e1\u05d9\u05db\u05d4", + "language": "he" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$03851c85-4db0-ff39-7608-1dc63852b6c8", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "3f8c2d8b4e28c17d49cc1bff30990657e0ab485a", + "datavalue": { + "value": { + "text": "n\u1eef v\u01b0\u01a1ng", + "language": "vi" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$6115764d-4391-6997-ecb2-7768f18b2b45", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "106d96fa708baf606b060bdc8c6b545f477eee32", + "datavalue": { + "value": {"text": "Prinzessin", "language": "de"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$6f2c129e-413c-dead-3404-146368643ab8", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "69a2a841f26ab197dca7c5a6e2dd595b67e4188c", + "datavalue": { + "value": { + "text": "\u03c0\u03c1\u03b9\u03b3\u03ba\u03af\u03c0\u03b9\u03c3\u03c3\u03b1", + "language": "el" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$9b901d48-4e41-ba93-344e-299c69a27ac6", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "560ecce28fcadaf0e2b8a584519fe94ffbf25ec1", + "datavalue": { + "value": {"text": "princesa", "language": "ast"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$520756e7-476d-a435-bc1c-0a56fa7851a1", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "44f2eb3f4fee6f4b4b3b992407bda0f6caed2536", + "datavalue": { + "value": {"text": "tywysoges", "language": "cy"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$698beb10-4e2c-b535-a89b-e29210f2be75", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "006e13a77c798832882c84070fe8f76cdc48611c", + "datavalue": { + "value": { + "text": "\u0623\u0645\u064a\u0631\u0629", + "language": "ar" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$b75e51e5-48e5-1f4c-d99c-d83dde03e91d", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "25eb24e42c0a566023ceb354777cb1ec14492ef1", + "datavalue": { + "value": { + "text": "\u043f\u0440\u044b\u043d\u0446\u044d\u0441\u0430", + "language": "be-tarask" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$075f0038-475e-e4ba-9801-52aac2067799", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "e72b1dd598ce40db3f7e9b195a3e9345b4ae4ba5", + "datavalue": { + "value": {"text": "princezna", "language": "cs"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$1085cbb9-4cd4-8a2f-a4c7-6f29fafea206", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "70d88bc577587e2732cf37a66dfd0920b175211a", + "datavalue": { + "value": {"text": "prinsesse", "language": "da"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$33d2e452-4ca2-8dea-4f98-242c53ef1811", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "eebf786f7c2b0963b9db4c2876bb24c6afc4ce1c", + "datavalue": { + "value": {"text": "principessa", "language": "it"}, + "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$3098804a-4758-d07f-8443-24ebe96c56ec", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P2521", + "hash": "649307549f96bfe54f16e9130f014bf018cc46c4", + "datavalue": { + "value": { + "text": "\u043f\u0440\u0438\u043d\u0446\u0435\u0441\u0430", + "language": "uk" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$ff433d7c-4e07-f7c0-14af-3b3f31f8ae9a", + "rank": "normal" + }], + "P3827": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3827", + "hash": "22ee9c46325acd0a1ca54f27bff5d75331211f8a", + "datavalue": {"value": "princes", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$6C64B5EA-8B74-4BF6-BB90-81C28320200A", + "rank": "normal" + }], + "P1343": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "eda63bed5c3d7a3460033092338ab321a2374c7f", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 2041543, + "id": "Q2041543" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P805": [{ + "snaktype": "value", + "property": "P805", + "hash": "a83263a5d43ce3636971eac0d25071e09746ed50", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 23858844, + "id": "Q23858844" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }] + }, + "qualifiers-order": ["P805"], + "id": "Q2747456$BC72E96E-6B05-4437-97F4-2BC0AC5DFA6D", + "rank": "normal", + "references": [{ + "hash": "c454383fe86a434f02006970b5c8b8f3f9b6714d", + "snaks": { + "P3452": [{ + "snaktype": "value", + "property": "P3452", + "hash": "482b5f23c034bd9eb5565e3869de4856bd9d5311", "datavalue": { "value": { "entity-type": "item", @@ -8099,58 +8119,236 @@ export default class WikidataSpecTest extends T { "datatype": "wikibase-item" }] }, - "qualifiers-order": ["P805"], - "id": "Q2747456$BC72E96E-6B05-4437-97F4-2BC0AC5DFA6D", - "rank": "normal", - "references": [{ - "hash": "c454383fe86a434f02006970b5c8b8f3f9b6714d", - "snaks": { - "P3452": [{ - "snaktype": "value", - "property": "P3452", - "hash": "482b5f23c034bd9eb5565e3869de4856bd9d5311", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 23858844, - "id": "Q23858844" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }] - }, - "snaks-order": ["P3452"] - }] - }, { - "mainsnak": { + "snaks-order": ["P3452"] + }] + }, { + "mainsnak": { + "snaktype": "value", + "property": "P1343", + "hash": "d5011798f92464584d8ccfc5f19f18f3659668bb", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 106727050, + "id": "Q106727050" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ "snaktype": "value", - "property": "P1343", - "hash": "d5011798f92464584d8ccfc5f19f18f3659668bb", + "property": "P1810", + "hash": "03c80cb894e30b3c675b60c14a8c96334cbb474c", + "datavalue": {"value": "Princes", "type": "string"}, + "datatype": "string" + }], + "P585": [{ + "snaktype": "value", + "property": "P585", + "hash": "ffb837135313cad3b2545c4b9ce5ee416deda3e2", "datavalue": { "value": { - "entity-type": "item", - "numeric-id": 106727050, - "id": "Q106727050" - }, "type": "wikibase-entityid" + "time": "+2021-05-07T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" }, - "datatype": "wikibase-item" + "datatype": "time" + }] + }, + "qualifiers-order": ["P1810", "P585"], + "id": "Q2747456$D6FEFF9B-75B5-4D37-B4CE-4DB70C6254C9", + "rank": "normal" + }], + "P1889": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1889", + "hash": "6999c7ae15eaea290cccb76ffdd06bc0677d0238", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 18244, + "id": "Q18244" + }, "type": "wikibase-entityid" }, - "type": "statement", - "qualifiers": { - "P1810": [{ + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$F24DA145-D17F-4574-AA66-6985CB25F420", + "rank": "normal" + }], + "P460": [{ + "mainsnak": { + "snaktype": "value", + "property": "P460", + "hash": "6615255f4b0abf58e9bbf71279496fb1a0b511fa", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 863048, + "id": "Q863048" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$838f53a3-4fd7-a6b9-48bd-ee70d9e91dc1", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P460", + "hash": "5f65f50d44d2a5b28655dc0b966f518e2106d3e1", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 147925, + "id": "Q147925" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$4c67b4d9-4a6f-dfe4-65c1-3aa104506737", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P460", + "hash": "2a1ef20476a8fa0d78b0bdfcdb34c88a72e4424f", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 11572959, + "id": "Q11572959" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$14b54a7e-4c22-fae3-81b2-1bd50ebca9e3", + "rank": "normal" + }], + "P2924": [{ + "mainsnak": { + "snaktype": "value", + "property": "P2924", + "hash": "5fd70a45453598d8cbd3f35682444dffb93ef183", + "datavalue": {"value": "3167678", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$D2F12FF3-B07F-408D-BAD1-87F8666ADBA6", + "rank": "normal" + }], + "P1417": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1417", + "hash": "b55bafafbccecce645f2a5f3ccfe4f1a93d5c797", + "datavalue": {"value": "topic/prince-title", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$3825CF57-55DE-4718-90B4-79DED5864AC4", + "rank": "normal" + }], + "P4212": [{ + "mainsnak": { + "snaktype": "value", + "property": "P4212", + "hash": "18175f20026e3c7967427cbf8230be7b80ba428b", + "datavalue": {"value": "pcrtSqFZmJvcTu", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$9791794A-44F1-4FC2-BA56-BA56D2B3578A", + "rank": "normal" + }], + "P279": [{ + "mainsnak": { + "snaktype": "value", + "property": "P279", + "hash": "05fb47e9bcde5c8dc864b788fbcab6eece27147b", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 2478141, + "id": "Q2478141" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$d68be51e-4bef-c388-920f-c76313d767a4", + "rank": "normal" + }], + "P6573": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6573", + "hash": "a3dd889f664f66353f3bdc1217a652bf779f0882", + "datavalue": {"value": "Prinz", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$6DCF9C3D-9898-4C78-A58F-FDC8400CCCA1", + "rank": "normal" + }], + "P3321": [{ + "mainsnak": { + "snaktype": "value", + "property": "P3321", + "hash": "83853e4f2ae83443c17c417de86f13d7adf2c6de", + "datavalue": { + "value": { + "text": "\u0623\u0645\u064a\u0631", + "language": "ar" + }, "type": "monolingualtext" + }, + "datatype": "monolingualtext" + }, + "type": "statement", + "id": "Q2747456$e5768817-48a9-44bc-637e-2137393ea3ff", + "rank": "normal" + }], + "P244": [{ + "mainsnak": { + "snaktype": "value", + "property": "P244", + "hash": "3484a6a7868e031d3d479ecf0dd02abd5ad5df67", + "datavalue": {"value": "sh85106721", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$2BEAAB19-60A8-4B69-85B2-80E522D88798", + "rank": "normal", + "references": [{ + "hash": "ac5d47e9fbcc281bc0d27a205ae02e22ad24ce31", + "snaks": { + "P854": [{ "snaktype": "value", - "property": "P1810", - "hash": "03c80cb894e30b3c675b60c14a8c96334cbb474c", - "datavalue": {"value": "Princes", "type": "string"}, - "datatype": "string" + "property": "P854", + "hash": "b560dc6b281a39d061e189d2eb299a426a06f1a2", + "datavalue": { + "value": "https://github.com/JohnMarkOckerbloom/ftl/blob/master/data/wikimap", + "type": "string" + }, + "datatype": "url" }], - "P585": [{ + "P813": [{ "snaktype": "value", - "property": "P585", - "hash": "ffb837135313cad3b2545c4b9ce5ee416deda3e2", + "property": "P813", + "hash": "0dcf4f64e93fdcc654e2c7534285881fe48b9f3d", "datavalue": { "value": { - "time": "+2021-05-07T00:00:00Z", + "time": "+2019-04-03T00:00:00Z", "timezone": 0, "before": 0, "after": 0, @@ -8161,1022 +8359,824 @@ export default class WikidataSpecTest extends T { "datatype": "time" }] }, - "qualifiers-order": ["P1810", "P585"], - "id": "Q2747456$D6FEFF9B-75B5-4D37-B4CE-4DB70C6254C9", - "rank": "normal" - }], - "P1889": [{ - "mainsnak": { + "snaks-order": ["P854", "P813"] + }] + }], + "P7033": [{ + "mainsnak": { + "snaktype": "value", + "property": "P7033", + "hash": "bbeb07d3dd6a36a1b4ff44294353090777d3f68f", + "datavalue": {"value": "scot/9663", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$7D6E3549-7ABD-43B0-BCF2-572F271FBE61", + "rank": "normal" + }], + "P6404": [{ + "mainsnak": { + "snaktype": "value", + "property": "P6404", + "hash": "b73a884b2dbc4d181d68748eb0a1369a60b6779a", + "datavalue": {"value": "principe", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ "snaktype": "value", - "property": "P1889", - "hash": "6999c7ae15eaea290cccb76ffdd06bc0677d0238", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 18244, - "id": "Q18244" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$F24DA145-D17F-4574-AA66-6985CB25F420", - "rank": "normal" - }], - "P460": [{ - "mainsnak": { - "snaktype": "value", - "property": "P460", - "hash": "6615255f4b0abf58e9bbf71279496fb1a0b511fa", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 863048, - "id": "Q863048" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$838f53a3-4fd7-a6b9-48bd-ee70d9e91dc1", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P460", - "hash": "5f65f50d44d2a5b28655dc0b966f518e2106d3e1", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 147925, - "id": "Q147925" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$4c67b4d9-4a6f-dfe4-65c1-3aa104506737", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P460", - "hash": "2a1ef20476a8fa0d78b0bdfcdb34c88a72e4424f", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 11572959, - "id": "Q11572959" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$14b54a7e-4c22-fae3-81b2-1bd50ebca9e3", - "rank": "normal" - }], - "P2924": [{ - "mainsnak": { - "snaktype": "value", - "property": "P2924", - "hash": "5fd70a45453598d8cbd3f35682444dffb93ef183", - "datavalue": {"value": "3167678", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$D2F12FF3-B07F-408D-BAD1-87F8666ADBA6", - "rank": "normal" - }], - "P1417": [{ - "mainsnak": { - "snaktype": "value", - "property": "P1417", - "hash": "b55bafafbccecce645f2a5f3ccfe4f1a93d5c797", - "datavalue": {"value": "topic/prince-title", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$3825CF57-55DE-4718-90B4-79DED5864AC4", - "rank": "normal" - }], - "P4212": [{ - "mainsnak": { - "snaktype": "value", - "property": "P4212", - "hash": "18175f20026e3c7967427cbf8230be7b80ba428b", - "datavalue": {"value": "pcrtSqFZmJvcTu", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$9791794A-44F1-4FC2-BA56-BA56D2B3578A", - "rank": "normal" - }], - "P279": [{ - "mainsnak": { - "snaktype": "value", - "property": "P279", - "hash": "05fb47e9bcde5c8dc864b788fbcab6eece27147b", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 2478141, - "id": "Q2478141" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$d68be51e-4bef-c388-920f-c76313d767a4", - "rank": "normal" - }], - "P6573": [{ - "mainsnak": { - "snaktype": "value", - "property": "P6573", - "hash": "a3dd889f664f66353f3bdc1217a652bf779f0882", - "datavalue": {"value": "Prinz", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$6DCF9C3D-9898-4C78-A58F-FDC8400CCCA1", - "rank": "normal" - }], - "P3321": [{ - "mainsnak": { - "snaktype": "value", - "property": "P3321", - "hash": "83853e4f2ae83443c17c417de86f13d7adf2c6de", - "datavalue": { - "value": { - "text": "\u0623\u0645\u064a\u0631", - "language": "ar" - }, "type": "monolingualtext" - }, - "datatype": "monolingualtext" - }, - "type": "statement", - "id": "Q2747456$e5768817-48a9-44bc-637e-2137393ea3ff", - "rank": "normal" - }], - "P244": [{ - "mainsnak": { - "snaktype": "value", - "property": "P244", - "hash": "3484a6a7868e031d3d479ecf0dd02abd5ad5df67", - "datavalue": {"value": "sh85106721", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$2BEAAB19-60A8-4B69-85B2-80E522D88798", - "rank": "normal", - "references": [{ - "hash": "ac5d47e9fbcc281bc0d27a205ae02e22ad24ce31", - "snaks": { - "P854": [{ - "snaktype": "value", - "property": "P854", - "hash": "b560dc6b281a39d061e189d2eb299a426a06f1a2", - "datavalue": { - "value": "https://github.com/JohnMarkOckerbloom/ftl/blob/master/data/wikimap", - "type": "string" - }, - "datatype": "url" - }], - "P813": [{ - "snaktype": "value", - "property": "P813", - "hash": "0dcf4f64e93fdcc654e2c7534285881fe48b9f3d", - "datavalue": { - "value": { - "time": "+2019-04-03T00:00:00Z", - "timezone": 0, - "before": 0, - "after": 0, - "precision": 11, - "calendarmodel": "http://www.wikidata.org/entity/Q1985727" - }, "type": "time" - }, - "datatype": "time" - }] - }, - "snaks-order": ["P854", "P813"] - }] - }], - "P7033": [{ - "mainsnak": { - "snaktype": "value", - "property": "P7033", - "hash": "bbeb07d3dd6a36a1b4ff44294353090777d3f68f", - "datavalue": {"value": "scot/9663", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$7D6E3549-7ABD-43B0-BCF2-572F271FBE61", - "rank": "normal" - }], - "P6404": [{ - "mainsnak": { - "snaktype": "value", - "property": "P6404", - "hash": "b73a884b2dbc4d181d68748eb0a1369a60b6779a", + "property": "P1810", + "hash": "aa57b954447e129789c598d135f12a17358aecac", "datavalue": {"value": "principe", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "qualifiers": { - "P1810": [{ + "datatype": "string" + }], + "P577": [{ + "snaktype": "value", + "property": "P577", + "hash": "d2a40d22655021267a9386d3086e000722b5a2d3", + "datavalue": { + "value": { + "time": "+2011-01-01T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 9, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "qualifiers-order": ["P1810", "P577"], + "id": "Q2747456$B0237EEF-F865-48E1-B40C-6078B365CA08", + "rank": "normal" + }], + "P1245": [{ + "mainsnak": { + "snaktype": "value", + "property": "P1245", + "hash": "96bd0f2ac61d64e0c7f70fc77dbc936887d30178", + "datavalue": {"value": "5814", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$CA27EF8B-8DE0-4B3D-98F2-2ED0857103E3", + "rank": "normal" + }], + "P487": [{ + "mainsnak": { + "snaktype": "value", + "property": "P487", + "hash": "14725f4cf317ce7d4b1a0e750232b59d06b5072c", + "datavalue": {"value": "\ud83e\udd34", "type": "string"}, + "datatype": "string" + }, + "type": "statement", + "id": "Q2747456$1df4cace-4275-e6a6-0c5a-edd013874f47", + "rank": "normal" + }], + "P8408": [{ + "mainsnak": { + "snaktype": "value", + "property": "P8408", + "hash": "1959b085f955100ebf2128c228f5a48c527b3066", + "datavalue": {"value": "Prince", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$DE4D8776-C78F-4ECC-A2AB-FF4C3C605B3D", + "rank": "normal", + "references": [{ + "hash": "9a681f9dd95c90224547c404e11295f4f7dcf54e", + "snaks": { + "P248": [{ "snaktype": "value", - "property": "P1810", - "hash": "aa57b954447e129789c598d135f12a17358aecac", - "datavalue": {"value": "principe", "type": "string"}, - "datatype": "string" - }], - "P577": [{ - "snaktype": "value", - "property": "P577", - "hash": "d2a40d22655021267a9386d3086e000722b5a2d3", + "property": "P248", + "hash": "9d5780dddffa8746637a9929a936ab6b0f601e24", "datavalue": { "value": { - "time": "+2011-01-01T00:00:00Z", + "entity-type": "item", + "numeric-id": 64139102, + "id": "Q64139102" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "622a5a27fa5b25e7e7984974e9db494cf8460990", + "datavalue": { + "value": { + "time": "+2020-07-09T00:00:00Z", "timezone": 0, "before": 0, "after": 0, - "precision": 9, + "precision": 11, "calendarmodel": "http://www.wikidata.org/entity/Q1985727" }, "type": "time" }, "datatype": "time" }] }, - "qualifiers-order": ["P1810", "P577"], - "id": "Q2747456$B0237EEF-F865-48E1-B40C-6078B365CA08", - "rank": "normal" - }], - "P1245": [{ - "mainsnak": { - "snaktype": "value", - "property": "P1245", - "hash": "96bd0f2ac61d64e0c7f70fc77dbc936887d30178", - "datavalue": {"value": "5814", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$CA27EF8B-8DE0-4B3D-98F2-2ED0857103E3", - "rank": "normal" - }], - "P487": [{ - "mainsnak": { - "snaktype": "value", - "property": "P487", - "hash": "14725f4cf317ce7d4b1a0e750232b59d06b5072c", - "datavalue": {"value": "\ud83e\udd34", "type": "string"}, - "datatype": "string" - }, - "type": "statement", - "id": "Q2747456$1df4cace-4275-e6a6-0c5a-edd013874f47", - "rank": "normal" - }], - "P8408": [{ - "mainsnak": { - "snaktype": "value", - "property": "P8408", - "hash": "1959b085f955100ebf2128c228f5a48c527b3066", - "datavalue": {"value": "Prince", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$DE4D8776-C78F-4ECC-A2AB-FF4C3C605B3D", - "rank": "normal", - "references": [{ - "hash": "9a681f9dd95c90224547c404e11295f4f7dcf54e", - "snaks": { - "P248": [{ - "snaktype": "value", - "property": "P248", - "hash": "9d5780dddffa8746637a9929a936ab6b0f601e24", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 64139102, - "id": "Q64139102" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }], - "P813": [{ - "snaktype": "value", - "property": "P813", - "hash": "622a5a27fa5b25e7e7984974e9db494cf8460990", - "datavalue": { - "value": { - "time": "+2020-07-09T00:00:00Z", - "timezone": 0, - "before": 0, - "after": 0, - "precision": 11, - "calendarmodel": "http://www.wikidata.org/entity/Q1985727" - }, "type": "time" - }, - "datatype": "time" - }] - }, - "snaks-order": ["P248", "P813"] - }] - }], - "P646": [{ - "mainsnak": { - "snaktype": "value", - "property": "P646", - "hash": "e2a702b2c25f7f56f203253d626302e897f59a8e", - "datavalue": {"value": "/m/0dl76", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$C85A80F8-BBE5-4036-B390-FE2D440662CE", - "rank": "normal" - }], - "P9486": [{ - "mainsnak": { - "snaktype": "value", - "property": "P9486", - "hash": "8112e14818e95883f0df779234ffa2b5bd7544ef", - "datavalue": {"value": "2114", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "id": "Q2747456$03DF860D-8766-4A8E-BA39-CA20E7748101", - "rank": "normal" - }], - "P268": [{ - "mainsnak": { - "snaktype": "value", - "property": "P268", - "hash": "6c26a220e139d739b090f743a20ceec3b2b13d36", - "datavalue": {"value": "11934545s", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "qualifiers": { - "P1810": [{ - "snaktype": "value", - "property": "P1810", - "hash": "03c80cb894e30b3c675b60c14a8c96334cbb474c", - "datavalue": {"value": "Princes", "type": "string"}, - "datatype": "string" - }] - }, - "qualifiers-order": ["P1810"], - "id": "Q2747456$58ba630c-6458-4a5a-8913-a294e6124d7b", - "rank": "normal", - "references": [{ - "hash": "7c27b83b9977dcc1e39904c165117c33f6d4d258", - "snaks": { - "P248": [{ - "snaktype": "value", - "property": "P248", - "hash": "3b090a7bae73c288393b2c8b9846cc7ed9a58f91", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 16583225, - "id": "Q16583225" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }], - "P854": [{ - "snaktype": "value", - "property": "P854", - "hash": "42ed86952731f89f4c99b0a5091aa580a24bf41f", - "datavalue": { - "value": "https://thes.bncf.firenze.sbn.it/termine.php?id=8468", - "type": "string" - }, - "datatype": "url" - }], - "P813": [{ - "snaktype": "value", - "property": "P813", - "hash": "fa626481f5288f46170160e657d94c0b692e3140", - "datavalue": { - "value": { - "time": "+2021-06-13T00:00:00Z", - "timezone": 0, - "before": 0, - "after": 0, - "precision": 11, - "calendarmodel": "http://www.wikidata.org/entity/Q1985727" - }, "type": "time" - }, - "datatype": "time" - }] - }, - "snaks-order": ["P248", "P854", "P813"] - }] - }], - "P950": [{ - "mainsnak": { - "snaktype": "value", - "property": "P950", - "hash": "cffc5e803a428e4e1c294de58122f1d3ed126bcd", - "datavalue": {"value": "XX542448", "type": "string"}, - "datatype": "external-id" - }, - "type": "statement", - "qualifiers": { - "P1810": [{ - "snaktype": "value", - "property": "P1810", - "hash": "c1ce0e3e614f65130d263d0a08d806a912624221", - "datavalue": {"value": "Pr\u00edncipes", "type": "string"}, - "datatype": "string" - }] - }, - "qualifiers-order": ["P1810"], - "id": "Q2747456$c8094f9b-d4b1-4050-9be0-252f7a070d8b", - "rank": "normal", - "references": [{ - "hash": "7c27b83b9977dcc1e39904c165117c33f6d4d258", - "snaks": { - "P248": [{ - "snaktype": "value", - "property": "P248", - "hash": "3b090a7bae73c288393b2c8b9846cc7ed9a58f91", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 16583225, - "id": "Q16583225" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }], - "P854": [{ - "snaktype": "value", - "property": "P854", - "hash": "42ed86952731f89f4c99b0a5091aa580a24bf41f", - "datavalue": { - "value": "https://thes.bncf.firenze.sbn.it/termine.php?id=8468", - "type": "string" - }, - "datatype": "url" - }], - "P813": [{ - "snaktype": "value", - "property": "P813", - "hash": "fa626481f5288f46170160e657d94c0b692e3140", - "datavalue": { - "value": { - "time": "+2021-06-13T00:00:00Z", - "timezone": 0, - "before": 0, - "after": 0, - "precision": 11, - "calendarmodel": "http://www.wikidata.org/entity/Q1985727" - }, "type": "time" - }, - "datatype": "time" - }] - }, - "snaks-order": ["P248", "P854", "P813"] - }] - }], - "P527": [{ - "mainsnak": { - "snaktype": "value", - "property": "P527", - "hash": "1f078eae805dfe58ac01a303b2a5474a99df8a48", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 28495701, - "id": "Q28495701" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$6a3b7447-4721-18a4-578e-97af51eeb4a5", - "rank": "normal" - }, { - "mainsnak": { - "snaktype": "value", - "property": "P527", - "hash": "168b349e75ce98b28c0f65998a2fe2d2f1e0f7f5", - "datavalue": { - "value": { - "entity-type": "item", - "numeric-id": 3403409, - "id": "Q3403409" - }, "type": "wikibase-entityid" - }, - "datatype": "wikibase-item" - }, - "type": "statement", - "id": "Q2747456$d2253d2b-4584-2367-122e-557303f41540", - "rank": "normal" + "snaks-order": ["P248", "P813"] }] + }], + "P646": [{ + "mainsnak": { + "snaktype": "value", + "property": "P646", + "hash": "e2a702b2c25f7f56f203253d626302e897f59a8e", + "datavalue": {"value": "/m/0dl76", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$C85A80F8-BBE5-4036-B390-FE2D440662CE", + "rank": "normal" + }], + "P9486": [{ + "mainsnak": { + "snaktype": "value", + "property": "P9486", + "hash": "8112e14818e95883f0df779234ffa2b5bd7544ef", + "datavalue": {"value": "2114", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "id": "Q2747456$03DF860D-8766-4A8E-BA39-CA20E7748101", + "rank": "normal" + }], + "P268": [{ + "mainsnak": { + "snaktype": "value", + "property": "P268", + "hash": "6c26a220e139d739b090f743a20ceec3b2b13d36", + "datavalue": {"value": "11934545s", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "03c80cb894e30b3c675b60c14a8c96334cbb474c", + "datavalue": {"value": "Princes", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1810"], + "id": "Q2747456$58ba630c-6458-4a5a-8913-a294e6124d7b", + "rank": "normal", + "references": [{ + "hash": "7c27b83b9977dcc1e39904c165117c33f6d4d258", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "3b090a7bae73c288393b2c8b9846cc7ed9a58f91", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 16583225, + "id": "Q16583225" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P854": [{ + "snaktype": "value", + "property": "P854", + "hash": "42ed86952731f89f4c99b0a5091aa580a24bf41f", + "datavalue": { + "value": "https://thes.bncf.firenze.sbn.it/termine.php?id=8468", + "type": "string" + }, + "datatype": "url" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "fa626481f5288f46170160e657d94c0b692e3140", + "datavalue": { + "value": { + "time": "+2021-06-13T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P854", "P813"] + }] + }], + "P950": [{ + "mainsnak": { + "snaktype": "value", + "property": "P950", + "hash": "cffc5e803a428e4e1c294de58122f1d3ed126bcd", + "datavalue": {"value": "XX542448", "type": "string"}, + "datatype": "external-id" + }, + "type": "statement", + "qualifiers": { + "P1810": [{ + "snaktype": "value", + "property": "P1810", + "hash": "c1ce0e3e614f65130d263d0a08d806a912624221", + "datavalue": {"value": "Pr\u00edncipes", "type": "string"}, + "datatype": "string" + }] + }, + "qualifiers-order": ["P1810"], + "id": "Q2747456$c8094f9b-d4b1-4050-9be0-252f7a070d8b", + "rank": "normal", + "references": [{ + "hash": "7c27b83b9977dcc1e39904c165117c33f6d4d258", + "snaks": { + "P248": [{ + "snaktype": "value", + "property": "P248", + "hash": "3b090a7bae73c288393b2c8b9846cc7ed9a58f91", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 16583225, + "id": "Q16583225" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }], + "P854": [{ + "snaktype": "value", + "property": "P854", + "hash": "42ed86952731f89f4c99b0a5091aa580a24bf41f", + "datavalue": { + "value": "https://thes.bncf.firenze.sbn.it/termine.php?id=8468", + "type": "string" + }, + "datatype": "url" + }], + "P813": [{ + "snaktype": "value", + "property": "P813", + "hash": "fa626481f5288f46170160e657d94c0b692e3140", + "datavalue": { + "value": { + "time": "+2021-06-13T00:00:00Z", + "timezone": 0, + "before": 0, + "after": 0, + "precision": 11, + "calendarmodel": "http://www.wikidata.org/entity/Q1985727" + }, "type": "time" + }, + "datatype": "time" + }] + }, + "snaks-order": ["P248", "P854", "P813"] + }] + }], + "P527": [{ + "mainsnak": { + "snaktype": "value", + "property": "P527", + "hash": "1f078eae805dfe58ac01a303b2a5474a99df8a48", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 28495701, + "id": "Q28495701" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$6a3b7447-4721-18a4-578e-97af51eeb4a5", + "rank": "normal" + }, { + "mainsnak": { + "snaktype": "value", + "property": "P527", + "hash": "168b349e75ce98b28c0f65998a2fe2d2f1e0f7f5", + "datavalue": { + "value": { + "entity-type": "item", + "numeric-id": 3403409, + "id": "Q3403409" + }, "type": "wikibase-entityid" + }, + "datatype": "wikibase-item" + }, + "type": "statement", + "id": "Q2747456$d2253d2b-4584-2367-122e-557303f41540", + "rank": "normal" + }] + }, + "sitelinks": { + "amwiki": { + "site": "amwiki", + "title": "\u120d\u12d1\u120d", + "badges": [], + "url": "https://am.wikipedia.org/wiki/%E1%88%8D%E1%8B%91%E1%88%8D" }, - "sitelinks": { - "amwiki": { - "site": "amwiki", - "title": "\u120d\u12d1\u120d", - "badges": [], - "url": "https://am.wikipedia.org/wiki/%E1%88%8D%E1%8B%91%E1%88%8D" - }, - "arwiki": { - "site": "arwiki", - "title": "\u0623\u0645\u064a\u0631 (\u0644\u0642\u0628)", - "badges": [], - "url": "https://ar.wikipedia.org/wiki/%D8%A3%D9%85%D9%8A%D8%B1_(%D9%84%D9%82%D8%A8)" - }, - "astwiki": { - "site": "astwiki", - "title": "Pr\u00edncipe", - "badges": [], - "url": "https://ast.wikipedia.org/wiki/Pr%C3%ADncipe" - }, - "azwiki": { - "site": "azwiki", - "title": "Prens", - "badges": [], - "url": "https://az.wikipedia.org/wiki/Prens" - }, - "be_x_oldwiki": { - "site": "be_x_oldwiki", - "title": "\u041f\u0440\u044b\u043d\u0446", - "badges": [], - "url": "https://be-tarask.wikipedia.org/wiki/%D0%9F%D1%80%D1%8B%D0%BD%D1%86" - }, - "bewiki": { - "site": "bewiki", - "title": "\u041f\u0440\u044b\u043d\u0446", - "badges": [], - "url": "https://be.wikipedia.org/wiki/%D0%9F%D1%80%D1%8B%D0%BD%D1%86" - }, - "bgwiki": { - "site": "bgwiki", - "title": "\u041f\u0440\u0438\u043d\u0446", - "badges": [], - "url": "https://bg.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86" - }, - "bxrwiki": { - "site": "bxrwiki", - "title": "\u0425\u0430\u043d \u0445\u04af\u0431\u04af\u04af\u043d", - "badges": [], - "url": "https://bxr.wikipedia.org/wiki/%D0%A5%D0%B0%D0%BD_%D1%85%D2%AF%D0%B1%D2%AF%D2%AF%D0%BD" - }, - "cawiki": { - "site": "cawiki", - "title": "Pr\u00edncep", - "badges": [], - "url": "https://ca.wikipedia.org/wiki/Pr%C3%ADncep" - }, - "cswiki": { - "site": "cswiki", - "title": "Princ", - "badges": [], - "url": "https://cs.wikipedia.org/wiki/Princ" - }, - "cywiki": { - "site": "cywiki", - "title": "Tywysog", - "badges": [], - "url": "https://cy.wikipedia.org/wiki/Tywysog" - }, - "dawiki": { - "site": "dawiki", - "title": "Prins", - "badges": [], - "url": "https://da.wikipedia.org/wiki/Prins" - }, - "dewiki": { - "site": "dewiki", - "title": "Prinz", - "badges": [], - "url": "https://de.wikipedia.org/wiki/Prinz" - }, - "dewikiquote": { - "site": "dewikiquote", - "title": "Prinz", - "badges": [], - "url": "https://de.wikiquote.org/wiki/Prinz" - }, - "diqwiki": { - "site": "diqwiki", - "title": "Prens", - "badges": [], - "url": "https://diq.wikipedia.org/wiki/Prens" - }, - "elwiki": { - "site": "elwiki", - "title": "\u03a0\u03c1\u03af\u03b3\u03ba\u03b9\u03c0\u03b1\u03c2", - "badges": [], - "url": "https://el.wikipedia.org/wiki/%CE%A0%CF%81%CE%AF%CE%B3%CE%BA%CE%B9%CF%80%CE%B1%CF%82" - }, - "enwiki": { - "site": "enwiki", - "title": "Prince", - "badges": [], - "url": "https://en.wikipedia.org/wiki/Prince" - }, - "enwikiquote": { - "site": "enwikiquote", - "title": "Prince", - "badges": [], - "url": "https://en.wikiquote.org/wiki/Prince" - }, - "eowiki": { - "site": "eowiki", - "title": "Princo", - "badges": [], - "url": "https://eo.wikipedia.org/wiki/Princo" - }, - "eswiki": { - "site": "eswiki", - "title": "Pr\u00edncipe", - "badges": [], - "url": "https://es.wikipedia.org/wiki/Pr%C3%ADncipe" - }, - "etwiki": { - "site": "etwiki", - "title": "Prints (j\u00e4reltulija)", - "badges": [], - "url": "https://et.wikipedia.org/wiki/Prints_(j%C3%A4reltulija)" - }, - "etwikiquote": { - "site": "etwikiquote", - "title": "Prints", - "badges": [], - "url": "https://et.wikiquote.org/wiki/Prints" - }, - "euwiki": { - "site": "euwiki", - "title": "Printze", - "badges": [], - "url": "https://eu.wikipedia.org/wiki/Printze" - }, - "fawiki": { - "site": "fawiki", - "title": "\u0634\u0627\u0647\u0632\u0627\u062f\u0647", - "badges": [], - "url": "https://fa.wikipedia.org/wiki/%D8%B4%D8%A7%D9%87%D8%B2%D8%A7%D8%AF%D9%87" - }, - "fiwiki": { - "site": "fiwiki", - "title": "Prinssi", - "badges": [], - "url": "https://fi.wikipedia.org/wiki/Prinssi" - }, - "frwiki": { - "site": "frwiki", - "title": "Prince (dignit\u00e9)", - "badges": [], - "url": "https://fr.wikipedia.org/wiki/Prince_(dignit%C3%A9)" - }, - "fywiki": { - "site": "fywiki", - "title": "Prins", - "badges": [], - "url": "https://fy.wikipedia.org/wiki/Prins" - }, - "gawiki": { - "site": "gawiki", - "title": "Prionsa", - "badges": [], - "url": "https://ga.wikipedia.org/wiki/Prionsa" - }, - "glwiki": { - "site": "glwiki", - "title": "Pr\u00edncipe", - "badges": [], - "url": "https://gl.wikipedia.org/wiki/Pr%C3%ADncipe" - }, - "hewiki": { - "site": "hewiki", - "title": "\u05e0\u05e1\u05d9\u05da", - "badges": [], - "url": "https://he.wikipedia.org/wiki/%D7%A0%D7%A1%D7%99%D7%9A" - }, - "hewikiquote": { - "site": "hewikiquote", - "title": "\u05e0\u05e1\u05d9\u05da", - "badges": [], - "url": "https://he.wikiquote.org/wiki/%D7%A0%D7%A1%D7%99%D7%9A" - }, - "hrwiki": { - "site": "hrwiki", - "title": "Princ", - "badges": [], - "url": "https://hr.wikipedia.org/wiki/Princ" - }, - "idwiki": { - "site": "idwiki", - "title": "Pangeran", - "badges": [], - "url": "https://id.wikipedia.org/wiki/Pangeran" - }, - "iswiki": { - "site": "iswiki", - "title": "Prins", - "badges": [], - "url": "https://is.wikipedia.org/wiki/Prins" - }, - "itwiki": { - "site": "itwiki", - "title": "Principe", - "badges": [], - "url": "https://it.wikipedia.org/wiki/Principe" - }, - "itwikiquote": { - "site": "itwikiquote", - "title": "Principe", - "badges": [], - "url": "https://it.wikiquote.org/wiki/Principe" - }, - "jawiki": { - "site": "jawiki", - "title": "\u30d7\u30ea\u30f3\u30b9", - "badges": [], - "url": "https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B9" - }, - "jvwiki": { - "site": "jvwiki", - "title": "Pang\u00e9ran", - "badges": [], - "url": "https://jv.wikipedia.org/wiki/Pang%C3%A9ran" - }, - "kawiki": { - "site": "kawiki", - "title": "\u10e3\u10e4\u10da\u10d8\u10e1\u10ec\u10e3\u10da\u10d8", - "badges": [], - "url": "https://ka.wikipedia.org/wiki/%E1%83%A3%E1%83%A4%E1%83%9A%E1%83%98%E1%83%A1%E1%83%AC%E1%83%A3%E1%83%9A%E1%83%98" - }, - "kowiki": { - "site": "kowiki", - "title": "\ud504\ub9b0\uc2a4", - "badges": [], - "url": "https://ko.wikipedia.org/wiki/%ED%94%84%EB%A6%B0%EC%8A%A4" - }, - "lawiki": { - "site": "lawiki", - "title": "Princeps", - "badges": [], - "url": "https://la.wikipedia.org/wiki/Princeps" - }, - "lawikiquote": { - "site": "lawikiquote", - "title": "Princeps", - "badges": [], - "url": "https://la.wikiquote.org/wiki/Princeps" - }, - "lvwiki": { - "site": "lvwiki", - "title": "Princis", - "badges": [], - "url": "https://lv.wikipedia.org/wiki/Princis" - }, - "mswiki": { - "site": "mswiki", - "title": "Putera", - "badges": [], - "url": "https://ms.wikipedia.org/wiki/Putera" - }, - "newiki": { - "site": "newiki", - "title": "\u0930\u093e\u091c\u0915\u0941\u092e\u093e\u0930", - "badges": [], - "url": "https://ne.wikipedia.org/wiki/%E0%A4%B0%E0%A4%BE%E0%A4%9C%E0%A4%95%E0%A5%81%E0%A4%AE%E0%A4%BE%E0%A4%B0" - }, - "nlwiki": { - "site": "nlwiki", - "title": "Prins", - "badges": [], - "url": "https://nl.wikipedia.org/wiki/Prins" - }, - "nnwiki": { - "site": "nnwiki", - "title": "Prins", - "badges": [], - "url": "https://nn.wikipedia.org/wiki/Prins" - }, - "nowiki": { - "site": "nowiki", - "title": "Prins", - "badges": [], - "url": "https://no.wikipedia.org/wiki/Prins" - }, - "plwiki": { - "site": "plwiki", - "title": "Ksi\u0105\u017c\u0119", - "badges": [], - "url": "https://pl.wikipedia.org/wiki/Ksi%C4%85%C5%BC%C4%99" - }, - "plwikiquote": { - "site": "plwikiquote", - "title": "Ksi\u0105\u017c\u0119", - "badges": [], - "url": "https://pl.wikiquote.org/wiki/Ksi%C4%85%C5%BC%C4%99" - }, - "ptwiki": { - "site": "ptwiki", - "title": "Pr\u00edncipe", - "badges": [], - "url": "https://pt.wikipedia.org/wiki/Pr%C3%ADncipe" - }, - "ptwikiquote": { - "site": "ptwikiquote", - "title": "Pr\u00edncipe", - "badges": [], - "url": "https://pt.wikiquote.org/wiki/Pr%C3%ADncipe" - }, - "rmywiki": { - "site": "rmywiki", - "title": "Rayon", - "badges": [], - "url": "https://rmy.wikipedia.org/wiki/Rayon" - }, - "rowiki": { - "site": "rowiki", - "title": "Prin\u021b", - "badges": [], - "url": "https://ro.wikipedia.org/wiki/Prin%C8%9B" - }, - "ruwiki": { - "site": "ruwiki", - "title": "\u041f\u0440\u0438\u043d\u0446", - "badges": [], - "url": "https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86" - }, - "scnwiki": { - "site": "scnwiki", - "title": "Pr\u00ecncipi", - "badges": [], - "url": "https://scn.wikipedia.org/wiki/Pr%C3%ACncipi" - }, - "scowiki": { - "site": "scowiki", - "title": "Prince", - "badges": [], - "url": "https://sco.wikipedia.org/wiki/Prince" - }, - "shwiki": { - "site": "shwiki", - "title": "Princ", - "badges": [], - "url": "https://sh.wikipedia.org/wiki/Princ" - }, - "simplewiki": { - "site": "simplewiki", - "title": "Prince", - "badges": [], - "url": "https://simple.wikipedia.org/wiki/Prince" - }, - "skwiki": { - "site": "skwiki", - "title": "Princ", - "badges": [], - "url": "https://sk.wikipedia.org/wiki/Princ" - }, - "slwiki": { - "site": "slwiki", - "title": "Princ", - "badges": [], - "url": "https://sl.wikipedia.org/wiki/Princ" - }, - "srwiki": { - "site": "srwiki", - "title": "Princ", - "badges": [], - "url": "https://sr.wikipedia.org/wiki/Princ" - }, - "suwiki": { - "site": "suwiki", - "title": "Pang\u00e9ran", - "badges": [], - "url": "https://su.wikipedia.org/wiki/Pang%C3%A9ran" - }, - "svwiki": { - "site": "svwiki", - "title": "Prins", - "badges": [], - "url": "https://sv.wikipedia.org/wiki/Prins" - }, - "thwiki": { - "site": "thwiki", - "title": "\u0e40\u0e08\u0e49\u0e32", - "badges": [], - "url": "https://th.wikipedia.org/wiki/%E0%B9%80%E0%B8%88%E0%B9%89%E0%B8%B2" - }, - "trwiki": { - "site": "trwiki", - "title": "Prens", - "badges": [], - "url": "https://tr.wikipedia.org/wiki/Prens" - }, - "ukwiki": { - "site": "ukwiki", - "title": "\u041f\u0440\u0438\u043d\u0446", - "badges": [], - "url": "https://uk.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86" - }, - "urwiki": { - "site": "urwiki", - "title": "\u0634\u06c1\u0632\u0627\u062f\u06c1", - "badges": [], - "url": "https://ur.wikipedia.org/wiki/%D8%B4%DB%81%D8%B2%D8%A7%D8%AF%DB%81" - }, - "vecwiki": { - "site": "vecwiki", - "title": "Principe", - "badges": [], - "url": "https://vec.wikipedia.org/wiki/Principe" - }, - "viwiki": { - "site": "viwiki", - "title": "V\u01b0\u01a1ng t\u01b0\u1edbc", - "badges": [], - "url": "https://vi.wikipedia.org/wiki/V%C6%B0%C6%A1ng_t%C6%B0%E1%BB%9Bc" - }, - "wuuwiki": { - "site": "wuuwiki", - "title": "\u738b\u7235", - "badges": [], - "url": "https://wuu.wikipedia.org/wiki/%E7%8E%8B%E7%88%B5" - }, - "zh_min_nanwiki": { - "site": "zh_min_nanwiki", - "title": "Prince", - "badges": [], - "url": "https://zh-min-nan.wikipedia.org/wiki/Prince" - }, - "zh_yuewiki": { - "site": "zh_yuewiki", - "title": "\u89aa\u738b", - "badges": [], - "url": "https://zh-yue.wikipedia.org/wiki/%E8%A6%AA%E7%8E%8B" - }, - "zhwiki": { - "site": "zhwiki", - "title": "\u738b\u7235", - "badges": [], - "url": "https://zh.wikipedia.org/wiki/%E7%8E%8B%E7%88%B5" - } + "arwiki": { + "site": "arwiki", + "title": "\u0623\u0645\u064a\u0631 (\u0644\u0642\u0628)", + "badges": [], + "url": "https://ar.wikipedia.org/wiki/%D8%A3%D9%85%D9%8A%D8%B1_(%D9%84%D9%82%D8%A8)" + }, + "astwiki": { + "site": "astwiki", + "title": "Pr\u00edncipe", + "badges": [], + "url": "https://ast.wikipedia.org/wiki/Pr%C3%ADncipe" + }, + "azwiki": { + "site": "azwiki", + "title": "Prens", + "badges": [], + "url": "https://az.wikipedia.org/wiki/Prens" + }, + "be_x_oldwiki": { + "site": "be_x_oldwiki", + "title": "\u041f\u0440\u044b\u043d\u0446", + "badges": [], + "url": "https://be-tarask.wikipedia.org/wiki/%D0%9F%D1%80%D1%8B%D0%BD%D1%86" + }, + "bewiki": { + "site": "bewiki", + "title": "\u041f\u0440\u044b\u043d\u0446", + "badges": [], + "url": "https://be.wikipedia.org/wiki/%D0%9F%D1%80%D1%8B%D0%BD%D1%86" + }, + "bgwiki": { + "site": "bgwiki", + "title": "\u041f\u0440\u0438\u043d\u0446", + "badges": [], + "url": "https://bg.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86" + }, + "bxrwiki": { + "site": "bxrwiki", + "title": "\u0425\u0430\u043d \u0445\u04af\u0431\u04af\u04af\u043d", + "badges": [], + "url": "https://bxr.wikipedia.org/wiki/%D0%A5%D0%B0%D0%BD_%D1%85%D2%AF%D0%B1%D2%AF%D2%AF%D0%BD" + }, + "cawiki": { + "site": "cawiki", + "title": "Pr\u00edncep", + "badges": [], + "url": "https://ca.wikipedia.org/wiki/Pr%C3%ADncep" + }, + "cswiki": { + "site": "cswiki", + "title": "Princ", + "badges": [], + "url": "https://cs.wikipedia.org/wiki/Princ" + }, + "cywiki": { + "site": "cywiki", + "title": "Tywysog", + "badges": [], + "url": "https://cy.wikipedia.org/wiki/Tywysog" + }, + "dawiki": { + "site": "dawiki", + "title": "Prins", + "badges": [], + "url": "https://da.wikipedia.org/wiki/Prins" + }, + "dewiki": { + "site": "dewiki", + "title": "Prinz", + "badges": [], + "url": "https://de.wikipedia.org/wiki/Prinz" + }, + "dewikiquote": { + "site": "dewikiquote", + "title": "Prinz", + "badges": [], + "url": "https://de.wikiquote.org/wiki/Prinz" + }, + "diqwiki": { + "site": "diqwiki", + "title": "Prens", + "badges": [], + "url": "https://diq.wikipedia.org/wiki/Prens" + }, + "elwiki": { + "site": "elwiki", + "title": "\u03a0\u03c1\u03af\u03b3\u03ba\u03b9\u03c0\u03b1\u03c2", + "badges": [], + "url": "https://el.wikipedia.org/wiki/%CE%A0%CF%81%CE%AF%CE%B3%CE%BA%CE%B9%CF%80%CE%B1%CF%82" + }, + "enwiki": { + "site": "enwiki", + "title": "Prince", + "badges": [], + "url": "https://en.wikipedia.org/wiki/Prince" + }, + "enwikiquote": { + "site": "enwikiquote", + "title": "Prince", + "badges": [], + "url": "https://en.wikiquote.org/wiki/Prince" + }, + "eowiki": { + "site": "eowiki", + "title": "Princo", + "badges": [], + "url": "https://eo.wikipedia.org/wiki/Princo" + }, + "eswiki": { + "site": "eswiki", + "title": "Pr\u00edncipe", + "badges": [], + "url": "https://es.wikipedia.org/wiki/Pr%C3%ADncipe" + }, + "etwiki": { + "site": "etwiki", + "title": "Prints (j\u00e4reltulija)", + "badges": [], + "url": "https://et.wikipedia.org/wiki/Prints_(j%C3%A4reltulija)" + }, + "etwikiquote": { + "site": "etwikiquote", + "title": "Prints", + "badges": [], + "url": "https://et.wikiquote.org/wiki/Prints" + }, + "euwiki": { + "site": "euwiki", + "title": "Printze", + "badges": [], + "url": "https://eu.wikipedia.org/wiki/Printze" + }, + "fawiki": { + "site": "fawiki", + "title": "\u0634\u0627\u0647\u0632\u0627\u062f\u0647", + "badges": [], + "url": "https://fa.wikipedia.org/wiki/%D8%B4%D8%A7%D9%87%D8%B2%D8%A7%D8%AF%D9%87" + }, + "fiwiki": { + "site": "fiwiki", + "title": "Prinssi", + "badges": [], + "url": "https://fi.wikipedia.org/wiki/Prinssi" + }, + "frwiki": { + "site": "frwiki", + "title": "Prince (dignit\u00e9)", + "badges": [], + "url": "https://fr.wikipedia.org/wiki/Prince_(dignit%C3%A9)" + }, + "fywiki": { + "site": "fywiki", + "title": "Prins", + "badges": [], + "url": "https://fy.wikipedia.org/wiki/Prins" + }, + "gawiki": { + "site": "gawiki", + "title": "Prionsa", + "badges": [], + "url": "https://ga.wikipedia.org/wiki/Prionsa" + }, + "glwiki": { + "site": "glwiki", + "title": "Pr\u00edncipe", + "badges": [], + "url": "https://gl.wikipedia.org/wiki/Pr%C3%ADncipe" + }, + "hewiki": { + "site": "hewiki", + "title": "\u05e0\u05e1\u05d9\u05da", + "badges": [], + "url": "https://he.wikipedia.org/wiki/%D7%A0%D7%A1%D7%99%D7%9A" + }, + "hewikiquote": { + "site": "hewikiquote", + "title": "\u05e0\u05e1\u05d9\u05da", + "badges": [], + "url": "https://he.wikiquote.org/wiki/%D7%A0%D7%A1%D7%99%D7%9A" + }, + "hrwiki": { + "site": "hrwiki", + "title": "Princ", + "badges": [], + "url": "https://hr.wikipedia.org/wiki/Princ" + }, + "idwiki": { + "site": "idwiki", + "title": "Pangeran", + "badges": [], + "url": "https://id.wikipedia.org/wiki/Pangeran" + }, + "iswiki": { + "site": "iswiki", + "title": "Prins", + "badges": [], + "url": "https://is.wikipedia.org/wiki/Prins" + }, + "itwiki": { + "site": "itwiki", + "title": "Principe", + "badges": [], + "url": "https://it.wikipedia.org/wiki/Principe" + }, + "itwikiquote": { + "site": "itwikiquote", + "title": "Principe", + "badges": [], + "url": "https://it.wikiquote.org/wiki/Principe" + }, + "jawiki": { + "site": "jawiki", + "title": "\u30d7\u30ea\u30f3\u30b9", + "badges": [], + "url": "https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B9" + }, + "jvwiki": { + "site": "jvwiki", + "title": "Pang\u00e9ran", + "badges": [], + "url": "https://jv.wikipedia.org/wiki/Pang%C3%A9ran" + }, + "kawiki": { + "site": "kawiki", + "title": "\u10e3\u10e4\u10da\u10d8\u10e1\u10ec\u10e3\u10da\u10d8", + "badges": [], + "url": "https://ka.wikipedia.org/wiki/%E1%83%A3%E1%83%A4%E1%83%9A%E1%83%98%E1%83%A1%E1%83%AC%E1%83%A3%E1%83%9A%E1%83%98" + }, + "kowiki": { + "site": "kowiki", + "title": "\ud504\ub9b0\uc2a4", + "badges": [], + "url": "https://ko.wikipedia.org/wiki/%ED%94%84%EB%A6%B0%EC%8A%A4" + }, + "lawiki": { + "site": "lawiki", + "title": "Princeps", + "badges": [], + "url": "https://la.wikipedia.org/wiki/Princeps" + }, + "lawikiquote": { + "site": "lawikiquote", + "title": "Princeps", + "badges": [], + "url": "https://la.wikiquote.org/wiki/Princeps" + }, + "lvwiki": { + "site": "lvwiki", + "title": "Princis", + "badges": [], + "url": "https://lv.wikipedia.org/wiki/Princis" + }, + "mswiki": { + "site": "mswiki", + "title": "Putera", + "badges": [], + "url": "https://ms.wikipedia.org/wiki/Putera" + }, + "newiki": { + "site": "newiki", + "title": "\u0930\u093e\u091c\u0915\u0941\u092e\u093e\u0930", + "badges": [], + "url": "https://ne.wikipedia.org/wiki/%E0%A4%B0%E0%A4%BE%E0%A4%9C%E0%A4%95%E0%A5%81%E0%A4%AE%E0%A4%BE%E0%A4%B0" + }, + "nlwiki": { + "site": "nlwiki", + "title": "Prins", + "badges": [], + "url": "https://nl.wikipedia.org/wiki/Prins" + }, + "nnwiki": { + "site": "nnwiki", + "title": "Prins", + "badges": [], + "url": "https://nn.wikipedia.org/wiki/Prins" + }, + "nowiki": { + "site": "nowiki", + "title": "Prins", + "badges": [], + "url": "https://no.wikipedia.org/wiki/Prins" + }, + "plwiki": { + "site": "plwiki", + "title": "Ksi\u0105\u017c\u0119", + "badges": [], + "url": "https://pl.wikipedia.org/wiki/Ksi%C4%85%C5%BC%C4%99" + }, + "plwikiquote": { + "site": "plwikiquote", + "title": "Ksi\u0105\u017c\u0119", + "badges": [], + "url": "https://pl.wikiquote.org/wiki/Ksi%C4%85%C5%BC%C4%99" + }, + "ptwiki": { + "site": "ptwiki", + "title": "Pr\u00edncipe", + "badges": [], + "url": "https://pt.wikipedia.org/wiki/Pr%C3%ADncipe" + }, + "ptwikiquote": { + "site": "ptwikiquote", + "title": "Pr\u00edncipe", + "badges": [], + "url": "https://pt.wikiquote.org/wiki/Pr%C3%ADncipe" + }, + "rmywiki": { + "site": "rmywiki", + "title": "Rayon", + "badges": [], + "url": "https://rmy.wikipedia.org/wiki/Rayon" + }, + "rowiki": { + "site": "rowiki", + "title": "Prin\u021b", + "badges": [], + "url": "https://ro.wikipedia.org/wiki/Prin%C8%9B" + }, + "ruwiki": { + "site": "ruwiki", + "title": "\u041f\u0440\u0438\u043d\u0446", + "badges": [], + "url": "https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86" + }, + "scnwiki": { + "site": "scnwiki", + "title": "Pr\u00ecncipi", + "badges": [], + "url": "https://scn.wikipedia.org/wiki/Pr%C3%ACncipi" + }, + "scowiki": { + "site": "scowiki", + "title": "Prince", + "badges": [], + "url": "https://sco.wikipedia.org/wiki/Prince" + }, + "shwiki": { + "site": "shwiki", + "title": "Princ", + "badges": [], + "url": "https://sh.wikipedia.org/wiki/Princ" + }, + "simplewiki": { + "site": "simplewiki", + "title": "Prince", + "badges": [], + "url": "https://simple.wikipedia.org/wiki/Prince" + }, + "skwiki": { + "site": "skwiki", + "title": "Princ", + "badges": [], + "url": "https://sk.wikipedia.org/wiki/Princ" + }, + "slwiki": { + "site": "slwiki", + "title": "Princ", + "badges": [], + "url": "https://sl.wikipedia.org/wiki/Princ" + }, + "srwiki": { + "site": "srwiki", + "title": "Princ", + "badges": [], + "url": "https://sr.wikipedia.org/wiki/Princ" + }, + "suwiki": { + "site": "suwiki", + "title": "Pang\u00e9ran", + "badges": [], + "url": "https://su.wikipedia.org/wiki/Pang%C3%A9ran" + }, + "svwiki": { + "site": "svwiki", + "title": "Prins", + "badges": [], + "url": "https://sv.wikipedia.org/wiki/Prins" + }, + "thwiki": { + "site": "thwiki", + "title": "\u0e40\u0e08\u0e49\u0e32", + "badges": [], + "url": "https://th.wikipedia.org/wiki/%E0%B9%80%E0%B8%88%E0%B9%89%E0%B8%B2" + }, + "trwiki": { + "site": "trwiki", + "title": "Prens", + "badges": [], + "url": "https://tr.wikipedia.org/wiki/Prens" + }, + "ukwiki": { + "site": "ukwiki", + "title": "\u041f\u0440\u0438\u043d\u0446", + "badges": [], + "url": "https://uk.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86" + }, + "urwiki": { + "site": "urwiki", + "title": "\u0634\u06c1\u0632\u0627\u062f\u06c1", + "badges": [], + "url": "https://ur.wikipedia.org/wiki/%D8%B4%DB%81%D8%B2%D8%A7%D8%AF%DB%81" + }, + "vecwiki": { + "site": "vecwiki", + "title": "Principe", + "badges": [], + "url": "https://vec.wikipedia.org/wiki/Principe" + }, + "viwiki": { + "site": "viwiki", + "title": "V\u01b0\u01a1ng t\u01b0\u1edbc", + "badges": [], + "url": "https://vi.wikipedia.org/wiki/V%C6%B0%C6%A1ng_t%C6%B0%E1%BB%9Bc" + }, + "wuuwiki": { + "site": "wuuwiki", + "title": "\u738b\u7235", + "badges": [], + "url": "https://wuu.wikipedia.org/wiki/%E7%8E%8B%E7%88%B5" + }, + "zh_min_nanwiki": { + "site": "zh_min_nanwiki", + "title": "Prince", + "badges": [], + "url": "https://zh-min-nan.wikipedia.org/wiki/Prince" + }, + "zh_yuewiki": { + "site": "zh_yuewiki", + "title": "\u89aa\u738b", + "badges": [], + "url": "https://zh-yue.wikipedia.org/wiki/%E8%A6%AA%E7%8E%8B" + }, + "zhwiki": { + "site": "zhwiki", + "title": "\u738b\u7235", + "badges": [], + "url": "https://zh.wikipedia.org/wiki/%E7%8E%8B%E7%88%B5" } } } } - ) + } + ) - const wikidata = await Wikidata.LoadWikidataEntryAsync("2747456") - }], - ["Extract key from a lexeme", () => { - Utils.injectJsonDownloadForTests( - "https://www.wikidata.org/wiki/Special:EntityData/L614072.json", - { - "entities": { - "L614072": { - "pageid": 104085278, - "ns": 146, - "title": "Lexeme:L614072", - "lastrevid": 1509989280, - "modified": "2021-10-09T18:43:52Z", - "type": "lexeme", - "id": "L614072", - "lemmas": {"nl": {"language": "nl", "value": "Groen"}}, - "lexicalCategory": "Q34698", - "language": "Q7411", - "claims": {}, - "forms": [], - "senses": [{ - "id": "L614072-S1", - "glosses": {"nl": {"language": "nl", "value": "Nieuw"}}, - "claims": {} - }, { - "id": "L614072-S2", - "glosses": {"nl": {"language": "nl", "value": "Jong"}}, - "claims": {} - }, { - "id": "L614072-S3", - "glosses": {"nl": {"language": "nl", "value": "Pril"}}, - "claims": {} - }] - } + const wikidata = await Wikidata.LoadWikidataEntryAsync("2747456") + }], + ["Extract key from a lexeme", () => { + Utils.injectJsonDownloadForTests( + "https://www.wikidata.org/wiki/Special:EntityData/L614072.json", + { + "entities": { + "L614072": { + "pageid": 104085278, + "ns": 146, + "title": "Lexeme:L614072", + "lastrevid": 1509989280, + "modified": "2021-10-09T18:43:52Z", + "type": "lexeme", + "id": "L614072", + "lemmas": {"nl": {"language": "nl", "value": "Groen"}}, + "lexicalCategory": "Q34698", + "language": "Q7411", + "claims": {}, + "forms": [], + "senses": [{ + "id": "L614072-S1", + "glosses": {"nl": {"language": "nl", "value": "Nieuw"}}, + "claims": {} + }, { + "id": "L614072-S2", + "glosses": {"nl": {"language": "nl", "value": "Jong"}}, + "claims": {} + }, { + "id": "L614072-S3", + "glosses": {"nl": {"language": "nl", "value": "Pril"}}, + "claims": {} + }] } } - ) + } + ) - const key = Wikidata.ExtractKey("https://www.wikidata.org/wiki/Lexeme:L614072") - T.equals("L614072", key) + const key = Wikidata.ExtractKey("https://www.wikidata.org/wiki/Lexeme:L614072") + T.equals("L614072", key) - }], - ["Download a lexeme", async () => { + }], + ["Download a lexeme", async () => { - const response = await Wikidata.LoadWikidataEntryAsync("https://www.wikidata.org/wiki/Lexeme:L614072") - T.isTrue(response !== undefined, "Response is undefined") + const response = await Wikidata.LoadWikidataEntryAsync("https://www.wikidata.org/wiki/Lexeme:L614072") + T.isTrue(response !== undefined, "Response is undefined") - }] + }] - ]); + ]); } } \ No newline at end of file