Merge branch 'master' into weblate-mapcomplete-core
|
@ -9,16 +9,14 @@
|
|||
"VARIANT": "14"
|
||||
}
|
||||
},
|
||||
|
||||
// Set *default* container specific settings.json values on container create.
|
||||
"settings": {},
|
||||
|
||||
// Add the IDs of extensions you want installed when the container is created.
|
||||
"extensions": [],
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [1234],
|
||||
|
||||
"forwardPorts": [
|
||||
1234
|
||||
],
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
//"postCreateCommand": "npm run init",
|
||||
|
||||
|
|
9
.github/pull_request_template.md
vendored
|
@ -1,9 +1,8 @@
|
|||
|
||||
Opening a pull request on MapComplete
|
||||
=====================================
|
||||
|
||||
Hey! Thanks for opening a pull request on Mapcomplete! This probably means you want to add a new theme - if so, please follow the checklist below.
|
||||
If this pull request is for some other issue, please ignore the template.
|
||||
Hey! Thanks for opening a pull request on Mapcomplete! This probably means you want to add a new theme - if so, please
|
||||
follow the checklist below. If this pull request is for some other issue, please ignore the template.
|
||||
|
||||
Adding your new theme
|
||||
---------------------
|
||||
|
@ -14,4 +13,6 @@ To making merging smooth, please make sure that each of the following conditions
|
|||
|
||||
- [ ] The codebase is GPL-licensed. By opening a pull request, the new theme will be GPL too
|
||||
- [ ] All images are included in the pull request and no images are loaded from an external service (e.g. Wikipedia)
|
||||
- [ ] The [guidelines on how to make your own theme](https://github.com/pietervdvn/MapComplete/blob/master/Docs/Making_Your_Own_Theme.md) are read and followed
|
||||
- [ ]
|
||||
The [guidelines on how to make your own theme](https://github.com/pietervdvn/MapComplete/blob/master/Docs/Making_Your_Own_Theme.md)
|
||||
are read and followed
|
5
.github/workflows/pull_request_check.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
name: Pull request check
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, edited, synchronize, ready_for_review, review_requested]
|
||||
types: [ opened, edited, synchronize, ready_for_review, review_requested ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
@ -24,6 +24,9 @@ jobs:
|
|||
- name: create stub themes
|
||||
run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
|
||||
|
||||
- name: generate assets
|
||||
run: npm run generate:images
|
||||
|
||||
- name: generate translations
|
||||
run: npm run generate:translations
|
||||
|
||||
|
|
|
@ -9,13 +9,11 @@ export default class AllKnownLayers {
|
|||
public static sharedLayers: Map<string, LayerConfig> = AllKnownLayers.getSharedLayers();
|
||||
public static sharedLayersJson: Map<string, any> = AllKnownLayers.getSharedLayersJson();
|
||||
|
||||
public static sharedUnits: any[] = []
|
||||
|
||||
private static getSharedLayers(): Map<string, LayerConfig> {
|
||||
const sharedLayers = new Map<string, LayerConfig>();
|
||||
for (const layer of known_layers.layers) {
|
||||
try {
|
||||
const parsed = new LayerConfig(layer, AllKnownLayers.sharedUnits, "shared_layers")
|
||||
const parsed = new LayerConfig(layer, "shared_layers")
|
||||
sharedLayers.set(layer.id, parsed);
|
||||
sharedLayers[layer.id] = parsed;
|
||||
} catch (e) {
|
||||
|
@ -35,7 +33,7 @@ export default class AllKnownLayers {
|
|||
continue;
|
||||
}
|
||||
try {
|
||||
const parsed = new LayerConfig(layer, AllKnownLayers.sharedUnits, "shared_layer_in_theme")
|
||||
const parsed = new LayerConfig(layer, "shared_layer_in_theme")
|
||||
sharedLayers.set(layer.id, parsed);
|
||||
sharedLayers[layer.id] = parsed;
|
||||
} catch (e) {
|
||||
|
|
|
@ -2,33 +2,40 @@ import * as questions from "../assets/tagRenderings/questions.json";
|
|||
import * as icons from "../assets/tagRenderings/icons.json";
|
||||
import {Utils} from "../Utils";
|
||||
import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig";
|
||||
import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson";
|
||||
|
||||
export default class SharedTagRenderings {
|
||||
|
||||
public static SharedTagRendering : Map<string, TagRenderingConfig> = SharedTagRenderings.generatedSharedFields();
|
||||
public static SharedIcons : Map<string, TagRenderingConfig> = SharedTagRenderings.generatedSharedFields(true);
|
||||
public static SharedTagRendering: Map<string, TagRenderingConfig> = SharedTagRenderings.generatedSharedFields();
|
||||
public static SharedTagRenderingJson: Map<string, TagRenderingConfigJson> = SharedTagRenderings.generatedSharedFieldsJsons();
|
||||
public static SharedIcons: Map<string, TagRenderingConfig> = SharedTagRenderings.generatedSharedFields(true);
|
||||
|
||||
private static generatedSharedFields(iconsOnly = false) : Map<string, TagRenderingConfig>{
|
||||
const dict = new Map<string, TagRenderingConfig>();
|
||||
|
||||
function add(key, store) {
|
||||
private static generatedSharedFields(iconsOnly = false): Map<string, TagRenderingConfig> {
|
||||
const configJsons = SharedTagRenderings.generatedSharedFieldsJsons(iconsOnly)
|
||||
const d = new Map<string, TagRenderingConfig>()
|
||||
for (const key of Array.from(configJsons.keys())) {
|
||||
try {
|
||||
dict.set(key, new TagRenderingConfig(store[key], undefined, `SharedTagRenderings.${key}`))
|
||||
d.set(key, new TagRenderingConfig(configJsons.get(key), undefined, `SharedTagRenderings.${key}`))
|
||||
} catch (e) {
|
||||
if(!Utils.runningFromConsole){
|
||||
if (!Utils.runningFromConsole) {
|
||||
console.error("BUG: could not parse", key, " from questions.json or icons.json - this error happened during the build step of the SharedTagRenderings", e)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return d
|
||||
}
|
||||
|
||||
private static generatedSharedFieldsJsons(iconsOnly = false): Map<string, TagRenderingConfigJson> {
|
||||
const dict = new Map<string, TagRenderingConfigJson>();
|
||||
|
||||
if (!iconsOnly) {
|
||||
for (const key in questions) {
|
||||
add(key, questions);
|
||||
dict.set(key, <TagRenderingConfigJson>questions[key])
|
||||
}
|
||||
}
|
||||
for (const key in icons) {
|
||||
add(key, icons);
|
||||
dict.set(key, <TagRenderingConfigJson>icons[key])
|
||||
}
|
||||
|
||||
return dict;
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
Architecture
|
||||
============
|
||||
|
||||
This document aims to give an architectural overview of how MapCompelte is built. It should give some feeling on how everything fits together.
|
||||
This document aims to give an architectural overview of how MapCompelte is built. It should give some feeling on how
|
||||
everything fits together.
|
||||
|
||||
Servers?
|
||||
--------
|
||||
|
@ -11,24 +12,30 @@ There are no servers for MapComplete, all services are configured by third parti
|
|||
Minimal HTML - Minimal CSS
|
||||
--------------------------
|
||||
|
||||
There is quasi no HTML. Most of the components are generated by TypeScript and attached dynamically. The html is a barebones skeleton which serves every theme.
|
||||
There is quasi no HTML. Most of the components are generated by TypeScript and attached dynamically. The html is a
|
||||
barebones skeleton which serves every theme.
|
||||
|
||||
|
||||
The UIEventSource
|
||||
-----------------
|
||||
|
||||
Most (but not all) objects in MapComplete get all the state they need as a parameter in the constructor. However, as is the case with most graphical applications, there are quite some dynamical values.
|
||||
Most (but not all) objects in MapComplete get all the state they need as a parameter in the constructor. However, as is
|
||||
the case with most graphical applications, there are quite some dynamical values.
|
||||
|
||||
All values which change regularly are wrapped into a [UIEventSource](https://github.com/pietervdvn/MapComplete/blob/master/Logic/UIEventSource.ts).
|
||||
An UiEventSource is a wrapper containing a value and offers the possibility to add a callback function which is called every time the value is changed (with setData)
|
||||
All values which change regularly are wrapped into
|
||||
a [UIEventSource](https://github.com/pietervdvn/MapComplete/blob/master/Logic/UIEventSource.ts). An UiEventSource is a
|
||||
wrapper containing a value and offers the possibility to add a callback function which is called every time the value is
|
||||
changed (with setData)
|
||||
|
||||
Furthermore, there are various helper functions, the most widely used one being `map` - generating a new event source with the new value applied.
|
||||
Note that 'map' will also absorb some changes, e.g. `const someEventSource : UIEventSource<string[]> = ... ; someEventSource.map(list = list.length)` will only trigger when the length of the list has changed.
|
||||
Furthermore, there are various helper functions, the most widely used one being `map` - generating a new event source
|
||||
with the new value applied. Note that 'map' will also absorb some changes,
|
||||
e.g. `const someEventSource : UIEventSource<string[]> = ... ; someEventSource.map(list = list.length)` will only trigger
|
||||
when the length of the list has changed.
|
||||
|
||||
An object which receives an UIEventSource is responsible of responding onto changes of this object. This is especially true for UI-components
|
||||
An object which receives an UIEventSource is responsible of responding onto changes of this object. This is especially
|
||||
true for UI-components
|
||||
|
||||
UI
|
||||
--```
|
||||
UI --```
|
||||
|
||||
export default class MyComponent {
|
||||
|
||||
|
@ -37,6 +44,7 @@ export default class MyComponent {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
The Graphical User Interface is composed of various UI-elements. For every UI-element, there is a BaseUIElement which creates the actual HTMLElement when needed.
|
||||
|
@ -55,9 +63,9 @@ For example:
|
|||
|
||||
```
|
||||
|
||||
const src : UIEventSource<string> = ... // E.g. user input, data that will be updated...
|
||||
new VariableUIElement(src)
|
||||
.AttachTo('some-id') // attach it to the html
|
||||
const src : UIEventSource<string> = ... // E.g. user input, data that will be updated... new VariableUIElement(src)
|
||||
.AttachTo('some-id') // attach it to the html
|
||||
|
||||
```
|
||||
|
||||
Note that every component offers support for `onClick( someCallBack)`
|
||||
|
@ -109,6 +117,7 @@ This can be constructed as following:
|
|||
|
||||
|
||||
```
|
||||
|
||||
// We construct the dropdown element with values and labelshttps://tailwindcss.com/
|
||||
const isOpened = new Dropdown<string>(Translations.t.is_this_shop_opened_during_holidays,
|
||||
[
|
||||
|
@ -127,6 +136,7 @@ This can be constructed as following:
|
|||
)
|
||||
|
||||
return new Combine([isOpened, extraQuestion])
|
||||
|
||||
```
|
||||
|
||||
### Constructing a special class
|
||||
|
@ -144,6 +154,7 @@ export default class MyComponent {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
2. Construct the needed UI in the constructor
|
||||
|
@ -166,6 +177,7 @@ export default class MyComponent {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
3. You'll notice that you'll end up with one certain component (in this example the combine) to wrap it all together. Change the class to extend this type of component and use super to wrap it all up:
|
||||
|
|
|
@ -1,113 +1,89 @@
|
|||
|
||||
Metatags
|
||||
Metatags
|
||||
==========
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
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)
|
||||
|
||||
|
||||
### _surface, _surface:ha
|
||||
|
||||
|
||||
|
||||
The surface area of the feature, in square meters and in hectare. Not set on points and ways
|
||||
|
||||
|
||||
### _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
|
||||
|
||||
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`)
|
||||
|
||||
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:description
|
||||
|
||||
|
||||
|
||||
If 'opening_hours' is present, it will add the current state of the feature (being 'yes' or 'no')
|
||||
|
||||
|
||||
### _width:needed, _width:needed:no_pedestrians, _width:difference
|
||||
|
||||
|
||||
|
||||
Legacy for a specific project calculating the needed width for safe traffic on a road. Only activated if 'width:carriageway' is present
|
||||
|
||||
Legacy for a specific project calculating the needed width for safe traffic on a road. Only activated if 'width:
|
||||
carriageway' is present
|
||||
|
||||
### _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 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
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
Information about the last edit of this object.
|
||||
|
||||
|
||||
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.:
|
||||
|
||||
|
@ -125,56 +101,56 @@ 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:
|
||||
|
||||
|
||||
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
|
||||
|
||||
- `area` contains the surface area (in square meters) of the object
|
||||
- `lat` and `lon` contain the latitude and longitude
|
||||
|
||||
Some advanced functions are available on **feat** as well:
|
||||
|
||||
- distanceTo
|
||||
- overlapWith
|
||||
- closest
|
||||
- memberships
|
||||
- score
|
||||
- distanceTo
|
||||
- overlapWith
|
||||
- closest
|
||||
- memberships
|
||||
- score
|
||||
|
||||
### distanceTo
|
||||
|
||||
Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of coordinates, a geojson feature or the ID of an object
|
||||
Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of
|
||||
coordinates, a geojson feature or the ID of an object
|
||||
|
||||
0. longitude
|
||||
1. latitude
|
||||
0. longitude
|
||||
1. latitude
|
||||
|
||||
### overlapWith
|
||||
|
||||
Gives a list of features from the specified layer which this feature (partly) overlaps with. If the current feature is a point, all features that embed the point are given. 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
|
||||
Gives a list of features from the specified layer which this feature (partly) overlaps with. If the current feature is a
|
||||
point, all features that embed the point are given. 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
|
||||
|
||||
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 overlap)
|
||||
|
||||
### closest
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
0. list of features
|
||||
0. list of features
|
||||
|
||||
### memberships
|
||||
|
||||
Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of.
|
||||
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(';')`
|
||||
|
||||
|
||||
|
||||
### score
|
||||
|
||||
Given the path of an aspected routing json file, will calculate the score. This score is wrapped in a UIEventSource, so for further calculations, use `.map(score => ...)`
|
||||
Given the path of an aspected routing json file, will calculate the score. This score is wrapped in a UIEventSource, so
|
||||
for further calculations, use `.map(score => ...)`
|
||||
|
||||
For example: `_comfort_score=feat.score('https://raw.githubusercontent.com/pietervdvn/AspectedRouting/master/Examples/bicycle/aspects/bicycle.comfort.json')`
|
||||
For
|
||||
example: `_comfort_score=feat.score('https://raw.githubusercontent.com/pietervdvn/AspectedRouting/master/Examples/bicycle/aspects/bicycle.comfort.json')`
|
||||
|
||||
0. path
|
||||
Generated from SimpleMetaTagger, ExtraFunction
|
||||
0. path Generated from SimpleMetaTagger, ExtraFunction
|
|
@ -1,113 +1,128 @@
|
|||
Development and deployment
|
||||
==========================
|
||||
|
||||
Development and deployment
|
||||
==========================
|
||||
There are various scripts to help setup MapComplete for deployment and develop-deployment.
|
||||
|
||||
There are various scripts to help setup MapComplete for deployment and develop-deployment.
|
||||
This documents attempts to shed some light on these scripts.
|
||||
|
||||
This documents attempts to shed some light on these scripts.
|
||||
Note: these scripts change every now and then - if the documentation here is incorrect or you run into troubles, do
|
||||
leave a message in [the issue tracker](https://github.com/pietervdvn/MapComplete/issues)
|
||||
|
||||
Note: these scripts change every now and then - if the documentation here is incorrect or you run into troubles, do leave a message in [the issue tracker](https://github.com/pietervdvn/MapComplete/issues)
|
||||
Architecture overview
|
||||
---------------------
|
||||
|
||||
Architecture overview
|
||||
---------------------
|
||||
At its core, MapComplete is a static (!) website. There are no servers to host.
|
||||
|
||||
At its core, MapComplete is a static (!) website. There are no servers to host.
|
||||
The data is fetched from Overpass/OSM/Wikidata/Wikipedia/Mapillary/... and written there directly. This means that any
|
||||
static file server will do to create a self-hosted version of MapComplete.
|
||||
|
||||
The data is fetched from Overpass/OSM/Wikidata/Wikipedia/Mapillary/... and written there directly. This means that any static file server will do to create a self-hosted version of MapComplete.
|
||||
Development
|
||||
-----------
|
||||
|
||||
Development
|
||||
-----------
|
||||
**Windows users**: All scripts are made for linux devices. Use the Ubuntu terminal for Windows (or even better - make
|
||||
the switch ;) ). If you are using Visual Studio Code you can use
|
||||
a [WSL Remote](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) window, or use the
|
||||
Devcontainer (see more details later).
|
||||
|
||||
**Windows users**: All scripts are made for linux devices. Use the Ubuntu terminal for Windows (or even better - make the switch ;) ). If you are using Visual Studio Code you can use a [WSL Remote](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) window, or use the Devcontainer (see more details later).
|
||||
|
||||
To develop and build MapComplete, you
|
||||
To develop and build MapComplete, you
|
||||
|
||||
0. Make sure you have a recent version of nodejs - at least 12.0, preferably 15
|
||||
0. Make a fork and clone the repository.
|
||||
1. Install `npm`. Linux: `sudo apt install npm` (or your favourite package manager), Windows: install nodeJS: https://nodejs.org/en/download/
|
||||
3. Run `npm run init` and generate some additional dependencies and generated files. Note that it'll install the dependencies too
|
||||
1. Install `npm`. Linux: `sudo apt install npm` (or your favourite package manager), Windows: install
|
||||
nodeJS: https://nodejs.org/en/download/
|
||||
3. Run `npm run init` and generate some additional dependencies and generated files. Note that it'll install the
|
||||
dependencies too
|
||||
4. Run `npm run start` to host a local testversion at http://localhost:1234/index.html
|
||||
5. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename` or `userlayout=true#<layout configuration>` as [Query parameter](URL_Parameters.md). Note that the shorter URLs (e.g. `bookcases.html`, `aed.html`, ...) _don't_ exist on the development version.
|
||||
5. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename`
|
||||
or `userlayout=true#<layout configuration>` as [Query parameter](URL_Parameters.md). Note that the shorter URLs (
|
||||
e.g. `bookcases.html`, `aed.html`, ...) _don't_ exist on the development version.
|
||||
|
||||
Development using Windows
|
||||
------------------------
|
||||
Development using Windows
|
||||
------------------------
|
||||
|
||||
For Windows you can use the devcontainer, or the WSL subsystem.
|
||||
For Windows you can use the devcontainer, or the WSL subsystem.
|
||||
|
||||
To use the devcontainer in Visual Studio Code:
|
||||
To use the devcontainer in Visual Studio Code:
|
||||
|
||||
0. Make sure you have installed the [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension and it's dependencies.
|
||||
0. Make sure you have installed
|
||||
the [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
|
||||
extension and it's dependencies.
|
||||
1. Make a fork and clone the repository.
|
||||
2. After cloning, Visual Studio Code will ask you if you want to use the devcontainer.
|
||||
3. Then you can either clone it again in a volume (for better performance), or open the current folder in a container.
|
||||
4. By now, you should be able to run `npm run start` to host a local testversion at http://localhost:1234/index.html
|
||||
5. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename` or `userlayout=true#<layout configuration>` as [Query parameter](URL_Parameters.md). Note that the shorter URLs (e.g. `bookcases.html`, `aed.html`, ...) _don't_ exist on the development version.
|
||||
5. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename`
|
||||
or `userlayout=true#<layout configuration>` as [Query parameter](URL_Parameters.md). Note that the shorter URLs (
|
||||
e.g. `bookcases.html`, `aed.html`, ...) _don't_ exist on the development version.
|
||||
|
||||
To use the WSL in Visual Studio Code:
|
||||
To use the WSL in Visual Studio Code:
|
||||
|
||||
0. Make sure you have installed the [Remote - WSL]() extension and it's dependencies.
|
||||
1. Open a remote WSL window using the button in the bottom left.
|
||||
2. Make a fork and clone the repository.
|
||||
3. Install `npm` using `sudo apt install npm`.
|
||||
4. Run `npm run init` and generate some additional dependencies and generated files. Note that it'll install the dependencies too
|
||||
4. Run `npm run init` and generate some additional dependencies and generated files. Note that it'll install the
|
||||
dependencies too
|
||||
5. Run `npm run start` to host a local testversion at http://localhost:1234/index.html
|
||||
6. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename` or `userlayout=true#<layout configuration>` as [Query parameter](URL_Parameters.md). Note that the shorter URLs (e.g. `bookcases.html`, `aed.html`, ...) _don't_ exist on the development version.
|
||||
6. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename`
|
||||
or `userlayout=true#<layout configuration>` as [Query parameter](URL_Parameters.md). Note that the shorter URLs (
|
||||
e.g. `bookcases.html`, `aed.html`, ...) _don't_ exist on the development version.
|
||||
|
||||
Automatic deployment
|
||||
--------------------
|
||||
|
||||
Currently, the master branch is automatically deployed to 'mapcomplete.osm.be' by a github action.
|
||||
|
||||
Every branch is automatically built (upon push) to 'pietervdvn.github.io/mc/<branchname>' by a github action.
|
||||
|
||||
|
||||
Automatic deployment
|
||||
--------------------
|
||||
Deploying a fork
|
||||
----------------
|
||||
|
||||
Currently, the master branch is automatically deployed to 'mapcomplete.osm.be' by a github action.
|
||||
A script creates a webpage for every theme automatically, with some customizations in order to:
|
||||
|
||||
Every branch is automatically built (upon push) to 'pietervdvn.github.io/mc/<branchname>' by a github action.
|
||||
- to have shorter urls
|
||||
- have individual social images
|
||||
- have individual web manifests
|
||||
|
||||
|
||||
Deploying a fork
|
||||
----------------
|
||||
|
||||
A script creates a webpage for every theme automatically, with some customizations in order to:
|
||||
|
||||
- to have shorter urls
|
||||
- have individual social images
|
||||
- have individual web manifests
|
||||
|
||||
|
||||
This script can be invoked with `npm run prepare-deploy`
|
||||
This script can be invoked with `npm run prepare-deploy`
|
||||
|
||||
If you want to deploy your fork:
|
||||
|
||||
0. `npm run prepare-deploy`
|
||||
1. `npm run build`
|
||||
2. Copy the entire `dist` folder to where you host your website. Visiting `index.html` gives you the landing page, visiting `yourwebsite/<theme>` should bring you to the appropriate theme.
|
||||
|
||||
2. Copy the entire `dist` folder to where you host your website. Visiting `index.html` gives you the landing page,
|
||||
visiting `yourwebsite/<theme>` should bring you to the appropriate theme.
|
||||
|
||||
Weird errors
|
||||
------------
|
||||
|
||||
Try removing `node_modules`, `package-lock.json` and `.cache`
|
||||
|
||||
Overview of package.json-scripts
|
||||
--------------------------------
|
||||
Overview of package.json-scripts
|
||||
--------------------------------
|
||||
|
||||
- `increase-memory`: this is a big (and memory-intensive) project to build and run, so we give nodejs some more RAM.
|
||||
- `start`: start a development server.
|
||||
- `test`: run the unit tests
|
||||
- `init`: Generates and downloads various assets which are needed to compile
|
||||
- `generate:editor-layer-index`: downloads the editor-layer-index-json from osmlab.github.io
|
||||
- `generate:images`: compiles the SVG's into an asset
|
||||
- `generate:translations`: compiles the translation file into a javascript file
|
||||
- `generate:layouts`: uses `index.html` as template to create all the theme index pages. You'll want to run `clean` when done
|
||||
- `generate:docs`: generates various documents, such as information about available metatags, information to put on the [OSM-wiki](https://wiki.openstreetmap.org/wiki/MapComplete),...
|
||||
- `generate:report`: downloads statistics from OsmCha, compiles neat graphs
|
||||
- `generate:cache:speelplekken`: creates an offline copy of all the data required for one specific (paid for) theme
|
||||
- `generate:layeroverview`: reads all the theme- and layerconfigurations, compiles them into a single JSON.
|
||||
- `reset:layeroverview`: if something is wrong with the layeroverview, creates an empty one
|
||||
- `generate:licenses`: compiles all the license info of images into a single json
|
||||
- `optimize:images`: attempts to make smaller pngs - optional to run before a deployment
|
||||
- `generate`: run all the necesary generate-scripts
|
||||
- `build`: actually bundle all the files into a single `dist/`-folder
|
||||
- `prepare-deploy`: create the layouts
|
||||
- `deploy:staging`,`deploy:pietervdvn`, `deploy:production`: deploy the latest code on various locations
|
||||
- `lint`: get depressed by the amount of warnings
|
||||
- `clean`: remove some generated files which are annoying in the repo
|
||||
- `increase-memory`: this is a big (and memory-intensive) project to build and run, so we give nodejs some more RAM.
|
||||
- `start`: start a development server.
|
||||
- `test`: run the unit tests
|
||||
- `init`: Generates and downloads various assets which are needed to compile
|
||||
- `generate:editor-layer-index`: downloads the editor-layer-index-json from osmlab.github.io
|
||||
- `generate:images`: compiles the SVG's into an asset
|
||||
- `generate:translations`: compiles the translation file into a javascript file
|
||||
- `generate:layouts`: uses `index.html` as template to create all the theme index pages. You'll want to run `clean` when
|
||||
done
|
||||
- `generate:docs`: generates various documents, such as information about available metatags, information to put on
|
||||
the [OSM-wiki](https://wiki.openstreetmap.org/wiki/MapComplete),...
|
||||
- `generate:report`: downloads statistics from OsmCha, compiles neat graphs
|
||||
- `generate:cache:speelplekken`: creates an offline copy of all the data required for one specific (paid for) theme
|
||||
- `generate:layeroverview`: reads all the theme- and layerconfigurations, compiles them into a single JSON.
|
||||
- `reset:layeroverview`: if something is wrong with the layeroverview, creates an empty one
|
||||
- `generate:licenses`: compiles all the license info of images into a single json
|
||||
- `optimize:images`: attempts to make smaller pngs - optional to run before a deployment
|
||||
- `generate`: run all the necesary generate-scripts
|
||||
- `build`: actually bundle all the files into a single `dist/`-folder
|
||||
- `prepare-deploy`: create the layouts
|
||||
- `deploy:staging`,`deploy:pietervdvn`, `deploy:production`: deploy the latest code on various locations
|
||||
- `lint`: get depressed by the amount of warnings
|
||||
- `clean`: remove some generated files which are annoying in the repo
|
||||
|
||||
|
|
|
@ -1,28 +1,45 @@
|
|||
Gebruikersgids MapComplete
|
||||
==========================
|
||||
|
||||
MapComplete is een website waar geodata op basis van [OpenStreetMap](https://osm.org), [Wikidata](https://wikidata.org) en andere open bronnen wordt gevisualiseerd en aangevuld.
|
||||
MapComplete is een website waar geodata op basis van [OpenStreetMap](https://osm.org), [Wikidata](https://wikidata.org)
|
||||
en andere open bronnen wordt gevisualiseerd en aangevuld.
|
||||
|
||||
De getoonde geodata is afhankelijk van het thema - zo is er bijvoorbeeld het thema voor [boekenruilkasten](https://mapcomplete.osm.be/bookcases) [cyclofix](http://mapcomplete.osm.be/cyclofix) die focust op fietspompen, fietswinkels, ...
|
||||
De getoonde geodata is afhankelijk van het thema - zo is er bijvoorbeeld het thema
|
||||
voor [boekenruilkasten](https://mapcomplete.osm.be/bookcases) [cyclofix](http://mapcomplete.osm.be/cyclofix) die focust
|
||||
op fietspompen, fietswinkels, ...
|
||||
|
||||
MapComplete mag gratis gebruikt worden. Om de data te raadplegen heb je geen account nodig - de webpagina bezoeken is voldoende.
|
||||
MapComplete mag gratis gebruikt worden. Om de data te raadplegen heb je geen account nodig - de webpagina bezoeken is
|
||||
voldoende.
|
||||
|
||||
### Data toevoegen
|
||||
|
||||
OpenStreetMap is een gedeelde databank van geodata. Om die correct en up to date te houden, voegen we _enkel_ gegevens toe waarvan we zeker weten dat die op dit moment ook zo zijn in de echte wereld. Twijfel je dus over een vraag? Sla de vraag dan over en ga opnieuw ter plaatse kijken. **Beter geen informatie dan foute informatie**.
|
||||
OpenStreetMap is een gedeelde databank van geodata. Om die correct en up to date te houden, voegen we _enkel_ gegevens
|
||||
toe waarvan we zeker weten dat die op dit moment ook zo zijn in de echte wereld. Twijfel je dus over een vraag? Sla de
|
||||
vraag dan over en ga opnieuw ter plaatse kijken. **Beter geen informatie dan foute informatie**.
|
||||
|
||||
Daarnaast verwachten we ook dat je op een vriendelijke en correcte manier omgaat met andere leden van de community. Je kan feedback of vragen krijgen over je aanpassingen - bijvoorbeeld wanneer andere bijdragers denken dat er een vergissing is gebeurd. Meestal is de vergissing met een paar heen- en weerberichtjes uitgeklaard. Vergissen is menselijk.
|
||||
Daarnaast verwachten we ook dat je op een vriendelijke en correcte manier omgaat met andere leden van de community. Je
|
||||
kan feedback of vragen krijgen over je aanpassingen - bijvoorbeeld wanneer andere bijdragers denken dat er een
|
||||
vergissing is gebeurd. Meestal is de vergissing met een paar heen- en weerberichtjes uitgeklaard. Vergissen is
|
||||
menselijk.
|
||||
|
||||
Als je bijdragen grote fouten bevatten, kunnen je wijzigingen ongedaan gemaakt worden door andere leden van OpenStreetMap. Dit is echter erg uitzonderlijk. Bij herhaaldelijke grote fouten, (vermoeden van) kwaad opzet of vandalisme kan je account geblokkeerd worden. Merk op dat MapComplete is opgezet om (grote) vergissingen te vermijden, dus dit is bijna onmogelijk.
|
||||
Als je bijdragen grote fouten bevatten, kunnen je wijzigingen ongedaan gemaakt worden door andere leden van
|
||||
OpenStreetMap. Dit is echter erg uitzonderlijk. Bij herhaaldelijke grote fouten, (vermoeden van) kwaad opzet of
|
||||
vandalisme kan je account geblokkeerd worden. Merk op dat MapComplete is opgezet om (grote) vergissingen te vermijden,
|
||||
dus dit is bijna onmogelijk.
|
||||
|
||||
Data hergebruiken
|
||||
-----------------
|
||||
|
||||
De getoonde data (locaties van POI, ...) mogen vrij en gratis hergebruikt worden voor alle doeleinden (ook commercieel), mits de vermelding `Data van OpenStreetMap, vrij beschikbaar onder ODBL` of een gelijkaardige zin. Hiervoor hoef je geen toestemming te vragen.
|
||||
De getoonde data (locaties van POI, ...) mogen vrij en gratis hergebruikt worden voor alle doeleinden (ook commercieel),
|
||||
mits de vermelding `Data van OpenStreetMap, vrij beschikbaar onder ODBL` of een gelijkaardige zin. Hiervoor hoef je geen
|
||||
toestemming te vragen.
|
||||
|
||||
Let op: aanpassingen aan de data worden ook als open data beschouwd. Let ook op wanneer je OpenStreetMap-data gaat mengen uit andere databronnen waar copyright op rust; vaak mag dit niet. Voor meer informatie, zie de [volledige copyrightnotice](https://osm.org/copyright).
|
||||
Let op: aanpassingen aan de data worden ook als open data beschouwd. Let ook op wanneer je OpenStreetMap-data gaat
|
||||
mengen uit andere databronnen waar copyright op rust; vaak mag dit niet. Voor meer informatie, zie
|
||||
de [volledige copyrightnotice](https://osm.org/copyright).
|
||||
|
||||
Om de data als computerbestand op te vragen, bestaan er [verschillende opties](https://learnosm.org/en/osm-data/getting-data/).
|
||||
Om de data als computerbestand op te vragen, bestaan
|
||||
er [verschillende opties](https://learnosm.org/en/osm-data/getting-data/).
|
||||
|
||||
Privacy
|
||||
-------
|
||||
|
@ -31,17 +48,24 @@ Privacy
|
|||
|
||||
Zolang je je niet aanmeldt, worden er geen persoonsgegevens opgeslaan.
|
||||
|
||||
Je computer stuurt echter wel een klein berichtje naar [pietervdvn.goatcounter.com](pietervdvn.goatcounter.com), waar statistieken over de bezoekersaantallen worden bijgehouden. Dit omvat een minimum aan technische gegevens en kan niet gelinkt worden aan een OSM-gebruikersaccount of persoon door de makers van MapComplete.
|
||||
Je computer stuurt echter wel een klein berichtje naar [pietervdvn.goatcounter.com](pietervdvn.goatcounter.com), waar
|
||||
statistieken over de bezoekersaantallen worden bijgehouden. Dit omvat een minimum aan technische gegevens en kan niet
|
||||
gelinkt worden aan een OSM-gebruikersaccount of persoon door de makers van MapComplete.
|
||||
|
||||
### Met account
|
||||
|
||||
Wanneer je een account maakt, is dit een account op OpenStreetMap. Voor je een account maakt, gelieve hun [privacy statement](https://wiki.osmfoundation.org/wiki/Privacy_Policy) te lezen.
|
||||
Wanneer je een account maakt, is dit een account op OpenStreetMap. Voor je een account maakt, gelieve
|
||||
hun [privacy statement](https://wiki.osmfoundation.org/wiki/Privacy_Policy) te lezen.
|
||||
|
||||
Een account maken is gratis, je moet enkel een email-adres en gebruikersnaam opgeven. Je email-adres is niet publiek zichtbaar, je gebruikersnaam wel.
|
||||
Een account maken is gratis, je moet enkel een email-adres en gebruikersnaam opgeven. Je email-adres is niet publiek
|
||||
zichtbaar, je gebruikersnaam wel.
|
||||
|
||||
Je kan opteren om een _pseudoniem_ te gebruiken - je gebruikersnaam hoeft niet je echte naam te zijn. Ook de naam van je huisdier of iets zelfbedacht mag gerust.
|
||||
Je kan opteren om een _pseudoniem_ te gebruiken - je gebruikersnaam hoeft niet je echte naam te zijn. Ook de naam van je
|
||||
huisdier of iets zelfbedacht mag gerust.
|
||||
|
||||
Wanneer je gegevens aanvult via MapComplete, zal je wijziging **publiek zichtbaar** zijn voor iedereen ter wereld. Dit betekent dus dat iedereen weet dat _gebruikersnaam_ op een bepaalde plaats op een bepaald uur aanwezig was.
|
||||
Wanneer je gegevens aanvult via MapComplete, zal je wijziging **publiek zichtbaar** zijn voor iedereen ter wereld. Dit
|
||||
betekent dus dat iedereen weet dat _gebruikersnaam_ op een bepaalde plaats op een bepaald uur aanwezig was.
|
||||
|
||||
**Ben je minderjarig?** Vraag toestemming aan je ouders voordat je een account aanmaakt en kies ervoor om je echte naam _niet_ te gebruiken.
|
||||
**Ben je minderjarig?** Vraag toestemming aan je ouders voordat je een account aanmaakt en kies ervoor om je echte
|
||||
naam _niet_ te gebruiken.
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
Making your own theme
|
||||
=====================
|
||||
|
||||
In MapComplete, it is relatively simple to make your own theme. This guide will give some information on how you can do this.
|
||||
In MapComplete, it is relatively simple to make your own theme. This guide will give some information on how you can do
|
||||
this.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
@ -11,17 +12,22 @@ Before you start, you should have the following qualifications:
|
|||
- You are a longtime contributor and do know the OpenStreetMap tagging scheme very well.
|
||||
- You are not afraid of editing a .JSON-file
|
||||
- You're theme will add well-understood tags (aka: the tags have a wiki page, are not controversial and are objective)
|
||||
- You are in contact with your local OpenStreetMap community and do know some other members to discuss tagging and to help testing
|
||||
- You are in contact with your local OpenStreetMap community and do know some other members to discuss tagging and to
|
||||
help testing
|
||||
|
||||
If you do not have those qualifications, reach out to the MapComplete community channel on [Telegram](https://t.me/MapComplete)
|
||||
If you do not have those qualifications, reach out to the MapComplete community channel
|
||||
on [Telegram](https://t.me/MapComplete)
|
||||
or [Matrix](https://app.element.io/#/room/#MapComplete:matrix.org).
|
||||
|
||||
The custom theme generator
|
||||
--------------------------
|
||||
|
||||
The custom theme generator is a special page of MapComplete, where one can create their own theme. It makes it easier to get started.
|
||||
The custom theme generator is a special page of MapComplete, where one can create their own theme. It makes it easier to
|
||||
get started.
|
||||
|
||||
However, the custom theme generator is extremely buggy and built before some updates. This means that some features are _not_ available through the custom theme generator. The custom theme generator is good to get the basics of the theme set up, but you will have to edit the raw JSON-file anyway afterwards.
|
||||
However, the custom theme generator is extremely buggy and built before some updates. This means that some features
|
||||
are _not_ available through the custom theme generator. The custom theme generator is good to get the basics of the
|
||||
theme set up, but you will have to edit the raw JSON-file anyway afterwards.
|
||||
|
||||
[A quick tutorial for the custom theme generator can be found here](https://www.youtube.com/watch?v=nVbFrNVPxPw).
|
||||
|
||||
|
@ -30,48 +36,67 @@ Loading your theme
|
|||
|
||||
If you have your .json file, there are three ways to distribute your theme:
|
||||
|
||||
- Take the entire JSON-file and [base64](https://www.base64encode.org/) encode it. Then open up the url `https://mapcomplete.osm.be?userlayout=true#<base64-encoded-json-here>`. Yes, this URL will be huge; and updates are difficult to distribute as you have to send a new URL to everyone. This is however excellent to have a 'quick and dirty' test version up and running as these links can be generated from the customThemeGenerator and can be quickly shared with a few other contributors.
|
||||
- Host the JSON file on a publicly accessible webserver (e.g. github) and open up `https://mapcomplete.osm.be?userlayout=<url-to-the-raw.json>`
|
||||
- Take the entire JSON-file and [base64](https://www.base64encode.org/) encode it. Then open up the
|
||||
url `https://mapcomplete.osm.be?userlayout=true#<base64-encoded-json-here>`. Yes, this URL will be huge; and updates
|
||||
are difficult to distribute as you have to send a new URL to everyone. This is however excellent to have a 'quick and
|
||||
dirty' test version up and running as these links can be generated from the customThemeGenerator and can be quickly
|
||||
shared with a few other contributors.
|
||||
- Host the JSON file on a publicly accessible webserver (e.g. github) and open
|
||||
up `https://mapcomplete.osm.be?userlayout=<url-to-the-raw.json>`
|
||||
- Ask to have your theme included into the official MapComplete - requirements below
|
||||
|
||||
### Getting your theme included into the official mapcomplete
|
||||
|
||||
Did you make an awesome theme that you want to share with the OpenStreetMap community? Have it included in the main application, which makes it more discoverable.
|
||||
Did you make an awesome theme that you want to share with the OpenStreetMap community? Have it included in the main
|
||||
application, which makes it more discoverable.
|
||||
|
||||
Your theme has to be:
|
||||
|
||||
0) Make sure the theme has an English version. This makes it easier for me to understand what is going on. The more other languages, the better of course!
|
||||
0) Make sure the theme has an English version. This makes it easier for me to understand what is going on. The more
|
||||
other languages, the better of course!
|
||||
1) Make sure your theme has good tagging
|
||||
3) Make sure there are somewhat decent icons. Note that there is _no_ styleguide at the moment though.
|
||||
|
||||
The preferred way to add your theme is via a Pull Request. A Pull Request is less work for the maintainer (which makes it really easy and for me to add it) and your name will be included in the git history (so you'll be listed as contributor). If that is not possible, send the .Json-file and assets, e.g. as a zip in an issue, per email, ...
|
||||
The preferred way to add your theme is via a Pull Request. A Pull Request is less work for the maintainer (which makes
|
||||
it really easy and for me to add it) and your name will be included in the git history (so you'll be listed as
|
||||
contributor). If that is not possible, send the .Json-file and assets, e.g. as a zip in an issue, per email, ...
|
||||
|
||||
*Via a pull request:*
|
||||
|
||||
1) Fork this repository
|
||||
2) Go to `assets/themes` and create a new directory `yourtheme`
|
||||
3) Create a new file `yourtheme.json`, paste the theme configuration in there. You can find your theme configuration in the customThemeBuilder (the tab with the *Floppy disk* icon)
|
||||
4) Copy all the images into this new directory. **No external sources are allowed!** External image sources leak privacy or can break.
|
||||
3) Create a new file `yourtheme.json`, paste the theme configuration in there. You can find your theme configuration in
|
||||
the customThemeBuilder (the tab with the *Floppy disk* icon)
|
||||
4) Copy all the images into this new directory. **No external sources are allowed!** External image sources leak privacy
|
||||
or can break.
|
||||
- Make sure the license is suitable, preferable a Creative Commons license or CC0-license.
|
||||
- If an SVG version is available, use the SVG version
|
||||
- Make sure all the links in `yourtheme.json` are updated. You can use `./assets/themes/yourtheme/yourimage.svg` instead of the HTML link
|
||||
- Make sure all the links in `yourtheme.json` are updated. You can use `./assets/themes/yourtheme/yourimage.svg`
|
||||
instead of the HTML link
|
||||
- Create a file `license_info.json` in the theme directory, which contains metadata on every artwork source
|
||||
5) Add your theme to the code base: add it into "assets/themes" and make sure all the images are there too. Running 'ts-node scripts/fixTheme <path to your theme>' will help downloading the images and attempts to get the licenses if on wikimedia.
|
||||
6) Add some finishing touches, such as a social image. See [this blog post](https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit) for some hints
|
||||
7) Test your theme: run the project as described in [development_deployment](Development_deployment.md)
|
||||
8) Happy with your theme? Time to open a Pull Request!
|
||||
9) Thanks a lot for improving MapComplete!
|
||||
5) Add your theme to the code base: add it into "assets/themes" and make sure all the images are there too. Running '
|
||||
ts-node scripts/fixTheme <path to your theme>' will help downloading the images and attempts to get the licenses if
|
||||
on wikimedia.
|
||||
6) Add some finishing touches, such as a social image.
|
||||
See [this blog post](https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit) for some
|
||||
hints
|
||||
7) Test your theme: run the project as described in [development_deployment](Development_deployment.md)
|
||||
8) Happy with your theme? Time to open a Pull Request!
|
||||
9) Thanks a lot for improving MapComplete!
|
||||
|
||||
|
||||
The .JSON-format
|
||||
----------------
|
||||
The .JSON-format
|
||||
----------------
|
||||
|
||||
There are three important levels in the .JSON-file:
|
||||
|
||||
- The toplevel describes the metadata of the entire theme. It contains the `title`, `description`, `icon`... of the theme. The most important object is `layers`, which is a list of objects describing layers.
|
||||
- A `layer` describes a layer. It contains the `name`, `icon`, `tags of objects to download from overpass`, and especially the `icon` and a way to ask dynamically render tags and ask questions. A lot of those fields (`icon`, `title`, ...) are actually a `TagRendering`
|
||||
- A `TagRendering` is an object describing a relationship between what should be shown on screen and the OSM-tagging. It works in two ways: if the correct tag is known, the appropriate text will be shown. If the tag is missing (and a question is defined), the question will be shown.
|
||||
|
||||
- The toplevel describes the metadata of the entire theme. It contains the `title`, `description`, `icon`... of the
|
||||
theme. The most important object is `layers`, which is a list of objects describing layers.
|
||||
- A `layer` describes a layer. It contains the `name`, `icon`, `tags of objects to download from overpass`, and
|
||||
especially the `icon` and a way to ask dynamically render tags and ask questions. A lot of those fields (`icon`
|
||||
, `title`, ...) are actually a `TagRendering`
|
||||
- A `TagRendering` is an object describing a relationship between what should be shown on screen and the OSM-tagging. It
|
||||
works in two ways: if the correct tag is known, the appropriate text will be shown. If the tag is missing (and a
|
||||
question is defined), the question will be shown.
|
||||
|
||||
Every field is documented in the source code itself - you can find them here:
|
||||
|
||||
|
@ -82,50 +107,65 @@ Every field is documented in the source code itself - you can find them here:
|
|||
|
||||
### MetaTags
|
||||
|
||||
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](Docs/CalculatedTags.md)
|
||||
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](Docs/CalculatedTags.md)
|
||||
|
||||
Some hints
|
||||
Some hints
|
||||
------------
|
||||
|
||||
### Everything is HTML
|
||||
|
||||
All the texts are actually *HTML*-snippets, so you can use `<b>` to add bold, or `<img src=...>` to add images to mappings or tagrenderings.
|
||||
All the texts are actually *HTML*-snippets, so you can use `<b>` to add bold, or `<img src=...>` to add images to
|
||||
mappings or tagrenderings.
|
||||
|
||||
Some remarks:
|
||||
|
||||
- links are disabled when answering a question (e.g. a link in a mapping) as it should trigger the answer - not trigger to open the link.
|
||||
- If you include images, e.g. to clarify a type, make sure these are _icons_ or _diagrams_ - not actual pictures! If users see a picture, they think it is a picture of _that actual object_, not a type to clarify the type. An icon is however perceived as something more abstract.
|
||||
- links are disabled when answering a question (e.g. a link in a mapping) as it should trigger the answer - not trigger
|
||||
to open the link.
|
||||
- If you include images, e.g. to clarify a type, make sure these are _icons_ or _diagrams_ - not actual pictures! If
|
||||
users see a picture, they think it is a picture of _that actual object_, not a type to clarify the type. An icon is
|
||||
however perceived as something more abstract.
|
||||
|
||||
Some pitfalls
|
||||
Some pitfalls
|
||||
---------------
|
||||
|
||||
### Not publishing
|
||||
|
||||
Not publishing because 'it is not good enough'. _Share your theme, even if it is still not great, let the community help it improve_
|
||||
Not publishing because 'it is not good enough'. _Share your theme, even if it is still not great, let the community help
|
||||
it improve_
|
||||
|
||||
### Thinking in terms of a question
|
||||
|
||||
Making a tagrendering as if it were a question only. If you have a question such as: _Does this bench have a backrest?_, it is very tempting to have as options _yes_ for `backrest=yes` and _no_ for `backrest=no`. However, when this data is known, it will simply show a lone _yes_ or _no_ which is very unclear.
|
||||
Making a tagrendering as if it were a question only. If you have a question such as: _Does this bench have a backrest?_,
|
||||
it is very tempting to have as options _yes_ for `backrest=yes` and _no_ for `backrest=no`. However, when this data is
|
||||
known, it will simply show a lone _yes_ or _no_ which is very unclear.
|
||||
|
||||
The correct way to handle this is to use _This bench does have a backrest_ and _This bench does not have a backrest_ as answers.
|
||||
The correct way to handle this is to use _This bench does have a backrest_ and _This bench does not have a backrest_ as
|
||||
answers.
|
||||
|
||||
One has to think first in terms of _what is shown to the user if it is known_, only then in terms of _what is the question I want to ask_
|
||||
One has to think first in terms of _what is shown to the user if it is known_, only then in terms of _what is the
|
||||
question I want to ask_
|
||||
|
||||
### Forgetting the casual/noob mapper
|
||||
|
||||
MapComplete is in the first place a tool to help *non-technical* people visualize their interest and contribute to it. In order to maximize contribution:
|
||||
MapComplete is in the first place a tool to help *non-technical* people visualize their interest and contribute to it.
|
||||
In order to maximize contribution:
|
||||
|
||||
1. Use simple language. Avoid difficult words and explain jargon
|
||||
2. Put the simple questions first and the difficult ones on the back. The contributor can then stop at a difficult point and go to the next POI
|
||||
2. Put the simple questions first and the difficult ones on the back. The contributor can then stop at a difficult point
|
||||
and go to the next POI
|
||||
3. Use symbols and images, also in the mappings on questions
|
||||
4. Make sure the icons (on the map and in the questions) are big enough, clear enough and contrast enough with the background map
|
||||
4. Make sure the icons (on the map and in the questions) are big enough, clear enough and contrast enough with the
|
||||
background map
|
||||
|
||||
### Using layers to distinguish on attributes
|
||||
|
||||
One layer should portray one kind of physical object, e.g. "benches" or "restaurants". It should contain all of them, disregarding other properties.
|
||||
One layer should portray one kind of physical object, e.g. "benches" or "restaurants". It should contain all of them,
|
||||
disregarding other properties.
|
||||
|
||||
One should not make one layer for benches with a backrest and one layer for benches without. This is confusing for users and poses problems: what if the backrest status is unknown? What if it is some weird value?
|
||||
Also, it isn't possible to 'move' an attribute to another layer.
|
||||
One should not make one layer for benches with a backrest and one layer for benches without. This is confusing for users
|
||||
and poses problems: what if the backrest status is unknown? What if it is some weird value? Also, it isn't possible to '
|
||||
move' an attribute to another layer.
|
||||
|
||||
Instead, make one layer for one kind of object and change the icon based on attributes.
|
||||
|
||||
|
@ -133,12 +173,19 @@ Instead, make one layer for one kind of object and change the icon based on attr
|
|||
|
||||
Using layers as filters - this doesn't work!
|
||||
|
||||
_All_ data is downloaded in one go and cached locally first. The layer selection (bottom left of the live app) then selects _anything_ that matches the criteria. This match is then passed of to the rendering layer, which selects the layer independently. This means that a feature can show up, even if it's layer is unselected!
|
||||
_All_ data is downloaded in one go and cached locally first. The layer selection (bottom left of the live app) then
|
||||
selects _anything_ that matches the criteria. This match is then passed of to the rendering layer, which selects the
|
||||
layer independently. This means that a feature can show up, even if it's layer is unselected!
|
||||
|
||||
For example, in the [cyclofix-theme](https://mapcomplete.osm.org/cyclofix), there is the layer with _bike-wash_ for do it yourself bikecleaning - points marked with `service:bicycle:cleaning`. However, a bicycle repair shop can offer this service too!
|
||||
For example, in the [cyclofix-theme](https://mapcomplete.osm.org/cyclofix), there is the layer with _bike-wash_ for do
|
||||
it yourself bikecleaning - points marked with `service:bicycle:cleaning`. However, a bicycle repair shop can offer this
|
||||
service too!
|
||||
|
||||
If all the layers are deselected except the bike wash layer, a shop having this tag will still match and will still show up as shop.
|
||||
If all the layers are deselected except the bike wash layer, a shop having this tag will still match and will still show
|
||||
up as shop.
|
||||
|
||||
### Not reading the .JSON-specs
|
||||
|
||||
There are a few advanced features to do fancy stuff available, which are documented only in the spec above - for example, reusing background images and substituting the colours or HTML-rendering. If you need advanced stuff, read it through!
|
||||
There are a few advanced features to do fancy stuff available, which are documented only in the spec above - for
|
||||
example, reusing background images and substituting the colours or HTML-rendering. If you need advanced stuff, read it
|
||||
through!
|
||||
|
|
|
@ -4,15 +4,18 @@
|
|||
|
||||
## StreetComplete
|
||||
|
||||
StreetComplete might look pretty similar to MapComplete at first glance - especially as it was a huge inspiration. However, there are a few huge differences between the two, especially in vision.
|
||||
StreetComplete might look pretty similar to MapComplete at first glance - especially as it was a huge inspiration.
|
||||
However, there are a few huge differences between the two, especially in vision.
|
||||
|
||||
### Vision
|
||||
|
||||
The core philosophy of StreetComplete is **OpenStreetMap is cool! Help to improve it by answering these questions**
|
||||
The core philosophy of MapComplete is **Here is a map of topic XYZ - enjoy it and update it if there is still some info missing**
|
||||
The core philosophy of MapComplete is **Here is a map of topic XYZ - enjoy it and update it if there is still some info
|
||||
missing**
|
||||
|
||||
This means that StreetComplete is mainly aimed towards people who are already OpenStreetMap-enthusiasts, whereas MapComplete is aimed to an audience interested in a certain topic.
|
||||
Of course, the next step is to attempt to inform that audience why having an open map is so cool and that they can contribute as well.
|
||||
This means that StreetComplete is mainly aimed towards people who are already OpenStreetMap-enthusiasts, whereas
|
||||
MapComplete is aimed to an audience interested in a certain topic. Of course, the next step is to attempt to inform that
|
||||
audience why having an open map is so cool and that they can contribute as well.
|
||||
|
||||
### Use cases
|
||||
|
||||
|
@ -29,7 +32,9 @@ MapComplete is made to
|
|||
|
||||
StreetComplete is an android app, so can only be used on Android Phones.
|
||||
|
||||
MapComplete is a web-app, and thus works on all devices. It can be installed as PWA to give an 'app-like'-experience, but can just as well be embedded in other websites. On the other hand PWA are a bit of a second class citizen compared to native apps.
|
||||
MapComplete is a web-app, and thus works on all devices. It can be installed as PWA to give an 'app-like'-experience,
|
||||
but can just as well be embedded in other websites. On the other hand PWA are a bit of a second class citizen compared
|
||||
to native apps.
|
||||
|
||||
### Feature comparison
|
||||
|
||||
|
@ -37,22 +42,26 @@ MapComplete is also an OpenStreetMap-viewer, while StreetComplete hides known va
|
|||
|
||||
MapComplete will not work offline.
|
||||
|
||||
In MapComplete it is easier to add more experimental, extremely detailed and more personal styles, as each topic is separated with its own part.
|
||||
In MapComplete it is easier to add more experimental, extremely detailed and more personal styles, as each topic is
|
||||
separated with its own part.
|
||||
|
||||
MapComplete is a bit more complex to use. One needs to go hunting for a specific map style rather than getting bunch of quests by default. And is likely to ask far more detailed question (email address and phone number of bicycle shop etc).
|
||||
After all if it would duplicate StreetComplete it would be a bit pointless and it is pretty hard to compete with SC by being easier to use and more newbie friendly, while there is space for "more complicated/detailed/involved editor working like SC".
|
||||
MapComplete is a bit more complex to use. One needs to go hunting for a specific map style rather than getting bunch of
|
||||
quests by default. And is likely to ask far more detailed question (email address and phone number of bicycle shop etc).
|
||||
After all if it would duplicate StreetComplete it would be a bit pointless and it is pretty hard to compete with SC by
|
||||
being easier to use and more newbie friendly, while there is space for "more complicated/detailed/involved editor
|
||||
working like SC".
|
||||
|
||||
Also, MapComplete has no requirement to make question easy to answer, making both possible to ask more questions than StreetComplete but making it more complicated to use.
|
||||
Also, MapComplete has no requirement to make question easy to answer, making both possible to ask more questions than
|
||||
StreetComplete but making it more complicated to use.
|
||||
|
||||
No support for splitting ways in MapComplete (as of now - hopefully it'll get added one day).
|
||||
|
||||
MapComplete allows the addition of new points, whereas StreetComplete does not.
|
||||
|
||||
|
||||
|
||||
## MapContrib
|
||||
|
||||
MapContrib is another very similar editor which served as inspiration. MapContrib offers - just like MapComplete - an extensible, thematic map view. However, I never understood the MapContrib user interface.
|
||||
MapContrib is another very similar editor which served as inspiration. MapContrib offers - just like MapComplete - an
|
||||
extensible, thematic map view. However, I never understood the MapContrib user interface.
|
||||
|
||||
MapContrib also allows to add new points and to edit tags - but it is very cumbersome.
|
||||
|
||||
|
|
|
@ -2,18 +2,19 @@
|
|||
|
||||
In this document, you'll find a short overview of which (paid) projects have been completed with MapComplete
|
||||
|
||||
|
||||
## Buurtnatuur
|
||||
|
||||
Commisioned by Groen (the Belgian Green Party): "a project to crowdsource data about parks, nature reserve and forests"
|
||||
|
||||
## Cyclofix
|
||||
|
||||
Cycle-related Points of interest (pumps, shops, drinking water, ...). Commissioned by "Brussels Mobility", executed during OSOC
|
||||
Cycle-related Points of interest (pumps, shops, drinking water, ...). Commissioned by "Brussels Mobility", executed
|
||||
during OSOC
|
||||
|
||||
## Speelplekken in de Antwerpse Zuidrand
|
||||
|
||||
Playgrounds, play forests and village green in the southern part of the Province of Antwerp; commisioned by Province of Antwerp
|
||||
Playgrounds, play forests and village green in the southern part of the Province of Antwerp; commisioned by Province of
|
||||
Antwerp
|
||||
|
||||
## Natuurpunt Map (planned)
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# Available types for text fields
|
||||
|
||||
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
|
||||
|
||||
|
@ -20,7 +21,8 @@ A geographical direction, in degrees. 0° is north, 90° is east, ... Will retur
|
|||
|
||||
## 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"]
|
||||
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
|
||||
|
||||
|
|
|
@ -1,21 +1,25 @@
|
|||
|
||||
### Special tag renderings
|
||||
|
||||
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_fcs 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. General usage is `{func_name()}`
|
||||
, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_fcs 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
|
||||
|
||||
### all_tags
|
||||
|
||||
Prints all key-value pairs of the object - used for debugging
|
||||
Prints all key-value pairs of the object - used for debugging
|
||||
|
||||
name | default | description
|
||||
------ | --------- | -------------
|
||||
|
||||
|
||||
#### Example usage
|
||||
|
||||
{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
|
||||
------ | --------- | -------------
|
||||
|
@ -24,10 +28,11 @@ smart search | true | Also include images given via 'Wikidata', 'wikimedia_commo
|
|||
|
||||
#### Example usage
|
||||
|
||||
{image_carousel(image,true)}
|
||||
{image_carousel(image,true)}
|
||||
|
||||
### 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
|
||||
------ | --------- | -------------
|
||||
|
@ -35,10 +40,11 @@ image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 whe
|
|||
|
||||
#### Example usage
|
||||
|
||||
{image_upload(image)}
|
||||
{image_upload(image)}
|
||||
|
||||
### minimap
|
||||
|
||||
A small map showing the selected feature. Note that no styling is applied, wrap this in a div
|
||||
A small map showing the selected feature. Note that no styling is applied, wrap this in a div
|
||||
|
||||
name | default | description
|
||||
------ | --------- | -------------
|
||||
|
@ -47,10 +53,13 @@ idKey | id | (Matches all resting arguments) This argument should be the key of
|
|||
|
||||
#### Example usage
|
||||
|
||||
`{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}`
|
||||
|
||||
### 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
|
||||
------ | --------- | -------------
|
||||
|
@ -59,10 +68,13 @@ fallback | undefined | The identifier to use, if <i>tags[subjectKey]</i> as spec
|
|||
|
||||
#### Example usage
|
||||
|
||||
<b>{reviews()}<b> for a vanilla review, <b>{reviews(name, play_forest)}</b> to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used
|
||||
<b>{reviews()}<b> for a vanilla review, <b>{reviews(name, play_forest)}</b> 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
|
||||
|
||||
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
|
||||
------ | --------- | -------------
|
||||
|
@ -70,10 +82,14 @@ key | opening_hours | The tagkey from which the table is constructed.
|
|||
|
||||
#### Example usage
|
||||
|
||||
{opening_hours_table(opening_hours)}
|
||||
{opening_hours_table(opening_hours)}
|
||||
|
||||
### 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
|
||||
------ | --------- | -------------
|
||||
|
@ -83,10 +99,12 @@ path | undefined | The path (or shorthand) that should be returned
|
|||
|
||||
#### Example usage
|
||||
|
||||
{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
|
||||
|
||||
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
|
||||
------ | --------- | -------------
|
||||
|
@ -97,10 +115,11 @@ colors* | undefined | (Matches all resting arguments - optional) Matches a regex
|
|||
|
||||
#### Example usage
|
||||
|
||||
`{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
|
||||
|
||||
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
|
||||
------ | --------- | -------------
|
||||
|
@ -108,10 +127,11 @@ url | undefined | The url to share (default: current URL)
|
|||
|
||||
#### Example usage
|
||||
|
||||
{share_link()} to share the current page, {share_link(<some_url>)} to share the given url
|
||||
{share_link()} to share the current page, {share_link(<some_url>)} to share the given url
|
||||
|
||||
### canonical
|
||||
|
||||
Converts a short, canonical value into the long, translated text
|
||||
Converts a short, canonical value into the long, translated text
|
||||
|
||||
name | default | description
|
||||
------ | --------- | -------------
|
||||
|
@ -119,4 +139,4 @@ key | undefined | The key of the tag to give the canonical text for
|
|||
|
||||
#### Example usage
|
||||
|
||||
{canonical(length)} will give 42 metre (in french) Generated from UI/SpecialVisualisations.ts
|
||||
{canonical(length)} will give 42 metre (in french) Generated from UI/SpecialVisualisations.ts
|
|
@ -1,7 +1,8 @@
|
|||
Statistics
|
||||
==========
|
||||
|
||||
There are some fancy statistics available about MapComplete use. The most important once are listed below, some more graphs (and the scripts to generate them) are [in the tools directory](Tools/)
|
||||
There are some fancy statistics available about MapComplete use. The most important once are listed below, some more
|
||||
graphs (and the scripts to generate them) are [in the tools directory](Tools/)
|
||||
|
||||
All Time usage
|
||||
--------------
|
||||
|
@ -9,7 +10,8 @@ All Time usage
|
|||

|
||||

|
||||
|
||||
Note: in 2020, MapComplete would still make one changeset per answered question. This heavily skews the below graphs towards `buurtnatuur` and `cyclofìx`, two heavily used themes at the beginning.
|
||||
Note: in 2020, MapComplete would still make one changeset per answered question. This heavily skews the below graphs
|
||||
towards `buurtnatuur` and `cyclofìx`, two heavily used themes at the beginning.
|
||||
|
||||

|
||||

|
||||
|
|
|
@ -112,22 +112,22 @@
|
|||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Defibrillators' shows wheelchair=designated with a fixed text, namely 'This defibrillator is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||
"description": "Layer 'Defibrillators' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||
"value": "designated"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Defibrillators' shows wheelchair=yes with a fixed text, namely 'This defibrillator is easily reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||
"description": "Layer 'Defibrillators' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Defibrillators' shows wheelchair=limited with a fixed text, namely 'It is possible to reach the defibrillator in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||
"description": "Layer 'Defibrillators' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Defibrillators' shows wheelchair=no with a fixed text, namely 'This defibrillator is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||
"description": "Layer 'Defibrillators' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
|
|
|
@ -140,6 +140,25 @@
|
|||
"description": "Layer 'Benches' shows survey:date= with a fixed text, namely 'Surveyed today!' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches') Picking this answer will delete the key survey:date.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:charge",
|
||||
"description": "Layer 'Benches' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Benches')"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Benches' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||
"value": "no&service:bicycle:cleaning:charge="
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Benches' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Benches')",
|
||||
"value": "no&"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Benches' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "bench",
|
||||
"description": "The MapComplete theme Benches has a layer Benches at public transport stops showing features with this tag",
|
||||
|
|
72
Docs/TagInfo/mapcomplete_binoculars.json
Normal file
|
@ -0,0 +1,72 @@
|
|||
{
|
||||
"data_format": 1,
|
||||
"project": {
|
||||
"name": "MapComplete Binoculars",
|
||||
"description": "A map with fixed binoculars",
|
||||
"project_url": "https://mapcomplete.osm.be/binoculars",
|
||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||
"icon_url": "https://mapcomplete.osm.be/assets/layers/binocular/telescope.svg",
|
||||
"contact_name": "Pieter Vander Vennet, ",
|
||||
"contact_email": "pietervdvn@posteo.net"
|
||||
},
|
||||
"tags": [
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Binoculars has a layer Binoculars showing features with this tag",
|
||||
"value": "binoculars"
|
||||
},
|
||||
{
|
||||
"key": "image",
|
||||
"description": "The layer 'Binoculars allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "mapillary",
|
||||
"description": "The layer 'Binoculars allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikidata",
|
||||
"description": "The layer 'Binoculars allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikipedia",
|
||||
"description": "The layer 'Binoculars allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "charge",
|
||||
"description": "Layer 'Binoculars' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Binoculars')"
|
||||
},
|
||||
{
|
||||
"key": "fee",
|
||||
"description": "Layer 'Binoculars' shows fee=no&charge= with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Binoculars')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "charge",
|
||||
"description": "Layer 'Binoculars' shows fee=no&charge= with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Binoculars') Picking this answer will delete the key charge.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "direction",
|
||||
"description": "Layer 'Binoculars' shows and asks freeform values for key 'direction' (in the MapComplete.osm.be theme 'Binoculars')"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:charge",
|
||||
"description": "Layer 'Binoculars' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Binoculars')"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Binoculars' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Binoculars')",
|
||||
"value": "no&service:bicycle:cleaning:charge="
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Binoculars' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Binoculars')",
|
||||
"value": "no&"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Binoculars' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Binoculars')",
|
||||
"value": "yes"
|
||||
}
|
||||
]
|
||||
}
|
125
Docs/TagInfo/mapcomplete_cafes_and_pubs.json
Normal file
|
@ -0,0 +1,125 @@
|
|||
{
|
||||
"data_format": 1,
|
||||
"project": {
|
||||
"name": "MapComplete Cafés and pubs",
|
||||
"description": "Cafés, kroegen en drinkgelegenheden",
|
||||
"project_url": "https://mapcomplete.osm.be/cafes_and_pubs",
|
||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||
"icon_url": "https://mapcomplete.osm.be/assets/layers/cafe_pub/pub.svg",
|
||||
"contact_name": "Pieter Vander Vennet, ",
|
||||
"contact_email": "pietervdvn@posteo.net"
|
||||
},
|
||||
"tags": [
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Cafés and pubs has a layer Cafés and pubs showing features with this tag",
|
||||
"value": "bar"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Cafés and pubs has a layer Cafés and pubs showing features with this tag",
|
||||
"value": "pub"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Cafés and pubs has a layer Cafés and pubs showing features with this tag",
|
||||
"value": "cafe"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Cafés and pubs has a layer Cafés and pubs showing features with this tag",
|
||||
"value": "biergarten"
|
||||
},
|
||||
{
|
||||
"key": "image",
|
||||
"description": "The layer 'Cafés and pubs allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "mapillary",
|
||||
"description": "The layer 'Cafés and pubs allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikidata",
|
||||
"description": "The layer 'Cafés and pubs allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikipedia",
|
||||
"description": "The layer 'Cafés and pubs allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "name",
|
||||
"description": "Layer 'Cafés and pubs' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Cafés and pubs')"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Cafés and pubs' shows amenity=pub with a fixed text, namely 'Dit is <b>een bruin café of een kroeg</b> waar voornamelijk bier wordt gedronken. De inrichting is typisch gezellig met veel houtwerk ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "pub"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Cafés and pubs' shows amenity=bar with a fixed text, namely 'Dit is een <b>bar</b> waar men ter plaatse alcoholische drank nuttigt. De inrichting is typisch modern en commercieel, soms met lichtinstallatie en feestmuziek' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "bar"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Cafés and pubs' shows amenity=cafe with a fixed text, namely 'Dit is een <b>cafe</b> - een plaats waar men rustig kan zitten om een thee, koffie of alcoholische drank te nuttigen.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "cafe"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Cafés and pubs' shows amenity=restaurant with a fixed text, namely 'Dit is een <b>restaurant</b> waar men een maaltijd geserveerd krijgt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "restaurant"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Cafés and pubs' shows amenity=biergarten with a fixed text, namely 'Een open ruimte waar bier geserveerd wordt. Typisch in Duitsland' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "biergarten"
|
||||
},
|
||||
{
|
||||
"key": "opening_hours",
|
||||
"description": "Layer 'Cafés and pubs' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Cafés and pubs')"
|
||||
},
|
||||
{
|
||||
"key": "website",
|
||||
"description": "Layer 'Cafés and pubs' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Cafés and pubs')"
|
||||
},
|
||||
{
|
||||
"key": "email",
|
||||
"description": "Layer 'Cafés and pubs' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Cafés and pubs')"
|
||||
},
|
||||
{
|
||||
"key": "phone",
|
||||
"description": "Layer 'Cafés and pubs' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Cafés and pubs')"
|
||||
},
|
||||
{
|
||||
"key": "payment:cash",
|
||||
"description": "Layer 'Cafés and pubs' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "payment:cards",
|
||||
"description": "Layer 'Cafés and pubs' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Cafés and pubs' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "designated"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Cafés and pubs' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Cafés and pubs' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Cafés and pubs' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cafés and pubs')",
|
||||
"value": "no"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -15,6 +15,21 @@
|
|||
"description": "The MapComplete theme Charging stations has a layer Charging stations showing features with this tag",
|
||||
"value": "charging_station"
|
||||
},
|
||||
{
|
||||
"key": "disused:amenity",
|
||||
"description": "The MapComplete theme Charging stations has a layer Charging stations showing features with this tag",
|
||||
"value": "charging_station"
|
||||
},
|
||||
{
|
||||
"key": "planned:amenity",
|
||||
"description": "The MapComplete theme Charging stations has a layer Charging stations showing features with this tag",
|
||||
"value": "charging_station"
|
||||
},
|
||||
{
|
||||
"key": "construction:amenity",
|
||||
"description": "The MapComplete theme Charging stations has a layer Charging stations showing features with this tag",
|
||||
"value": "charging_station"
|
||||
},
|
||||
{
|
||||
"key": "image",
|
||||
"description": "The layer 'Charging stations allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
|
@ -31,113 +46,224 @@
|
|||
"key": "wikipedia",
|
||||
"description": "The layer 'Charging stations allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "motorcar",
|
||||
"description": "Layer 'Charging stations' shows motorcar=yes&bicycle=yes with a fixed text, namely 'This is a charging station for <b>both bicycles and cars</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Charging stations' shows motorcar=yes&bicycle=yes with a fixed text, namely 'This is a charging station for <b>both bicycles and cars</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows bicycle=yes with a fixed text, namely '<b>bicycles</b> can be charged here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "motorcar",
|
||||
"description": "Layer 'Charging stations' shows motorcar=&car=&bicycle=yes with a fixed text, namely 'This is a charging station exclusively for <b>bicycles</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key motorcar.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "car",
|
||||
"description": "Layer 'Charging stations' shows motorcar=&car=&bicycle=yes with a fixed text, namely 'This is a charging station exclusively for <b>bicycles</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key car.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Charging stations' shows motorcar=&car=&bicycle=yes with a fixed text, namely 'This is a charging station exclusively for <b>bicycles</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows motorcar=yes with a fixed text, namely '<b>Cars</b> can be charged here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "motorcar",
|
||||
"description": "Layer 'Charging stations' shows motorcar=yes&car=&bicycle= with a fixed text, namely 'This is a charging station exclusively for <b>electric cars and similar vehicles</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"key": "scooter",
|
||||
"description": "Layer 'Charging stations' shows scooter=yes with a fixed text, namely '<b>Scooters</b> can be charged here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "car",
|
||||
"description": "Layer 'Charging stations' shows motorcar=yes&car=&bicycle= with a fixed text, namely 'This is a charging station exclusively for <b>electric cars and similar vehicles</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key car.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Charging stations' shows motorcar=yes&car=&bicycle= with a fixed text, namely 'This is a charging station exclusively for <b>electric cars and similar vehicles</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key bicycle.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "car",
|
||||
"description": "Layer 'Charging stations' shows car=yes&bicycle= with a fixed text, namely 'This is a charging station exclusively for <b>electric cars</b>' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"key": "hgv",
|
||||
"description": "Layer 'Charging stations' shows hgv=yes with a fixed text, namely '<b>Heavy good vehicles</b> (such as trucks) can be charged here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Charging stations' shows car=yes&bicycle= with a fixed text, namely 'This is a charging station exclusively for <b>electric cars</b>' (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key bicycle.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "car",
|
||||
"description": "Layer 'Charging stations' shows car=yes&bicycle=yes with a fixed text, namely 'This is a charging station for <b>both electric cars and bicycles</b>' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"key": "bus",
|
||||
"description": "Layer 'Charging stations' shows bus=yes with a fixed text, namely '<b>Buses</b> can be charged here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Charging stations' shows car=yes&bicycle=yes with a fixed text, namely 'This is a charging station for <b>both electric cars and bicycles</b>' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"key": "access",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'access' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "access",
|
||||
"description": "Layer 'Charging stations' shows access=yes with a fixed text, namely 'Anyone can use this charging station (payment might be needed)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "access",
|
||||
"description": "Layer 'Charging stations' shows access=permissive|access=public with a fixed text, namely 'Anyone can use this charging station (payment might be needed)' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "permissive"
|
||||
},
|
||||
{
|
||||
"key": "access",
|
||||
"description": "Layer 'Charging stations' shows access=permissive|access=public with a fixed text, namely 'Anyone can use this charging station (payment might be needed)' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "public"
|
||||
},
|
||||
{
|
||||
"key": "access",
|
||||
"description": "Layer 'Charging stations' shows access=customers with a fixed text, namely 'Only customers of the place this station belongs to can use this charging station<br/><span class='subtle'>E.g. a charging station operated by hotel which is only usable by their guests</span> ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "customers"
|
||||
},
|
||||
{
|
||||
"key": "access",
|
||||
"description": "Layer 'Charging stations' shows access=private with a fixed text, namely 'Not accessible to the general public (e.g. only accessible to the owners, employees, ...)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "private"
|
||||
},
|
||||
{
|
||||
"key": "capacity",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:schuko",
|
||||
"description": "Layer 'Charging stations' shows socket:schuko=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/CEE7_4F.svg'/> <b>Schuko wall plug</b> without ground pin (CEE7/4 type F)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:schuko",
|
||||
"description": "Layer 'Charging stations' shows socket:schuko~^..*$&socket:schuko!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/CEE7_4F.svg'/> <b>Schuko wall plug</b> without ground pin (CEE7/4 type F)' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:typee",
|
||||
"description": "Layer 'Charging stations' shows socket:typee=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/TypeE.svg'/> <b>European wall plug</b> with ground pin (CEE7/4 type E)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:typee",
|
||||
"description": "Layer 'Charging stations' shows socket:typee~^..*$&socket:typee!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/TypeE.svg'/> <b>European wall plug</b> with ground pin (CEE7/4 type E)' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:chademo",
|
||||
"description": "Layer 'Charging stations' shows socket:chademo=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Chademo_type4.svg'/> <b>Chademo</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:chademo",
|
||||
"description": "Layer 'Charging stations' shows socket:chademo~^..*$&socket:chademo!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Chademo_type4.svg'/> <b>Chademo</b>' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1_cable",
|
||||
"description": "Layer 'Charging stations' shows socket:type1_cable=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type1_J1772.svg'/> <b>Type 1 with cable</b> (J1772)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1_cable",
|
||||
"description": "Layer 'Charging stations' shows socket:type1_cable~^..*$&socket:type1_cable!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type1_J1772.svg'/> <b>Type 1 with cable</b> (J1772)' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1",
|
||||
"description": "Layer 'Charging stations' shows socket:type1=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type1_J1772.svg'/> <b>Type 1 <i>without</i> cable</b> (J1772)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1",
|
||||
"description": "Layer 'Charging stations' shows socket:type1~^..*$&socket:type1!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type1_J1772.svg'/> <b>Type 1 <i>without</i> cable</b> (J1772)' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1_combo",
|
||||
"description": "Layer 'Charging stations' shows socket:type1_combo=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type1-ccs.svg'/> <b>Type 1 CCS</b> (aka Type 1 Combo)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1_combo",
|
||||
"description": "Layer 'Charging stations' shows socket:type1_combo~^..*$&socket:type1_combo!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type1-ccs.svg'/> <b>Type 1 CCS</b> (aka Type 1 Combo)' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:tesla_supercharger",
|
||||
"description": "Layer 'Charging stations' shows socket:tesla_supercharger=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <b>Tesla Supercharger</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:tesla_supercharger",
|
||||
"description": "Layer 'Charging stations' shows socket:tesla_supercharger~^..*$&socket:tesla_supercharger!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/> <b>Tesla Supercharger</b>' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type2",
|
||||
"description": "Layer 'Charging stations' shows socket:type2=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type2_socket.svg'/> <b>Type 2</b> (mennekes)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:type2",
|
||||
"description": "Layer 'Charging stations' shows socket:type2~^..*$&socket:type2!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type2_socket.svg'/> <b>Type 2</b> (mennekes)' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type2_combo",
|
||||
"description": "Layer 'Charging stations' shows socket:type2_combo=1 with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type2_CCS.svg'/> <b>Type 2 CCS</b> (mennekes)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "socket:type2_combo",
|
||||
"description": "Layer 'Charging stations' shows socket:type2_combo~^..*$&socket:type2_combo!~^1$ with a fixed text, namely '<img style='width:3rem; margin-left: 1rem; margin-right: 1rem' src='./assets/layers/charging_station/Type2_CCS.svg'/> <b>Type 2 CCS</b> (mennekes)' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:schuko",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:schuko' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:typee",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:typee' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:chademo",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:chademo' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1_cable",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_cable' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type1_combo",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type1_combo' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:tesla_supercharger",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:tesla_supercharger' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type2",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "socket:type2_combo",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'socket:type2_combo' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "authentication:membership_card",
|
||||
"description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows authentication:membership_card=yes with a fixed text, namely 'Authentication by a membership card' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "authentication:app",
|
||||
"description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows authentication:app=yes with a fixed text, namely 'Authentication by an app' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "authentication:phone_call",
|
||||
"description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows authentication:phone_call=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "authentication:short_message",
|
||||
"description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via phone call is available' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows authentication:short_message=yes with a fixed text, namely 'Authentication via phone call is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "authentication:nfc",
|
||||
"description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows authentication:nfc=yes with a fixed text, namely 'Authentication via NFC is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "authentication:money_card",
|
||||
"description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows authentication:money_card=yes with a fixed text, namely 'Authentication via Money Card is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "authentication:debig",
|
||||
"description": "Layer 'Charging stations' shows authentication:debig=yes with a fixed text, namely 'Authentication via debit card is available' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"key": "authentication:debit_card",
|
||||
"description": "Layer 'Charging stations' shows authentication:debit_card=yes with a fixed text, namely 'Authentication via debit card is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "authentication:none",
|
||||
"description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'No authentication is needed' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"description": "Layer 'Charging stations' shows authentication:none=yes with a fixed text, namely 'No authentication is needed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "authentication:phone_call:number",
|
||||
"description": "Layer 'Charging stations' shows values with key 'authentication:phone_call:number' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'authentication:phone_call:number' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "opening_hours",
|
||||
|
@ -157,6 +283,11 @@
|
|||
"description": "Layer 'Charging stations' shows no:network=yes with a fixed text, namely 'Not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "network",
|
||||
"description": "Layer 'Charging stations' shows network=none with a fixed text, namely 'Not part of a bigger network' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "none"
|
||||
},
|
||||
{
|
||||
"key": "network",
|
||||
"description": "Layer 'Charging stations' shows network=AeroVironment with a fixed text, namely 'AeroVironment' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
|
@ -171,6 +302,114 @@
|
|||
"key": "network",
|
||||
"description": "Layer 'Charging stations' shows network=eVgo with a fixed text, namely 'eVgo' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "eVgo"
|
||||
},
|
||||
{
|
||||
"key": "operator",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "network",
|
||||
"description": "Layer 'Charging stations' shows network= with a fixed text, namely 'Actually, {operator} is the network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key network.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "phone",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "email",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "website",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "level",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'level' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "location",
|
||||
"description": "Layer 'Charging stations' shows location=underground with a fixed text, namely 'Located underground' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "underground"
|
||||
},
|
||||
{
|
||||
"key": "level",
|
||||
"description": "Layer 'Charging stations' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"key": "level",
|
||||
"description": "Layer 'Charging stations' shows level= with a fixed text, namely 'Located on the ground floor' (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key level.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "level",
|
||||
"description": "Layer 'Charging stations' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"key": "ref",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'ref' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "operational_status",
|
||||
"description": "Layer 'Charging stations' shows operational_status=broken with a fixed text, namely 'This charging station is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "broken"
|
||||
},
|
||||
{
|
||||
"key": "planned:amenity",
|
||||
"description": "Layer 'Charging stations' shows planned:amenity=charging_station&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "charging_station"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Charging stations' shows planned:amenity=charging_station&amenity= with a fixed text, namely 'A charging station is planned here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "construction:amenity",
|
||||
"description": "Layer 'Charging stations' shows construction:amenity=charging_station&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "charging_station"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Charging stations' shows construction:amenity=charging_station&amenity= with a fixed text, namely 'A charging station is constructed here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "disused:amenity",
|
||||
"description": "Layer 'Charging stations' shows disused:amenity=charging_station&amenity= with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "charging_station"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Charging stations' shows disused:amenity=charging_station&amenity= with a fixed text, namely 'This charging station has beed permanently disabled and is not in use anymore but is still visible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations') Picking this answer will delete the key amenity.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Charging stations' shows amenity=charging_station with a fixed text, namely 'This charging station works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "charging_station"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:charge",
|
||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Charging stations' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "no&service:bicycle:cleaning:charge="
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Charging stations' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "no&"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Charging stations' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||
"value": "yes"
|
||||
}
|
||||
]
|
||||
}
|
743
Docs/TagInfo/mapcomplete_cycle_infra.json
Normal file
|
@ -0,0 +1,743 @@
|
|||
{
|
||||
"data_format": 1,
|
||||
"project": {
|
||||
"name": "MapComplete Bicycle infrastructure",
|
||||
"description": "A map where you can view and edit things related to the bicycle infrastructure.",
|
||||
"project_url": "https://mapcomplete.osm.be/cycle_infra",
|
||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/cycle_infra/cycle-infra.svg",
|
||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||
"contact_email": "pietervdvn@posteo.net"
|
||||
},
|
||||
"tags": [
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "cycleway"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "lane"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "shared_lane"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "track"
|
||||
},
|
||||
{
|
||||
"key": "cyclestreet",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "residential"
|
||||
},
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "tertiary"
|
||||
},
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "unclassified"
|
||||
},
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "primary"
|
||||
},
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "secondary"
|
||||
},
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "path"
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
|
||||
"value": "designated"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "shared_lane"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "lane"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "track"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "separate"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "cycleway",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "lit",
|
||||
"description": "Layer 'Cycleways and roads' shows lit=yes with a fixed text, namely 'This street is lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "lit",
|
||||
"description": "Layer 'Cycleways and roads' shows lit=no with a fixed text, namely 'This road is not lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "lit",
|
||||
"description": "Layer 'Cycleways and roads' shows lit=sunset-sunrise with a fixed text, namely 'This road is lit at night' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "sunset-sunrise"
|
||||
},
|
||||
{
|
||||
"key": "lit",
|
||||
"description": "Layer 'Cycleways and roads' shows lit=24/7 with a fixed text, namely 'This road is lit 24/7' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "24/7"
|
||||
},
|
||||
{
|
||||
"key": "cyclestreet",
|
||||
"description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "cyclestreet",
|
||||
"description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "cyclestreet",
|
||||
"description": "Layer 'Cycleways and roads' shows cyclestreet= with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure') Picking this answer will delete the key cyclestreet.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "maxspeed",
|
||||
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "maxspeed",
|
||||
"description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "20"
|
||||
},
|
||||
{
|
||||
"key": "maxspeed",
|
||||
"description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "30"
|
||||
},
|
||||
{
|
||||
"key": "maxspeed",
|
||||
"description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "50"
|
||||
},
|
||||
{
|
||||
"key": "maxspeed",
|
||||
"description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "70"
|
||||
},
|
||||
{
|
||||
"key": "maxspeed",
|
||||
"description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "90"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "unpaved"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "paved"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "asphalt"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "paving_stones"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "concrete"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "cobblestone"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "unhewn_cobblestone"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "sett"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "wood"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "gravel"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "fine_gravel"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "pebblestone"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:surface",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "ground"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "excellent"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "good"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "intermediate"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "bad"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "very_bad"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "horrible"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "very_horrible"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "impassable"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'surface' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=unpaved with a fixed text, namely 'This cycleway is unhardened' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "unpaved"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=paved with a fixed text, namely 'This cycleway is paved' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "paved"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "asphalt"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "paving_stones"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "concrete"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "cobblestone"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "unhewn_cobblestone"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "sett"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "wood"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "gravel"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "fine_gravel"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "pebblestone"
|
||||
},
|
||||
{
|
||||
"key": "surface",
|
||||
"description": "Layer 'Cycleways and roads' shows surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "ground"
|
||||
},
|
||||
{
|
||||
"key": "smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "excellent"
|
||||
},
|
||||
{
|
||||
"key": "smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "good"
|
||||
},
|
||||
{
|
||||
"key": "smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "intermediate"
|
||||
},
|
||||
{
|
||||
"key": "smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "bad"
|
||||
},
|
||||
{
|
||||
"key": "smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "very_bad"
|
||||
},
|
||||
{
|
||||
"key": "smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "horrible"
|
||||
},
|
||||
{
|
||||
"key": "smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "very_horrible"
|
||||
},
|
||||
{
|
||||
"key": "smoothness",
|
||||
"description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "impassable"
|
||||
},
|
||||
{
|
||||
"key": "width:carriageway",
|
||||
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^BE:D7;.*$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)<br><img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'> ' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D9"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D10"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "none"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign~^BE:D7;.*$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)<br><img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='width: 3em'> ' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D9"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D10"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "none"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M6.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M6"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M13.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M13"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M14.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M14"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M7.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M7"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M15.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M15"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M16.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M16"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:traffic_sign:supplementary",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "none"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7;BE:M6 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M6.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M6"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7;BE:M13 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M13.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M13"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7;BE:M14 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M14.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M14"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7;BE:M7 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M7.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M7"
|
||||
},
|
||||
{
|
||||
"key": ":traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows :traffic_sign=BE:D7;BE:M15 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M15.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M15"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7;BE:M16 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M16.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "BE:D7;BE:M16"
|
||||
},
|
||||
{
|
||||
"key": "traffic_sign:supplementary",
|
||||
"description": "Layer 'Cycleways and roads' shows traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "none"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:buffer",
|
||||
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:separation",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "dashed_line"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:separation",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "solid_line"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:separation",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "parking_lane"
|
||||
},
|
||||
{
|
||||
"key": "cycleway:separation",
|
||||
"description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "kerb"
|
||||
},
|
||||
{
|
||||
"key": "separation",
|
||||
"description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "dashed_line"
|
||||
},
|
||||
{
|
||||
"key": "separation",
|
||||
"description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "solid_line"
|
||||
},
|
||||
{
|
||||
"key": "separation",
|
||||
"description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "parking_lane"
|
||||
},
|
||||
{
|
||||
"key": "separation",
|
||||
"description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "kerb"
|
||||
},
|
||||
{
|
||||
"key": "barrier",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Barriers showing features with this tag",
|
||||
"value": "bollard"
|
||||
},
|
||||
{
|
||||
"key": "barrier",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Barriers showing features with this tag",
|
||||
"value": "cycle_barrier"
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Barriers' shows bicycle=yes with a fixed text, namely 'A cyclist can go past this.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Barriers' shows bicycle=no with a fixed text, namely 'A cyclist can not go past this.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "bollard",
|
||||
"description": "Layer 'Barriers' shows bollard=removable with a fixed text, namely 'Removable bollard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "removable"
|
||||
},
|
||||
{
|
||||
"key": "bollard",
|
||||
"description": "Layer 'Barriers' shows bollard=fixed with a fixed text, namely 'Fixed bollard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "fixed"
|
||||
},
|
||||
{
|
||||
"key": "bollard",
|
||||
"description": "Layer 'Barriers' shows bollard=foldable with a fixed text, namely 'Bollard that can be folded down' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "foldable"
|
||||
},
|
||||
{
|
||||
"key": "bollard",
|
||||
"description": "Layer 'Barriers' shows bollard=flexible with a fixed text, namely 'Flexible bollard, usually plastic' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "flexible"
|
||||
},
|
||||
{
|
||||
"key": "bollard",
|
||||
"description": "Layer 'Barriers' shows bollard=rising with a fixed text, namely 'Rising bollard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "rising"
|
||||
},
|
||||
{
|
||||
"key": "cycle_barrier:type",
|
||||
"description": "Layer 'Barriers' shows cycle_barrier:type=single with a fixed text, namely 'Single, just two barriers with a space inbetween <img src='./assets/themes/cycle_infra/Cycle_barrier_single.png' style='width:8em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "single"
|
||||
},
|
||||
{
|
||||
"key": "cycle_barrier:type",
|
||||
"description": "Layer 'Barriers' shows cycle_barrier:type=double with a fixed text, namely 'Double, two barriers behind each other <img src='./assets/themes/cycle_infra/Cycle_barrier_double.png' style='width:8em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "double"
|
||||
},
|
||||
{
|
||||
"key": "cycle_barrier:type",
|
||||
"description": "Layer 'Barriers' shows cycle_barrier:type=triple with a fixed text, namely 'Triple, three barriers behind each other <img src='./assets/themes/cycle_infra/Cycle_barrier_triple.png' style='width:8em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "triple"
|
||||
},
|
||||
{
|
||||
"key": "cycle_barrier:type",
|
||||
"description": "Layer 'Barriers' shows cycle_barrier:type=squeeze with a fixed text, namely 'Squeeze gate, gap is smaller at top, than at the bottom <img src='./assets/themes/cycle_infra/Cycle_barrier_squeeze.png' style='width:8em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "squeeze"
|
||||
},
|
||||
{
|
||||
"key": "maxwidth:physical",
|
||||
"description": "Layer 'Barriers' shows and asks freeform values for key 'maxwidth:physical' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "width:separation",
|
||||
"description": "Layer 'Barriers' shows and asks freeform values for key 'width:separation' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "width:opening",
|
||||
"description": "Layer 'Barriers' shows and asks freeform values for key 'width:opening' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "overlap",
|
||||
"description": "Layer 'Barriers' shows and asks freeform values for key 'overlap' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
|
||||
},
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Crossings showing features with this tag",
|
||||
"value": "traffic_signals"
|
||||
},
|
||||
{
|
||||
"key": "highway",
|
||||
"description": "The MapComplete theme Bicycle infrastructure has a layer Crossings showing features with this tag",
|
||||
"value": "crossing"
|
||||
},
|
||||
{
|
||||
"key": "crossing",
|
||||
"description": "Layer 'Crossings' shows crossing=uncontrolled with a fixed text, namely 'Crossing, without traffic lights' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "uncontrolled"
|
||||
},
|
||||
{
|
||||
"key": "crossing",
|
||||
"description": "Layer 'Crossings' shows crossing=traffic_signals with a fixed text, namely 'Crossing with traffic signals' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "traffic_signals"
|
||||
},
|
||||
{
|
||||
"key": "crossing",
|
||||
"description": "Layer 'Crossings' shows crossing=zebra with a fixed text, namely 'Zebra crossing' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "zebra"
|
||||
},
|
||||
{
|
||||
"key": "crossing_ref",
|
||||
"description": "Layer 'Crossings' shows crossing_ref=zebra with a fixed text, namely 'This is a zebra crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "zebra"
|
||||
},
|
||||
{
|
||||
"key": "crossing_ref",
|
||||
"description": "Layer 'Crossings' shows crossing_ref= with a fixed text, namely 'This is not a zebra crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure') Picking this answer will delete the key crossing_ref.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Crossings' shows bicycle=yes with a fixed text, namely 'A cyclist can use this crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "bicycle",
|
||||
"description": "Layer 'Crossings' shows bicycle=no with a fixed text, namely 'A cyclist can not use this crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "crossing:island",
|
||||
"description": "Layer 'Crossings' shows crossing:island=yes with a fixed text, namely 'This crossing has an island in the middle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "crossing:island",
|
||||
"description": "Layer 'Crossings' shows crossing:island=no with a fixed text, namely 'This crossing does not have an island in the middle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "tactile_paving",
|
||||
"description": "Layer 'Crossings' shows tactile_paving=yes with a fixed text, namely 'This crossing has tactile paving' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "tactile_paving",
|
||||
"description": "Layer 'Crossings' shows tactile_paving=no with a fixed text, namely 'This crossing does not have tactile paving' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "tactile_paving",
|
||||
"description": "Layer 'Crossings' shows tactile_paving=incorrect with a fixed text, namely 'This crossing has tactile paving, but is not correct' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "incorrect"
|
||||
},
|
||||
{
|
||||
"key": "button_operated",
|
||||
"description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "button_operated",
|
||||
"description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "red_turn:right:bicycle",
|
||||
"description": "Layer 'Crossings' shows red_turn:right:bicycle=yes with a fixed text, namely 'A cyclist can turn right if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B22.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "red_turn:right:bicycle",
|
||||
"description": "Layer 'Crossings' shows red_turn:right:bicycle=yes with a fixed text, namely 'A cyclist can turn right if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "red_turn:right:bicycle",
|
||||
"description": "Layer 'Crossings' shows red_turn:right:bicycle=no with a fixed text, namely 'A cyclist can not turn right if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "red_turn:straight:bicycle",
|
||||
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=yes with a fixed text, namely 'A cyclist can go straight on if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B23.svg' style='width: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "red_turn:straight:bicycle",
|
||||
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=yes with a fixed text, namely 'A cyclist can go straight on if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "red_turn:straight:bicycle",
|
||||
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=no with a fixed text, namely 'A cyclist can not go straight on if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
|
||||
"value": "no"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -500,6 +500,14 @@
|
|||
"description": "Layer 'Bike stations (repair, pump or both)' shows operator=De Fietsambassade Gent with a fixed text, namely '<a href='https://fietsambassade.gent.be/' target='_blank'>De Fietsambassade Gent</a>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
|
||||
"value": "De Fietsambassade Gent"
|
||||
},
|
||||
{
|
||||
"key": "email",
|
||||
"description": "Layer 'Bike stations (repair, pump or both)' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
|
||||
},
|
||||
{
|
||||
"key": "phone",
|
||||
"description": "Layer 'Bike stations (repair, pump or both)' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
|
||||
},
|
||||
{
|
||||
"key": "opening_hours",
|
||||
"description": "Layer 'Bike stations (repair, pump or both)' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
|
||||
|
@ -602,6 +610,11 @@
|
|||
"description": "Layer 'Bike stations (repair, pump or both)' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"key": "level",
|
||||
"description": "Layer 'Bike stations (repair, pump or both)' shows level= with a fixed text, namely 'Located on the ground floor' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists') Picking this answer will delete the key level.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "level",
|
||||
"description": "Layer 'Bike stations (repair, pump or both)' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
|
||||
|
|
309
Docs/TagInfo/mapcomplete_food.json
Normal file
|
@ -0,0 +1,309 @@
|
|||
{
|
||||
"data_format": 1,
|
||||
"project": {
|
||||
"name": "MapComplete Restaurants and fast food",
|
||||
"description": "Restaurants en fast food",
|
||||
"project_url": "https://mapcomplete.osm.be/food",
|
||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||
"icon_url": "https://mapcomplete.osm.be/assets/layers/food/restaurant.svg",
|
||||
"contact_name": "Pieter Vander Vennet, ",
|
||||
"contact_email": "pietervdvn@posteo.net"
|
||||
},
|
||||
"tags": [
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Restaurants and fast food has a layer Restaurants and fast food showing features with this tag",
|
||||
"value": "fast_food"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Restaurants and fast food has a layer Restaurants and fast food showing features with this tag",
|
||||
"value": "restaurant"
|
||||
},
|
||||
{
|
||||
"key": "image",
|
||||
"description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "mapillary",
|
||||
"description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikidata",
|
||||
"description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikipedia",
|
||||
"description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "name",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Restaurants and fast food')"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Restaurants and fast food' shows amenity=fast_food with a fixed text, namely 'Dit is een <b>fastfood-zaak</b>. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "fast_food"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Restaurants and fast food' shows amenity=restaurant with a fixed text, namely 'Dit is een <b>restaurant</b>. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "restaurant"
|
||||
},
|
||||
{
|
||||
"key": "opening_hours",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Restaurants and fast food')"
|
||||
},
|
||||
{
|
||||
"key": "website",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Restaurants and fast food')"
|
||||
},
|
||||
{
|
||||
"key": "email",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Restaurants and fast food')"
|
||||
},
|
||||
{
|
||||
"key": "phone",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Restaurants and fast food')"
|
||||
},
|
||||
{
|
||||
"key": "payment:cash",
|
||||
"description": "Layer 'Restaurants and fast food' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "payment:cards",
|
||||
"description": "Layer 'Restaurants and fast food' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "designated"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Restaurants and fast food' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Restaurants and fast food' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Restaurants and fast food' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'cuisine' (in the MapComplete.osm.be theme 'Restaurants and fast food')"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=pizza with a fixed text, namely 'This is a pizzeria' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "pizza"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=friture with a fixed text, namely 'This is a friture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "friture"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=pasta with a fixed text, namely 'Mainly serves pasta' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "pasta"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=kebab with a fixed text, namely 'Dit is een kebabzaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "kebab"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=sandwich with a fixed text, namely 'Dit is een broodjeszaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "sandwich"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=burger with a fixed text, namely 'Dit is een hamburgerrestaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "burger"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=sushi with a fixed text, namely 'Dit is een sushirestaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "sushi"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=coffee with a fixed text, namely 'Dit is een koffiezaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "coffee"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=italian with a fixed text, namely 'Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "italian"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=french with a fixed text, namely 'Dit is een Frans restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "french"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=chinese with a fixed text, namely 'Dit is een Chinees restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "chinese"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=greek with a fixed text, namely 'Dit is een Grieks restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "greek"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=indian with a fixed text, namely 'Dit is een Indisch restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "indian"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=turkish with a fixed text, namely 'Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "turkish"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=thai with a fixed text, namely 'Dit is een Thaïs restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "thai"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Restaurants and fast food' shows takeaway=only with a fixed text, namely 'This is a take-away only business' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Restaurants and fast food' shows takeaway=yes with a fixed text, namely 'Take-away is possible here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Restaurants and fast food' shows takeaway=no with a fixed text, namely 'Take-away is not possible here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=no with a fixed text, namely 'Geen vegetarische opties beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=limited with a fixed text, namely 'Beperkte vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=yes with a fixed text, namely 'Vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=only with a fixed text, namely 'Enkel vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=no with a fixed text, namely 'Geen veganistische opties beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=limited with a fixed text, namely 'Beperkte veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=yes with a fixed text, namely 'Veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=only with a fixed text, namely 'Enkel veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:halal=no with a fixed text, namely 'There are no halal options available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:halal=limited with a fixed text, namely 'There is a small halal menu' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:halal=yes with a fixed text, namely 'There is a halal menu' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:halal=only with a fixed text, namely 'Only halal options are available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=yes with a fixed text, namely 'Er zijn vegetarische snacks aanwezig' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=limited with a fixed text, namely 'Slechts enkele vegetarische snacks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=no with a fixed text, namely 'Geen vegetarische snacks beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=yes with a fixed text, namely 'Er zijn veganistische snacks aanwezig' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=limited with a fixed text, namely 'Slechts enkele veganistische snacks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=no with a fixed text, namely 'Geen veganistische snacks beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "friture:oil",
|
||||
"description": "Layer 'Restaurants and fast food' shows friture:oil=vegetable with a fixed text, namely 'Plantaardige olie' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "vegetable"
|
||||
},
|
||||
{
|
||||
"key": "friture:oil",
|
||||
"description": "Layer 'Restaurants and fast food' shows friture:oil=animal with a fixed text, namely 'Dierlijk vet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "animal"
|
||||
},
|
||||
{
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Restaurants and fast food' shows reusable_packaging:accept=yes with a fixed text, namely 'You can bring <b>your own containers</b> to get your order, saving on single-use packaging material and thus waste' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Restaurants and fast food' shows reusable_packaging:accept=no with a fixed text, namely 'Bringing your own container is <b>not allowed</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Restaurants and fast food' shows reusable_packaging:accept=only with a fixed text, namely 'You <b>must</b> bring your own container to order here.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Restaurants and fast food')",
|
||||
"value": "only"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -12,93 +12,597 @@
|
|||
"tags": [
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "The MapComplete theme Friturenkaart has a layer Frituren showing features with this tag"
|
||||
"description": "The MapComplete theme Friturenkaart has a layer Fries shop showing features with this tag",
|
||||
"value": "friture"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Friturenkaart has a layer Fries shop showing features with this tag",
|
||||
"value": "fast_food"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Friturenkaart has a layer Fries shop showing features with this tag",
|
||||
"value": "restaurant"
|
||||
},
|
||||
{
|
||||
"key": "image",
|
||||
"description": "The layer 'Frituren allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
"description": "The layer 'Fries shop allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "mapillary",
|
||||
"description": "The layer 'Frituren allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
"description": "The layer 'Fries shop allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikidata",
|
||||
"description": "The layer 'Frituren allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
"description": "The layer 'Fries shop allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikipedia",
|
||||
"description": "The layer 'Frituren allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
"description": "The layer 'Fries shop allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "name",
|
||||
"description": "Layer 'Frituren' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
"description": "Layer 'Fries shop' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Fries shop' shows amenity=fast_food with a fixed text, namely 'Dit is een <b>fastfood-zaak</b>. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "fast_food"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Fries shop' shows amenity=restaurant with a fixed text, namely 'Dit is een <b>restaurant</b>. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "restaurant"
|
||||
},
|
||||
{
|
||||
"key": "opening_hours",
|
||||
"description": "Layer 'Frituren' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
"description": "Layer 'Fries shop' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "website",
|
||||
"description": "Layer 'Frituren' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
"description": "Layer 'Fries shop' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "email",
|
||||
"description": "Layer 'Fries shop' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "phone",
|
||||
"description": "Layer 'Frituren' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
"description": "Layer 'Fries shop' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Frituren' shows diet:vegetarian=yes with a fixed text, namely 'Er zijn vegetarische snacks aanwezig' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"key": "payment:cash",
|
||||
"description": "Layer 'Fries shop' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "payment:cards",
|
||||
"description": "Layer 'Fries shop' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Fries shop' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "designated"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Fries shop' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Fries shop' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Fries shop' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows and asks freeform values for key 'cuisine' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=pizza with a fixed text, namely 'This is a pizzeria' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "pizza"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=friture with a fixed text, namely 'This is a friture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "friture"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=pasta with a fixed text, namely 'Mainly serves pasta' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "pasta"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=kebab with a fixed text, namely 'Dit is een kebabzaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "kebab"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=sandwich with a fixed text, namely 'Dit is een broodjeszaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "sandwich"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=burger with a fixed text, namely 'Dit is een hamburgerrestaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "burger"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=sushi with a fixed text, namely 'Dit is een sushirestaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "sushi"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=coffee with a fixed text, namely 'Dit is een koffiezaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "coffee"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=italian with a fixed text, namely 'Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "italian"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=french with a fixed text, namely 'Dit is een Frans restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "french"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=chinese with a fixed text, namely 'Dit is een Chinees restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "chinese"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=greek with a fixed text, namely 'Dit is een Grieks restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "greek"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=indian with a fixed text, namely 'Dit is een Indisch restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "indian"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=turkish with a fixed text, namely 'Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "turkish"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Fries shop' shows cuisine=thai with a fixed text, namely 'Dit is een Thaïs restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "thai"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Fries shop' shows takeaway=only with a fixed text, namely 'This is a take-away only business' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Fries shop' shows takeaway=yes with a fixed text, namely 'Take-away is possible here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Fries shop' shows takeaway=no with a fixed text, namely 'Take-away is not possible here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Frituren' shows diet:vegetarian=limited with a fixed text, namely 'Slechts enkele vegetarische snacks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"description": "Layer 'Fries shop' shows diet:vegetarian=no with a fixed text, namely 'Geen vegetarische opties beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Fries shop' shows diet:vegetarian=limited with a fixed text, namely 'Beperkte vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Frituren' shows diet:vegetarian=no with a fixed text, namely 'Geen vegetarische snacks beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"description": "Layer 'Fries shop' shows diet:vegetarian=yes with a fixed text, namely 'Vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Fries shop' shows diet:vegetarian=only with a fixed text, namely 'Enkel vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Fries shop' shows diet:vegan=no with a fixed text, namely 'Geen veganistische opties beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Frituren' shows diet:vegan=yes with a fixed text, namely 'Er zijn veganistische snacks aanwezig' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"description": "Layer 'Fries shop' shows diet:vegan=limited with a fixed text, namely 'Beperkte veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Fries shop' shows diet:vegan=yes with a fixed text, namely 'Veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Frituren' shows diet:vegan=limited with a fixed text, namely 'Slechts enkele veganistische snacks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"description": "Layer 'Fries shop' shows diet:vegan=only with a fixed text, namely 'Enkel veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Fries shop' shows diet:halal=no with a fixed text, namely 'There are no halal options available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Fries shop' shows diet:halal=limited with a fixed text, namely 'There is a small halal menu' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Fries shop' shows diet:halal=yes with a fixed text, namely 'There is a halal menu' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Fries shop' shows diet:halal=only with a fixed text, namely 'Only halal options are available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Fries shop' shows diet:vegetarian=yes with a fixed text, namely 'Er zijn vegetarische snacks aanwezig' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Fries shop' shows diet:vegetarian=limited with a fixed text, namely 'Slechts enkele vegetarische snacks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Frituren' shows diet:vegetarian=no with a fixed text, namely 'Geen veganistische snacks beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"description": "Layer 'Fries shop' shows diet:vegetarian=no with a fixed text, namely 'Geen vegetarische snacks beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Fries shop' shows diet:vegan=yes with a fixed text, namely 'Er zijn veganistische snacks aanwezig' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Fries shop' shows diet:vegan=limited with a fixed text, namely 'Slechts enkele veganistische snacks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Fries shop' shows diet:vegan=no with a fixed text, namely 'Geen veganistische snacks beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "friture:oil",
|
||||
"description": "Layer 'Frituren' shows friture:oil=vegetable with a fixed text, namely 'Plantaardige olie' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"description": "Layer 'Fries shop' shows friture:oil=vegetable with a fixed text, namely 'Plantaardige olie' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "vegetable"
|
||||
},
|
||||
{
|
||||
"key": "friture:oil",
|
||||
"description": "Layer 'Frituren' shows friture:oil=animal with a fixed text, namely 'Dierlijk vet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"description": "Layer 'Fries shop' shows friture:oil=animal with a fixed text, namely 'Dierlijk vet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "animal"
|
||||
},
|
||||
{
|
||||
"key": "bulk_purchase",
|
||||
"description": "Layer 'Frituren' shows bulk_purchase=yes with a fixed text, namely 'You can bring <b>your own containers</b> to get your order, saving on single-use packaging material and thus waste' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Fries shop' shows reusable_packaging:accept=yes with a fixed text, namely 'You can bring <b>your own containers</b> to get your order, saving on single-use packaging material and thus waste' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "bulk_purchase",
|
||||
"description": "Layer 'Frituren' shows bulk_purchase=no with a fixed text, namely 'Bringing your own container is <b>not allowed</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Fries shop' shows reusable_packaging:accept=no with a fixed text, namely 'Bringing your own container is <b>not allowed</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "bulk_purchase",
|
||||
"description": "Layer 'Frituren' shows bulk_purchase=only with a fixed text, namely 'You <b>must</b> bring your own container to order here.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Fries shop' shows reusable_packaging:accept=only with a fixed text, namely 'You <b>must</b> bring your own container to order here.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Friturenkaart has a layer Restaurants and fast food showing features with this tag",
|
||||
"value": "fast_food"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "The MapComplete theme Friturenkaart has a layer Restaurants and fast food showing features with this tag",
|
||||
"value": "restaurant"
|
||||
},
|
||||
{
|
||||
"key": "image",
|
||||
"description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "mapillary",
|
||||
"description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikidata",
|
||||
"description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "wikipedia",
|
||||
"description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
|
||||
},
|
||||
{
|
||||
"key": "name",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Restaurants and fast food' shows amenity=fast_food with a fixed text, namely 'Dit is een <b>fastfood-zaak</b>. De focus ligt op snelle bediening, zitplaatsen zijn vaak beperkt en functioneel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "fast_food"
|
||||
},
|
||||
{
|
||||
"key": "amenity",
|
||||
"description": "Layer 'Restaurants and fast food' shows amenity=restaurant with a fixed text, namely 'Dit is een <b>restaurant</b>. De focus ligt op een aangename ervaring waar je aan tafel wordt bediend' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "restaurant"
|
||||
},
|
||||
{
|
||||
"key": "opening_hours",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "website",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "email",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "phone",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "payment:cash",
|
||||
"description": "Layer 'Restaurants and fast food' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "payment:cards",
|
||||
"description": "Layer 'Restaurants and fast food' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "designated"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Restaurants and fast food' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Restaurants and fast food' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Restaurants and fast food' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'cuisine' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=pizza with a fixed text, namely 'This is a pizzeria' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "pizza"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=friture with a fixed text, namely 'This is a friture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "friture"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=pasta with a fixed text, namely 'Mainly serves pasta' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "pasta"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=kebab with a fixed text, namely 'Dit is een kebabzaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "kebab"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=sandwich with a fixed text, namely 'Dit is een broodjeszaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "sandwich"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=burger with a fixed text, namely 'Dit is een hamburgerrestaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "burger"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=sushi with a fixed text, namely 'Dit is een sushirestaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "sushi"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=coffee with a fixed text, namely 'Dit is een koffiezaak' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "coffee"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=italian with a fixed text, namely 'Dit is een Italiaans restaurant (dat meer dan enkel pasta of pizza verkoopt)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "italian"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=french with a fixed text, namely 'Dit is een Frans restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "french"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=chinese with a fixed text, namely 'Dit is een Chinees restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "chinese"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=greek with a fixed text, namely 'Dit is een Grieks restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "greek"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=indian with a fixed text, namely 'Dit is een Indisch restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "indian"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=turkish with a fixed text, namely 'Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "turkish"
|
||||
},
|
||||
{
|
||||
"key": "cuisine",
|
||||
"description": "Layer 'Restaurants and fast food' shows cuisine=thai with a fixed text, namely 'Dit is een Thaïs restaurant' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "thai"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Restaurants and fast food' shows takeaway=only with a fixed text, namely 'This is a take-away only business' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Restaurants and fast food' shows takeaway=yes with a fixed text, namely 'Take-away is possible here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "takeaway",
|
||||
"description": "Layer 'Restaurants and fast food' shows takeaway=no with a fixed text, namely 'Take-away is not possible here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=no with a fixed text, namely 'Geen vegetarische opties beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=limited with a fixed text, namely 'Beperkte vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=yes with a fixed text, namely 'Vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=only with a fixed text, namely 'Enkel vegetarische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=no with a fixed text, namely 'Geen veganistische opties beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=limited with a fixed text, namely 'Beperkte veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=yes with a fixed text, namely 'Veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=only with a fixed text, namely 'Enkel veganistische opties zijn beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:halal=no with a fixed text, namely 'There are no halal options available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:halal=limited with a fixed text, namely 'There is a small halal menu' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:halal=yes with a fixed text, namely 'There is a halal menu' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:halal",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:halal=only with a fixed text, namely 'Only halal options are available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=yes with a fixed text, namely 'Er zijn vegetarische snacks aanwezig' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=limited with a fixed text, namely 'Slechts enkele vegetarische snacks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegetarian",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegetarian=no with a fixed text, namely 'Geen vegetarische snacks beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=yes with a fixed text, namely 'Er zijn veganistische snacks aanwezig' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=limited with a fixed text, namely 'Slechts enkele veganistische snacks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "diet:vegan",
|
||||
"description": "Layer 'Restaurants and fast food' shows diet:vegan=no with a fixed text, namely 'Geen veganistische snacks beschikbaar' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "friture:oil",
|
||||
"description": "Layer 'Restaurants and fast food' shows friture:oil=vegetable with a fixed text, namely 'Plantaardige olie' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "vegetable"
|
||||
},
|
||||
{
|
||||
"key": "friture:oil",
|
||||
"description": "Layer 'Restaurants and fast food' shows friture:oil=animal with a fixed text, namely 'Dierlijk vet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "animal"
|
||||
},
|
||||
{
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Restaurants and fast food' shows reusable_packaging:accept=yes with a fixed text, namely 'You can bring <b>your own containers</b> to get your order, saving on single-use packaging material and thus waste' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Restaurants and fast food' shows reusable_packaging:accept=no with a fixed text, namely 'Bringing your own container is <b>not allowed</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "reusable_packaging:accept",
|
||||
"description": "Layer 'Restaurants and fast food' shows reusable_packaging:accept=only with a fixed text, namely 'You <b>must</b> bring your own container to order here.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Friturenkaart')",
|
||||
"value": "only"
|
||||
}
|
||||
]
|
||||
|
|
88
Docs/TagInfo/mapcomplete_hackerspaces.json
Normal file
|
@ -0,0 +1,88 @@
|
|||
{
|
||||
"data_format": 1,
|
||||
"project": {
|
||||
"name": "MapComplete Hackerspaces",
|
||||
"description": "A map of hackerspaces",
|
||||
"project_url": "https://mapcomplete.osm.be/hackerspaces",
|
||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/hackerspaces/glider.svg",
|
||||
"contact_name": "Pieter Vander Vennet, ",
|
||||
"contact_email": "pietervdvn@posteo.net"
|
||||
},
|
||||
"tags": [
|
||||
{
|
||||
"key": "leisure",
|
||||
"description": "The MapComplete theme Hackerspaces has a layer Hackerspace showing features with this tag",
|
||||
"value": "hackerspace"
|
||||
},
|
||||
{
|
||||
"key": "hackerspace",
|
||||
"description": "Layer 'Hackerspace' shows hackerspace=makerspace with a fixed text, namely 'This is a makerspace' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')",
|
||||
"value": "makerspace"
|
||||
},
|
||||
{
|
||||
"key": "hackerspace",
|
||||
"description": "Layer 'Hackerspace' shows hackerspace= with a fixed text, namely 'This is a traditional (software oriented) hackerspace' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces') Picking this answer will delete the key hackerspace.",
|
||||
"value": ""
|
||||
},
|
||||
{
|
||||
"key": "name",
|
||||
"description": "Layer 'Hackerspace' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Hackerspaces')"
|
||||
},
|
||||
{
|
||||
"key": "website",
|
||||
"description": "Layer 'Hackerspace' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Hackerspaces')"
|
||||
},
|
||||
{
|
||||
"key": "email",
|
||||
"description": "Layer 'Hackerspace' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Hackerspaces')"
|
||||
},
|
||||
{
|
||||
"key": "phone",
|
||||
"description": "Layer 'Hackerspace' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Hackerspaces')"
|
||||
},
|
||||
{
|
||||
"key": "opening_hours",
|
||||
"description": "Layer 'Hackerspace' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Hackerspaces')"
|
||||
},
|
||||
{
|
||||
"key": "opening_hours",
|
||||
"description": "Layer 'Hackerspace' shows opening_hours=24/7 with a fixed text, namely 'Opened 24/7' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')",
|
||||
"value": "24/7"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Hackerspace' shows wheelchair=designated with a fixed text, namely 'This place is specially adapated for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')",
|
||||
"value": "designated"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Hackerspace' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Hackerspace' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')",
|
||||
"value": "limited"
|
||||
},
|
||||
{
|
||||
"key": "wheelchair",
|
||||
"description": "Layer 'Hackerspace' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "drink:club-mate",
|
||||
"description": "Layer 'Hackerspace' shows drink:club-mate=yes with a fixed text, namely 'This hackerspace serves club mate' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')",
|
||||
"value": "yes"
|
||||
},
|
||||
{
|
||||
"key": "drink:club-mate",
|
||||
"description": "Layer 'Hackerspace' shows drink:club-mate=no with a fixed text, namely 'This hackerspace is not worthy of the name hackerspace as it does not serve club mate' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hackerspaces')",
|
||||
"value": "no"
|
||||
},
|
||||
{
|
||||
"key": "start_date",
|
||||
"description": "Layer 'Hackerspace' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'Hackerspaces')"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -132,6 +132,25 @@
|
|||
"key": "changing_table:location",
|
||||
"description": "Layer 'Toilets' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||
"value": "dedicated_room"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:charge",
|
||||
"description": "Layer 'Toilets' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Open Toilet Map')"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Toilets' shows service:bicycle:cleaning:fee=no&service:bicycle:cleaning:charge= with a fixed text, namely 'The cleaning service is free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||
"value": "no&service:bicycle:cleaning:charge="
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Toilets' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||
"value": "no&"
|
||||
},
|
||||
{
|
||||
"key": "service:bicycle:cleaning:fee",
|
||||
"description": "Layer 'Toilets' shows service:bicycle:cleaning:fee=yes with a fixed text, namely 'The cleaning service has a fee' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||
"value": "yes"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,48 +1,59 @@
|
|||
Tags format
|
||||
Tags format
|
||||
=============
|
||||
|
||||
When creating the `json` file describing your layer or theme, you'll have to add a few tags to describe what you want. This document gives an overview of what every expression means and how it behaves in edge cases.
|
||||
When creating the `json` file describing your layer or theme, you'll have to add a few tags to describe what you want.
|
||||
This document gives an overview of what every expression means and how it behaves in edge cases.
|
||||
|
||||
Strict equality
|
||||
---------------
|
||||
|
||||
Strict equality is denoted by `key=value`. This key matches __only if__ the keypair is present exactly as stated.
|
||||
|
||||
**Only normal tags (eventually in an `and`) can be used in places where they are uploaded**. Normal tags are used in the `mappings` of a [TagRendering] (unless `hideInAnswer` is specified), they are used in `addExtraTags` of [Freeform] and are used in the `tags`-list of a preset.
|
||||
**Only normal tags (eventually in an `and`) can be used in places where they are uploaded**. Normal tags are used in
|
||||
the `mappings` of a [TagRendering] (unless `hideInAnswer` is specified), they are used in `addExtraTags` of [Freeform]
|
||||
and are used in the `tags`-list of a preset.
|
||||
|
||||
If a different kind of tag specification is given, your theme will fail to parse.
|
||||
|
||||
### If key is not present
|
||||
|
||||
If you want to check if a key is not present, use `key=` (pronounce as *key is empty*). A tag collection will match this if `key` is missing or if `key` is a literal empty value.
|
||||
If you want to check if a key is not present, use `key=` (pronounce as *key is empty*). A tag collection will match this
|
||||
if `key` is missing or if `key` is a literal empty value.
|
||||
|
||||
### Removing a key
|
||||
|
||||
If a key should be deleted in the OpenStreetMap-database, specify `key=` as well. This can be used e.g. to remove a fixme or value from another mapping if another field is filled out.
|
||||
If a key should be deleted in the OpenStreetMap-database, specify `key=` as well. This can be used e.g. to remove a
|
||||
fixme or value from another mapping if another field is filled out.
|
||||
|
||||
Strict not equals
|
||||
-----------------
|
||||
|
||||
To check if a key does _not_ equal a certain value, use `key!=value`. This is converted behind the scenes to `key!~^value$`
|
||||
To check if a key does _not_ equal a certain value, use `key!=value`. This is converted behind the scenes
|
||||
to `key!~^value$`
|
||||
|
||||
### If key is present
|
||||
|
||||
This implies that, to check if a key is present, `key!=` can be used. This will only match if the key is present and not empty.
|
||||
This implies that, to check if a key is present, `key!=` can be used. This will only match if the key is present and not
|
||||
empty.
|
||||
|
||||
Number comparison
|
||||
-----------------
|
||||
|
||||
If the value of a tag is a number (e.g. `key=42`), one can use a filter `key<=42`, `key>=35`, `key>40` or `key<50` to match this, e.g. in conditions for renderings.
|
||||
These tags cannot be used to generate an answer nor can they be used to request data upstream from overpass.
|
||||
If the value of a tag is a number (e.g. `key=42`), one can use a filter `key<=42`, `key>=35`, `key>40` or `key<50` to
|
||||
match this, e.g. in conditions for renderings. These tags cannot be used to generate an answer nor can they be used to
|
||||
request data upstream from overpass.
|
||||
|
||||
Note that the value coming from OSM will first be stripped by removing all non-numeric characters. For example, `length=42 meter` will be interpreted as `length=42` and will thus match `length<=42` and `length>=42`.
|
||||
In special circumstances (e.g. `surface_area=42 m2` or `length=100 feet`), this will result in erronous values (`surface=422` or if a length in meters is compared to).
|
||||
However, this can be partially alleviated by using 'Units' to rewrite to a default format.
|
||||
Note that the value coming from OSM will first be stripped by removing all non-numeric characters. For
|
||||
example, `length=42 meter` will be interpreted as `length=42` and will thus match `length<=42` and `length>=42`. In
|
||||
special circumstances (e.g. `surface_area=42 m2` or `length=100 feet`), this will result in erronous
|
||||
values (`surface=422` or if a length in meters is compared to). However, this can be partially alleviated by using '
|
||||
Units' to rewrite to a default format.
|
||||
|
||||
Regex equals
|
||||
------------
|
||||
|
||||
A tag can also be tested against a regex with `key~regex`. Note that this regex __must match__ the entire value. If the value is allowed to appear anywhere as substring, use `key~.*regex.*`
|
||||
A tag can also be tested against a regex with `key~regex`. Note that this regex __must match__ the entire value. If the
|
||||
value is allowed to appear anywhere as substring, use `key~.*regex.*`
|
||||
|
||||
Equivalently, `key!~regex` can be used if you _don't_ want to match the regex in order to appear.
|
||||
|
||||
|
@ -52,16 +63,18 @@ Using other tags as variables
|
|||
|
||||
**This is an advanced feature - use with caution**
|
||||
|
||||
Some tags are automatically set or calculated - see [CalculatedTags](CalculatedTags.md) for an entire overview.
|
||||
If one wants to apply such a value as tag, use a substituting-tag such, for example`survey:date:={_date:now}`. Note that the separator between key and value here is `:=`.
|
||||
The text between `{` and `}` is interpreted as a key, and the respective value is substituted into the string.
|
||||
Some tags are automatically set or calculated - see [CalculatedTags](CalculatedTags.md) for an entire overview. If one
|
||||
wants to apply such a value as tag, use a substituting-tag such, for example`survey:date:={_date:now}`. Note that the
|
||||
separator between key and value here is `:=`. The text between `{` and `}` is interpreted as a key, and the respective
|
||||
value is substituted into the string.
|
||||
|
||||
One can also append, e.g. `key:={some_key} fixed text {some_other_key}`.
|
||||
|
||||
An assigning tag _cannot_ be used to query OpenStreetMap/Overpass.
|
||||
|
||||
If using a key or variable which might not be defined, add a condition in the mapping to hide the option.
|
||||
This is because, if `some_other_key` is not defined, one might actually upload the literal text `key={some_other_key}` to OSM - which we do not want.
|
||||
If using a key or variable which might not be defined, add a condition in the mapping to hide the option. This is
|
||||
because, if `some_other_key` is not defined, one might actually upload the literal text `key={some_other_key}` to OSM -
|
||||
which we do not want.
|
||||
|
||||
To mitigate this, use:
|
||||
|
||||
|
|
|
@ -1,26 +1,23 @@
|
|||
Talk at State of the Map
|
||||
========================
|
||||
|
||||
Talk at State of the Map
|
||||
========================
|
||||
I'm planning to do a talk/video on MapComplete on _State of the Map 2021_. This document outlines the structure of the
|
||||
talk and serves as my speaker notes.
|
||||
|
||||
I'm planning to do a talk/video on MapComplete on _State of the Map 2021_. This document outlines the structure of the talk and serves as my speaker notes.
|
||||
Overview
|
||||
--------
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
1. What is MapComplete? Three slides
|
||||
2. Already one year old!
|
||||
1. What is MapComplete? Three slides
|
||||
2. Already one year old!
|
||||
a. Where and how did it start? "This project isn't going anywhere"
|
||||
(buurtnatuur, cyclofix, Antwerpen, Natuurpunt, Oost-Vlaanderen?, Toerisme Vlaanderen?)
|
||||
b. Where are we now? Some cool statistics
|
||||
3. The vision
|
||||
a. Your granny can use it
|
||||
a. pragmatism - somewhat working today is better then something perfect tomorrow
|
||||
a. It's a trap! Cool thematic map (as iframe on website) -> the OSM rabbit hole -> easy start -> more features when mapping more -> oh, I can make a theme too!
|
||||
b. The pareto frontier of 'easy to use' vs 'number of features'
|
||||
c. The thematic approach (+ disabling/enabling features per theme/view)
|
||||
3. The vision a. Your granny can use it a. pragmatism - somewhat working today is better then something perfect tomorrow
|
||||
a. It's a trap! Cool thematic map (as iframe on website) -> the OSM rabbit hole -> easy start -> more features when
|
||||
mapping more -> oh, I can make a theme too!
|
||||
b. The pareto frontier of 'easy to use' vs 'number of features' c. The thematic approach (+ disabling/enabling
|
||||
features per theme/view)
|
||||
|
||||
|
||||
4. The future
|
||||
a. paid projects? Microgrant for a better theme creator?
|
||||
b. user contributed themes (see you next talk!)
|
||||
5. OpenStreetMap is Cool!
|
||||
4. The future a. paid projects? Microgrant for a better theme creator? b. user contributed themes (see you next talk!)
|
||||
5. OpenStreetMap is Cool!
|
||||
|
|
After Width: | Height: | Size: 136 KiB |
|
@ -198,7 +198,7 @@ interface PlotSpec {
|
|||
function createGraph(
|
||||
title: string,
|
||||
...options: PlotSpec[]) {
|
||||
const process = exec("python GenPlot.py \"graphs/" + title + "\"", ((error, stdout, stderr) => {
|
||||
const process = exec("python3 GenPlot.py \"graphs/" + title + "\"", ((error, stdout, stderr) => {
|
||||
console.log("Python: ", stdout)
|
||||
if (error !== null) {
|
||||
console.error(error)
|
||||
|
@ -216,12 +216,6 @@ function createGraph(
|
|||
}
|
||||
|
||||
class Histogram<K> {
|
||||
total(): number {
|
||||
let total = 0
|
||||
Array.from(this.counts.values()).forEach(i => total = total + i)
|
||||
return total
|
||||
}
|
||||
|
||||
public counts: Map<K, number> = new Map<K, number>()
|
||||
private sortAtEnd: K[] = []
|
||||
|
||||
|
@ -230,6 +224,11 @@ class Histogram<K> {
|
|||
keys?.forEach(key => self.bump(key))
|
||||
}
|
||||
|
||||
total(): number {
|
||||
let total = 0
|
||||
Array.from(this.counts.values()).forEach(i => total = total + i)
|
||||
return total
|
||||
}
|
||||
|
||||
public bump(key: K, increase = 1) {
|
||||
if (this.counts.has(key)) {
|
||||
|
@ -506,13 +505,6 @@ function stackHists<K, V>(hists: [V, Histogram<K>][]): [V, Histogram<K>][] {
|
|||
|
||||
function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: string) {
|
||||
const hist = new Histogram<string>(allFeatures.map(f => f.properties.metadata.theme))
|
||||
hist
|
||||
.addCountToName()
|
||||
.createOthersCategory("other", 40)
|
||||
.asPie({
|
||||
name: "Changesets per theme" + appliedFilterDescription
|
||||
}).render()
|
||||
|
||||
hist
|
||||
.createOthersCategory("other", 20)
|
||||
.addCountToName()
|
||||
|
@ -533,6 +525,12 @@ function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: st
|
|||
name: "Changesets per host" + appliedFilterDescription
|
||||
}).render()
|
||||
|
||||
new Histogram<string>(allFeatures.map(f => f.properties.metadata.theme))
|
||||
.createOthersCategory("< 25 changesets", 25)
|
||||
.addCountToName()
|
||||
.asPie({
|
||||
name: "Changesets per theme (pie)" + appliedFilterDescription
|
||||
}).render()
|
||||
|
||||
Group.createStackedBarChartPerDay(
|
||||
"Changesets per theme" + appliedFilterDescription,
|
||||
|
@ -619,7 +617,7 @@ const geojson = {
|
|||
})
|
||||
}
|
||||
|
||||
writeFileSync("centerpoints.geojson",JSON.stringify(geojson, undefined, 2) )
|
||||
writeFileSync("centerpoints.geojson", JSON.stringify(geojson, undefined, 2))
|
||||
|
||||
|
||||
createGraphs(allFeatures, "")
|
||||
|
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 264 KiB |
Before Width: | Height: | Size: 196 KiB After Width: | Height: | Size: 216 KiB |
Before Width: | Height: | Size: 231 KiB After Width: | Height: | Size: 232 KiB |
Before Width: | Height: | Size: 477 KiB After Width: | Height: | Size: 507 KiB |
Before Width: | Height: | Size: 514 KiB After Width: | Height: | Size: 531 KiB |
BIN
Docs/Tools/graphs/Changesets per theme (pie) in 2020.png
Normal file
After Width: | Height: | Size: 264 KiB |
BIN
Docs/Tools/graphs/Changesets per theme (pie) in 2021.png
Normal file
After Width: | Height: | Size: 623 KiB |
BIN
Docs/Tools/graphs/Changesets per theme (pie).png
Normal file
After Width: | Height: | Size: 718 KiB |
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 176 KiB |
Before Width: | Height: | Size: 382 KiB After Width: | Height: | Size: 394 KiB |
Before Width: | Height: | Size: 436 KiB After Width: | Height: | Size: 449 KiB |
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 177 KiB |
Before Width: | Height: | Size: 352 KiB After Width: | Height: | Size: 370 KiB |
Before Width: | Height: | Size: 427 KiB After Width: | Height: | Size: 443 KiB |
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 133 KiB |
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 118 KiB |
BIN
Docs/Tools/graphs/Contributors per day in 2020.png
Normal file
After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 138 KiB |
Before Width: | Height: | Size: 138 KiB |
BIN
Docs/Tools/graphs/Contributors per day in 2021.png
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
Docs/Tools/graphs/Contributors per day.png
Normal file
After Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 98 KiB |
13151
Docs/Tools/stats/stats.2021-9.json
Normal file
|
@ -1,4 +1,3 @@
|
|||
|
||||
URL-parameters and URL-hash
|
||||
============================
|
||||
|
||||
|
@ -9,8 +8,8 @@ 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:
|
||||
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
|
||||
|
@ -19,162 +18,176 @@ the URL-parameters are stated in the part between the `?` and the `#`. There are
|
|||
|
||||
Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case.
|
||||
|
||||
language
|
||||
----------
|
||||
|
||||
The language to display mapcomplete in. Will be ignored in case a logged-in-user did set their language before. If the specified language does not exist, it will default to the first language in the theme.
|
||||
|
||||
download-control-toggle
|
||||
download-control-toggle
|
||||
-------------------------
|
||||
|
||||
Whether or not the download panel is shown The default value is _false_
|
||||
Whether or not the download panel is shown The default value is _false_
|
||||
|
||||
|
||||
filter-toggle
|
||||
filter-toggle
|
||||
---------------
|
||||
|
||||
Whether or not the filter view is shown The default value is _false_
|
||||
Whether or not the filter view is shown The default value is _false_
|
||||
|
||||
|
||||
tab
|
||||
tab
|
||||
-----
|
||||
|
||||
The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >50 changesets) The default value is _0_
|
||||
The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 =
|
||||
more themes, 4 = about mapcomplete (user must be logged in and have >50 changesets) The default value is _0_
|
||||
|
||||
|
||||
z
|
||||
z
|
||||
---
|
||||
|
||||
The initial/current zoom level The default value is _0_
|
||||
The initial/current zoom level The default value is _0_
|
||||
|
||||
|
||||
lat
|
||||
lat
|
||||
-----
|
||||
|
||||
The initial/current latitude The default value is _0_
|
||||
The initial/current latitude The default value is _0_
|
||||
|
||||
|
||||
lon
|
||||
lon
|
||||
-----
|
||||
|
||||
The initial/current longitude of the app The default value is _0_
|
||||
The initial/current longitude of the app The default value is _0_
|
||||
|
||||
|
||||
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
|
||||
fs-iframe
|
||||
-----------
|
||||
|
||||
Disables/Enables the iframe-popup The default value is _false_
|
||||
Disables/Enables the iframe-popup The default value is _false_
|
||||
|
||||
|
||||
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_
|
||||
|
||||
|
||||
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_
|
||||
|
||||
|
||||
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_
|
||||
|
||||
|
||||
custom-css
|
||||
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_
|
||||
|
||||
|
||||
overpassTimeout
|
||||
-----------------
|
||||
|
||||
Set a different timeout (in seconds) for queries in overpass The default value is _30_
|
||||
|
||||
|
||||
custom-css
|
||||
------------
|
||||
|
||||
If specified, the custom css from the given link will be loaded additionaly The default value is __
|
||||
If specified, the custom css from the given link will be loaded additionaly The default value is __
|
||||
|
||||
|
||||
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 <layer-id> is shown The default value is _true_ Generated from QueryParameters
|
||||
Wether or not the layer with id <layer-id> is shown The default value is _true_ Generated from QueryParameters
|
|
@ -3,6 +3,8 @@ What is MapComplete?
|
|||
|
||||
MapComplete is a website where people can see a map of Points of Interest (POI) on a specific subject or theme.
|
||||
|
||||
If the visitor is logged in with their OpenStreetMap account, information about a selected POI can be enriched by answering questions in the respective popups; this data is sent back directly to OpenStreetMap.
|
||||
If the visitor is logged in with their OpenStreetMap account, information about a selected POI can be enriched by
|
||||
answering questions in the respective popups; this data is sent back directly to OpenStreetMap.
|
||||
|
||||
While there are some predefined themes available, it is also possible to create your own theme. Have a look on [the OpenStreetMap-wiki](https://wiki.openstreetmap.org/wiki/MapComplete) for a list of (un)official themes.
|
||||
While there are some predefined themes available, it is also possible to create your own theme. Have a look
|
||||
on [the OpenStreetMap-wiki](https://wiki.openstreetmap.org/wiki/MapComplete) for a list of (un)official themes.
|
|
@ -1,6 +1,5 @@
|
|||
import {FixedUiElement} from "./UI/Base/FixedUiElement";
|
||||
import Toggle from "./UI/Input/Toggle";
|
||||
import {Basemap} from "./UI/BigComponents/Basemap";
|
||||
import State from "./State";
|
||||
import LoadFromOverpass from "./Logic/Actors/OverpassFeatureSource";
|
||||
import {UIEventSource} from "./Logic/UIEventSource";
|
||||
|
@ -38,6 +37,8 @@ import RightControls from "./UI/BigComponents/RightControls";
|
|||
import {LayoutConfigJson} from "./Models/ThemeConfig/Json/LayoutConfigJson";
|
||||
import LayoutConfig from "./Models/ThemeConfig/LayoutConfig";
|
||||
import LayerConfig from "./Models/ThemeConfig/LayerConfig";
|
||||
import Minimap from "./UI/Base/Minimap";
|
||||
import Constants from "./Models/Constants";
|
||||
|
||||
export class InitUiElements {
|
||||
static InitAll(
|
||||
|
@ -274,10 +275,11 @@ export class InitUiElements {
|
|||
const help = new MapControlButton(Svg.help_svg());
|
||||
help.onClick(() => isOpened.setData(true));
|
||||
new Toggle(
|
||||
fullOptions.SetClass("welcomeMessage"),
|
||||
help,
|
||||
fullOptions.SetClass("welcomeMessage pointer-events-auto"),
|
||||
help.SetClass("pointer-events-auto"),
|
||||
isOpened
|
||||
).AttachTo("messagesbox");
|
||||
)
|
||||
.AttachTo("messagesbox");
|
||||
const openedTime = new Date().getTime();
|
||||
State.state.locationControl.addCallback(() => {
|
||||
if (new Date().getTime() - openedTime < 15 * 1000) {
|
||||
|
@ -334,14 +336,15 @@ export class InitUiElements {
|
|||
State.state.leafletMap
|
||||
);
|
||||
|
||||
const bm = new Basemap(
|
||||
"leafletDiv",
|
||||
State.state.locationControl,
|
||||
State.state.backgroundLayer,
|
||||
State.state.LastClickLocation,
|
||||
attr
|
||||
);
|
||||
State.state.leafletMap.setData(bm.map);
|
||||
new Minimap({
|
||||
background: State.state.backgroundLayer,
|
||||
location: State.state.locationControl,
|
||||
leafletMap: State.state.leafletMap,
|
||||
attribution: attr,
|
||||
lastClickLocation: State.state.LastClickLocation
|
||||
}).SetClass("w-full h-full")
|
||||
.AttachTo("leafletDiv")
|
||||
|
||||
const layout = State.state.layoutToUse.data;
|
||||
if (layout.lockLocation) {
|
||||
if (layout.lockLocation === true) {
|
||||
|
@ -360,8 +363,11 @@ export class InitUiElements {
|
|||
];
|
||||
}
|
||||
console.warn("Locking the bounds to ", layout.lockLocation);
|
||||
bm.map.setMaxBounds(layout.lockLocation);
|
||||
bm.map.setMinZoom(layout.startZoom);
|
||||
State.state.leafletMap.addCallbackAndRunD(map => {
|
||||
// @ts-ignore
|
||||
map.setMaxBounds(layout.lockLocation);
|
||||
map.setMinZoom(layout.startZoom);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -393,7 +399,10 @@ export class InitUiElements {
|
|||
const updater = new LoadFromOverpass(
|
||||
state.locationControl,
|
||||
state.layoutToUse,
|
||||
state.leafletMap
|
||||
state.leafletMap,
|
||||
state.overpassUrl,
|
||||
state.overpassTimeout,
|
||||
Constants.useOsmApiAt
|
||||
);
|
||||
State.state.layerUpdater = updater;
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@ import Svg from "../../Svg";
|
|||
import Img from "../../UI/Base/Img";
|
||||
import {LocalStorageSource} from "../Web/LocalStorageSource";
|
||||
import {VariableUiElement} from "../../UI/Base/VariableUIElement";
|
||||
import BaseUIElement from "../../UI/BaseUIElement";
|
||||
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
||||
import {QueryParameters} from "../Web/QueryParameters";
|
||||
|
||||
export default class GeoLocationHandler extends VariableUiElement {
|
||||
/**
|
||||
|
@ -94,8 +94,6 @@ export default class GeoLocationHandler extends VariableUiElement {
|
|||
super(
|
||||
hasLocation.map(
|
||||
(hasLocationData) => {
|
||||
let icon: BaseUIElement;
|
||||
console.log("Determining icon:", permission.data, isActive.data, hasLocationData, isLocked.data, lastClickWithinThreeSecs.data)
|
||||
if (permission.data === "denied") {
|
||||
return Svg.location_refused_svg();
|
||||
}
|
||||
|
@ -162,14 +160,17 @@ export default class GeoLocationHandler extends VariableUiElement {
|
|||
} else {
|
||||
lastClick.setData(new Date())
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
lastClick.setData(new Date())
|
||||
}
|
||||
}
|
||||
|
||||
self.init(true);
|
||||
self.init(true, true);
|
||||
});
|
||||
this.init(false);
|
||||
|
||||
const latLonGiven = QueryParameters.wasInitialized("lat") && QueryParameters.wasInitialized("lon")
|
||||
|
||||
this.init(false, !latLonGiven);
|
||||
|
||||
isLocked.addCallbackAndRunD(isLocked => {
|
||||
if (isLocked) {
|
||||
|
@ -217,7 +218,7 @@ export default class GeoLocationHandler extends VariableUiElement {
|
|||
});
|
||||
}
|
||||
|
||||
private init(askPermission: boolean) {
|
||||
private init(askPermission: boolean, forceZoom: boolean) {
|
||||
const self = this;
|
||||
|
||||
if (self._isActive.data) {
|
||||
|
@ -231,7 +232,7 @@ export default class GeoLocationHandler extends VariableUiElement {
|
|||
?.then(function (status) {
|
||||
console.log("Geolocation is already", status);
|
||||
if (status.state === "granted") {
|
||||
self.StartGeolocating(false);
|
||||
self.StartGeolocating(forceZoom);
|
||||
}
|
||||
self._permission.setData(status.state);
|
||||
status.onchange = function () {
|
||||
|
@ -243,10 +244,10 @@ export default class GeoLocationHandler extends VariableUiElement {
|
|||
}
|
||||
|
||||
if (askPermission) {
|
||||
self.StartGeolocating(true);
|
||||
self.StartGeolocating(forceZoom);
|
||||
} else if (this._previousLocationGrant.data === "granted") {
|
||||
this._previousLocationGrant.setData("");
|
||||
self.StartGeolocating(false);
|
||||
self.StartGeolocating(forceZoom);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ export class ImageSearcher extends UIEventSource<{ key: string, url: string }[]>
|
|||
|
||||
public static construct(tags: UIEventSource<any>, imagePrefix = "image", loadSpecial = true): ImageSearcher {
|
||||
const key = tags.data["id"] + " " + imagePrefix + loadSpecial;
|
||||
if (ImageSearcher._cache.has(key)) {
|
||||
if (tags.data["id"] !== undefined && ImageSearcher._cache.has(key)) {
|
||||
return ImageSearcher._cache.get(key)
|
||||
}
|
||||
|
||||
|
|
|
@ -25,10 +25,10 @@ export default class InstalledThemes {
|
|||
}
|
||||
try {
|
||||
let layoutJson;
|
||||
try{
|
||||
try {
|
||||
layoutJson = JSON.parse(atob(customLayout.data))
|
||||
}catch(e){
|
||||
layoutJson = JSON.parse( Utils.UnMinify(LZString.decompressFromBase64(customLayout.data)))
|
||||
} catch (e) {
|
||||
layoutJson = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(customLayout.data)))
|
||||
}
|
||||
const layout = new LayoutConfig(layoutJson, false);
|
||||
installedThemes.push({
|
||||
|
|
|
@ -8,7 +8,7 @@ import Loc from "../../Models/Loc";
|
|||
*/
|
||||
export default class LayerResetter {
|
||||
|
||||
constructor( currentBackgroundLayer: UIEventSource<BaseLayer>,
|
||||
constructor(currentBackgroundLayer: UIEventSource<BaseLayer>,
|
||||
location: UIEventSource<Loc>,
|
||||
availableLayers: UIEventSource<BaseLayer[]>,
|
||||
defaultLayerId: UIEventSource<string> = undefined) {
|
||||
|
@ -28,7 +28,7 @@ export default class LayerResetter {
|
|||
if (availableLayer.min_zoom > location.data.zoom) {
|
||||
break;
|
||||
}
|
||||
if(availableLayer.id === defaultLayerId.data){
|
||||
if (availableLayer.id === defaultLayerId.data) {
|
||||
defaultLayer = availableLayer;
|
||||
}
|
||||
return; // All good - the current layer still works!
|
||||
|
|
|
@ -23,6 +23,7 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
public readonly sufficientlyZoomed: UIEventSource<boolean>;
|
||||
public readonly runningQuery: UIEventSource<boolean> = new UIEventSource<boolean>(false);
|
||||
public readonly timeout: UIEventSource<number> = new UIEventSource<number>(0);
|
||||
|
||||
private readonly retries: UIEventSource<number> = new UIEventSource<number>(0);
|
||||
/**
|
||||
* The previous bounds for which the query has been run at the given zoom level
|
||||
|
@ -35,6 +36,8 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
private readonly _location: UIEventSource<Loc>;
|
||||
private readonly _layoutToUse: UIEventSource<LayoutConfig>;
|
||||
private readonly _leafletMap: UIEventSource<L.Map>;
|
||||
private readonly _interpreterUrl: UIEventSource<string>;
|
||||
private readonly _timeout: UIEventSource<number>;
|
||||
|
||||
/**
|
||||
* The most important layer should go first, as that one gets first pick for the questions
|
||||
|
@ -42,10 +45,15 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
constructor(
|
||||
location: UIEventSource<Loc>,
|
||||
layoutToUse: UIEventSource<LayoutConfig>,
|
||||
leafletMap: UIEventSource<L.Map>) {
|
||||
leafletMap: UIEventSource<L.Map>,
|
||||
interpreterUrl: UIEventSource<string>,
|
||||
timeout: UIEventSource<number>,
|
||||
maxZoom = undefined) {
|
||||
this._location = location;
|
||||
this._layoutToUse = layoutToUse;
|
||||
this._leafletMap = leafletMap;
|
||||
this._interpreterUrl = interpreterUrl;
|
||||
this._timeout = timeout;
|
||||
const self = this;
|
||||
|
||||
this.sufficientlyZoomed = location.map(location => {
|
||||
|
@ -53,7 +61,14 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
return false;
|
||||
}
|
||||
let minzoom = Math.min(...layoutToUse.data.layers.map(layer => layer.minzoom ?? 18));
|
||||
return location.zoom >= minzoom;
|
||||
if(location.zoom < minzoom){
|
||||
return false;
|
||||
}
|
||||
if(maxZoom !== undefined && location.zoom > maxZoom){
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}, [layoutToUse]
|
||||
);
|
||||
for (let i = 0; i < 25; i++) {
|
||||
|
@ -67,6 +82,9 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
location.addCallback(() => {
|
||||
self.update()
|
||||
});
|
||||
leafletMap.addCallbackAndRunD(_ => {
|
||||
self.update();
|
||||
})
|
||||
}
|
||||
|
||||
public ForceRefresh() {
|
||||
|
@ -123,7 +141,7 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
if (filters.length + extraScripts.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
return new Overpass(new Or(filters), extraScripts);
|
||||
return new Overpass(new Or(filters), extraScripts, this._interpreterUrl, this._timeout);
|
||||
}
|
||||
|
||||
private update(): void {
|
||||
|
@ -137,7 +155,10 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
return;
|
||||
}
|
||||
|
||||
const bounds = this._leafletMap.data.getBounds();
|
||||
const bounds = this._leafletMap.data?.getBounds();
|
||||
if (bounds === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
const diff = this._layoutToUse.data.widenFactor;
|
||||
|
||||
|
@ -176,7 +197,6 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
function countDown() {
|
||||
window?.setTimeout(
|
||||
function () {
|
||||
console.log("Countdown: ", self.timeout.data)
|
||||
if (self.timeout.data > 1) {
|
||||
self.timeout.setData(self.timeout.data - 1);
|
||||
window.setTimeout(
|
||||
|
|
|
@ -54,7 +54,7 @@ export default class PendingChangesUploader {
|
|||
|
||||
|
||||
function onunload(e) {
|
||||
if(changes.pendingChanges.data.length == 0){
|
||||
if (changes.pendingChanges.data.length == 0) {
|
||||
return;
|
||||
}
|
||||
changes.flushChanges("onbeforeunload - probably closing or something similar");
|
||||
|
|
|
@ -3,6 +3,7 @@ Actors
|
|||
|
||||
An **actor** is a module which converts one UIEventSource into another while performing logic.
|
||||
|
||||
Typically, it will only expose the constructor taking some UIEventSources (and configuration) and a few fields which are UIEVentSources.
|
||||
Typically, it will only expose the constructor taking some UIEventSources (and configuration) and a few fields which are
|
||||
UIEVentSources.
|
||||
|
||||
An actor should _never_ have a dependency on 'State' and should _never_ import it
|
|
@ -9,11 +9,10 @@ import OsmApiFeatureSource from "../FeatureSource/OsmApiFeatureSource";
|
|||
* Makes sure the hash shows the selected element and vice-versa.
|
||||
*/
|
||||
export default class SelectedFeatureHandler {
|
||||
private static readonly _no_trigger_on = ["welcome", "copyright", "layers", "new"]
|
||||
private readonly _featureSource: FeatureSource;
|
||||
private readonly _hash: UIEventSource<string>;
|
||||
private readonly _selectedFeature: UIEventSource<any>;
|
||||
|
||||
private static readonly _no_trigger_on = ["welcome", "copyright", "layers", "new"]
|
||||
private readonly _osmApiSource: OsmApiFeatureSource;
|
||||
|
||||
constructor(hash: UIEventSource<string>,
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import * as L from "leaflet";
|
||||
import Svg from "../../Svg";
|
||||
import {UIEventSource} from "../UIEventSource";
|
||||
import Img from "../../UI/Base/Img";
|
||||
import ScrollableFullScreen from "../../UI/Base/ScrollableFullScreen";
|
||||
import AddNewMarker from "../../UI/BigComponents/AddNewMarker";
|
||||
import FilteredLayer from "../../Models/FilteredLayer";
|
||||
import Constants from "../../Models/Constants";
|
||||
|
||||
/**
|
||||
* The stray-click-hanlders adds a marker to the map if no feature was clicked.
|
||||
|
@ -14,7 +15,7 @@ export default class StrayClickHandler {
|
|||
constructor(
|
||||
lastClickLocation: UIEventSource<{ lat: number, lon: number }>,
|
||||
selectedElement: UIEventSource<string>,
|
||||
filteredLayers: UIEventSource<{ readonly isDisplayed: UIEventSource<boolean> }[]>,
|
||||
filteredLayers: UIEventSource<FilteredLayer[]>,
|
||||
leafletMap: UIEventSource<L.Map>,
|
||||
uiToShow: ScrollableFullScreen) {
|
||||
const self = this;
|
||||
|
@ -34,14 +35,15 @@ export default class StrayClickHandler {
|
|||
leafletMap.data?.removeLayer(self._lastMarker);
|
||||
}
|
||||
|
||||
if(lastClick === undefined){
|
||||
if (lastClick === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
selectedElement.setData(undefined);
|
||||
self._lastMarker = L.marker([lastClick.lat, lastClick.lon], {
|
||||
icon: L.icon({
|
||||
iconUrl: Img.AsData(Svg.add),
|
||||
const clickCoor: [number, number] = [lastClick.lat, lastClick.lon]
|
||||
self._lastMarker = L.marker(clickCoor, {
|
||||
icon: L.divIcon({
|
||||
html: new AddNewMarker(filteredLayers).ConstructElement(),
|
||||
iconSize: [50, 50],
|
||||
iconAnchor: [25, 50],
|
||||
popupAnchor: [0, -45]
|
||||
|
@ -49,7 +51,7 @@ export default class StrayClickHandler {
|
|||
});
|
||||
const popup = L.popup({
|
||||
autoPan: true,
|
||||
autoPanPaddingTopLeft: [15,15],
|
||||
autoPanPaddingTopLeft: [15, 15],
|
||||
closeOnEscapeKey: true,
|
||||
autoClose: true
|
||||
}).setContent("<div id='strayclick' style='height: 65vh'></div>");
|
||||
|
@ -57,6 +59,13 @@ export default class StrayClickHandler {
|
|||
self._lastMarker.bindPopup(popup);
|
||||
|
||||
self._lastMarker.on("click", () => {
|
||||
if (leafletMap.data.getZoom() < Constants.userJourney.minZoomLevelToAddNewPoints) {
|
||||
self._lastMarker.closePopup()
|
||||
leafletMap.data.flyTo(clickCoor, Constants.userJourney.minZoomLevelToAddNewPoints)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
uiToShow.AttachTo("strayclick")
|
||||
uiToShow.Activate();
|
||||
});
|
||||
|
|
|
@ -24,9 +24,9 @@ class TitleElement extends UIEventSource<string> {
|
|||
this.syncWith(
|
||||
this._selectedFeature.map(
|
||||
selected => {
|
||||
const defaultTitle = Translations.WT(this._layoutToUse.data?.title)?.txt ??"MapComplete"
|
||||
const defaultTitle = Translations.WT(this._layoutToUse.data?.title)?.txt ?? "MapComplete"
|
||||
|
||||
if(selected === undefined){
|
||||
if (selected === undefined) {
|
||||
return defaultTitle
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,6 @@ class TitleElement extends UIEventSource<string> {
|
|||
}
|
||||
, [Locale.language, layoutToUse]
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -5,8 +5,8 @@ import {UIEventSource} from "./UIEventSource";
|
|||
|
||||
export class ElementStorage {
|
||||
|
||||
private _elements = new Map<string, UIEventSource<any>>();
|
||||
public ContainingFeatures = new Map<string, any>();
|
||||
private _elements = new Map<string, UIEventSource<any>>();
|
||||
|
||||
constructor() {
|
||||
|
||||
|
@ -31,7 +31,7 @@ export class ElementStorage {
|
|||
// At last, we overwrite the tag of the new feature to use the tags in the already existing event source
|
||||
feature.properties = es.data
|
||||
|
||||
if(!this.ContainingFeatures.has(elementId)){
|
||||
if (!this.ContainingFeatures.has(elementId)) {
|
||||
this.ContainingFeatures.set(elementId, feature);
|
||||
}
|
||||
|
||||
|
@ -69,7 +69,7 @@ export class ElementStorage {
|
|||
const debug_msg = []
|
||||
let somethingChanged = false;
|
||||
for (const k in newProperties) {
|
||||
if(!newProperties.hasOwnProperty(k)){
|
||||
if (!newProperties.hasOwnProperty(k)) {
|
||||
continue;
|
||||
}
|
||||
const v = newProperties[k];
|
||||
|
|
|
@ -14,10 +14,10 @@ export default class FeatureDuplicatorPerLayer implements FeatureSource {
|
|||
public readonly name;
|
||||
|
||||
constructor(layers: UIEventSource<FilteredLayer[]>, upstream: FeatureSource) {
|
||||
this.name = "FeatureDuplicator of "+upstream.name;
|
||||
this.name = "FeatureDuplicator of " + upstream.name;
|
||||
this.features = upstream.features.map(features => {
|
||||
const newFeatures: { feature: any, freshness: Date }[] = [];
|
||||
if(features === undefined){
|
||||
if (features === undefined) {
|
||||
return newFeatures;
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,7 @@ export default class FeatureDuplicatorPerLayer implements FeatureSource {
|
|||
id: f.feature.id,
|
||||
type: f.feature.type,
|
||||
properties: f.feature.properties,
|
||||
_matching_layer_id : layer.layerDef.id
|
||||
_matching_layer_id: layer.layerDef.id
|
||||
}
|
||||
newFeatures.push({feature: newFeature, freshness: f.freshness});
|
||||
} else {
|
||||
|
|
|
@ -58,7 +58,7 @@ export default class FeatureSourceMerger implements FeatureSource {
|
|||
}
|
||||
}
|
||||
|
||||
if(!somethingChanged){
|
||||
if (!somethingChanged) {
|
||||
// We don't bother triggering an update
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -13,10 +13,10 @@ export default class GeoJsonSource implements FeatureSource {
|
|||
|
||||
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>;
|
||||
public readonly name;
|
||||
public readonly isOsmCache: boolean
|
||||
private onFail: ((errorMsg: any, url: string) => void) = undefined;
|
||||
private readonly layerId: string;
|
||||
private readonly seenids: Set<string> = new Set<string>()
|
||||
public readonly isOsmCache: boolean
|
||||
|
||||
private constructor(locationControl: UIEventSource<Loc>,
|
||||
flayer: { isDisplayed: UIEventSource<boolean>, layerDef: LayerConfig },
|
||||
|
@ -124,14 +124,18 @@ export default class GeoJsonSource implements FeatureSource {
|
|||
}
|
||||
|
||||
// Yup, this is cheating to just get the bounds here
|
||||
const bounds = State.state.leafletMap.data.getBounds()
|
||||
const bounds = State.state.leafletMap.data?.getBounds()
|
||||
if(bounds === undefined){
|
||||
// We'll retry later
|
||||
return undefined
|
||||
}
|
||||
const tileRange = Utils.TileRangeBetween(zoomLevel, bounds.getNorth(), bounds.getEast(), bounds.getSouth(), bounds.getWest())
|
||||
const needed = Utils.MapRange(tileRange, (x, y) => {
|
||||
return url.replace("{x}", "" + x).replace("{y}", "" + y);
|
||||
})
|
||||
return new Set<string>(needed);
|
||||
}
|
||||
, [flayer.isDisplayed]);
|
||||
, [flayer.isDisplayed, State.state.leafletMap]);
|
||||
neededTiles.stabilized(250).addCallback((needed: Set<string>) => {
|
||||
if (needed === undefined) {
|
||||
return;
|
||||
|
|
|
@ -18,17 +18,17 @@ export default class LocalStorageSaver implements FeatureSource {
|
|||
|
||||
this.features.addCallbackAndRunD(features => {
|
||||
const now = new Date().getTime()
|
||||
features = features.filter(f => layout.data.cacheTimeout > Math.abs(now - f.freshness.getTime())/1000)
|
||||
features = features.filter(f => layout.data.cacheTimeout > Math.abs(now - f.freshness.getTime()) / 1000)
|
||||
|
||||
|
||||
if(features.length == 0){
|
||||
if (features.length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const key = LocalStorageSaver.storageKey+layout.data.id
|
||||
const key = LocalStorageSaver.storageKey + layout.data.id
|
||||
localStorage.setItem(key, JSON.stringify(features));
|
||||
console.log("Saved ",features.length, "elements to",key)
|
||||
console.log("Saved ", features.length, "elements to", key)
|
||||
} catch (e) {
|
||||
console.warn("Could not save the features to local storage:", e)
|
||||
}
|
||||
|
|
|
@ -16,12 +16,12 @@ export default class LocalStorageSource implements FeatureSource {
|
|||
if (fromStorage == null) {
|
||||
return;
|
||||
}
|
||||
const loaded : { feature: any; freshness: Date | string }[]=
|
||||
const loaded: { feature: any; freshness: Date | string }[] =
|
||||
JSON.parse(fromStorage);
|
||||
|
||||
const parsed : { feature: any; freshness: Date }[]= loaded.map(ff => ({
|
||||
const parsed: { feature: any; freshness: Date }[] = loaded.map(ff => ({
|
||||
feature: ff.feature,
|
||||
freshness : typeof ff.freshness == "string" ? new Date(ff.freshness) : ff.freshness
|
||||
freshness: typeof ff.freshness == "string" ? new Date(ff.freshness) : ff.freshness
|
||||
}))
|
||||
|
||||
this.features.setData(parsed);
|
||||
|
|
|
@ -19,7 +19,7 @@ export default class MetaTaggingFeatureSource implements FeatureSource {
|
|||
const self = this;
|
||||
this.name = "MetaTagging of " + source.name
|
||||
|
||||
if(allFeaturesSource === undefined){
|
||||
if (allFeaturesSource === undefined) {
|
||||
throw ("UIEVentSource is undefined")
|
||||
}
|
||||
|
||||
|
|
|
@ -1,16 +1,34 @@
|
|||
import FeatureSource from "./FeatureSource";
|
||||
import {UIEventSource} from "../UIEventSource";
|
||||
import {OsmObject} from "../Osm/OsmObject";
|
||||
import State from "../../State";
|
||||
import {Utils} from "../../Utils";
|
||||
import Loc from "../../Models/Loc";
|
||||
import FilteredLayer from "../../Models/FilteredLayer";
|
||||
import Constants from "../../Models/Constants";
|
||||
|
||||
|
||||
export default class OsmApiFeatureSource implements FeatureSource {
|
||||
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]);
|
||||
public readonly name: string = "OsmApiFeatureSource";
|
||||
private readonly loadedTiles: Set<string> = new Set<string>();
|
||||
private readonly _state: {
|
||||
leafletMap: UIEventSource<any>;
|
||||
locationControl: UIEventSource<Loc>, filteredLayers: UIEventSource<FilteredLayer[]>};
|
||||
|
||||
constructor() {
|
||||
constructor(minZoom = undefined, state: {locationControl: UIEventSource<Loc>, filteredLayers: UIEventSource<FilteredLayer[]>, leafletMap: UIEventSource<any>}) {
|
||||
this._state = state;
|
||||
if(minZoom !== undefined){
|
||||
if(minZoom < 14){
|
||||
throw "MinZoom should be at least 14 or higher, OSM-api won't work otherwise"
|
||||
}
|
||||
const self = this;
|
||||
state.locationControl.addCallbackAndRunD(location => {
|
||||
if(location.zoom > minZoom){
|
||||
return;
|
||||
}
|
||||
self.loadArea()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -34,21 +52,21 @@ export default class OsmApiFeatureSource implements FeatureSource {
|
|||
/**
|
||||
* Loads the current inview-area
|
||||
*/
|
||||
public loadArea(z: number = 16): boolean {
|
||||
const layers = State.state.filteredLayers.data;
|
||||
public loadArea(z: number = 14): boolean {
|
||||
const layers = this._state.filteredLayers.data;
|
||||
|
||||
const disabledLayers = layers.filter(layer => layer.layerDef.source.overpassScript !== undefined || layer.layerDef.source.geojsonSource !== undefined)
|
||||
if (disabledLayers.length > 0) {
|
||||
return false;
|
||||
}
|
||||
const loc = State.state.locationControl.data;
|
||||
if (loc.zoom < 16) {
|
||||
const loc = this._state.locationControl.data;
|
||||
if (loc.zoom < Constants.useOsmApiAt) {
|
||||
return false;
|
||||
}
|
||||
if (State.state.leafletMap.data === undefined) {
|
||||
if (this._state.leafletMap.data === undefined) {
|
||||
return false; // Not yet inited
|
||||
}
|
||||
const bounds = State.state.leafletMap.data.getBounds()
|
||||
const bounds = this._state.leafletMap.data.getBounds()
|
||||
const tileRange = Utils.TileRangeBetween(z, bounds.getNorth(), bounds.getEast(), bounds.getSouth(), bounds.getWest())
|
||||
const self = this;
|
||||
Utils.MapRange(tileRange, (x, y) => {
|
||||
|
|
|
@ -11,7 +11,7 @@ export default class RememberingSource implements FeatureSource {
|
|||
|
||||
constructor(source: FeatureSource) {
|
||||
const self = this;
|
||||
this.name = "RememberingSource of "+source.name;
|
||||
this.name = "RememberingSource of " + source.name;
|
||||
const empty = [];
|
||||
this.features = source.features.map(features => {
|
||||
const oldFeatures = self.features?.data ?? empty;
|
||||
|
|
|
@ -185,6 +185,60 @@ export class GeoOperations {
|
|||
return turf.length(feature) * 1000
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the closest point on a way from a given point
|
||||
* @param way The road on which you want to find a point
|
||||
* @param point Point defined as [lon, lat]
|
||||
*/
|
||||
public static nearestPoint(way, point: [number, number]) {
|
||||
return turf.nearestPointOnLine(way, point, {units: "kilometers"});
|
||||
}
|
||||
|
||||
public static toCSV(features: any[]): string {
|
||||
|
||||
const headerValuesSeen = new Set<string>();
|
||||
const headerValuesOrdered: string[] = []
|
||||
|
||||
function addH(key) {
|
||||
if (!headerValuesSeen.has(key)) {
|
||||
headerValuesSeen.add(key)
|
||||
headerValuesOrdered.push(key)
|
||||
}
|
||||
}
|
||||
|
||||
addH("_lat")
|
||||
addH("_lon")
|
||||
|
||||
const lines: string[] = []
|
||||
|
||||
for (const feature of features) {
|
||||
const properties = feature.properties;
|
||||
for (const key in properties) {
|
||||
if (!properties.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
addH(key)
|
||||
|
||||
}
|
||||
}
|
||||
headerValuesOrdered.sort()
|
||||
for (const feature of features) {
|
||||
const properties = feature.properties;
|
||||
let line = ""
|
||||
for (const key of headerValuesOrdered) {
|
||||
const value = properties[key]
|
||||
if (value === undefined) {
|
||||
line += ","
|
||||
} else {
|
||||
line += JSON.stringify(value) + ","
|
||||
}
|
||||
}
|
||||
lines.push(line)
|
||||
}
|
||||
|
||||
return headerValuesOrdered.map(v => JSON.stringify(v)).join(",") + "\n" + lines.join("\n")
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the intersection between two features.
|
||||
* Returns the length if intersecting a linestring and a (multi)polygon (in meters), returns a surface area (in m²) if intersecting two (multi)polygons
|
||||
|
@ -277,60 +331,6 @@ export class GeoOperations {
|
|||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the closest point on a way from a given point
|
||||
* @param way The road on which you want to find a point
|
||||
* @param point Point defined as [lon, lat]
|
||||
*/
|
||||
public static nearestPoint(way, point: [number, number]) {
|
||||
return turf.nearestPointOnLine(way, point, {units: "kilometers"});
|
||||
}
|
||||
|
||||
public static toCSV(features: any[]): string {
|
||||
|
||||
const headerValuesSeen = new Set<string>();
|
||||
const headerValuesOrdered: string[] = []
|
||||
|
||||
function addH(key) {
|
||||
if (!headerValuesSeen.has(key)) {
|
||||
headerValuesSeen.add(key)
|
||||
headerValuesOrdered.push(key)
|
||||
}
|
||||
}
|
||||
|
||||
addH("_lat")
|
||||
addH("_lon")
|
||||
|
||||
const lines: string[] = []
|
||||
|
||||
for (const feature of features) {
|
||||
const properties = feature.properties;
|
||||
for (const key in properties) {
|
||||
if (!properties.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
addH(key)
|
||||
|
||||
}
|
||||
}
|
||||
headerValuesOrdered.sort()
|
||||
for (const feature of features) {
|
||||
const properties = feature.properties;
|
||||
let line = ""
|
||||
for (const key of headerValuesOrdered) {
|
||||
const value = properties[key]
|
||||
if (value === undefined) {
|
||||
line += ","
|
||||
} else {
|
||||
line += JSON.stringify(value) + ","
|
||||
}
|
||||
}
|
||||
lines.push(line)
|
||||
}
|
||||
|
||||
return headerValuesOrdered.map(v => JSON.stringify(v)).join(",") + "\n" + lines.join("\n")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -364,7 +364,7 @@ export class BBox {
|
|||
static get(feature) {
|
||||
if (feature.bbox?.overlapsWith === undefined) {
|
||||
const turfBbox: number[] = turf.bbox(feature)
|
||||
feature.bbox = new BBox([[turfBbox[0], turfBbox[1]],[turfBbox[2], turfBbox[3]]]);
|
||||
feature.bbox = new BBox([[turfBbox[0], turfBbox[1]], [turfBbox[2], turfBbox[3]]]);
|
||||
}
|
||||
|
||||
return feature.bbox;
|
||||
|
|
|
@ -2,7 +2,7 @@ import {Mapillary} from "./Mapillary";
|
|||
import {Wikimedia} from "./Wikimedia";
|
||||
import {Imgur} from "./Imgur";
|
||||
|
||||
export default class AllImageProviders{
|
||||
export default class AllImageProviders {
|
||||
|
||||
public static ImageAttributionSource = [Imgur.singleton, Mapillary.singleton, Wikimedia.singleton]
|
||||
|
||||
|
|
|
@ -18,12 +18,13 @@ export default abstract class ImageAttributionSource {
|
|||
}
|
||||
|
||||
|
||||
public abstract SourceIcon(backlinkSource?: string): BaseUIElement;
|
||||
|
||||
public abstract SourceIcon(backlinkSource?: string) : BaseUIElement;
|
||||
protected abstract DownloadAttribution(url: string): UIEventSource<LicenseInfo>;
|
||||
/*Converts a value to a URL. Can return null if not applicable*/
|
||||
public PrepareUrl(value: string): string{
|
||||
public PrepareUrl(value: string): string | UIEventSource<string>{
|
||||
return value;
|
||||
}
|
||||
|
||||
protected abstract DownloadAttribution(url: string): UIEventSource<LicenseInfo>;
|
||||
|
||||
}
|
|
@ -1,4 +1,3 @@
|
|||
import $ from "jquery"
|
||||
import {LicenseInfo} from "./Wikimedia";
|
||||
import ImageAttributionSource from "./ImageAttributionSource";
|
||||
import BaseUIElement from "../../UI/BaseUIElement";
|
||||
|
@ -10,38 +9,91 @@ export class Mapillary extends ImageAttributionSource {
|
|||
|
||||
public static readonly singleton = new Mapillary();
|
||||
|
||||
private static readonly v4_cached_urls = new Map<string, UIEventSource<string>>();
|
||||
|
||||
private static readonly client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2'
|
||||
private static readonly client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
|
||||
|
||||
private constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
private static ExtractKeyFromURL(value: string) {
|
||||
private static ExtractKeyFromURL(value: string): {
|
||||
key: string,
|
||||
isApiv4?: boolean
|
||||
} {
|
||||
if (value.startsWith("https://a.mapillary.com")) {
|
||||
return value.substring(0, value.lastIndexOf("?")).substring(value.lastIndexOf("/") + 1);
|
||||
const key = value.substring(0, value.lastIndexOf("?")).substring(value.lastIndexOf("/") + 1)
|
||||
return {key:key, isApiv4: !isNaN(Number(key))};
|
||||
}
|
||||
const matchApi = value.match(/https?:\/\/images.mapillary.com\/([^/]*)/)
|
||||
if (matchApi !== null) {
|
||||
return matchApi[1];
|
||||
const newApiFormat = value.match(/https?:\/\/www.mapillary.com\/app\/\?pKey=([0-9]*)/)
|
||||
if (newApiFormat !== null) {
|
||||
return {key: newApiFormat[1], isApiv4: true}
|
||||
}
|
||||
|
||||
const mapview = value.match(/https?:\/\/www.mapillary.com\/map\/im\/(.*)/)
|
||||
console.log("Mapview matched ", value, mapview)
|
||||
if(mapview !== null){
|
||||
const key = mapview[1]
|
||||
return {key:key, isApiv4: !isNaN(Number(key))};
|
||||
}
|
||||
|
||||
|
||||
if (value.toLowerCase().startsWith("https://www.mapillary.com/map/im/")) {
|
||||
// Extract the key of the image
|
||||
value = value.substring("https://www.mapillary.com/map/im/".length);
|
||||
}
|
||||
return value;
|
||||
|
||||
const matchApi = value.match(/https?:\/\/images.mapillary.com\/([^/]*)(&.*)?/)
|
||||
if (matchApi !== null) {
|
||||
return {key: matchApi[1]};
|
||||
}
|
||||
|
||||
|
||||
return {key: value, isApiv4: !isNaN(Number(value))};
|
||||
}
|
||||
|
||||
SourceIcon(backlinkSource?: string): BaseUIElement {
|
||||
return Svg.mapillary_svg();
|
||||
}
|
||||
|
||||
PrepareUrl(value: string): string {
|
||||
const key = Mapillary.ExtractKeyFromURL(value)
|
||||
return `https://images.mapillary.com/${key}/thumb-640.jpg?client_id=TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2`
|
||||
PrepareUrl(value: string): string | UIEventSource<string> {
|
||||
const keyV = Mapillary.ExtractKeyFromURL(value)
|
||||
if (!keyV.isApiv4) {
|
||||
return `https://images.mapillary.com/${keyV.key}/thumb-640.jpg?client_id=${Mapillary.client_token_v3}`
|
||||
} else {
|
||||
const key = keyV.key;
|
||||
if(Mapillary.v4_cached_urls.has(key)){
|
||||
return Mapillary.v4_cached_urls.get(key)
|
||||
}
|
||||
|
||||
const metadataUrl ='https://graph.mapillary.com/' + key + '?fields=thumb_1024_url&&access_token=' + Mapillary.client_token_v4;
|
||||
const source = new UIEventSource<string>(undefined)
|
||||
Mapillary.v4_cached_urls.set(key, source)
|
||||
Utils.downloadJson(metadataUrl).then(
|
||||
json => {
|
||||
console.warn("Got response on mapillary image", json, json["thumb_1024_url"])
|
||||
return source.setData(json["thumb_1024_url"]);
|
||||
}
|
||||
)
|
||||
return source
|
||||
}
|
||||
}
|
||||
|
||||
protected DownloadAttribution(url: string): UIEventSource<LicenseInfo> {
|
||||
|
||||
const key = Mapillary.ExtractKeyFromURL(url)
|
||||
const keyV = Mapillary.ExtractKeyFromURL(url)
|
||||
if(keyV.isApiv4){
|
||||
const license = new LicenseInfo()
|
||||
license.artist = "Contributor name unavailable";
|
||||
license.license = "CC BY-SA 4.0";
|
||||
// license.license = "Creative Commons Attribution-ShareAlike 4.0 International License";
|
||||
license.attributionRequired = true;
|
||||
return new UIEventSource<LicenseInfo>(license)
|
||||
|
||||
}
|
||||
const key = keyV.key
|
||||
|
||||
const metadataURL = `https://a.mapillary.com/v3/images/${key}?client_id=TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2`
|
||||
const source = new UIEventSource<LicenseInfo>(undefined)
|
||||
Utils.downloadJson(metadataURL).then(data => {
|
||||
|
|
|
@ -77,7 +77,7 @@ export class Wikimedia extends ImageAttributionSource {
|
|||
|
||||
static GetWikiData(id: number, handleWikidata: ((Wikidata) => void)) {
|
||||
const url = "https://www.wikidata.org/wiki/Special:EntityData/Q" + id + ".json";
|
||||
Utils.downloadJson(url).then (response => {
|
||||
Utils.downloadJson(url).then(response => {
|
||||
const entity = response.entities["Q" + id];
|
||||
const commons = entity.sitelinks.commonswiki;
|
||||
const wd = new Wikidata();
|
||||
|
@ -139,10 +139,10 @@ export class Wikimedia extends ImageAttributionSource {
|
|||
"titles=" + filename +
|
||||
"&format=json&origin=*";
|
||||
Utils.downloadJson(url).then(
|
||||
data =>{
|
||||
data => {
|
||||
const licenseInfo = new LicenseInfo();
|
||||
const license = (data.query.pages[-1].imageinfo ?? [])[0]?.extmetadata;
|
||||
if(license === undefined){
|
||||
if (license === undefined) {
|
||||
console.error("This file has no usable metedata or license attached... Please fix the license info file yourself!")
|
||||
source.setData(null)
|
||||
return;
|
||||
|
|
|
@ -18,6 +18,9 @@ interface Params {
|
|||
export default class MetaTagging {
|
||||
|
||||
|
||||
private static errorPrintCount = 0;
|
||||
private static readonly stopErrorOutputAt = 10;
|
||||
|
||||
/**
|
||||
* An actor which adds metatags on every feature in the given object
|
||||
* The features are a list of geojson-features, with a "properties"-field and geometry
|
||||
|
@ -86,9 +89,6 @@ export default class MetaTagging {
|
|||
|
||||
}
|
||||
|
||||
private static errorPrintCount = 0;
|
||||
private static readonly stopErrorOutputAt = 10;
|
||||
|
||||
private static createRetaggingFunc(layer: LayerConfig):
|
||||
((params: Params, feature: any) => void) {
|
||||
const calculatedTags: [string, string][] = layer.calculatedTags;
|
||||
|
@ -111,7 +111,7 @@ export default class MetaTagging {
|
|||
const f = (featuresPerLayer, feature: any) => {
|
||||
try {
|
||||
let result = func(feature);
|
||||
if(result instanceof UIEventSource){
|
||||
if (result instanceof UIEventSource) {
|
||||
result.addCallbackAndRunD(d => {
|
||||
if (typeof d !== "string") {
|
||||
// Make sure it is a string!
|
||||
|
|
|
@ -8,11 +8,10 @@ import {GeoOperations} from "../../GeoOperations";
|
|||
|
||||
export default class CreateNewNodeAction extends OsmChangeAction {
|
||||
|
||||
public newElementId: string = undefined
|
||||
private readonly _basicTags: Tag[];
|
||||
private readonly _lat: number;
|
||||
private readonly _lon: number;
|
||||
|
||||
public newElementId: string = undefined
|
||||
private readonly _snapOnto: OsmWay;
|
||||
private readonly _reusePointDistance: number;
|
||||
|
||||
|
@ -21,7 +20,7 @@ export default class CreateNewNodeAction extends OsmChangeAction {
|
|||
this._basicTags = basicTags;
|
||||
this._lat = lat;
|
||||
this._lon = lon;
|
||||
if(lat === undefined || lon === undefined){
|
||||
if (lat === undefined || lon === undefined) {
|
||||
throw "Lat or lon are undefined!"
|
||||
}
|
||||
this._snapOnto = options?.snapOnto;
|
||||
|
@ -95,7 +94,7 @@ export default class CreateNewNodeAction extends OsmChangeAction {
|
|||
return [
|
||||
newPointChange,
|
||||
{
|
||||
type:"way",
|
||||
type: "way",
|
||||
id: this._snapOnto.id,
|
||||
changes: {
|
||||
locations: locations,
|
||||
|
|
|
@ -30,7 +30,7 @@ export default class DeleteAction {
|
|||
* Does actually delete the feature; returns the event source 'this.isDeleted'
|
||||
* If deletion is not allowed, triggers the callback instead
|
||||
*/
|
||||
public DoDelete(reason: string, onNotAllowed : () => void): void {
|
||||
public DoDelete(reason: string, onNotAllowed: () => void): void {
|
||||
const isDeleted = this.isDeleted
|
||||
const self = this;
|
||||
let deletionStarted = false;
|
||||
|
@ -41,7 +41,7 @@ export default class DeleteAction {
|
|||
return;
|
||||
}
|
||||
|
||||
if(canBeDeleted.canBeDeleted === false){
|
||||
if (canBeDeleted.canBeDeleted === false) {
|
||||
// We aren't allowed to delete
|
||||
deletionStarted = true;
|
||||
onNotAllowed();
|
||||
|
@ -55,8 +55,6 @@ export default class DeleteAction {
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
deletionStarted = true;
|
||||
OsmObject.DownloadObject(self._id).addCallbackAndRun(obj => {
|
||||
if (obj === undefined) {
|
||||
|
@ -207,7 +205,7 @@ export default class DeleteAction {
|
|||
canBeDeleted: false,
|
||||
reason: t.partOfOthers
|
||||
})
|
||||
}else{
|
||||
} else {
|
||||
// alright, this point can be safely deleted!
|
||||
state.setData({
|
||||
canBeDeleted: true,
|
||||
|
@ -216,7 +214,6 @@ export default class DeleteAction {
|
|||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
import OsmChangeAction from "./OsmChangeAction";
|
||||
import {Changes} from "../Changes";
|
||||
import {ChangeDescription} from "./ChangeDescription";
|
||||
import {OsmRelation, OsmWay} from "../OsmObject";
|
||||
import {OsmRelation} from "../OsmObject";
|
||||
|
||||
export default class RelationSplitlHandler extends OsmChangeAction{
|
||||
export default class RelationSplitlHandler extends OsmChangeAction {
|
||||
|
||||
constructor(partOf: OsmRelation[], newWayIds: number[], originalNodes: number[]) {
|
||||
super()
|
||||
|
|
|
@ -24,7 +24,7 @@ export class Changes {
|
|||
public readonly pendingChanges = LocalStorageSource.GetParsed<ChangeDescription[]>("pending-changes", [])
|
||||
private readonly isUploading = new UIEventSource(false);
|
||||
|
||||
private readonly previouslyCreated : OsmObject[] = []
|
||||
private readonly previouslyCreated: OsmObject[] = []
|
||||
|
||||
constructor() {
|
||||
}
|
||||
|
@ -70,6 +70,88 @@ export class Changes {
|
|||
.map(c => c.type + "/" + c.id))
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new ID and updates the value for the next ID
|
||||
*/
|
||||
public getNewID() {
|
||||
return Changes._nextId--;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads all the pending changes in one go.
|
||||
* Triggered by the 'PendingChangeUploader'-actor in Actors
|
||||
*/
|
||||
public flushChanges(flushreason: string = undefined) {
|
||||
if (this.pendingChanges.data.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.isUploading.data) {
|
||||
console.log("Is already uploading... Abort")
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
this.isUploading.setData(true)
|
||||
|
||||
console.log("Beginning upload... " + flushreason ?? "");
|
||||
// At last, we build the changeset and upload
|
||||
const self = this;
|
||||
const pending = self.pendingChanges.data;
|
||||
const neededIds = Changes.GetNeededIds(pending)
|
||||
console.log("Needed ids", neededIds)
|
||||
OsmObject.DownloadAll(neededIds, true).addCallbackAndRunD(osmObjects => {
|
||||
console.log("Got the fresh objects!", osmObjects, "pending: ", pending)
|
||||
try {
|
||||
|
||||
|
||||
const changes: {
|
||||
newObjects: OsmObject[],
|
||||
modifiedObjects: OsmObject[]
|
||||
deletedObjects: OsmObject[]
|
||||
|
||||
} = self.CreateChangesetObjects(pending, osmObjects)
|
||||
if (changes.newObjects.length + changes.deletedObjects.length + changes.modifiedObjects.length === 0) {
|
||||
console.log("No changes to be made")
|
||||
self.pendingChanges.setData([])
|
||||
self.isUploading.setData(false)
|
||||
return true; // Unregister the callback
|
||||
}
|
||||
|
||||
|
||||
State.state.osmConnection.UploadChangeset(
|
||||
State.state.layoutToUse.data,
|
||||
State.state.allElements,
|
||||
(csId) => Changes.createChangesetFor(csId, changes),
|
||||
() => {
|
||||
console.log("Upload successfull!")
|
||||
self.pendingChanges.setData([]);
|
||||
self.isUploading.setData(false)
|
||||
},
|
||||
() => {
|
||||
console.log("Upload failed - trying again later")
|
||||
return self.isUploading.setData(false);
|
||||
} // Failed - mark to try again
|
||||
)
|
||||
} catch (e) {
|
||||
console.error("Could not handle changes - probably an old, pending changeset in localstorage with an invalid format; erasing those", e)
|
||||
self.pendingChanges.setData([])
|
||||
self.isUploading.setData(false)
|
||||
}
|
||||
return true;
|
||||
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
public applyAction(action: OsmChangeAction) {
|
||||
const changes = action.Perform(this)
|
||||
console.log("Received changes:", changes)
|
||||
this.pendingChanges.data.push(...changes);
|
||||
this.pendingChanges.ping();
|
||||
}
|
||||
|
||||
private CreateChangesetObjects(changes: ChangeDescription[], downloadedOsmObjects: OsmObject[]): {
|
||||
newObjects: OsmObject[],
|
||||
modifiedObjects: OsmObject[]
|
||||
|
@ -93,8 +175,8 @@ export class Changes {
|
|||
for (const change of changes) {
|
||||
const id = change.type + "/" + change.id
|
||||
if (!objects.has(id)) {
|
||||
if(change.id >= 0){
|
||||
throw "Did not get an object that should be known: "+id
|
||||
if (change.id >= 0) {
|
||||
throw "Did not get an object that should be known: " + id
|
||||
}
|
||||
// This is a new object that should be created
|
||||
states.set(id, "created")
|
||||
|
@ -221,86 +303,4 @@ export class Changes {
|
|||
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new ID and updates the value for the next ID
|
||||
*/
|
||||
public getNewID() {
|
||||
return Changes._nextId--;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads all the pending changes in one go.
|
||||
* Triggered by the 'PendingChangeUploader'-actor in Actors
|
||||
*/
|
||||
public flushChanges(flushreason: string = undefined) {
|
||||
if (this.pendingChanges.data.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.isUploading.data) {
|
||||
console.log("Is already uploading... Abort")
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
this.isUploading.setData(true)
|
||||
|
||||
console.log("Beginning upload... "+flushreason ?? "");
|
||||
// At last, we build the changeset and upload
|
||||
const self = this;
|
||||
const pending = self.pendingChanges.data;
|
||||
const neededIds = Changes.GetNeededIds(pending)
|
||||
console.log("Needed ids", neededIds)
|
||||
OsmObject.DownloadAll(neededIds, true).addCallbackAndRunD(osmObjects => {
|
||||
console.log("Got the fresh objects!", osmObjects, "pending: ", pending)
|
||||
try{
|
||||
|
||||
|
||||
const changes: {
|
||||
newObjects: OsmObject[],
|
||||
modifiedObjects: OsmObject[]
|
||||
deletedObjects: OsmObject[]
|
||||
|
||||
} = self.CreateChangesetObjects(pending, osmObjects)
|
||||
if (changes.newObjects.length + changes.deletedObjects.length + changes.modifiedObjects.length === 0) {
|
||||
console.log("No changes to be made")
|
||||
self.pendingChanges.setData([])
|
||||
self.isUploading.setData(false)
|
||||
return true; // Unregister the callback
|
||||
}
|
||||
|
||||
|
||||
State.state.osmConnection.UploadChangeset(
|
||||
State.state.layoutToUse.data,
|
||||
State.state.allElements,
|
||||
(csId) => Changes.createChangesetFor(csId, changes),
|
||||
() => {
|
||||
console.log("Upload successfull!")
|
||||
self.pendingChanges.setData([]);
|
||||
self.isUploading.setData(false)
|
||||
},
|
||||
() => {
|
||||
console.log("Upload failed - trying again later")
|
||||
return self.isUploading.setData(false);
|
||||
} // Failed - mark to try again
|
||||
)
|
||||
}catch(e){
|
||||
console.error("Could not handle changes - probably an old, pending changeset in localstorage with an invalid format; erasing those", e)
|
||||
self.pendingChanges.setData([])
|
||||
self.isUploading.setData(false)
|
||||
}
|
||||
return true;
|
||||
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
public applyAction(action: OsmChangeAction) {
|
||||
const changes = action.Perform(this)
|
||||
console.log("Received changes:", changes)
|
||||
this.pendingChanges.data.push(...changes);
|
||||
this.pendingChanges.ping();
|
||||
}
|
||||
}
|
|
@ -258,7 +258,7 @@ export class ChangesetHandler {
|
|||
}, function (err, response) {
|
||||
if (response === undefined) {
|
||||
console.log("err", err);
|
||||
if(options.onFail){
|
||||
if (options.onFail) {
|
||||
options.onFail()
|
||||
}
|
||||
return;
|
||||
|
|
|
@ -15,7 +15,7 @@ export interface Relation {
|
|||
|
||||
export default class ExtractRelations {
|
||||
|
||||
public static RegisterRelations(overpassJson: any) : void{
|
||||
public static RegisterRelations(overpassJson: any): void {
|
||||
const memberships = ExtractRelations.BuildMembershipTable(ExtractRelations.GetRelationElements(overpassJson))
|
||||
State.state.knownRelations.setData(memberships)
|
||||
}
|
||||
|
|
|
@ -6,12 +6,14 @@ export class Geocoding {
|
|||
private static readonly host = "https://nominatim.openstreetmap.org/search?";
|
||||
|
||||
static Search(query: string,
|
||||
handleResult: ((places: { display_name: string, lat: number, lon: number, boundingbox: number[],
|
||||
osm_type: string, osm_id: string}[]) => void),
|
||||
handleResult: ((places: {
|
||||
display_name: string, lat: number, lon: number, boundingbox: number[],
|
||||
osm_type: string, osm_id: string
|
||||
}[]) => void),
|
||||
onFail: (() => void)) {
|
||||
const b = State.state.leafletMap.data.getBounds();
|
||||
const url = Geocoding.host + "format=json&limit=1&viewbox=" +
|
||||
`${b.getEast()},${b.getNorth()},${b.getWest()},${b.getSouth()}`+
|
||||
`${b.getEast()},${b.getNorth()},${b.getWest()},${b.getSouth()}` +
|
||||
"&accept-language=nl&q=" + query;
|
||||
Utils.downloadJson(
|
||||
url)
|
||||
|
|
|
@ -47,10 +47,10 @@ export class OsmConnection {
|
|||
public auth;
|
||||
public userDetails: UIEventSource<UserDetails>;
|
||||
public isLoggedIn: UIEventSource<boolean>
|
||||
private fakeUser: boolean;
|
||||
_dryRun: boolean;
|
||||
public preferencesHandler: OsmPreferences;
|
||||
public changesetHandler: ChangesetHandler;
|
||||
private fakeUser: boolean;
|
||||
private _onLoggedIn: ((userDetails: UserDetails) => void)[] = [];
|
||||
private readonly _iframeMode: Boolean | boolean;
|
||||
private readonly _singlePage: boolean;
|
||||
|
@ -59,6 +59,7 @@ export class OsmConnection {
|
|||
oauth_secret: string,
|
||||
url: string
|
||||
};
|
||||
private isChecking = false;
|
||||
|
||||
constructor(dryRun: boolean,
|
||||
fakeUser: boolean,
|
||||
|
@ -77,17 +78,17 @@ export class OsmConnection {
|
|||
|
||||
this.userDetails = new UIEventSource<UserDetails>(new UserDetails(this._oauth_config.url), "userDetails");
|
||||
this.userDetails.data.dryRun = dryRun || fakeUser;
|
||||
if(fakeUser){
|
||||
if (fakeUser) {
|
||||
const ud = this.userDetails.data;
|
||||
ud.csCount = 5678
|
||||
ud.loggedIn= true;
|
||||
ud.loggedIn = true;
|
||||
ud.unreadMessages = 0
|
||||
ud.name = "Fake user"
|
||||
ud.totalMessages = 42;
|
||||
}
|
||||
const self =this;
|
||||
const self = this;
|
||||
this.isLoggedIn = this.userDetails.map(user => user.loggedIn).addCallback(isLoggedIn => {
|
||||
if(self.userDetails.data.loggedIn == false && isLoggedIn == true){
|
||||
if (self.userDetails.data.loggedIn == false && isLoggedIn == true) {
|
||||
// We have an inconsistency: the userdetails say we _didn't_ log in, but this actor says we do
|
||||
// This means someone attempted to toggle this; so we attempt to login!
|
||||
self.AttemptLogin()
|
||||
|
@ -150,7 +151,7 @@ export class OsmConnection {
|
|||
}
|
||||
|
||||
public AttemptLogin() {
|
||||
if(this.fakeUser){
|
||||
if (this.fakeUser) {
|
||||
console.log("AttemptLogin called, but ignored as fakeUser is set")
|
||||
return;
|
||||
}
|
||||
|
@ -191,7 +192,7 @@ export class OsmConnection {
|
|||
data.loggedIn = true;
|
||||
console.log("Login completed, userinfo is ", userInfo);
|
||||
data.name = userInfo.getAttribute('display_name');
|
||||
data.uid= Number(userInfo.getAttribute("id"))
|
||||
data.uid = Number(userInfo.getAttribute("id"))
|
||||
data.csCount = userInfo.getElementsByTagName("changesets")[0].getAttribute("count");
|
||||
|
||||
data.img = undefined;
|
||||
|
@ -249,15 +250,14 @@ export class OsmConnection {
|
|||
});
|
||||
}
|
||||
|
||||
private isChecking = false;
|
||||
private CheckForMessagesContinuously(){
|
||||
const self =this;
|
||||
if(this.isChecking){
|
||||
private CheckForMessagesContinuously() {
|
||||
const self = this;
|
||||
if (this.isChecking) {
|
||||
return;
|
||||
}
|
||||
this.isChecking = true;
|
||||
UIEventSource.Chronic(5 * 60 * 1000).addCallback(_ => {
|
||||
if (self.isLoggedIn .data) {
|
||||
if (self.isLoggedIn.data) {
|
||||
console.log("Checking for messages")
|
||||
self.AttemptLogin();
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ export abstract class OsmObject {
|
|||
const splitted = id.split("/");
|
||||
const type = splitted[0];
|
||||
const idN = Number(splitted[1]);
|
||||
if(idN <0){
|
||||
if (idN < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -292,7 +292,7 @@ export abstract class OsmObject {
|
|||
const element = data.elements.pop();
|
||||
|
||||
let nodes = []
|
||||
if (data.elements.length > 2) {
|
||||
if (self.type === "way" && data.elements.length >= 0) {
|
||||
nodes = OsmObject.ParseObjects(data.elements)
|
||||
}
|
||||
|
||||
|
@ -438,15 +438,15 @@ export class OsmWay extends OsmObject {
|
|||
|
||||
for (const nodeId of element.nodes) {
|
||||
const node = nodeDict.get(nodeId)
|
||||
if(node === undefined){
|
||||
if (node === undefined) {
|
||||
console.error("Error: node ", nodeId, "not found in ", nodeDict)
|
||||
// This is probably part of a relation which hasn't been fully downloaded
|
||||
continue;
|
||||
}
|
||||
const cp = node.centerpoint();
|
||||
this.coordinates.push(cp);
|
||||
latSum = cp[0]
|
||||
lonSum = cp[1]
|
||||
latSum += cp[0]
|
||||
lonSum += cp[1]
|
||||
}
|
||||
let count = this.coordinates.length;
|
||||
this.lat = latSum / count;
|
||||
|
@ -498,7 +498,7 @@ export class OsmRelation extends OsmObject {
|
|||
|
||||
let tags = this.TagsXML();
|
||||
let cs = ""
|
||||
if(changesetId !== undefined){
|
||||
if (changesetId !== undefined) {
|
||||
cs = `changeset="${changesetId}"`
|
||||
}
|
||||
return ` <relation id="${this.id}" ${cs} ${this.VersionXML()}>
|
||||
|
|