Add binoculars theme, auto reformat everything
This commit is contained in:
parent
38dea806c5
commit
78d6482c88
586 changed files with 115573 additions and 111842 deletions
|
@ -1,27 +1,25 @@
|
||||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
|
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
|
||||||
// https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/typescript-node
|
// https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/typescript-node
|
||||||
{
|
{
|
||||||
"name": "MapComplete",
|
"name": "MapComplete",
|
||||||
"build": {
|
"build": {
|
||||||
"dockerfile": "Dockerfile",
|
"dockerfile": "Dockerfile",
|
||||||
// Update 'VARIANT' to pick a Node version: 12, 14, 16
|
// Update 'VARIANT' to pick a Node version: 12, 14, 16
|
||||||
"args": {
|
"args": {
|
||||||
"VARIANT": "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
|
||||||
|
],
|
||||||
|
// Use 'postCreateCommand' to run commands after the container is created.
|
||||||
|
//"postCreateCommand": "npm run init",
|
||||||
|
|
||||||
// Set *default* container specific settings.json values on container create.
|
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
||||||
"settings": {},
|
"remoteUser": "node"
|
||||||
|
|
||||||
// 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],
|
|
||||||
|
|
||||||
// Use 'postCreateCommand' to run commands after the container is created.
|
|
||||||
//"postCreateCommand": "npm run init",
|
|
||||||
|
|
||||||
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
|
||||||
"remoteUser": "node"
|
|
||||||
}
|
}
|
||||||
|
|
9
.github/pull_request_template.md
vendored
9
.github/pull_request_template.md
vendored
|
@ -1,9 +1,8 @@
|
||||||
|
|
||||||
Opening a pull request on MapComplete
|
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.
|
Hey! Thanks for opening a pull request on Mapcomplete! This probably means you want to add a new theme - if so, please
|
||||||
If this pull request is for some other issue, please ignore the template.
|
follow the checklist below. If this pull request is for some other issue, please ignore the template.
|
||||||
|
|
||||||
Adding your new theme
|
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
|
- [ ] 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)
|
- [ ] 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
|
20
.github/workflows/deploy_pietervdvn.yml
vendored
20
.github/workflows/deploy_pietervdvn.yml
vendored
|
@ -1,42 +1,42 @@
|
||||||
name: Deployment on pietervdvn
|
name: Deployment on pietervdvn
|
||||||
on:
|
on:
|
||||||
push
|
push
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1.2.0
|
uses: actions/setup-node@v1.2.0
|
||||||
with:
|
with:
|
||||||
node-version: '15'
|
node-version: '15'
|
||||||
env:
|
env:
|
||||||
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
|
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
|
||||||
|
|
||||||
- name: install deps
|
- name: install deps
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
||||||
- name: create generated dir
|
- name: create generated dir
|
||||||
run: mkdir ./assets/generated
|
run: mkdir ./assets/generated
|
||||||
|
|
||||||
- name: create stub themes
|
- name: create stub themes
|
||||||
run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
|
run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
|
||||||
|
|
||||||
- name: Prepare deploy
|
- name: Prepare deploy
|
||||||
run: npm run prepare-deploy
|
run: npm run prepare-deploy
|
||||||
|
|
||||||
- name: Clone deployment repo
|
- name: Clone deployment repo
|
||||||
env:
|
env:
|
||||||
DEPLOY_KEY_PIETERVDVN: ${{ secrets.DEPLOY_KEY_PIETERVDVN }}
|
DEPLOY_KEY_PIETERVDVN: ${{ secrets.DEPLOY_KEY_PIETERVDVN }}
|
||||||
run: |
|
run: |
|
||||||
echo "Cloning destination repo"
|
echo "Cloning destination repo"
|
||||||
git config --global user.email "pietervdvn@posteo.net"
|
git config --global user.email "pietervdvn@posteo.net"
|
||||||
git config --global user.name "pietervdvn"
|
git config --global user.name "pietervdvn"
|
||||||
git clone --depth 1 --single-branch --branch master "https://x-access-token:$DEPLOY_KEY_PIETERVDVN@github.com/pietervdvn/pietervdvn.github.io.git"
|
git clone --depth 1 --single-branch --branch master "https://x-access-token:$DEPLOY_KEY_PIETERVDVN@github.com/pietervdvn/pietervdvn.github.io.git"
|
||||||
echo "Destination repo is cloned"
|
echo "Destination repo is cloned"
|
||||||
|
|
||||||
- name: "Copying files"
|
- name: "Copying files"
|
||||||
run: |
|
run: |
|
||||||
echo "Deploying"
|
echo "Deploying"
|
||||||
|
|
26
.github/workflows/pull_request_check.yml
vendored
26
.github/workflows/pull_request_check.yml
vendored
|
@ -1,38 +1,38 @@
|
||||||
name: Pull request check
|
name: Pull request check
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
types: [opened, edited, synchronize, ready_for_review, review_requested]
|
types: [ opened, edited, synchronize, ready_for_review, review_requested ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1.2.0
|
uses: actions/setup-node@v1.2.0
|
||||||
env:
|
env:
|
||||||
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
|
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
|
||||||
|
|
||||||
- name: install deps
|
- name: install deps
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
||||||
- name: create generated dir
|
- name: create generated dir
|
||||||
run: mkdir ./assets/generated
|
run: mkdir ./assets/generated
|
||||||
|
|
||||||
- name: create stub themes
|
- name: create stub themes
|
||||||
run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
|
run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
|
||||||
|
|
||||||
- name: generate translations
|
- name: generate translations
|
||||||
run: npm run generate:translations
|
run: npm run generate:translations
|
||||||
|
|
||||||
- name: Compile license info
|
- name: Compile license info
|
||||||
run: npm run generate:licenses
|
run: npm run generate:licenses
|
||||||
|
|
||||||
- name: Compile and validate themes and layers
|
- name: Compile and validate themes and layers
|
||||||
run: npm run validate:layeroverview
|
run: npm run validate:layeroverview
|
||||||
|
|
||||||
- name: Validate license info
|
- name: Validate license info
|
||||||
run: npm run validate:licenses
|
run: npm run validate:licenses
|
||||||
|
|
||||||
|
@ -45,10 +45,10 @@ jobs:
|
||||||
else
|
else
|
||||||
echo "VALIDATION_FAILED=false" >> $GITHUB_ENV
|
echo "VALIDATION_FAILED=false" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Test variable
|
- name: Test variable
|
||||||
run: echo "${{ env.VALIDATION_FAILED }}"
|
run: echo "${{ env.VALIDATION_FAILED }}"
|
||||||
|
|
||||||
- name: Archive reports
|
- name: Archive reports
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
if: >-
|
if: >-
|
||||||
|
@ -58,7 +58,7 @@ jobs:
|
||||||
path: |
|
path: |
|
||||||
layer_report.txt
|
layer_report.txt
|
||||||
missing_licenses.txt
|
missing_licenses.txt
|
||||||
|
|
||||||
- name: Comment PR
|
- name: Comment PR
|
||||||
uses: allthatjazzleo/actions-pull-request-add-comment@master
|
uses: allthatjazzleo/actions-pull-request-add-comment@master
|
||||||
if: >-
|
if: >-
|
||||||
|
|
|
@ -3,42 +3,42 @@ on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1.2.0
|
uses: actions/setup-node@v1.2.0
|
||||||
with:
|
with:
|
||||||
node-version: '15'
|
node-version: '15'
|
||||||
env:
|
env:
|
||||||
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
|
ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
|
||||||
|
|
||||||
- name: install deps
|
- name: install deps
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
||||||
- name: create generated dir
|
- name: create generated dir
|
||||||
run: mkdir ./assets/generated
|
run: mkdir ./assets/generated
|
||||||
|
|
||||||
- name: create stub themes
|
- name: create stub themes
|
||||||
run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
|
run: "echo '{\"layers\": [], \"themes\": []}' > ./assets/generated/known_layers_and_themes.json"
|
||||||
|
|
||||||
- name: Prepare deploy
|
- name: Prepare deploy
|
||||||
run: npm run prepare-deploy
|
run: npm run prepare-deploy
|
||||||
|
|
||||||
- name: Clone deployment repo
|
- name: Clone deployment repo
|
||||||
env:
|
env:
|
||||||
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
|
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
|
||||||
run: |
|
run: |
|
||||||
echo "Cloning destination repo"
|
echo "Cloning destination repo"
|
||||||
git config --global user.email "pietervdvn@posteo.net"
|
git config --global user.email "pietervdvn@posteo.net"
|
||||||
git config --global user.name "MapComplete"
|
git config --global user.name "MapComplete"
|
||||||
git clone --depth 1 --single-branch --branch main "https://x-access-token:$DEPLOY_KEY@github.com/MapComplete/mapcomplete.github.io.git"
|
git clone --depth 1 --single-branch --branch main "https://x-access-token:$DEPLOY_KEY@github.com/MapComplete/mapcomplete.github.io.git"
|
||||||
echo "Destination repo is cloned"
|
echo "Destination repo is cloned"
|
||||||
|
|
||||||
- name: "Copying files"
|
- name: "Copying files"
|
||||||
run: |
|
run: |
|
||||||
echo "Deploying"
|
echo "Deploying"
|
||||||
|
|
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
|
@ -1,3 +1,3 @@
|
||||||
{
|
{
|
||||||
"files.eol": "\n"
|
"files.eol": "\n"
|
||||||
}
|
}
|
|
@ -5,17 +5,17 @@ import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig";
|
||||||
|
|
||||||
export default class SharedTagRenderings {
|
export default class SharedTagRenderings {
|
||||||
|
|
||||||
public static SharedTagRendering : Map<string, TagRenderingConfig> = SharedTagRenderings.generatedSharedFields();
|
public static SharedTagRendering: Map<string, TagRenderingConfig> = SharedTagRenderings.generatedSharedFields();
|
||||||
public static SharedIcons : Map<string, TagRenderingConfig> = SharedTagRenderings.generatedSharedFields(true);
|
public static SharedIcons: Map<string, TagRenderingConfig> = SharedTagRenderings.generatedSharedFields(true);
|
||||||
|
|
||||||
private static generatedSharedFields(iconsOnly = false) : Map<string, TagRenderingConfig>{
|
private static generatedSharedFields(iconsOnly = false): Map<string, TagRenderingConfig> {
|
||||||
const dict = new Map<string, TagRenderingConfig>();
|
const dict = new Map<string, TagRenderingConfig>();
|
||||||
|
|
||||||
function add(key, store) {
|
function add(key, store) {
|
||||||
try {
|
try {
|
||||||
dict.set(key, new TagRenderingConfig(store[key], undefined, `SharedTagRenderings.${key}`))
|
dict.set(key, new TagRenderingConfig(store[key], undefined, `SharedTagRenderings.${key}`))
|
||||||
} catch (e) {
|
} 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)
|
console.error("BUG: could not parse", key, " from questions.json or icons.json - this error happened during the build step of the SharedTagRenderings", e)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
Architecture
|
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?
|
Servers?
|
||||||
--------
|
--------
|
||||||
|
@ -11,24 +12,30 @@ There are no servers for MapComplete, all services are configured by third parti
|
||||||
Minimal HTML - Minimal CSS
|
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
|
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).
|
All values which change regularly are wrapped into
|
||||||
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)
|
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.
|
Furthermore, there are various helper functions, the most widely used one being `map` - generating a new event source
|
||||||
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.
|
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 {
|
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.
|
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...
|
const src : UIEventSource<string> = ... // E.g. user input, data that will be updated... new VariableUIElement(src)
|
||||||
new VariableUIElement(src)
|
.AttachTo('some-id') // attach it to the html
|
||||||
.AttachTo('some-id') // attach it to the html
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that every component offers support for `onClick( someCallBack)`
|
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/
|
// We construct the dropdown element with values and labelshttps://tailwindcss.com/
|
||||||
const isOpened = new Dropdown<string>(Translations.t.is_this_shop_opened_during_holidays,
|
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])
|
return new Combine([isOpened, extraQuestion])
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Constructing a special class
|
### Constructing a special class
|
||||||
|
@ -144,6 +154,7 @@ export default class MyComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Construct the needed UI in the constructor
|
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:
|
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,116 +1,91 @@
|
||||||
|
Metatags
|
||||||
|
|
||||||
Metatags
|
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Metatags are extra tags available, in order to display more data or to give better questions.
|
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
|
|
||||||
|
|
||||||
|
|
||||||
|
### _lat, _lon
|
||||||
|
|
||||||
The latitude and longitude of the point (or centerpoint in the case of a way/area)
|
The latitude and longitude of the point (or centerpoint in the case of a way/area)
|
||||||
|
|
||||||
|
### _surface, _surface:ha
|
||||||
### _surface, _surface:ha
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The surface area of the feature, in square meters and in hectare. Not set on points and ways
|
The surface area of the feature, in square meters and in hectare. Not set on points and ways
|
||||||
|
|
||||||
|
### _length, _length:km
|
||||||
|
|
||||||
### _length, _length:km
|
The total length of a feature in meters (and in kilometers, rounded to one decimal for '_length:km'). For a surface, the
|
||||||
|
length of the perimeter
|
||||||
|
|
||||||
|
### Theme-defined keys
|
||||||
|
|
||||||
|
If 'units' is defined in the layoutConfig, then this metatagger will rewrite the specified keys to have the canonical
|
||||||
|
form (e.g. `1meter` will be rewritten to `1m`)
|
||||||
|
|
||||||
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
|
### _country
|
||||||
|
|
||||||
|
|
||||||
### Theme-defined keys
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
If 'units' is defined in the layoutConfig, then this metatagger will rewrite the specified keys to have the canonical form (e.g. `1meter` will be rewritten to `1m`)
|
|
||||||
|
|
||||||
|
|
||||||
### _country
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The country code of the property (with latlon2country)
|
The country code of the property (with latlon2country)
|
||||||
|
|
||||||
|
### _isOpen, _isOpen:description
|
||||||
### _isOpen, _isOpen:description
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
If 'opening_hours' is present, it will add the current state of the feature (being 'yes' or 'no')
|
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
|
||||||
|
|
||||||
### _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
|
||||||
|
|
||||||
|
### _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
|
||||||
|
|
||||||
Legacy for a specific project calculating the needed width for safe traffic on a road. Only activated if 'width:carriageway' is present
|
### _now:date, _now:datetime, _loaded:date, _loaded:_datetime
|
||||||
|
|
||||||
|
|
||||||
### _direction:numerical, _direction:leftright
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_direction:numerical is a normalized, numerical direction based on 'camera:direction' or on 'direction'; it is only present if a valid direction is found (e.g. 38.5 or NE). _direction:leftright is either 'left' or 'right', which is left-looking on the map or 'right-looking' on the map
|
|
||||||
|
|
||||||
|
|
||||||
### _now:date, _now:datetime, _loaded:date, _loaded:_datetime
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Adds the time that the data got loaded - pretty much the time of downloading from overpass. The format is YYYY-MM-DD hh:mm, aka 'sortable' aka ISO-8601-but-not-entirely
|
|
||||||
|
|
||||||
|
|
||||||
### _last_edit:contributor, _last_edit:contributor:uid, _last_edit:changeset, _last_edit:timestamp, _version_number
|
|
||||||
|
|
||||||
|
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.
|
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.
|
It is also possible to calculate your own tags - but this requires some javascript knowledge.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Before proceeding, some warnings:
|
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.
|
||||||
|
|
||||||
|
To enable this feature, add a field `calculatedTags` in the layer object, e.g.:
|
||||||
- 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.:
|
|
||||||
|
|
||||||
````
|
````
|
||||||
|
|
||||||
|
@ -126,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:
|
||||||
|
|
||||||
|
- `area` contains the surface area (in square meters) of the object
|
||||||
|
- `lat` and `lon` contain the latitude and longitude
|
||||||
|
|
||||||
The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object:
|
Some advanced functions are available on **feat** as well:
|
||||||
|
|
||||||
|
- distanceTo
|
||||||
|
- overlapWith
|
||||||
|
- closest
|
||||||
|
- memberships
|
||||||
|
- score
|
||||||
|
|
||||||
|
### distanceTo
|
||||||
|
|
||||||
- `area` contains the surface area (in square meters) of the object
|
Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of
|
||||||
- `lat` and `lon` contain the latitude and longitude
|
coordinates, a geojson feature or the ID of an object
|
||||||
|
|
||||||
|
0. longitude
|
||||||
|
1. latitude
|
||||||
|
|
||||||
Some advanced functions are available on **feat** as well:
|
### overlapWith
|
||||||
|
|
||||||
- distanceTo
|
Gives a list of features from the specified layer which this feature (partly) overlaps with. If the current feature is a
|
||||||
- overlapWith
|
point, all features that embed the point are given. The returned value is `{ feat: GeoJSONFeature, overlap: number}[]`
|
||||||
- closest
|
where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current
|
||||||
- memberships
|
feature is a line or `undefined` if the current feature is a point
|
||||||
- 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
|
0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)
|
||||||
|
|
||||||
0. longitude
|
### closest
|
||||||
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
|
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. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)
|
0. list of features
|
||||||
|
|
||||||
### 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.
|
### memberships
|
||||||
|
|
||||||
0. list of features
|
Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of.
|
||||||
|
|
||||||
### memberships
|
|
||||||
|
|
||||||
Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of.
|
For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`
|
||||||
|
|
||||||
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 => ...)`
|
||||||
|
|
||||||
|
For
|
||||||
### score
|
example: `_comfort_score=feat.score('https://raw.githubusercontent.com/pietervdvn/AspectedRouting/master/Examples/bicycle/aspects/bicycle.comfort.json')`
|
||||||
|
|
||||||
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 => ...)`
|
0. path Generated from SimpleMetaTagger, ExtraFunction
|
||||||
|
|
||||||
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
|
|
|
@ -1,113 +1,128 @@
|
||||||
|
Development and deployment
|
||||||
|
==========================
|
||||||
|
|
||||||
|
There are various scripts to help setup MapComplete for deployment and develop-deployment.
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
Architecture overview
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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).
|
||||||
|
|
||||||
|
To develop and build MapComplete, you
|
||||||
|
|
||||||
Development and deployment
|
|
||||||
==========================
|
|
||||||
|
|
||||||
There are various scripts to help setup MapComplete for deployment and develop-deployment.
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
Architecture overview
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
To develop and build MapComplete, you
|
|
||||||
|
|
||||||
0. Make sure you have a recent version of nodejs - at least 12.0, preferably 15
|
0. Make sure you have a recent version of nodejs - at least 12.0, preferably 15
|
||||||
0. Make a fork and clone the repository.
|
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/
|
1. Install `npm`. Linux: `sudo apt install npm` (or your favourite package manager), Windows: install
|
||||||
3. Run `npm run init` and generate some additional dependencies and generated files. Note that it'll install the dependencies too
|
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
|
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.
|
1. Make a fork and clone the repository.
|
||||||
2. After cloning, Visual Studio Code will ask you if you want to use the devcontainer.
|
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.
|
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
|
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.
|
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.
|
1. Open a remote WSL window using the button in the bottom left.
|
||||||
2. Make a fork and clone the repository.
|
2. Make a fork and clone the repository.
|
||||||
3. Install `npm` using `sudo apt install npm`.
|
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
|
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.
|
|
||||||
|
|
||||||
Every branch is automatically built (upon push) to 'pietervdvn.github.io/mc/<branchname>' by a github action.
|
|
||||||
|
|
||||||
|
A script creates a webpage for every theme automatically, with some customizations in order to:
|
||||||
|
|
||||||
Deploying a fork
|
- to have shorter urls
|
||||||
----------------
|
- have individual social images
|
||||||
|
- have individual web manifests
|
||||||
A script creates a webpage for every theme automatically, with some customizations in order to:
|
|
||||||
|
This script can be invoked with `npm run prepare-deploy`
|
||||||
- to have shorter urls
|
|
||||||
- have individual social images
|
|
||||||
- have individual web manifests
|
|
||||||
|
|
||||||
|
|
||||||
This script can be invoked with `npm run prepare-deploy`
|
|
||||||
|
|
||||||
If you want to deploy your fork:
|
If you want to deploy your fork:
|
||||||
|
|
||||||
0. `npm run prepare-deploy`
|
0. `npm run prepare-deploy`
|
||||||
1. `npm run build`
|
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
|
Weird errors
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Try removing `node_modules`, `package-lock.json` and `.cache`
|
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.
|
- `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.
|
- `start`: start a development server.
|
||||||
- `test`: run the unit tests
|
- `test`: run the unit tests
|
||||||
- `init`: Generates and downloads various assets which are needed to compile
|
- `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:editor-layer-index`: downloads the editor-layer-index-json from osmlab.github.io
|
||||||
- `generate:images`: compiles the SVG's into an asset
|
- `generate:images`: compiles the SVG's into an asset
|
||||||
- `generate:translations`: compiles the translation file into a javascript file
|
- `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:layouts`: uses `index.html` as template to create all the theme index pages. You'll want to run `clean` when
|
||||||
- `generate:docs`: generates various documents, such as information about available metatags, information to put on the [OSM-wiki](https://wiki.openstreetmap.org/wiki/MapComplete),...
|
done
|
||||||
- `generate:report`: downloads statistics from OsmCha, compiles neat graphs
|
- `generate:docs`: generates various documents, such as information about available metatags, information to put on
|
||||||
- `generate:cache:speelplekken`: creates an offline copy of all the data required for one specific (paid for) theme
|
the [OSM-wiki](https://wiki.openstreetmap.org/wiki/MapComplete),...
|
||||||
- `generate:layeroverview`: reads all the theme- and layerconfigurations, compiles them into a single JSON.
|
- `generate:report`: downloads statistics from OsmCha, compiles neat graphs
|
||||||
- `reset:layeroverview`: if something is wrong with the layeroverview, creates an empty one
|
- `generate:cache:speelplekken`: creates an offline copy of all the data required for one specific (paid for) theme
|
||||||
- `generate:licenses`: compiles all the license info of images into a single json
|
- `generate:layeroverview`: reads all the theme- and layerconfigurations, compiles them into a single JSON.
|
||||||
- `optimize:images`: attempts to make smaller pngs - optional to run before a deployment
|
- `reset:layeroverview`: if something is wrong with the layeroverview, creates an empty one
|
||||||
- `generate`: run all the necesary generate-scripts
|
- `generate:licenses`: compiles all the license info of images into a single json
|
||||||
- `build`: actually bundle all the files into a single `dist/`-folder
|
- `optimize:images`: attempts to make smaller pngs - optional to run before a deployment
|
||||||
- `prepare-deploy`: create the layouts
|
- `generate`: run all the necesary generate-scripts
|
||||||
- `deploy:staging`,`deploy:pietervdvn`, `deploy:production`: deploy the latest code on various locations
|
- `build`: actually bundle all the files into a single `dist/`-folder
|
||||||
- `lint`: get depressed by the amount of warnings
|
- `prepare-deploy`: create the layouts
|
||||||
- `clean`: remove some generated files which are annoying in the repo
|
- `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
|
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
|
### 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
|
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
|
Privacy
|
||||||
-------
|
-------
|
||||||
|
@ -31,17 +48,24 @@ Privacy
|
||||||
|
|
||||||
Zolang je je niet aanmeldt, worden er geen persoonsgegevens opgeslaan.
|
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
|
### 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
|
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
|
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 a longtime contributor and do know the OpenStreetMap tagging scheme very well.
|
||||||
- You are not afraid of editing a .JSON-file
|
- 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'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).
|
or [Matrix](https://app.element.io/#/room/#MapComplete:matrix.org).
|
||||||
|
|
||||||
The custom theme generator
|
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).
|
[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:
|
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.
|
- Take the entire JSON-file and [base64](https://www.base64encode.org/) encode it. Then open up the
|
||||||
- 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>`
|
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
|
- Ask to have your theme included into the official MapComplete - requirements below
|
||||||
|
|
||||||
### Getting your theme included into the official mapcomplete
|
### 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:
|
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
|
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.
|
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:*
|
*Via a pull request:*
|
||||||
|
|
||||||
1) Fork this repository
|
1) Fork this repository
|
||||||
2) Go to `assets/themes` and create a new directory `yourtheme`
|
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)
|
3) Create a new file `yourtheme.json`, paste the theme configuration in there. You can find your theme configuration in
|
||||||
4) Copy all the images into this new directory. **No external sources are allowed!** External image sources leak privacy or can break.
|
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.
|
- Make sure the license is suitable, preferable a Creative Commons license or CC0-license.
|
||||||
- If an SVG version is available, use the SVG version
|
- 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`
|
||||||
- Create a file `license_info.json` in the theme directory, which contains metadata on every artwork source
|
instead of the HTML link
|
||||||
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.
|
- Create a file `license_info.json` in the theme directory, which contains metadata on every artwork source
|
||||||
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
|
5) Add your theme to the code base: add it into "assets/themes" and make sure all the images are there too. Running '
|
||||||
7) Test your theme: run the project as described in [development_deployment](Development_deployment.md)
|
ts-node scripts/fixTheme <path to your theme>' will help downloading the images and attempts to get the licenses if
|
||||||
8) Happy with your theme? Time to open a Pull Request!
|
on wikimedia.
|
||||||
9) Thanks a lot for improving MapComplete!
|
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
|
||||||
The .JSON-format
|
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
|
||||||
|
----------------
|
||||||
|
|
||||||
There are three important levels in the .JSON-file:
|
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.
|
- The toplevel describes the metadata of the entire theme. It contains the `title`, `description`, `icon`... of the
|
||||||
- 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`
|
theme. The most important object is `layers`, which is a list of objects describing layers.
|
||||||
- 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.
|
- 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:
|
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
|
### 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
|
### 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:
|
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.
|
- links are disabled when answering a question (e.g. a link in a mapping) as it should trigger the answer - not trigger
|
||||||
- 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.
|
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
|
||||||
|
|
||||||
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
|
### 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
|
### 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
|
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
|
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
|
### 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?
|
One should not make one layer for benches with a backrest and one layer for benches without. This is confusing for users
|
||||||
Also, it isn't possible to 'move' an attribute to another layer.
|
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.
|
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!
|
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
|
### 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
|
||||||
|
|
||||||
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
|
### Vision
|
||||||
|
|
||||||
The core philosophy of StreetComplete is **OpenStreetMap is cool! Help to improve it by answering these questions**
|
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.
|
This means that StreetComplete is mainly aimed towards people who are already OpenStreetMap-enthusiasts, whereas
|
||||||
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.
|
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
|
### Use cases
|
||||||
|
|
||||||
|
@ -29,7 +32,9 @@ MapComplete is made to
|
||||||
|
|
||||||
StreetComplete is an android app, so can only be used on Android Phones.
|
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
|
### Feature comparison
|
||||||
|
|
||||||
|
@ -37,22 +42,26 @@ MapComplete is also an OpenStreetMap-viewer, while StreetComplete hides known va
|
||||||
|
|
||||||
MapComplete will not work offline.
|
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).
|
MapComplete is a bit more complex to use. One needs to go hunting for a specific map style rather than getting bunch of
|
||||||
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".
|
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).
|
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.
|
MapComplete allows the addition of new points, whereas StreetComplete does not.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## MapContrib
|
## 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.
|
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
|
In this document, you'll find a short overview of which (paid) projects have been completed with MapComplete
|
||||||
|
|
||||||
|
|
||||||
## Buurtnatuur
|
## Buurtnatuur
|
||||||
|
|
||||||
Commisioned by Groen (the Belgian Green Party): "a project to crowdsource data about parks, nature reserve and forests"
|
Commisioned by Groen (the Belgian Green Party): "a project to crowdsource data about parks, nature reserve and forests"
|
||||||
|
|
||||||
## Cyclofix
|
## 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
|
## 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)
|
## Natuurpunt Map (planned)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
# Available types for text fields
|
# 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
|
## string
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@ A geographical direction, in degrees. 0° is north, 90° is east, ... Will retur
|
||||||
|
|
||||||
## length
|
## 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
|
## wikidata
|
||||||
|
|
||||||
|
|
|
@ -1,92 +1,110 @@
|
||||||
|
### Special tag renderings
|
||||||
|
|
||||||
### 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
|
||||||
### 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
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
|
|
||||||
|
#### Example usage
|
||||||
#### 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)
|
### 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)
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
image key/prefix | image | The keys given to the images, e.g. if <span class='literal-code'>image</span> is given, the first picture URL will be added as <span class='literal-code'>image</span>, the second as <span class='literal-code'>image:0</span>, the third as <span class='literal-code'>image:1</span>, etc...
|
image key/prefix | image | The keys given to the images, e.g. if <span class='literal-code'>image</span> is given, the first picture URL will be added as <span class='literal-code'>image</span>, the second as <span class='literal-code'>image:0</span>, the third as <span class='literal-code'>image:1</span>, etc...
|
||||||
smart search | true | Also include images given via 'Wikidata', 'wikimedia_commons' and 'mapillary
|
smart search | true | Also include images given via 'Wikidata', 'wikimedia_commons' and 'mapillary
|
||||||
|
|
||||||
#### Example usage
|
|
||||||
|
|
||||||
{image_carousel(image,true)}
|
#### Example usage
|
||||||
### image_upload
|
|
||||||
|
|
||||||
Creates a button where a user can upload an image to IMGUR
|
{image_carousel(image,true)}
|
||||||
|
|
||||||
|
### image_upload
|
||||||
|
|
||||||
|
Creates a button where a user can upload an image to IMGUR
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added)
|
image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added)
|
||||||
|
|
||||||
#### Example usage
|
|
||||||
|
|
||||||
{image_upload(image)}
|
#### Example usage
|
||||||
### minimap
|
|
||||||
|
|
||||||
A small map showing the selected feature. Note that no styling is applied, wrap this in a div
|
{image_upload(image)}
|
||||||
|
|
||||||
|
### minimap
|
||||||
|
|
||||||
|
A small map showing the selected feature. Note that no styling is applied, wrap this in a div
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
zoomlevel | 18 | The (maximum) zoomlevel: the target zoomlevel after fitting the entire feature. The minimap will fit the entire feature, then zoom out to this zoom level. The higher, the more zoomed in with 1 being the entire world and 19 being really close
|
zoomlevel | 18 | The (maximum) zoomlevel: the target zoomlevel after fitting the entire feature. The minimap will fit the entire feature, then zoom out to this zoom level. The higher, the more zoomed in with 1 being the entire world and 19 being really close
|
||||||
idKey | id | (Matches all resting arguments) This argument should be the key of a property of the feature. The corresponding value is interpreted as either the id or the a list of ID's. The features with these ID's will be shown on this minimap.
|
idKey | id | (Matches all resting arguments) This argument should be the key of a property of the feature. The corresponding value is interpreted as either the id or the a list of ID's. The features with these ID's will be shown on this minimap.
|
||||||
|
|
||||||
#### Example usage
|
|
||||||
|
|
||||||
`{minimap()}`, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}`
|
#### Example usage
|
||||||
### 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
|
`{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
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
subjectKey | name | The key to use to determine the subject. If specified, the subject will be <b>tags[subjectKey]</b>
|
subjectKey | name | The key to use to determine the subject. If specified, the subject will be <b>tags[subjectKey]</b>
|
||||||
fallback | undefined | The identifier to use, if <i>tags[subjectKey]</i> as specified above is not available. This is effectively a fallback value
|
fallback | undefined | The identifier to use, if <i>tags[subjectKey]</i> as specified above is not available. This is effectively a fallback value
|
||||||
|
|
||||||
#### 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
|
#### Example usage
|
||||||
### opening_hours_table
|
|
||||||
|
|
||||||
Creates an opening-hours table. Usage: {opening_hours_table(opening_hours)} to create a table of the tag 'opening_hours'.
|
<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'.
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
key | opening_hours | The tagkey from which the table is constructed.
|
key | opening_hours | The tagkey from which the table is constructed.
|
||||||
|
|
||||||
#### Example usage
|
|
||||||
|
|
||||||
{opening_hours_table(opening_hours)}
|
#### Example usage
|
||||||
### 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)}
|
{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)}
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
Url | undefined | The URL to load
|
Url | undefined | The URL to load
|
||||||
Shorthands | undefined | A list of shorthands, of the format 'shorthandname:path.path.path'. separated by ;
|
Shorthands | undefined | A list of shorthands, of the format 'shorthandname:path.path.path'. separated by ;
|
||||||
path | undefined | The path (or shorthand) that should be returned
|
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)}
|
#### Example usage
|
||||||
### histogram
|
|
||||||
|
|
||||||
Create a histogram for a list of given values, read from the properties.
|
{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.
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
|
@ -94,29 +112,31 @@ key | undefined | The key to be read and to generate a histogram from
|
||||||
title | | The text to put above the given values column
|
title | | The text to put above the given values column
|
||||||
countHeader | | The text to put above the counts
|
countHeader | | The text to put above the counts
|
||||||
colors* | undefined | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33`
|
colors* | undefined | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33`
|
||||||
|
|
||||||
#### Example usage
|
|
||||||
|
|
||||||
`{histogram('some_key')}` with properties being `{some_key: ['a','b','a','c']} to create a histogram
|
#### Example usage
|
||||||
### share_link
|
|
||||||
|
|
||||||
Creates a link that (attempts to) open the native 'share'-screen
|
`{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
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
url | undefined | The url to share (default: current URL)
|
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
|
#### Example usage
|
||||||
### canonical
|
|
||||||
|
|
||||||
Converts a short, canonical value into the long, translated text
|
{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
|
||||||
|
|
||||||
name | default | description
|
name | default | description
|
||||||
------ | --------- | -------------
|
------ | --------- | -------------
|
||||||
key | undefined | The key of the tag to give the canonical text for
|
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
|
#### Example usage
|
||||||
|
|
||||||
|
{canonical(length)} will give 42 metre (in french) Generated from UI/SpecialVisualisations.ts
|
|
@ -1,7 +1,8 @@
|
||||||
Statistics
|
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
|
All Time usage
|
||||||
--------------
|
--------------
|
||||||
|
@ -9,7 +10,8 @@ All Time usage
|
||||||
![](Tools/CumulativeContributors.png)
|
![](Tools/CumulativeContributors.png)
|
||||||
![](Tools/Cumulative%20changesets%20per%20contributor.png)
|
![](Tools/Cumulative%20changesets%20per%20contributor.png)
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
![](Tools/Cumulative%20changesets%20per%20theme.png)
|
![](Tools/Cumulative%20changesets%20per%20theme.png)
|
||||||
![](Tools/Theme%20distribution.png)
|
![](Tools/Theme%20distribution.png)
|
||||||
|
|
|
@ -1,172 +1,172 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Open AED Map",
|
"name": "MapComplete Open AED Map",
|
||||||
"description": "On this map, one can find and mark nearby defibrillators",
|
"description": "On this map, one can find and mark nearby defibrillators",
|
||||||
"project_url": "https://mapcomplete.osm.be/aed",
|
"project_url": "https://mapcomplete.osm.be/aed",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/aed/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/aed/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "emergency",
|
|
||||||
"description": "The MapComplete theme Open AED Map has a layer Defibrillators showing features with this tag",
|
|
||||||
"value": "defibrillator"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Defibrillators 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": "emergency",
|
||||||
},
|
"description": "The MapComplete theme Open AED Map has a layer Defibrillators showing features with this tag",
|
||||||
{
|
"value": "defibrillator"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Defibrillators 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": "image",
|
||||||
{
|
"description": "The layer 'Defibrillators 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 'Defibrillators 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 'Defibrillators 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 'Defibrillators 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 'Defibrillators 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": "indoor",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows indoor=yes with a fixed text, namely 'This defibrillator is located indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
{
|
||||||
"value": "yes"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer 'Defibrillators 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": "indoor",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows indoor=no with a fixed text, namely 'This defibrillator is located outdoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
"key": "indoor",
|
||||||
"value": "no"
|
"description": "Layer 'Defibrillators' shows indoor=yes with a fixed text, namely 'This defibrillator is located indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'access' (in the MapComplete.osm.be theme 'Open AED Map')"
|
"key": "indoor",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows indoor=no with a fixed text, namely 'This defibrillator is located outdoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "access",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows access=yes with a fixed text, namely 'Publicly accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
{
|
||||||
"value": "yes"
|
"key": "access",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'access' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows access=public with a fixed text, namely 'Publicly accessible' (in the MapComplete.osm.be theme 'Open AED Map')",
|
"key": "access",
|
||||||
"value": "public"
|
"description": "Layer 'Defibrillators' shows access=yes with a fixed text, namely 'Publicly accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows access=customers with a fixed text, namely 'Only accessible to customers' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
"key": "access",
|
||||||
"value": "customers"
|
"description": "Layer 'Defibrillators' shows access=public with a fixed text, namely 'Publicly accessible' (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
},
|
"value": "public"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows access=private with a fixed text, namely 'Not accessible to the general public (e.g. only accesible to staff, the owners, ...)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
"key": "access",
|
||||||
"value": "private"
|
"description": "Layer 'Defibrillators' shows access=customers with a fixed text, namely 'Only accessible to customers' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
},
|
"value": "customers"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows access=no with a fixed text, namely 'Not accessible, possibly only for professional use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
"key": "access",
|
||||||
"value": "no"
|
"description": "Layer 'Defibrillators' shows access=private with a fixed text, namely 'Not accessible to the general public (e.g. only accesible to staff, the owners, ...)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
},
|
"value": "private"
|
||||||
{
|
},
|
||||||
"key": "defibrillator",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'defibrillator' (in the MapComplete.osm.be theme 'Open AED Map')"
|
"key": "access",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows access=no with a fixed text, namely 'Not accessible, possibly only for professional use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "defibrillator",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows defibrillator=manual with a fixed text, namely 'This is a manual defibrillator for professionals' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
{
|
||||||
"value": "manual"
|
"key": "defibrillator",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'defibrillator' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
{
|
},
|
||||||
"key": "defibrillator",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows defibrillator=automatic with a fixed text, namely 'This is a normal automatic defibrillator' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
"key": "defibrillator",
|
||||||
"value": "automatic"
|
"description": "Layer 'Defibrillators' shows defibrillator=manual with a fixed text, namely 'This is a manual defibrillator for professionals' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
},
|
"value": "manual"
|
||||||
{
|
},
|
||||||
"key": "level",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'level' (in the MapComplete.osm.be theme 'Open AED Map')"
|
"key": "defibrillator",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows defibrillator=automatic with a fixed text, namely 'This is a normal automatic defibrillator' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
{
|
"value": "automatic"
|
||||||
"key": "level",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows level=0 with a fixed text, namely 'This defibrillator is on the <b>ground floor</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
{
|
||||||
"value": "0"
|
"key": "level",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'level' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
{
|
},
|
||||||
"key": "level",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows level=1 with a fixed text, namely 'This defibrillator is on the <b>first floor</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
"key": "level",
|
||||||
"value": "1"
|
"description": "Layer 'Defibrillators' shows level=0 with a fixed text, namely 'This defibrillator is on the <b>ground floor</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
},
|
"value": "0"
|
||||||
{
|
},
|
||||||
"key": "defibrillator:location",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'defibrillator:location' (in the MapComplete.osm.be theme 'Open AED Map')"
|
"key": "level",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows level=1 with a fixed text, namely 'This defibrillator is on the <b>first floor</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
{
|
"value": "1"
|
||||||
"key": "defibrillator:location:en",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'defibrillator:location:en' (in the MapComplete.osm.be theme 'Open AED Map')"
|
{
|
||||||
},
|
"key": "defibrillator:location",
|
||||||
{
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'defibrillator:location' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
"key": "defibrillator:location:fr",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'defibrillator:location:fr' (in the MapComplete.osm.be theme 'Open AED Map')"
|
{
|
||||||
},
|
"key": "defibrillator:location:en",
|
||||||
{
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'defibrillator:location:en' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
"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')",
|
{
|
||||||
"value": "designated"
|
"key": "defibrillator:location:fr",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'defibrillator:location:fr' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
{
|
},
|
||||||
"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')",
|
"key": "wheelchair",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"value": "designated"
|
||||||
{
|
},
|
||||||
"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')",
|
"key": "wheelchair",
|
||||||
"value": "limited"
|
"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')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"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')",
|
"key": "wheelchair",
|
||||||
"value": "no"
|
"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')",
|
||||||
},
|
"value": "limited"
|
||||||
{
|
},
|
||||||
"key": "ref",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'ref' (in the MapComplete.osm.be theme 'Open AED Map')"
|
"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')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "email",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Open AED Map')"
|
{
|
||||||
},
|
"key": "ref",
|
||||||
{
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'ref' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
"key": "phone",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Open AED Map')"
|
{
|
||||||
},
|
"key": "email",
|
||||||
{
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
"key": "opening_hours",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Open AED Map')"
|
{
|
||||||
},
|
"key": "phone",
|
||||||
{
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
"key": "opening_hours",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
{
|
||||||
"value": "24/7"
|
"key": "opening_hours",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
{
|
},
|
||||||
"key": "description",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Open AED Map')"
|
"key": "opening_hours",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map')",
|
||||||
{
|
"value": "24/7"
|
||||||
"key": "survey:date",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'survey:date' (in the MapComplete.osm.be theme 'Open AED Map')"
|
{
|
||||||
},
|
"key": "description",
|
||||||
{
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
"key": "survey:date",
|
},
|
||||||
"description": "Layer 'Defibrillators' shows survey:date= with a fixed text, namely 'Checked today!' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map') Picking this answer will delete the key survey:date.",
|
{
|
||||||
"value": ""
|
"key": "survey:date",
|
||||||
},
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'survey:date' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
{
|
},
|
||||||
"key": "fixme",
|
{
|
||||||
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'fixme' (in the MapComplete.osm.be theme 'Open AED Map')"
|
"key": "survey:date",
|
||||||
}
|
"description": "Layer 'Defibrillators' shows survey:date= with a fixed text, namely 'Checked today!' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open AED Map') Picking this answer will delete the key survey:date.",
|
||||||
]
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "fixme",
|
||||||
|
"description": "Layer 'Defibrillators' shows and asks freeform values for key 'fixme' (in the MapComplete.osm.be theme 'Open AED Map')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,111 +1,111 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Open Artwork Map",
|
"name": "MapComplete Open Artwork Map",
|
||||||
"description": "Welcome to Open Artwork Map, a map of statues, busts, grafittis and other artwork all over the world",
|
"description": "Welcome to Open Artwork Map, a map of statues, busts, grafittis and other artwork all over the world",
|
||||||
"project_url": "https://mapcomplete.osm.be/artwork",
|
"project_url": "https://mapcomplete.osm.be/artwork",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/artwork/artwork.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/artwork/artwork.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "tourism",
|
|
||||||
"description": "The MapComplete theme Open Artwork Map has a layer Artworks showing features with this tag",
|
|
||||||
"value": "artwork"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Artworks 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": "tourism",
|
||||||
},
|
"description": "The MapComplete theme Open Artwork Map has a layer Artworks showing features with this tag",
|
||||||
{
|
"value": "artwork"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Artworks 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": "image",
|
||||||
{
|
"description": "The layer 'Artworks 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 'Artworks 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 'Artworks 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 'Artworks 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 'Artworks 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": "artwork_type",
|
},
|
||||||
"description": "Layer 'Artworks' shows and asks freeform values for key 'artwork_type' (in the MapComplete.osm.be theme 'Open Artwork Map')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Artworks 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": "artwork_type",
|
},
|
||||||
"description": "Layer 'Artworks' shows artwork_type=architecture with a fixed text, namely 'Architecture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
{
|
||||||
"value": "architecture"
|
"key": "artwork_type",
|
||||||
},
|
"description": "Layer 'Artworks' shows and asks freeform values for key 'artwork_type' (in the MapComplete.osm.be theme 'Open Artwork Map')"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=mural with a fixed text, namely 'Mural' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "mural"
|
"description": "Layer 'Artworks' shows artwork_type=architecture with a fixed text, namely 'Architecture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "architecture"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=painting with a fixed text, namely 'Painting' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "painting"
|
"description": "Layer 'Artworks' shows artwork_type=mural with a fixed text, namely 'Mural' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "mural"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=sculpture with a fixed text, namely 'Sculpture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "sculpture"
|
"description": "Layer 'Artworks' shows artwork_type=painting with a fixed text, namely 'Painting' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "painting"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=statue with a fixed text, namely 'Statue' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "statue"
|
"description": "Layer 'Artworks' shows artwork_type=sculpture with a fixed text, namely 'Sculpture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "sculpture"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=bust with a fixed text, namely 'Bust' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "bust"
|
"description": "Layer 'Artworks' shows artwork_type=statue with a fixed text, namely 'Statue' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "statue"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=stone with a fixed text, namely 'Stone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "stone"
|
"description": "Layer 'Artworks' shows artwork_type=bust with a fixed text, namely 'Bust' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "bust"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=installation with a fixed text, namely 'Installation' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "installation"
|
"description": "Layer 'Artworks' shows artwork_type=stone with a fixed text, namely 'Stone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "stone"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=graffiti with a fixed text, namely 'Graffiti' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "graffiti"
|
"description": "Layer 'Artworks' shows artwork_type=installation with a fixed text, namely 'Installation' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "installation"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=relief with a fixed text, namely 'Relief' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "relief"
|
"description": "Layer 'Artworks' shows artwork_type=graffiti with a fixed text, namely 'Graffiti' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "graffiti"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=azulejo with a fixed text, namely 'Azulejo (Spanish decorative tilework)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "azulejo"
|
"description": "Layer 'Artworks' shows artwork_type=relief with a fixed text, namely 'Relief' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "relief"
|
||||||
{
|
},
|
||||||
"key": "artwork_type",
|
{
|
||||||
"description": "Layer 'Artworks' shows artwork_type=tilework with a fixed text, namely 'Tilework' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
"key": "artwork_type",
|
||||||
"value": "tilework"
|
"description": "Layer 'Artworks' shows artwork_type=azulejo with a fixed text, namely 'Azulejo (Spanish decorative tilework)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
},
|
"value": "azulejo"
|
||||||
{
|
},
|
||||||
"key": "artist_name",
|
{
|
||||||
"description": "Layer 'Artworks' shows and asks freeform values for key 'artist_name' (in the MapComplete.osm.be theme 'Open Artwork Map')"
|
"key": "artwork_type",
|
||||||
},
|
"description": "Layer 'Artworks' shows artwork_type=tilework with a fixed text, namely 'Tilework' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
|
||||||
{
|
"value": "tilework"
|
||||||
"key": "website",
|
},
|
||||||
"description": "Layer 'Artworks' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Artwork Map')"
|
{
|
||||||
},
|
"key": "artist_name",
|
||||||
{
|
"description": "Layer 'Artworks' shows and asks freeform values for key 'artist_name' (in the MapComplete.osm.be theme 'Open Artwork Map')"
|
||||||
"key": "wikidata",
|
},
|
||||||
"description": "Layer 'Artworks' shows and asks freeform values for key 'wikidata' (in the MapComplete.osm.be theme 'Open Artwork Map')"
|
{
|
||||||
}
|
"key": "website",
|
||||||
]
|
"description": "Layer 'Artworks' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Artwork Map')"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "wikidata",
|
||||||
|
"description": "Layer 'Artworks' shows and asks freeform values for key 'wikidata' (in the MapComplete.osm.be theme 'Open Artwork Map')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,197 +1,197 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Benches",
|
"name": "MapComplete Benches",
|
||||||
"description": "A map of benches",
|
"description": "A map of benches",
|
||||||
"project_url": "https://mapcomplete.osm.be/benches",
|
"project_url": "https://mapcomplete.osm.be/benches",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/benches/bench_poi.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/benches/bench_poi.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, Florian Edelmann",
|
"contact_name": "Pieter Vander Vennet, Florian Edelmann",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "amenity",
|
|
||||||
"description": "The MapComplete theme Benches has a layer Benches showing features with this tag",
|
|
||||||
"value": "bench"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Benches 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": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Benches has a layer Benches showing features with this tag",
|
||||||
{
|
"value": "bench"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Benches 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": "image",
|
||||||
{
|
"description": "The layer 'Benches 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 'Benches 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 'Benches 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 'Benches 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 'Benches 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": "backrest",
|
},
|
||||||
"description": "Layer 'Benches' shows and asks freeform values for key 'backrest' (in the MapComplete.osm.be theme 'Benches')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Benches 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": "backrest",
|
},
|
||||||
"description": "Layer 'Benches' shows backrest=yes with a fixed text, namely 'Backrest: Yes' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
{
|
||||||
"value": "yes"
|
"key": "backrest",
|
||||||
},
|
"description": "Layer 'Benches' shows and asks freeform values for key 'backrest' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
{
|
},
|
||||||
"key": "backrest",
|
{
|
||||||
"description": "Layer 'Benches' shows backrest=no with a fixed text, namely 'Backrest: No' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "backrest",
|
||||||
"value": "no"
|
"description": "Layer 'Benches' shows backrest=yes with a fixed text, namely 'Backrest: Yes' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "seats",
|
{
|
||||||
"description": "Layer 'Benches' shows and asks freeform values for key 'seats' (in the MapComplete.osm.be theme 'Benches')"
|
"key": "backrest",
|
||||||
},
|
"description": "Layer 'Benches' shows backrest=no with a fixed text, namely 'Backrest: No' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "material",
|
},
|
||||||
"description": "Layer 'Benches' shows and asks freeform values for key 'material' (in the MapComplete.osm.be theme 'Benches')"
|
{
|
||||||
},
|
"key": "seats",
|
||||||
{
|
"description": "Layer 'Benches' shows and asks freeform values for key 'seats' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
"key": "material",
|
},
|
||||||
"description": "Layer 'Benches' shows material=wood with a fixed text, namely 'Material: wood' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
{
|
||||||
"value": "wood"
|
"key": "material",
|
||||||
},
|
"description": "Layer 'Benches' shows and asks freeform values for key 'material' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
{
|
},
|
||||||
"key": "material",
|
{
|
||||||
"description": "Layer 'Benches' shows material=metal with a fixed text, namely 'Material: metal' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "material",
|
||||||
"value": "metal"
|
"description": "Layer 'Benches' shows material=wood with a fixed text, namely 'Material: wood' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "wood"
|
||||||
{
|
},
|
||||||
"key": "material",
|
{
|
||||||
"description": "Layer 'Benches' shows material=stone with a fixed text, namely 'Material: stone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "material",
|
||||||
"value": "stone"
|
"description": "Layer 'Benches' shows material=metal with a fixed text, namely 'Material: metal' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "metal"
|
||||||
{
|
},
|
||||||
"key": "material",
|
{
|
||||||
"description": "Layer 'Benches' shows material=concrete with a fixed text, namely 'Material: concrete' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "material",
|
||||||
"value": "concrete"
|
"description": "Layer 'Benches' shows material=stone with a fixed text, namely 'Material: stone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "stone"
|
||||||
{
|
},
|
||||||
"key": "material",
|
{
|
||||||
"description": "Layer 'Benches' shows material=plastic with a fixed text, namely 'Material: plastic' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "material",
|
||||||
"value": "plastic"
|
"description": "Layer 'Benches' shows material=concrete with a fixed text, namely 'Material: concrete' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "concrete"
|
||||||
{
|
},
|
||||||
"key": "material",
|
{
|
||||||
"description": "Layer 'Benches' shows material=steel with a fixed text, namely 'Material: steel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "material",
|
||||||
"value": "steel"
|
"description": "Layer 'Benches' shows material=plastic with a fixed text, namely 'Material: plastic' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "plastic"
|
||||||
{
|
},
|
||||||
"key": "direction",
|
{
|
||||||
"description": "Layer 'Benches' shows and asks freeform values for key 'direction' (in the MapComplete.osm.be theme 'Benches')"
|
"key": "material",
|
||||||
},
|
"description": "Layer 'Benches' shows material=steel with a fixed text, namely 'Material: steel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
{
|
"value": "steel"
|
||||||
"key": "colour",
|
},
|
||||||
"description": "Layer 'Benches' shows and asks freeform values for key 'colour' (in the MapComplete.osm.be theme 'Benches')"
|
{
|
||||||
},
|
"key": "direction",
|
||||||
{
|
"description": "Layer 'Benches' shows and asks freeform values for key 'direction' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
"key": "colour",
|
},
|
||||||
"description": "Layer 'Benches' shows colour=brown with a fixed text, namely 'Colour: brown' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
{
|
||||||
"value": "brown"
|
"key": "colour",
|
||||||
},
|
"description": "Layer 'Benches' shows and asks freeform values for key 'colour' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Benches' shows colour=green with a fixed text, namely 'Colour: green' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "colour",
|
||||||
"value": "green"
|
"description": "Layer 'Benches' shows colour=brown with a fixed text, namely 'Colour: brown' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "brown"
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Benches' shows colour=gray with a fixed text, namely 'Colour: gray' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "colour",
|
||||||
"value": "gray"
|
"description": "Layer 'Benches' shows colour=green with a fixed text, namely 'Colour: green' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "green"
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Benches' shows colour=white with a fixed text, namely 'Colour: white' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "colour",
|
||||||
"value": "white"
|
"description": "Layer 'Benches' shows colour=gray with a fixed text, namely 'Colour: gray' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "gray"
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Benches' shows colour=red with a fixed text, namely 'Colour: red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "colour",
|
||||||
"value": "red"
|
"description": "Layer 'Benches' shows colour=white with a fixed text, namely 'Colour: white' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "white"
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Benches' shows colour=black with a fixed text, namely 'Colour: black' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "colour",
|
||||||
"value": "black"
|
"description": "Layer 'Benches' shows colour=red with a fixed text, namely 'Colour: red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "red"
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Benches' shows colour=blue with a fixed text, namely 'Colour: blue' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "colour",
|
||||||
"value": "blue"
|
"description": "Layer 'Benches' shows colour=black with a fixed text, namely 'Colour: black' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "black"
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Benches' shows colour=yellow with a fixed text, namely 'Colour: yellow' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "colour",
|
||||||
"value": "yellow"
|
"description": "Layer 'Benches' shows colour=blue with a fixed text, namely 'Colour: blue' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
},
|
"value": "blue"
|
||||||
{
|
},
|
||||||
"key": "survey:date",
|
{
|
||||||
"description": "Layer 'Benches' shows and asks freeform values for key 'survey:date' (in the MapComplete.osm.be theme 'Benches')"
|
"key": "colour",
|
||||||
},
|
"description": "Layer 'Benches' shows colour=yellow with a fixed text, namely 'Colour: yellow' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
{
|
"value": "yellow"
|
||||||
"key": "survey:date",
|
},
|
||||||
"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": "survey:date",
|
||||||
},
|
"description": "Layer 'Benches' shows and asks freeform values for key 'survey:date' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
{
|
},
|
||||||
"key": "bench",
|
{
|
||||||
"description": "The MapComplete theme Benches has a layer Benches at public transport stops showing features with this tag",
|
"key": "survey:date",
|
||||||
"value": "yes"
|
"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": "bench",
|
{
|
||||||
"description": "The MapComplete theme Benches has a layer Benches at public transport stops showing features with this tag",
|
"key": "bench",
|
||||||
"value": "stand_up_bench"
|
"description": "The MapComplete theme Benches has a layer Benches at public transport stops showing features with this tag",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Benches at public transport stops 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": "bench",
|
||||||
},
|
"description": "The MapComplete theme Benches has a layer Benches at public transport stops showing features with this tag",
|
||||||
{
|
"value": "stand_up_bench"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Benches at public transport stops 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": "image",
|
||||||
{
|
"description": "The layer 'Benches at public transport stops 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 'Benches at public transport stops 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 'Benches at public transport stops 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 'Benches at public transport stops 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 'Benches at public transport stops 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 'Benches at public transport stops' shows values with key 'name' (in the MapComplete.osm.be theme 'Benches')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Benches at public transport stops 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": "bench",
|
},
|
||||||
"description": "Layer 'Benches at public transport stops' shows values with key 'bench' (in the MapComplete.osm.be theme 'Benches')"
|
{
|
||||||
},
|
"key": "name",
|
||||||
{
|
"description": "Layer 'Benches at public transport stops' shows values with key 'name' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
"key": "leisure",
|
},
|
||||||
"description": "The MapComplete theme Benches has a layer Picnic tables showing features with this tag",
|
{
|
||||||
"value": "picnic_table"
|
"key": "bench",
|
||||||
},
|
"description": "Layer 'Benches at public transport stops' shows values with key 'bench' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
{
|
},
|
||||||
"key": "material",
|
{
|
||||||
"description": "Layer 'Picnic tables' shows and asks freeform values for key 'material' (in the MapComplete.osm.be theme 'Benches')"
|
"key": "leisure",
|
||||||
},
|
"description": "The MapComplete theme Benches has a layer Picnic tables showing features with this tag",
|
||||||
{
|
"value": "picnic_table"
|
||||||
"key": "material",
|
},
|
||||||
"description": "Layer 'Picnic tables' shows material=wood with a fixed text, namely 'This is a wooden picnic table' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
{
|
||||||
"value": "wood"
|
"key": "material",
|
||||||
},
|
"description": "Layer 'Picnic tables' shows and asks freeform values for key 'material' (in the MapComplete.osm.be theme 'Benches')"
|
||||||
{
|
},
|
||||||
"key": "material",
|
{
|
||||||
"description": "Layer 'Picnic tables' shows material=concrete with a fixed text, namely 'This is a concrete picnic table' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
"key": "material",
|
||||||
"value": "concrete"
|
"description": "Layer 'Picnic tables' shows material=wood with a fixed text, namely 'This is a wooden picnic table' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
}
|
"value": "wood"
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"key": "material",
|
||||||
|
"description": "Layer 'Picnic tables' shows material=concrete with a fixed text, namely 'This is a concrete picnic table' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Benches')",
|
||||||
|
"value": "concrete"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,98 +1,98 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Bicycle libraries",
|
"name": "MapComplete Bicycle libraries",
|
||||||
"description": "A bicycle library is a place where bicycles can be lent, often for a small yearly fee",
|
"description": "A bicycle library is a place where bicycles can be lent, often for a small yearly fee",
|
||||||
"project_url": "https://mapcomplete.osm.be/bicyclelib",
|
"project_url": "https://mapcomplete.osm.be/bicyclelib",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/bicyclelib/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/bicyclelib/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "amenity",
|
|
||||||
"description": "The MapComplete theme Bicycle libraries has a layer Bicycle library showing features with this tag",
|
|
||||||
"value": "bicycle_library"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Bicycle library 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": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Bicycle libraries has a layer Bicycle library showing features with this tag",
|
||||||
{
|
"value": "bicycle_library"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Bicycle library 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": "image",
|
||||||
{
|
"description": "The layer 'Bicycle library 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 'Bicycle library 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 'Bicycle library 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 'Bicycle library 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 'Bicycle library 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 'Bicycle library' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Bicycle library 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": "website",
|
},
|
||||||
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
{
|
||||||
},
|
"key": "name",
|
||||||
{
|
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
||||||
"key": "phone",
|
},
|
||||||
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
{
|
||||||
},
|
"key": "website",
|
||||||
{
|
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
||||||
"key": "email",
|
},
|
||||||
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
{
|
||||||
},
|
"key": "phone",
|
||||||
{
|
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
||||||
"key": "opening_hours",
|
},
|
||||||
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
{
|
||||||
},
|
"key": "email",
|
||||||
{
|
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
||||||
"key": "charge",
|
},
|
||||||
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
{
|
||||||
},
|
"key": "opening_hours",
|
||||||
{
|
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
||||||
"key": "fee",
|
},
|
||||||
"description": "Layer 'Bicycle library' shows fee=no&charge= with a fixed text, namely 'Lending a bicycle is free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
{
|
||||||
"value": "no"
|
"key": "charge",
|
||||||
},
|
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
||||||
{
|
},
|
||||||
"key": "charge",
|
{
|
||||||
"description": "Layer 'Bicycle library' shows fee=no&charge= with a fixed text, namely 'Lending a bicycle is free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries') Picking this answer will delete the key charge.",
|
"key": "fee",
|
||||||
"value": ""
|
"description": "Layer 'Bicycle library' shows fee=no&charge= with a fixed text, namely 'Lending a bicycle is free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
"key": "charge",
|
||||||
"value": "yes"
|
"description": "Layer 'Bicycle library' shows fee=no&charge= with a fixed text, namely 'Lending a bicycle is free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries') Picking this answer will delete the key charge.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "charge",
|
{
|
||||||
"description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
"key": "fee",
|
||||||
"value": "€20warranty + €20/year"
|
"description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "bicycle_library:for",
|
{
|
||||||
"description": "Layer 'Bicycle library' shows bicycle_library:for=child with a fixed text, namely 'Bikes for children available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
"key": "charge",
|
||||||
"value": "child"
|
"description": "Layer 'Bicycle library' shows fee=yes&charge=€20warranty + €20/year with a fixed text, namely 'Lending a bicycle costs €20/year and €20 warranty' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
||||||
},
|
"value": "€20warranty + €20/year"
|
||||||
{
|
},
|
||||||
"key": "bicycle_library:for",
|
{
|
||||||
"description": "Layer 'Bicycle library' shows bicycle_library:for=adult with a fixed text, namely 'Bikes for adult available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
"key": "bicycle_library:for",
|
||||||
"value": "adult"
|
"description": "Layer 'Bicycle library' shows bicycle_library:for=child with a fixed text, namely 'Bikes for children available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
||||||
},
|
"value": "child"
|
||||||
{
|
},
|
||||||
"key": "bicycle_library:for",
|
{
|
||||||
"description": "Layer 'Bicycle library' shows bicycle_library:for=disabled with a fixed text, namely 'Bikes for disabled persons available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
"key": "bicycle_library:for",
|
||||||
"value": "disabled"
|
"description": "Layer 'Bicycle library' shows bicycle_library:for=adult with a fixed text, namely 'Bikes for adult available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
||||||
},
|
"value": "adult"
|
||||||
{
|
},
|
||||||
"key": "description",
|
{
|
||||||
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
"key": "bicycle_library:for",
|
||||||
}
|
"description": "Layer 'Bicycle library' shows bicycle_library:for=disabled with a fixed text, namely 'Bikes for disabled persons available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle libraries')",
|
||||||
]
|
"value": "disabled"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "description",
|
||||||
|
"description": "Layer 'Bicycle library' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Bicycle libraries')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,148 +1,148 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Open Bookcase Map",
|
"name": "MapComplete Open Bookcase Map",
|
||||||
"description": "A public bookcase is a small streetside cabinet, box, old phone boot or some other objects where books are stored",
|
"description": "A public bookcase is a small streetside cabinet, box, old phone boot or some other objects where books are stored",
|
||||||
"project_url": "https://mapcomplete.osm.be/bookcases",
|
"project_url": "https://mapcomplete.osm.be/bookcases",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/bookcases/bookcase.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/bookcases/bookcase.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "amenity",
|
|
||||||
"description": "The MapComplete theme Open Bookcase Map has a layer Bookcases showing features with this tag",
|
|
||||||
"value": "public_bookcase"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Bookcases 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": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Open Bookcase Map has a layer Bookcases showing features with this tag",
|
||||||
{
|
"value": "public_bookcase"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Bookcases 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": "image",
|
||||||
{
|
"description": "The layer 'Bookcases 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 'Bookcases 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 'Bookcases 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 'Bookcases 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 'Bookcases 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 'Bookcases' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Bookcases 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": "noname",
|
},
|
||||||
"description": "Layer 'Bookcases' shows noname=yes&name= with a fixed text, namely 'This bookcase doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
{
|
||||||
"value": "yes"
|
"key": "name",
|
||||||
},
|
"description": "Layer 'Bookcases' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
||||||
{
|
},
|
||||||
"key": "name",
|
{
|
||||||
"description": "Layer 'Bookcases' shows noname=yes&name= with a fixed text, namely 'This bookcase doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key name.",
|
"key": "noname",
|
||||||
"value": ""
|
"description": "Layer 'Bookcases' shows noname=yes&name= with a fixed text, namely 'This bookcase doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "capacity",
|
{
|
||||||
"description": "Layer 'Bookcases' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
"key": "name",
|
||||||
},
|
"description": "Layer 'Bookcases' shows noname=yes&name= with a fixed text, namely 'This bookcase doesn't have a name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key name.",
|
||||||
{
|
"value": ""
|
||||||
"key": "books",
|
},
|
||||||
"description": "Layer 'Bookcases' shows books=children with a fixed text, namely 'Mostly children books' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
{
|
||||||
"value": "children"
|
"key": "capacity",
|
||||||
},
|
"description": "Layer 'Bookcases' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
||||||
{
|
},
|
||||||
"key": "books",
|
{
|
||||||
"description": "Layer 'Bookcases' shows books=adults with a fixed text, namely 'Mostly books for adults' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
"key": "books",
|
||||||
"value": "adults"
|
"description": "Layer 'Bookcases' shows books=children with a fixed text, namely 'Mostly children books' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "children"
|
||||||
{
|
},
|
||||||
"key": "books",
|
{
|
||||||
"description": "Layer 'Bookcases' shows books=children;adults with a fixed text, namely 'Both books for kids and adults' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
"key": "books",
|
||||||
"value": "children;adults"
|
"description": "Layer 'Bookcases' shows books=adults with a fixed text, namely 'Mostly books for adults' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "adults"
|
||||||
{
|
},
|
||||||
"key": "indoor",
|
{
|
||||||
"description": "Layer 'Bookcases' shows indoor=yes with a fixed text, namely 'This bookcase is located indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
"key": "books",
|
||||||
"value": "yes"
|
"description": "Layer 'Bookcases' shows books=children;adults with a fixed text, namely 'Both books for kids and adults' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "children;adults"
|
||||||
{
|
},
|
||||||
"key": "indoor",
|
{
|
||||||
"description": "Layer 'Bookcases' shows indoor=no with a fixed text, namely 'This bookcase is located outdoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
"key": "indoor",
|
||||||
"value": "no"
|
"description": "Layer 'Bookcases' shows indoor=yes with a fixed text, namely 'This bookcase is located indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "indoor",
|
{
|
||||||
"description": "Layer 'Bookcases' shows indoor= with a fixed text, namely 'This bookcase is located outdoors' (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key indoor.",
|
"key": "indoor",
|
||||||
"value": ""
|
"description": "Layer 'Bookcases' shows indoor=no with a fixed text, namely 'This bookcase is located outdoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Bookcases' shows access=yes with a fixed text, namely 'Publicly accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
"key": "indoor",
|
||||||
"value": "yes"
|
"description": "Layer 'Bookcases' shows indoor= with a fixed text, namely 'This bookcase is located outdoors' (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key indoor.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Bookcases' shows access=customers with a fixed text, namely 'Only accessible to customers' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
"key": "access",
|
||||||
"value": "customers"
|
"description": "Layer 'Bookcases' shows access=yes with a fixed text, namely 'Publicly accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "operator",
|
{
|
||||||
"description": "Layer 'Bookcases' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
"key": "access",
|
||||||
},
|
"description": "Layer 'Bookcases' shows access=customers with a fixed text, namely 'Only accessible to customers' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
{
|
"value": "customers"
|
||||||
"key": "brand",
|
},
|
||||||
"description": "Layer 'Bookcases' shows and asks freeform values for key 'brand' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
{
|
||||||
},
|
"key": "operator",
|
||||||
{
|
"description": "Layer 'Bookcases' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
||||||
"key": "brand",
|
},
|
||||||
"description": "Layer 'Bookcases' shows brand=Little Free Library&nobrand= with a fixed text, namely 'Part of the network 'Little Free Library'' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
{
|
||||||
"value": "Little Free Library"
|
"key": "brand",
|
||||||
},
|
"description": "Layer 'Bookcases' shows and asks freeform values for key 'brand' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
||||||
{
|
},
|
||||||
"key": "nobrand",
|
{
|
||||||
"description": "Layer 'Bookcases' shows brand=Little Free Library&nobrand= with a fixed text, namely 'Part of the network 'Little Free Library'' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key nobrand.",
|
"key": "brand",
|
||||||
"value": ""
|
"description": "Layer 'Bookcases' shows brand=Little Free Library&nobrand= with a fixed text, namely 'Part of the network 'Little Free Library'' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "Little Free Library"
|
||||||
{
|
},
|
||||||
"key": "nobrand",
|
{
|
||||||
"description": "Layer 'Bookcases' shows nobrand=yes&brand= with a fixed text, namely 'This public bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
"key": "nobrand",
|
||||||
"value": "yes"
|
"description": "Layer 'Bookcases' shows brand=Little Free Library&nobrand= with a fixed text, namely 'Part of the network 'Little Free Library'' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key nobrand.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "brand",
|
{
|
||||||
"description": "Layer 'Bookcases' shows nobrand=yes&brand= with a fixed text, namely 'This public bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key brand.",
|
"key": "nobrand",
|
||||||
"value": ""
|
"description": "Layer 'Bookcases' shows nobrand=yes&brand= with a fixed text, namely 'This public bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "ref",
|
{
|
||||||
"description": "Layer 'Bookcases' shows and asks freeform values for key 'ref' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
"key": "brand",
|
||||||
},
|
"description": "Layer 'Bookcases' shows nobrand=yes&brand= with a fixed text, namely 'This public bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key brand.",
|
||||||
{
|
"value": ""
|
||||||
"key": "nobrand",
|
},
|
||||||
"description": "Layer 'Bookcases' shows nobrand=yes&brand=&ref= with a fixed text, namely 'This bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
{
|
||||||
"value": "yes"
|
"key": "ref",
|
||||||
},
|
"description": "Layer 'Bookcases' shows and asks freeform values for key 'ref' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
||||||
{
|
},
|
||||||
"key": "brand",
|
{
|
||||||
"description": "Layer 'Bookcases' shows nobrand=yes&brand=&ref= with a fixed text, namely 'This bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key brand.",
|
"key": "nobrand",
|
||||||
"value": ""
|
"description": "Layer 'Bookcases' shows nobrand=yes&brand=&ref= with a fixed text, namely 'This bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "ref",
|
{
|
||||||
"description": "Layer 'Bookcases' shows nobrand=yes&brand=&ref= with a fixed text, namely 'This bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key ref.",
|
"key": "brand",
|
||||||
"value": ""
|
"description": "Layer 'Bookcases' shows nobrand=yes&brand=&ref= with a fixed text, namely 'This bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key brand.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "start_date",
|
{
|
||||||
"description": "Layer 'Bookcases' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
"key": "ref",
|
||||||
},
|
"description": "Layer 'Bookcases' shows nobrand=yes&brand=&ref= with a fixed text, namely 'This bookcase is not part of a bigger network' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Bookcase Map') Picking this answer will delete the key ref.",
|
||||||
{
|
"value": ""
|
||||||
"key": "website",
|
},
|
||||||
"description": "Layer 'Bookcases' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
{
|
||||||
}
|
"key": "start_date",
|
||||||
]
|
"description": "Layer 'Bookcases' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "website",
|
||||||
|
"description": "Layer 'Bookcases' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Bookcase Map')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,257 +1,257 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Campersites",
|
"name": "MapComplete Campersites",
|
||||||
"description": "Find sites to spend the night with your camper",
|
"description": "Find sites to spend the night with your camper",
|
||||||
"project_url": "https://mapcomplete.osm.be/campersite",
|
"project_url": "https://mapcomplete.osm.be/campersite",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/campersite/caravan.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/campersite/caravan.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, joost schouppe",
|
"contact_name": "Pieter Vander Vennet, joost schouppe",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "tourism",
|
|
||||||
"description": "The MapComplete theme Campersites has a layer Camper sites showing features with this tag",
|
|
||||||
"value": "caravan_site"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Camper sites 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": "tourism",
|
||||||
},
|
"description": "The MapComplete theme Campersites has a layer Camper sites showing features with this tag",
|
||||||
{
|
"value": "caravan_site"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Camper sites 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": "image",
|
||||||
{
|
"description": "The layer 'Camper sites 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 'Camper sites 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 'Camper sites 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 'Camper sites 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 'Camper sites 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 'Camper sites' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Campersites')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Camper sites 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": "fee",
|
},
|
||||||
"description": "Layer 'Camper sites' shows fee=yes with a fixed text, namely 'You need to pay for use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
{
|
||||||
"value": "yes"
|
"key": "name",
|
||||||
},
|
"description": "Layer 'Camper sites' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'Camper sites' shows fee=no&charge= with a fixed text, namely 'Can be used for free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "fee",
|
||||||
"value": "no"
|
"description": "Layer 'Camper sites' shows fee=yes with a fixed text, namely 'You need to pay for use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "charge",
|
{
|
||||||
"description": "Layer 'Camper sites' shows fee=no&charge= with a fixed text, namely 'Can be used for free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites') Picking this answer will delete the key charge.",
|
"key": "fee",
|
||||||
"value": ""
|
"description": "Layer 'Camper sites' shows fee=no&charge= with a fixed text, namely 'Can be used for free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'Camper sites' shows fee=no with a fixed text, namely 'Can be used for free' (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "charge",
|
||||||
"value": "no"
|
"description": "Layer 'Camper sites' shows fee=no&charge= with a fixed text, namely 'Can be used for free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites') Picking this answer will delete the key charge.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "charge",
|
{
|
||||||
"description": "Layer 'Camper sites' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Campersites')"
|
"key": "fee",
|
||||||
},
|
"description": "Layer 'Camper sites' shows fee=no with a fixed text, namely 'Can be used for free' (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "sanitary_dump_station",
|
},
|
||||||
"description": "Layer 'Camper sites' shows sanitary_dump_station=yes with a fixed text, namely 'This place has a sanitary dump station' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
{
|
||||||
"value": "yes"
|
"key": "charge",
|
||||||
},
|
"description": "Layer 'Camper sites' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
{
|
},
|
||||||
"key": "sanitary_dump_station",
|
{
|
||||||
"description": "Layer 'Camper sites' shows sanitary_dump_station=no with a fixed text, namely 'This place does not have a sanitary dump station' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "sanitary_dump_station",
|
||||||
"value": "no"
|
"description": "Layer 'Camper sites' shows sanitary_dump_station=yes with a fixed text, namely 'This place has a sanitary dump station' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "capacity",
|
{
|
||||||
"description": "Layer 'Camper sites' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Campersites')"
|
"key": "sanitary_dump_station",
|
||||||
},
|
"description": "Layer 'Camper sites' shows sanitary_dump_station=no with a fixed text, namely 'This place does not have a sanitary dump station' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "internet_access",
|
},
|
||||||
"description": "Layer 'Camper sites' shows internet_access=yes with a fixed text, namely 'There is internet access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
{
|
||||||
"value": "yes"
|
"key": "capacity",
|
||||||
},
|
"description": "Layer 'Camper sites' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
{
|
},
|
||||||
"key": "internet_access",
|
{
|
||||||
"description": "Layer 'Camper sites' shows internet_access=wifi|internet_access=wlan with a fixed text, namely 'There is internet access' (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "internet_access",
|
||||||
"value": "wifi"
|
"description": "Layer 'Camper sites' shows internet_access=yes with a fixed text, namely 'There is internet access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "internet_access",
|
{
|
||||||
"description": "Layer 'Camper sites' shows internet_access=wifi|internet_access=wlan with a fixed text, namely 'There is internet access' (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "internet_access",
|
||||||
"value": "wlan"
|
"description": "Layer 'Camper sites' shows internet_access=wifi|internet_access=wlan with a fixed text, namely 'There is internet access' (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "wifi"
|
||||||
{
|
},
|
||||||
"key": "internet_access",
|
{
|
||||||
"description": "Layer 'Camper sites' shows internet_access=no with a fixed text, namely 'There is no internet access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "internet_access",
|
||||||
"value": "no"
|
"description": "Layer 'Camper sites' shows internet_access=wifi|internet_access=wlan with a fixed text, namely 'There is internet access' (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "wlan"
|
||||||
{
|
},
|
||||||
"key": "internet_access:fee",
|
{
|
||||||
"description": "Layer 'Camper sites' shows internet_access:fee=yes with a fixed text, namely 'You need to pay extra for internet access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "internet_access",
|
||||||
"value": "yes"
|
"description": "Layer 'Camper sites' shows internet_access=no with a fixed text, namely 'There is no internet access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "internet_access:fee",
|
{
|
||||||
"description": "Layer 'Camper sites' shows internet_access:fee=no with a fixed text, namely 'You do not need to pay extra for internet access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "internet_access:fee",
|
||||||
"value": "no"
|
"description": "Layer 'Camper sites' shows internet_access:fee=yes with a fixed text, namely 'You need to pay extra for internet access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "toilets",
|
{
|
||||||
"description": "Layer 'Camper sites' shows toilets=yes with a fixed text, namely 'This place has toilets' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "internet_access:fee",
|
||||||
"value": "yes"
|
"description": "Layer 'Camper sites' shows internet_access:fee=no with a fixed text, namely 'You do not need to pay extra for internet access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "toilets",
|
{
|
||||||
"description": "Layer 'Camper sites' shows toilets=no with a fixed text, namely 'This place does not have toilets' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "toilets",
|
||||||
"value": "no"
|
"description": "Layer 'Camper sites' shows toilets=yes with a fixed text, namely 'This place has toilets' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "website",
|
{
|
||||||
"description": "Layer 'Camper sites' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Campersites')"
|
"key": "toilets",
|
||||||
},
|
"description": "Layer 'Camper sites' shows toilets=no with a fixed text, namely 'This place does not have toilets' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "permanent_camping",
|
},
|
||||||
"description": "Layer 'Camper sites' shows permanent_camping=yes with a fixed text, namely 'Yes, there are some spots for long term rental, but you can also stay on a daily basis' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
{
|
||||||
"value": "yes"
|
"key": "website",
|
||||||
},
|
"description": "Layer 'Camper sites' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
{
|
},
|
||||||
"key": "permanent_camping",
|
{
|
||||||
"description": "Layer 'Camper sites' shows permanent_camping=no with a fixed text, namely 'No, there are no permanent guests here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "permanent_camping",
|
||||||
"value": "no"
|
"description": "Layer 'Camper sites' shows permanent_camping=yes with a fixed text, namely 'Yes, there are some spots for long term rental, but you can also stay on a daily basis' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "permanent_camping",
|
{
|
||||||
"description": "Layer 'Camper sites' shows permanent_camping=only with a fixed text, namely 'It is only possible to stay here if you have a long term contract(this place will disappear from this map if you choose this)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "permanent_camping",
|
||||||
"value": "only"
|
"description": "Layer 'Camper sites' shows permanent_camping=no with a fixed text, namely 'No, there are no permanent guests here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "description",
|
{
|
||||||
"description": "Layer 'Camper sites' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Campersites')"
|
"key": "permanent_camping",
|
||||||
},
|
"description": "Layer 'Camper sites' shows permanent_camping=only with a fixed text, namely 'It is only possible to stay here if you have a long term contract(this place will disappear from this map if you choose this)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
{
|
"value": "only"
|
||||||
"key": "operator",
|
},
|
||||||
"description": "Layer 'Camper sites' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Campersites')"
|
{
|
||||||
},
|
"key": "description",
|
||||||
{
|
"description": "Layer 'Camper sites' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
"key": "power_supply",
|
},
|
||||||
"description": "Layer 'Camper sites' shows power_supply=yes with a fixed text, namely 'This place has a power supply' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
{
|
||||||
"value": "yes"
|
"key": "operator",
|
||||||
},
|
"description": "Layer 'Camper sites' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
{
|
},
|
||||||
"key": "power_supply",
|
{
|
||||||
"description": "Layer 'Camper sites' shows power_supply=no with a fixed text, namely 'This place does not have power supply' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "power_supply",
|
||||||
"value": "no"
|
"description": "Layer 'Camper sites' shows power_supply=yes with a fixed text, namely 'This place has a power supply' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "amenity",
|
{
|
||||||
"description": "The MapComplete theme Campersites has a layer Sanitary dump stations showing features with this tag",
|
"key": "power_supply",
|
||||||
"value": "sanitary_dump_station"
|
"description": "Layer 'Camper sites' shows power_supply=no with a fixed text, namely 'This place does not have power supply' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Sanitary dump 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": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Campersites has a layer Sanitary dump stations showing features with this tag",
|
||||||
{
|
"value": "sanitary_dump_station"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Sanitary dump 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": "image",
|
||||||
{
|
"description": "The layer 'Sanitary dump 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": "wikidata",
|
},
|
||||||
"description": "The layer 'Sanitary dump 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": "mapillary",
|
||||||
{
|
"description": "The layer 'Sanitary dump 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": "wikipedia",
|
},
|
||||||
"description": "The layer 'Sanitary dump 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": "wikidata",
|
||||||
{
|
"description": "The layer 'Sanitary dump 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": "fee",
|
},
|
||||||
"description": "Layer 'Sanitary dump stations' shows fee=yes with a fixed text, namely 'You need to pay for use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
{
|
||||||
"value": "yes"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer 'Sanitary dump 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": "fee",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows fee=no with a fixed text, namely 'Can be used for free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "fee",
|
||||||
"value": "no"
|
"description": "Layer 'Sanitary dump stations' shows fee=yes with a fixed text, namely 'You need to pay for use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "charge",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Campersites')"
|
"key": "fee",
|
||||||
},
|
"description": "Layer 'Sanitary dump stations' shows fee=no with a fixed text, namely 'Can be used for free' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "water_point",
|
},
|
||||||
"description": "Layer 'Sanitary dump stations' shows water_point=yes with a fixed text, namely 'This place has a water point' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
{
|
||||||
"value": "yes"
|
"key": "charge",
|
||||||
},
|
"description": "Layer 'Sanitary dump stations' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
{
|
},
|
||||||
"key": "water_point",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows water_point=no with a fixed text, namely 'This place does not have a water point' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "water_point",
|
||||||
"value": "no"
|
"description": "Layer 'Sanitary dump stations' shows water_point=yes with a fixed text, namely 'This place has a water point' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "sanitary_dump_station:grey_water",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows sanitary_dump_station:grey_water=yes with a fixed text, namely 'You can dispose of grey water here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "water_point",
|
||||||
"value": "yes"
|
"description": "Layer 'Sanitary dump stations' shows water_point=no with a fixed text, namely 'This place does not have a water point' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "sanitary_dump_station:grey_water",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows sanitary_dump_station:grey_water=no with a fixed text, namely 'You cannot dispose of gray water here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "sanitary_dump_station:grey_water",
|
||||||
"value": "no"
|
"description": "Layer 'Sanitary dump stations' shows sanitary_dump_station:grey_water=yes with a fixed text, namely 'You can dispose of grey water here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "sanitary_dump_station:chemical_toilet",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows sanitary_dump_station:chemical_toilet=yes with a fixed text, namely 'You can dispose of chemical toilet waste here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "sanitary_dump_station:grey_water",
|
||||||
"value": "yes"
|
"description": "Layer 'Sanitary dump stations' shows sanitary_dump_station:grey_water=no with a fixed text, namely 'You cannot dispose of gray water here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "sanitary_dump_station:chemical_toilet",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows sanitary_dump_station:chemical_toilet=no with a fixed text, namely 'You cannot dispose of chemical toilet waste here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "sanitary_dump_station:chemical_toilet",
|
||||||
"value": "no"
|
"description": "Layer 'Sanitary dump stations' shows sanitary_dump_station:chemical_toilet=yes with a fixed text, namely 'You can dispose of chemical toilet waste here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows access=network with a fixed text, namely 'You need a network key/code to use this' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "sanitary_dump_station:chemical_toilet",
|
||||||
"value": "network"
|
"description": "Layer 'Sanitary dump stations' shows sanitary_dump_station:chemical_toilet=no with a fixed text, namely 'You cannot dispose of chemical toilet waste here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows access=customers with a fixed text, namely 'You need to be a customer of camping/campersite to use this place' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "access",
|
||||||
"value": "customers"
|
"description": "Layer 'Sanitary dump stations' shows access=network with a fixed text, namely 'You need a network key/code to use this' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "network"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows access=public with a fixed text, namely 'Anyone can use this dump station' (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "access",
|
||||||
"value": "public"
|
"description": "Layer 'Sanitary dump stations' shows access=customers with a fixed text, namely 'You need to be a customer of camping/campersite to use this place' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "customers"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows access=yes with a fixed text, namely 'Anyone can use this dump station' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "access",
|
||||||
"value": "yes"
|
"description": "Layer 'Sanitary dump stations' shows access=public with a fixed text, namely 'Anyone can use this dump station' (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
},
|
"value": "public"
|
||||||
{
|
},
|
||||||
"key": "network",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows and asks freeform values for key 'network' (in the MapComplete.osm.be theme 'Campersites')"
|
"key": "access",
|
||||||
},
|
"description": "Layer 'Sanitary dump stations' shows access=yes with a fixed text, namely 'Anyone can use this dump station' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
{
|
"value": "yes"
|
||||||
"key": "operator",
|
},
|
||||||
"description": "Layer 'Sanitary dump stations' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Campersites')"
|
{
|
||||||
},
|
"key": "network",
|
||||||
{
|
"description": "Layer 'Sanitary dump stations' shows and asks freeform values for key 'network' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
"key": "power_supply",
|
},
|
||||||
"description": "Layer 'Sanitary dump stations' shows power_supply=yes with a fixed text, namely 'This place has a power supply' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
{
|
||||||
"value": "yes"
|
"key": "operator",
|
||||||
},
|
"description": "Layer 'Sanitary dump stations' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Campersites')"
|
||||||
{
|
},
|
||||||
"key": "power_supply",
|
{
|
||||||
"description": "Layer 'Sanitary dump stations' shows power_supply=no with a fixed text, namely 'This place does not have power supply' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
"key": "power_supply",
|
||||||
"value": "no"
|
"description": "Layer 'Sanitary dump stations' shows power_supply=yes with a fixed text, namely 'This place has a power supply' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
}
|
"value": "yes"
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"key": "power_supply",
|
||||||
|
"description": "Layer 'Sanitary dump stations' shows power_supply=no with a fixed text, namely 'This place does not have power supply' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Campersites')",
|
||||||
|
"value": "no"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,176 +1,176 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Charging stations",
|
"name": "MapComplete Charging stations",
|
||||||
"description": "A worldwide map of charging stations",
|
"description": "A worldwide map of charging stations",
|
||||||
"project_url": "https://mapcomplete.osm.be/charging_stations",
|
"project_url": "https://mapcomplete.osm.be/charging_stations",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/charging_stations/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/charging_stations/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, ",
|
"contact_name": "Pieter Vander Vennet, ",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "amenity",
|
|
||||||
"description": "The MapComplete theme Charging stations has a layer Charging stations showing features with this tag",
|
|
||||||
"value": "charging_station"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"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"
|
"key": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Charging stations has a layer Charging stations showing features with this tag",
|
||||||
{
|
"value": "charging_station"
|
||||||
"key": "mapillary",
|
},
|
||||||
"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": "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"
|
||||||
"key": "wikidata",
|
},
|
||||||
"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": "mapillary",
|
||||||
{
|
"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": "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": "wikidata",
|
||||||
{
|
"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": "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": "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')",
|
"key": "motorcar",
|
||||||
"value": "yes"
|
"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": "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.",
|
"key": "bicycle",
|
||||||
"value": ""
|
"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": "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.",
|
"key": "motorcar",
|
||||||
"value": ""
|
"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": "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')",
|
"key": "car",
|
||||||
"value": "yes"
|
"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": "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": "bicycle",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"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.",
|
"key": "motorcar",
|
||||||
"value": ""
|
"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')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"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.",
|
"key": "car",
|
||||||
"value": ""
|
"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": "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": "bicycle",
|
||||||
"value": "yes"
|
"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": "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.",
|
"key": "car",
|
||||||
"value": ""
|
"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')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"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": "bicycle",
|
||||||
"value": "yes"
|
"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": "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": "car",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "capacity",
|
{
|
||||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Charging stations')"
|
"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')",
|
||||||
{
|
"value": "yes"
|
||||||
"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')",
|
{
|
||||||
"value": "yes"
|
"key": "capacity",
|
||||||
},
|
"description": "Layer 'Charging stations' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||||
{
|
},
|
||||||
"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')",
|
"key": "authentication:membership_card",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"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')",
|
"key": "authentication:app",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"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')",
|
"key": "authentication:phone_call",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"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')",
|
"key": "authentication:short_message",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"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')",
|
"key": "authentication:nfc",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"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:money_card",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"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')",
|
"key": "authentication:debig",
|
||||||
"value": "yes"
|
"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')",
|
||||||
},
|
"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')"
|
"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')",
|
||||||
{
|
"value": "yes"
|
||||||
"key": "opening_hours",
|
},
|
||||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Charging stations')"
|
{
|
||||||
},
|
"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')"
|
||||||
"key": "opening_hours",
|
},
|
||||||
"description": "Layer 'Charging stations' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
{
|
||||||
"value": "24/7"
|
"key": "opening_hours",
|
||||||
},
|
"description": "Layer 'Charging stations' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||||
{
|
},
|
||||||
"key": "network",
|
{
|
||||||
"description": "Layer 'Charging stations' shows and asks freeform values for key 'network' (in the MapComplete.osm.be theme 'Charging stations')"
|
"key": "opening_hours",
|
||||||
},
|
"description": "Layer 'Charging stations' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||||
{
|
"value": "24/7"
|
||||||
"key": "no:network",
|
},
|
||||||
"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 and asks freeform values for key 'network' (in the MapComplete.osm.be theme 'Charging stations')"
|
||||||
{
|
},
|
||||||
"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')",
|
"key": "no:network",
|
||||||
"value": "AeroVironment"
|
"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=Blink with a fixed text, namely 'Blink' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
"key": "network",
|
||||||
"value": "Blink"
|
"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')",
|
||||||
},
|
"value": "AeroVironment"
|
||||||
{
|
},
|
||||||
"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')",
|
"key": "network",
|
||||||
"value": "eVgo"
|
"description": "Layer 'Charging stations' shows network=Blink with a fixed text, namely 'Blink' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Charging stations')",
|
||||||
}
|
"value": "Blink"
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,264 +1,264 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Cyclestreets",
|
"name": "MapComplete Cyclestreets",
|
||||||
"description": "A map of cyclestreets",
|
"description": "A map of cyclestreets",
|
||||||
"project_url": "https://mapcomplete.osm.be/cyclestreets",
|
"project_url": "https://mapcomplete.osm.be/cyclestreets",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/cyclestreets/F111.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/cyclestreets/F111.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "cyclestreet",
|
|
||||||
"description": "The MapComplete theme Cyclestreets has a layer Cyclestreets showing features with this tag",
|
|
||||||
"value": "yes"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Cyclestreets 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": "cyclestreet",
|
||||||
},
|
"description": "The MapComplete theme Cyclestreets has a layer Cyclestreets showing features with this tag",
|
||||||
{
|
"value": "yes"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Cyclestreets 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": "image",
|
||||||
{
|
"description": "The layer 'Cyclestreets 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 'Cyclestreets 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 'Cyclestreets 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 'Cyclestreets 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 'Cyclestreets 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": "cyclestreet",
|
},
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
{
|
||||||
"value": "yes"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer 'Cyclestreets 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": "maxspeed",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "cyclestreet",
|
||||||
"value": "30"
|
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "overtaking:motor_vehicle",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "maxspeed",
|
||||||
"value": "no"
|
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "30"
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "overtaking:motor_vehicle",
|
||||||
"value": ""
|
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "proposed:cyclestreet",
|
||||||
"value": "yes"
|
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "cyclestreet",
|
||||||
"value": "yes"
|
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "overtaking:motor_vehicle",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "cyclestreet:start_date",
|
{
|
||||||
"description": "Layer 'Cyclestreets' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
|
"key": "overtaking:motor_vehicle",
|
||||||
},
|
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
|
||||||
{
|
"value": ""
|
||||||
"key": "proposed:cyclestreet",
|
},
|
||||||
"description": "The MapComplete theme Cyclestreets has a layer Future cyclestreet showing features with this tag",
|
{
|
||||||
"value": "yes"
|
"key": "cyclestreet:start_date",
|
||||||
},
|
"description": "Layer 'Cyclestreets' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Future cyclestreet 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": "proposed:cyclestreet",
|
||||||
},
|
"description": "The MapComplete theme Cyclestreets has a layer Future cyclestreet showing features with this tag",
|
||||||
{
|
"value": "yes"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Future cyclestreet 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": "image",
|
||||||
{
|
"description": "The layer 'Future cyclestreet 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 'Future cyclestreet 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 'Future cyclestreet 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 'Future cyclestreet 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 'Future cyclestreet 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": "cyclestreet",
|
},
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
{
|
||||||
"value": "yes"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer 'Future cyclestreet 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": "maxspeed",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "cyclestreet",
|
||||||
"value": "30"
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "overtaking:motor_vehicle",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "maxspeed",
|
||||||
"value": "no"
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "30"
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "overtaking:motor_vehicle",
|
||||||
"value": ""
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "proposed:cyclestreet",
|
||||||
"value": "yes"
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "cyclestreet",
|
||||||
"value": "yes"
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "overtaking:motor_vehicle",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "cyclestreet:start_date",
|
{
|
||||||
"description": "Layer 'Future cyclestreet' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
|
"key": "overtaking:motor_vehicle",
|
||||||
},
|
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
|
||||||
{
|
"value": ""
|
||||||
"key": "highway",
|
},
|
||||||
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
|
{
|
||||||
"value": "residential"
|
"key": "cyclestreet:start_date",
|
||||||
},
|
"description": "Layer 'Future cyclestreet' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
|
||||||
{
|
},
|
||||||
"key": "highway",
|
{
|
||||||
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
|
"key": "highway",
|
||||||
"value": "tertiary"
|
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
|
||||||
},
|
"value": "residential"
|
||||||
{
|
},
|
||||||
"key": "highway",
|
{
|
||||||
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
|
"key": "highway",
|
||||||
"value": "unclassified"
|
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
|
||||||
},
|
"value": "tertiary"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'All streets 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": "highway",
|
||||||
},
|
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
|
||||||
{
|
"value": "unclassified"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'All streets 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": "image",
|
||||||
{
|
"description": "The layer 'All streets 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 'All streets 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 'All streets 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 'All streets 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 'All streets 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": "cyclestreet",
|
},
|
||||||
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
{
|
||||||
"value": "yes"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer 'All streets 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": "maxspeed",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "cyclestreet",
|
||||||
"value": "30"
|
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "overtaking:motor_vehicle",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "maxspeed",
|
||||||
"value": "no"
|
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "30"
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "overtaking:motor_vehicle",
|
||||||
"value": ""
|
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "proposed:cyclestreet",
|
||||||
"value": "yes"
|
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'All streets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'All streets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
"key": "cyclestreet",
|
||||||
"value": "yes"
|
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "cyclestreet",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "proposed:cyclestreet",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
"key": "cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "overtaking:motor_vehicle",
|
{
|
||||||
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
|
"key": "proposed:cyclestreet",
|
||||||
"value": ""
|
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "cyclestreet:start_date",
|
{
|
||||||
"description": "Layer 'All streets' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
|
"key": "overtaking:motor_vehicle",
|
||||||
}
|
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
|
||||||
]
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "cyclestreet:start_date",
|
||||||
|
"description": "Layer 'All streets' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,83 +1,83 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Drinking Water",
|
"name": "MapComplete Drinking Water",
|
||||||
"description": "On this map, publicly accessible drinking water spots are shown and can be easily added",
|
"description": "On this map, publicly accessible drinking water spots are shown and can be easily added",
|
||||||
"project_url": "https://mapcomplete.osm.be/drinking_water",
|
"project_url": "https://mapcomplete.osm.be/drinking_water",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/drinking_water/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/drinking_water/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "amenity",
|
|
||||||
"description": "The MapComplete theme Drinking Water has a layer Drinking water showing features with this tag",
|
|
||||||
"value": "drinking_water"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Drinking water 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": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Drinking Water has a layer Drinking water showing features with this tag",
|
||||||
{
|
"value": "drinking_water"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Drinking water 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": "image",
|
||||||
{
|
"description": "The layer 'Drinking water 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 'Drinking water 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 'Drinking water 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 'Drinking water 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 'Drinking water 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": "operational_status",
|
},
|
||||||
"description": "Layer 'Drinking water' shows and asks freeform values for key 'operational_status' (in the MapComplete.osm.be theme 'Drinking Water')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Drinking water 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": "operational_status",
|
},
|
||||||
"description": "Layer 'Drinking water' shows operational_status= with a fixed text, namely 'This drinking water works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water') Picking this answer will delete the key operational_status.",
|
{
|
||||||
"value": ""
|
"key": "operational_status",
|
||||||
},
|
"description": "Layer 'Drinking water' shows and asks freeform values for key 'operational_status' (in the MapComplete.osm.be theme 'Drinking Water')"
|
||||||
{
|
},
|
||||||
"key": "operational_status",
|
{
|
||||||
"description": "Layer 'Drinking water' shows operational_status=broken with a fixed text, namely 'This drinking water is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')",
|
"key": "operational_status",
|
||||||
"value": "broken"
|
"description": "Layer 'Drinking water' shows operational_status= with a fixed text, namely 'This drinking water works' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water') Picking this answer will delete the key operational_status.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "operational_status",
|
{
|
||||||
"description": "Layer 'Drinking water' shows operational_status=closed with a fixed text, namely 'This drinking water is closed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')",
|
"key": "operational_status",
|
||||||
"value": "closed"
|
"description": "Layer 'Drinking water' shows operational_status=broken with a fixed text, namely 'This drinking water is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')",
|
||||||
},
|
"value": "broken"
|
||||||
{
|
},
|
||||||
"key": "bottle",
|
{
|
||||||
"description": "Layer 'Drinking water' shows bottle=yes with a fixed text, namely 'It is easy to refill water bottles' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')",
|
"key": "operational_status",
|
||||||
"value": "yes"
|
"description": "Layer 'Drinking water' shows operational_status=closed with a fixed text, namely 'This drinking water is closed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')",
|
||||||
},
|
"value": "closed"
|
||||||
{
|
},
|
||||||
"key": "bottle",
|
{
|
||||||
"description": "Layer 'Drinking water' shows bottle=no with a fixed text, namely 'Water bottles may not fit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')",
|
"key": "bottle",
|
||||||
"value": "no"
|
"description": "Layer 'Drinking water' shows bottle=yes with a fixed text, namely 'It is easy to refill water bottles' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "service:bicycle:cleaning:charge",
|
{
|
||||||
"description": "Layer 'Drinking water' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Drinking Water')"
|
"key": "bottle",
|
||||||
},
|
"description": "Layer 'Drinking water' shows bottle=no with a fixed text, namely 'Water bottles may not fit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Drinking Water')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "service:bicycle:cleaning:fee",
|
},
|
||||||
"description": "Layer 'Drinking water' 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 'Drinking Water')",
|
{
|
||||||
"value": "no&service:bicycle:cleaning:charge="
|
"key": "service:bicycle:cleaning:charge",
|
||||||
},
|
"description": "Layer 'Drinking water' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Drinking Water')"
|
||||||
{
|
},
|
||||||
"key": "service:bicycle:cleaning:fee",
|
{
|
||||||
"description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Drinking Water')",
|
"key": "service:bicycle:cleaning:fee",
|
||||||
"value": "no&"
|
"description": "Layer 'Drinking water' 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 'Drinking Water')",
|
||||||
},
|
"value": "no&service:bicycle:cleaning:charge="
|
||||||
{
|
},
|
||||||
"key": "service:bicycle:cleaning:fee",
|
{
|
||||||
"description": "Layer 'Drinking water' 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 'Drinking Water')",
|
"key": "service:bicycle:cleaning:fee",
|
||||||
"value": "yes"
|
"description": "Layer 'Drinking water' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'Drinking Water')",
|
||||||
}
|
"value": "no&"
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"key": "service:bicycle:cleaning:fee",
|
||||||
|
"description": "Layer 'Drinking water' 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 'Drinking Water')",
|
||||||
|
"value": "yes"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,107 +1,107 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Facade gardens",
|
"name": "MapComplete Facade gardens",
|
||||||
"description": "This map shows facade gardens with pictures and useful info about orientation, sunshine and plant types.",
|
"description": "This map shows facade gardens with pictures and useful info about orientation, sunshine and plant types.",
|
||||||
"project_url": "https://mapcomplete.osm.be/facadegardens",
|
"project_url": "https://mapcomplete.osm.be/facadegardens",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/facadegardens/geveltuin.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/facadegardens/geveltuin.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, joost schouppe; stla",
|
"contact_name": "Pieter Vander Vennet, joost schouppe; stla",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "leisure",
|
|
||||||
"description": "The MapComplete theme Facade gardens has a layer Facade gardens showing features with this tag",
|
|
||||||
"value": "garden"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "garden:type",
|
{
|
||||||
"description": "The MapComplete theme Facade gardens has a layer Facade gardens showing features with this tag",
|
"key": "leisure",
|
||||||
"value": "facade_garden"
|
"description": "The MapComplete theme Facade gardens has a layer Facade gardens showing features with this tag",
|
||||||
},
|
"value": "garden"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Facade gardens 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": "garden:type",
|
||||||
},
|
"description": "The MapComplete theme Facade gardens has a layer Facade gardens showing features with this tag",
|
||||||
{
|
"value": "facade_garden"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Facade gardens 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": "image",
|
||||||
{
|
"description": "The layer 'Facade gardens 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 'Facade gardens 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 'Facade gardens 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 'Facade gardens 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 'Facade gardens 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": "direction",
|
},
|
||||||
"description": "Layer 'Facade gardens' shows and asks freeform values for key 'direction' (in the MapComplete.osm.be theme 'Facade gardens')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Facade gardens 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": "direct_sunlight",
|
},
|
||||||
"description": "Layer 'Facade gardens' shows direct_sunlight=yes with a fixed text, namely 'The garden is in full sun' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
{
|
||||||
"value": "yes"
|
"key": "direction",
|
||||||
},
|
"description": "Layer 'Facade gardens' shows and asks freeform values for key 'direction' (in the MapComplete.osm.be theme 'Facade gardens')"
|
||||||
{
|
},
|
||||||
"key": "direct_sunlight",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows direct_sunlight=partial with a fixed text, namely 'The garden is in partial shade' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "direct_sunlight",
|
||||||
"value": "partial"
|
"description": "Layer 'Facade gardens' shows direct_sunlight=yes with a fixed text, namely 'The garden is in full sun' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "direct_sunlight",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows direct_sunlight=no with a fixed text, namely 'The garden is in the shade' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "direct_sunlight",
|
||||||
"value": "no"
|
"description": "Layer 'Facade gardens' shows direct_sunlight=partial with a fixed text, namely 'The garden is in partial shade' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "partial"
|
||||||
{
|
},
|
||||||
"key": "rain_barrel",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows rain_barrel=yes with a fixed text, namely 'There is a rain barrel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "direct_sunlight",
|
||||||
"value": "yes"
|
"description": "Layer 'Facade gardens' shows direct_sunlight=no with a fixed text, namely 'The garden is in the shade' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "rain_barrel",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows rain_barrel=no with a fixed text, namely 'There is no rain barrel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "rain_barrel",
|
||||||
"value": "no"
|
"description": "Layer 'Facade gardens' shows rain_barrel=yes with a fixed text, namely 'There is a rain barrel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "start_date",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'Facade gardens')"
|
"key": "rain_barrel",
|
||||||
},
|
"description": "Layer 'Facade gardens' shows rain_barrel=no with a fixed text, namely 'There is no rain barrel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "edible",
|
},
|
||||||
"description": "Layer 'Facade gardens' shows edible=yes with a fixed text, namely 'There are edible plants' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
{
|
||||||
"value": "yes"
|
"key": "start_date",
|
||||||
},
|
"description": "Layer 'Facade gardens' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'Facade gardens')"
|
||||||
{
|
},
|
||||||
"key": "edible",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows edible=no with a fixed text, namely 'There are no edible plants' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "edible",
|
||||||
"value": "no"
|
"description": "Layer 'Facade gardens' shows edible=yes with a fixed text, namely 'There are edible plants' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "plant",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows plant=vine with a fixed text, namely 'There are vines' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "edible",
|
||||||
"value": "vine"
|
"description": "Layer 'Facade gardens' shows edible=no with a fixed text, namely 'There are no edible plants' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "plant",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows plant=flower with a fixed text, namely 'There are flowering plants' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "plant",
|
||||||
"value": "flower"
|
"description": "Layer 'Facade gardens' shows plant=vine with a fixed text, namely 'There are vines' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "vine"
|
||||||
{
|
},
|
||||||
"key": "plant",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows plant=shrub with a fixed text, namely 'There are shrubs' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "plant",
|
||||||
"value": "shrub"
|
"description": "Layer 'Facade gardens' shows plant=flower with a fixed text, namely 'There are flowering plants' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "flower"
|
||||||
{
|
},
|
||||||
"key": "plant",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows plant=groundcover with a fixed text, namely 'There are groundcovering plants' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
"key": "plant",
|
||||||
"value": "groundcover"
|
"description": "Layer 'Facade gardens' shows plant=shrub with a fixed text, namely 'There are shrubs' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
},
|
"value": "shrub"
|
||||||
{
|
},
|
||||||
"key": "description",
|
{
|
||||||
"description": "Layer 'Facade gardens' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Facade gardens')"
|
"key": "plant",
|
||||||
}
|
"description": "Layer 'Facade gardens' shows plant=groundcover with a fixed text, namely 'There are groundcovering plants' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Facade gardens')",
|
||||||
]
|
"value": "groundcover"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "description",
|
||||||
|
"description": "Layer 'Facade gardens' shows and asks freeform values for key 'description' (in the MapComplete.osm.be theme 'Facade gardens')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,105 +1,105 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Friturenkaart",
|
"name": "MapComplete Friturenkaart",
|
||||||
"description": "Op deze kaart vind je je favoriete frituur!",
|
"description": "Op deze kaart vind je je favoriete frituur!",
|
||||||
"project_url": "https://mapcomplete.osm.be/fritures",
|
"project_url": "https://mapcomplete.osm.be/fritures",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/fritures/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/fritures/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, ",
|
"contact_name": "Pieter Vander Vennet, ",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "cuisine",
|
|
||||||
"description": "The MapComplete theme Friturenkaart has a layer Frituren showing features with this tag"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"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"
|
"key": "cuisine",
|
||||||
},
|
"description": "The MapComplete theme Friturenkaart has a layer Frituren showing features with this tag"
|
||||||
{
|
},
|
||||||
"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"
|
"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"
|
||||||
{
|
},
|
||||||
"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"
|
"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"
|
||||||
{
|
},
|
||||||
"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"
|
"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"
|
||||||
{
|
},
|
||||||
"key": "name",
|
{
|
||||||
"description": "Layer 'Frituren' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
"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"
|
||||||
{
|
},
|
||||||
"key": "opening_hours",
|
{
|
||||||
"description": "Layer 'Frituren' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
"key": "name",
|
||||||
},
|
"description": "Layer 'Frituren' shows and asks freeform values for key 'name' (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')"
|
"key": "opening_hours",
|
||||||
},
|
"description": "Layer 'Frituren' shows and asks freeform values for key 'opening_hours' (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')"
|
"key": "website",
|
||||||
},
|
"description": "Layer 'Frituren' shows and asks freeform values for key 'website' (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": "phone",
|
||||||
"value": "yes"
|
"description": "Layer 'Frituren' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Friturenkaart')"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "diet:vegetarian",
|
"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 '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')",
|
||||||
"value": "limited"
|
"value": "yes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "diet:vegetarian",
|
"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 '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')",
|
||||||
"value": "no"
|
"value": "limited"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "diet:vegan",
|
"key": "diet:vegetarian",
|
||||||
"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 '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')",
|
||||||
"value": "yes"
|
"value": "no"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "diet:vegan",
|
"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 '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')",
|
||||||
"value": "limited"
|
"value": "yes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "diet:vegetarian",
|
"key": "diet:vegan",
|
||||||
"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 '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')",
|
||||||
"value": "no"
|
"value": "limited"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "friture:oil",
|
"key": "diet:vegetarian",
|
||||||
"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 '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')",
|
||||||
"value": "vegetable"
|
"value": "no"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "friture:oil",
|
"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 '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')",
|
||||||
"value": "animal"
|
"value": "vegetable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "bulk_purchase",
|
"key": "friture:oil",
|
||||||
"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')",
|
"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')",
|
||||||
"value": "yes"
|
"value": "animal"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "bulk_purchase",
|
"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')",
|
"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')",
|
||||||
"value": "no"
|
"value": "yes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "bulk_purchase",
|
"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')",
|
"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')",
|
||||||
"value": "only"
|
"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')",
|
||||||
|
"value": "only"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,56 +1,56 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Ghost bikes",
|
"name": "MapComplete Ghost bikes",
|
||||||
"description": "A <b>ghost bike</b> is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location",
|
"description": "A <b>ghost bike</b> is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location",
|
||||||
"project_url": "https://mapcomplete.osm.be/ghostbikes",
|
"project_url": "https://mapcomplete.osm.be/ghostbikes",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/ghostbikes/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/ghostbikes/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "memorial",
|
|
||||||
"description": "The MapComplete theme Ghost bikes has a layer Ghost bikes showing features with this tag",
|
|
||||||
"value": "ghost_bike"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Ghost bikes 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": "memorial",
|
||||||
},
|
"description": "The MapComplete theme Ghost bikes has a layer Ghost bikes showing features with this tag",
|
||||||
{
|
"value": "ghost_bike"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Ghost bikes 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": "image",
|
||||||
{
|
"description": "The layer 'Ghost bikes 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 'Ghost bikes 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 'Ghost bikes 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 'Ghost bikes 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 'Ghost bikes 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 'Ghost bikes' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Ghost bikes')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Ghost bikes 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": "noname",
|
},
|
||||||
"description": "Layer 'Ghost bikes' shows noname=yes with a fixed text, namely 'No name is marked on the bike' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Ghost bikes')",
|
{
|
||||||
"value": "yes"
|
"key": "name",
|
||||||
},
|
"description": "Layer 'Ghost bikes' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Ghost bikes')"
|
||||||
{
|
},
|
||||||
"key": "source",
|
{
|
||||||
"description": "Layer 'Ghost bikes' shows and asks freeform values for key 'source' (in the MapComplete.osm.be theme 'Ghost bikes')"
|
"key": "noname",
|
||||||
},
|
"description": "Layer 'Ghost bikes' shows noname=yes with a fixed text, namely 'No name is marked on the bike' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Ghost bikes')",
|
||||||
{
|
"value": "yes"
|
||||||
"key": "inscription",
|
},
|
||||||
"description": "Layer 'Ghost bikes' shows and asks freeform values for key 'inscription' (in the MapComplete.osm.be theme 'Ghost bikes')"
|
{
|
||||||
},
|
"key": "source",
|
||||||
{
|
"description": "Layer 'Ghost bikes' shows and asks freeform values for key 'source' (in the MapComplete.osm.be theme 'Ghost bikes')"
|
||||||
"key": "start_date",
|
},
|
||||||
"description": "Layer 'Ghost bikes' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'Ghost bikes')"
|
{
|
||||||
}
|
"key": "inscription",
|
||||||
]
|
"description": "Layer 'Ghost bikes' shows and asks freeform values for key 'inscription' (in the MapComplete.osm.be theme 'Ghost bikes')"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "start_date",
|
||||||
|
"description": "Layer 'Ghost bikes' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'Ghost bikes')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,279 +1,279 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Hydrants, Extinguishers, Fire stations, and Ambulance stations.",
|
"name": "MapComplete Hydrants, Extinguishers, Fire stations, and Ambulance stations.",
|
||||||
"description": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.",
|
"description": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.",
|
||||||
"project_url": "https://mapcomplete.osm.be/hailhydrant",
|
"project_url": "https://mapcomplete.osm.be/hailhydrant",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/hailhydrant/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/hailhydrant/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, Erwin Olario",
|
"contact_name": "Pieter Vander Vennet, Erwin Olario",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "emergency",
|
|
||||||
"description": "The MapComplete theme Hydrants, Extinguishers, Fire stations, and Ambulance stations. has a layer Map of hydrants showing features with this tag",
|
|
||||||
"value": "fire_hydrant"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows and asks freeform values for key 'colour' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
"key": "emergency",
|
||||||
},
|
"description": "The MapComplete theme Hydrants, Extinguishers, Fire stations, and Ambulance stations. has a layer Map of hydrants showing features with this tag",
|
||||||
{
|
"value": "fire_hydrant"
|
||||||
"key": "colour",
|
},
|
||||||
"description": "Layer 'Map of hydrants' shows colour= with a fixed text, namely 'The hydrant color is unknown.' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.') Picking this answer will delete the key colour.",
|
{
|
||||||
"value": ""
|
"key": "colour",
|
||||||
},
|
"description": "Layer 'Map of hydrants' shows and asks freeform values for key 'colour' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows colour=yellow with a fixed text, namely 'The hydrant color is yellow.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "colour",
|
||||||
"value": "yellow"
|
"description": "Layer 'Map of hydrants' shows colour= with a fixed text, namely 'The hydrant color is unknown.' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.') Picking this answer will delete the key colour.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "colour",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows colour=red with a fixed text, namely 'The hydrant color is red.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "colour",
|
||||||
"value": "red"
|
"description": "Layer 'Map of hydrants' shows colour=yellow with a fixed text, namely 'The hydrant color is yellow.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "yellow"
|
||||||
{
|
},
|
||||||
"key": "fire_hydrant:type",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows and asks freeform values for key 'fire_hydrant:type' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
"key": "colour",
|
||||||
},
|
"description": "Layer 'Map of hydrants' shows colour=red with a fixed text, namely 'The hydrant color is red.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
{
|
"value": "red"
|
||||||
"key": "fire_hydrant:type",
|
},
|
||||||
"description": "Layer 'Map of hydrants' shows fire_hydrant:type= with a fixed text, namely 'The hydrant type is unknown.' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.') Picking this answer will delete the key fire_hydrant:type.",
|
{
|
||||||
"value": ""
|
"key": "fire_hydrant:type",
|
||||||
},
|
"description": "Layer 'Map of hydrants' shows and asks freeform values for key 'fire_hydrant:type' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
{
|
},
|
||||||
"key": "fire_hydrant:type",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows fire_hydrant:type=pillar with a fixed text, namely '<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_pillar.svg\" /> Pillar type.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "fire_hydrant:type",
|
||||||
"value": "pillar"
|
"description": "Layer 'Map of hydrants' shows fire_hydrant:type= with a fixed text, namely 'The hydrant type is unknown.' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.') Picking this answer will delete the key fire_hydrant:type.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "fire_hydrant:type",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows fire_hydrant:type=pipe with a fixed text, namely '<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Pipe type.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "fire_hydrant:type",
|
||||||
"value": "pipe"
|
"description": "Layer 'Map of hydrants' shows fire_hydrant:type=pillar with a fixed text, namely '<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_pillar.svg\" /> Pillar type.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "pillar"
|
||||||
{
|
},
|
||||||
"key": "fire_hydrant:type",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows fire_hydrant:type=wall with a fixed text, namely '<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Wall type.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "fire_hydrant:type",
|
||||||
"value": "wall"
|
"description": "Layer 'Map of hydrants' shows fire_hydrant:type=pipe with a fixed text, namely '<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Pipe type.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "pipe"
|
||||||
{
|
},
|
||||||
"key": "fire_hydrant:type",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows fire_hydrant:type=underground with a fixed text, namely '<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_underground.svg\" /> Underground type.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "fire_hydrant:type",
|
||||||
"value": "underground"
|
"description": "Layer 'Map of hydrants' shows fire_hydrant:type=wall with a fixed text, namely '<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_unknown.svg\" /> Wall type.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "wall"
|
||||||
{
|
},
|
||||||
"key": "disused:emergency",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows and asks freeform values for key 'disused:emergency' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
"key": "fire_hydrant:type",
|
||||||
},
|
"description": "Layer 'Map of hydrants' shows fire_hydrant:type=underground with a fixed text, namely '<img style=\"width:15px\" src=\"./assets/themes/hailhydrant/hydrant_underground.svg\" /> Underground type.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
{
|
"value": "underground"
|
||||||
"key": "emergency",
|
},
|
||||||
"description": "Layer 'Map of hydrants' shows emergency=fire_hydrant with a fixed text, namely 'The hydrant is (fully or partially) working.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
{
|
||||||
"value": "fire_hydrant"
|
"key": "disused:emergency",
|
||||||
},
|
"description": "Layer 'Map of hydrants' shows and asks freeform values for key 'disused:emergency' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
{
|
},
|
||||||
"key": "disused:emergency",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows disused:emergency=fire_hydrant&emergency= with a fixed text, namely 'The hydrant is unavailable.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "emergency",
|
||||||
"value": "fire_hydrant"
|
"description": "Layer 'Map of hydrants' shows emergency=fire_hydrant with a fixed text, namely 'The hydrant is (fully or partially) working.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "fire_hydrant"
|
||||||
{
|
},
|
||||||
"key": "emergency",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows disused:emergency=fire_hydrant&emergency= with a fixed text, namely 'The hydrant is unavailable.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.') Picking this answer will delete the key emergency.",
|
"key": "disused:emergency",
|
||||||
"value": ""
|
"description": "Layer 'Map of hydrants' shows disused:emergency=fire_hydrant&emergency= with a fixed text, namely 'The hydrant is unavailable.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "fire_hydrant"
|
||||||
{
|
},
|
||||||
"key": "removed:emergency",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows removed:emergency=fire_hydrant&emergency= with a fixed text, namely 'The hydrant has been removed.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "emergency",
|
||||||
"value": "fire_hydrant"
|
"description": "Layer 'Map of hydrants' shows disused:emergency=fire_hydrant&emergency= with a fixed text, namely 'The hydrant is unavailable.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.') Picking this answer will delete the key emergency.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "emergency",
|
{
|
||||||
"description": "Layer 'Map of hydrants' shows removed:emergency=fire_hydrant&emergency= with a fixed text, namely 'The hydrant has been removed.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.') Picking this answer will delete the key emergency.",
|
"key": "removed:emergency",
|
||||||
"value": ""
|
"description": "Layer 'Map of hydrants' shows removed:emergency=fire_hydrant&emergency= with a fixed text, namely 'The hydrant has been removed.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "fire_hydrant"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Map of hydrants 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": "emergency",
|
||||||
},
|
"description": "Layer 'Map of hydrants' shows removed:emergency=fire_hydrant&emergency= with a fixed text, namely 'The hydrant has been removed.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.') Picking this answer will delete the key emergency.",
|
||||||
{
|
"value": ""
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Map of hydrants 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": "image",
|
||||||
{
|
"description": "The layer 'Map of hydrants 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 'Map of hydrants 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 'Map of hydrants 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 'Map of hydrants 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 'Map of hydrants 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": "emergency",
|
},
|
||||||
"description": "The MapComplete theme Hydrants, Extinguishers, Fire stations, and Ambulance stations. has a layer Map of fire extinguishers. showing features with this tag",
|
{
|
||||||
"value": "fire_extinguisher"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer 'Map of hydrants 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": "location",
|
{
|
||||||
"description": "Layer 'Map of fire extinguishers.' shows and asks freeform values for key 'location' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
"key": "emergency",
|
||||||
},
|
"description": "The MapComplete theme Hydrants, Extinguishers, Fire stations, and Ambulance stations. has a layer Map of fire extinguishers. showing features with this tag",
|
||||||
{
|
"value": "fire_extinguisher"
|
||||||
"key": "location",
|
},
|
||||||
"description": "Layer 'Map of fire extinguishers.' shows location=indoor with a fixed text, namely 'Found indoors.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
{
|
||||||
"value": "indoor"
|
"key": "location",
|
||||||
},
|
"description": "Layer 'Map of fire extinguishers.' shows and asks freeform values for key 'location' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
{
|
},
|
||||||
"key": "location",
|
{
|
||||||
"description": "Layer 'Map of fire extinguishers.' shows location=outdoor with a fixed text, namely 'Found outdoors.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "location",
|
||||||
"value": "outdoor"
|
"description": "Layer 'Map of fire extinguishers.' shows location=indoor with a fixed text, namely 'Found indoors.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "indoor"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Map of fire extinguishers. 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": "location",
|
||||||
},
|
"description": "Layer 'Map of fire extinguishers.' shows location=outdoor with a fixed text, namely 'Found outdoors.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
{
|
"value": "outdoor"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Map of fire extinguishers. 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": "image",
|
||||||
{
|
"description": "The layer 'Map of fire extinguishers. 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 'Map of fire extinguishers. 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 'Map of fire extinguishers. 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 'Map of fire extinguishers. 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 'Map of fire extinguishers. 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": "amenity",
|
},
|
||||||
"description": "The MapComplete theme Hydrants, Extinguishers, Fire stations, and Ambulance stations. has a layer Map of fire stations showing features with this tag",
|
{
|
||||||
"value": "fire_station"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer 'Map of fire extinguishers. 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 'Map of fire stations' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
"key": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Hydrants, Extinguishers, Fire stations, and Ambulance stations. has a layer Map of fire stations showing features with this tag",
|
||||||
{
|
"value": "fire_station"
|
||||||
"key": "addr:street",
|
},
|
||||||
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'addr:street' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
{
|
||||||
},
|
"key": "name",
|
||||||
{
|
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
"key": "addr:place",
|
},
|
||||||
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'addr:place' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
{
|
||||||
},
|
"key": "addr:street",
|
||||||
{
|
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'addr:street' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
"key": "operator",
|
},
|
||||||
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
{
|
||||||
},
|
"key": "addr:place",
|
||||||
{
|
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'addr:place' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
"key": "operator",
|
},
|
||||||
"description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection&operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
{
|
||||||
"value": "Bureau of Fire Protection"
|
"key": "operator",
|
||||||
},
|
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
{
|
},
|
||||||
"key": "operator:type",
|
{
|
||||||
"description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection&operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "operator",
|
||||||
"value": "government"
|
"description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection&operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "Bureau of Fire Protection"
|
||||||
{
|
},
|
||||||
"key": "operator:type",
|
{
|
||||||
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'operator:type' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
"key": "operator:type",
|
||||||
},
|
"description": "Layer 'Map of fire stations' shows operator=Bureau of Fire Protection&operator:type=government with a fixed text, namely 'Bureau of Fire Protection' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
{
|
"value": "government"
|
||||||
"key": "operator:type",
|
},
|
||||||
"description": "Layer 'Map of fire stations' shows operator:type=government with a fixed text, namely 'The station is operated by the government.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
{
|
||||||
"value": "government"
|
"key": "operator:type",
|
||||||
},
|
"description": "Layer 'Map of fire stations' shows and asks freeform values for key 'operator:type' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
{
|
},
|
||||||
"key": "operator:type",
|
{
|
||||||
"description": "Layer 'Map of fire stations' shows operator:type=community with a fixed text, namely 'The station is operated by a community-based, or informal organization.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "operator:type",
|
||||||
"value": "community"
|
"description": "Layer 'Map of fire stations' shows operator:type=government with a fixed text, namely 'The station is operated by the government.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "government"
|
||||||
{
|
},
|
||||||
"key": "operator:type",
|
{
|
||||||
"description": "Layer 'Map of fire stations' shows operator:type=ngo with a fixed text, namely 'The station is operated by a formal group of volunteers.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "operator:type",
|
||||||
"value": "ngo"
|
"description": "Layer 'Map of fire stations' shows operator:type=community with a fixed text, namely 'The station is operated by a community-based, or informal organization.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "community"
|
||||||
{
|
},
|
||||||
"key": "operator:type",
|
{
|
||||||
"description": "Layer 'Map of fire stations' shows operator:type=private with a fixed text, namely 'The station is privately operated.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "operator:type",
|
||||||
"value": "private"
|
"description": "Layer 'Map of fire stations' shows operator:type=ngo with a fixed text, namely 'The station is operated by a formal group of volunteers.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "ngo"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Map of fire 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": "operator:type",
|
||||||
},
|
"description": "Layer 'Map of fire stations' shows operator:type=private with a fixed text, namely 'The station is privately operated.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
{
|
"value": "private"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Map of fire 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": "image",
|
||||||
{
|
"description": "The layer 'Map of fire 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": "wikidata",
|
},
|
||||||
"description": "The layer 'Map of fire 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": "mapillary",
|
||||||
{
|
"description": "The layer 'Map of fire 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": "wikipedia",
|
},
|
||||||
"description": "The layer 'Map of fire 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": "wikidata",
|
||||||
{
|
"description": "The layer 'Map of fire 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": "emergency",
|
},
|
||||||
"description": "The MapComplete theme Hydrants, Extinguishers, Fire stations, and Ambulance stations. has a layer Map of ambulance stations showing features with this tag",
|
{
|
||||||
"value": "ambulance_station"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer 'Map of fire 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": "name",
|
{
|
||||||
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
"key": "emergency",
|
||||||
},
|
"description": "The MapComplete theme Hydrants, Extinguishers, Fire stations, and Ambulance stations. has a layer Map of ambulance stations showing features with this tag",
|
||||||
{
|
"value": "ambulance_station"
|
||||||
"key": "addr:street",
|
},
|
||||||
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'addr:street' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
{
|
||||||
},
|
"key": "name",
|
||||||
{
|
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
"key": "addr:place",
|
},
|
||||||
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'addr:place' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
{
|
||||||
},
|
"key": "addr:street",
|
||||||
{
|
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'addr:street' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
"key": "operator",
|
},
|
||||||
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
{
|
||||||
},
|
"key": "addr:place",
|
||||||
{
|
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'addr:place' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
"key": "operator:type",
|
},
|
||||||
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'operator:type' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
{
|
||||||
},
|
"key": "operator",
|
||||||
{
|
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
"key": "operator:type",
|
},
|
||||||
"description": "Layer 'Map of ambulance stations' shows operator:type=government with a fixed text, namely 'The station is operated by the government.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
{
|
||||||
"value": "government"
|
"key": "operator:type",
|
||||||
},
|
"description": "Layer 'Map of ambulance stations' shows and asks freeform values for key 'operator:type' (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')"
|
||||||
{
|
},
|
||||||
"key": "operator:type",
|
{
|
||||||
"description": "Layer 'Map of ambulance stations' shows operator:type=community with a fixed text, namely 'The station is operated by a community-based, or informal organization.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "operator:type",
|
||||||
"value": "community"
|
"description": "Layer 'Map of ambulance stations' shows operator:type=government with a fixed text, namely 'The station is operated by the government.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "government"
|
||||||
{
|
},
|
||||||
"key": "operator:type",
|
{
|
||||||
"description": "Layer 'Map of ambulance stations' shows operator:type=ngo with a fixed text, namely 'The station is operated by a formal group of volunteers.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "operator:type",
|
||||||
"value": "ngo"
|
"description": "Layer 'Map of ambulance stations' shows operator:type=community with a fixed text, namely 'The station is operated by a community-based, or informal organization.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "community"
|
||||||
{
|
},
|
||||||
"key": "operator:type",
|
{
|
||||||
"description": "Layer 'Map of ambulance stations' shows operator:type=private with a fixed text, namely 'The station is privately operated.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
"key": "operator:type",
|
||||||
"value": "private"
|
"description": "Layer 'Map of ambulance stations' shows operator:type=ngo with a fixed text, namely 'The station is operated by a formal group of volunteers.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
},
|
"value": "ngo"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Map of ambulance 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": "operator:type",
|
||||||
},
|
"description": "Layer 'Map of ambulance stations' shows operator:type=private with a fixed text, namely 'The station is privately operated.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Hydrants, Extinguishers, Fire stations, and Ambulance stations.')",
|
||||||
{
|
"value": "private"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Map of ambulance 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": "image",
|
||||||
{
|
"description": "The layer 'Map of ambulance 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": "wikidata",
|
},
|
||||||
"description": "The layer 'Map of ambulance 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": "mapillary",
|
||||||
{
|
"description": "The layer 'Map of ambulance 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": "wikipedia",
|
},
|
||||||
"description": "The layer 'Map of ambulance 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": "wikidata",
|
||||||
]
|
"description": "The layer 'Map of ambulance 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": "wikipedia",
|
||||||
|
"description": "The layer 'Map of ambulance 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"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,98 +1,98 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete A map of maps",
|
"name": "MapComplete A map of maps",
|
||||||
"description": "This theme shows all (touristic) maps that OpenStreetMap knows of",
|
"description": "This theme shows all (touristic) maps that OpenStreetMap knows of",
|
||||||
"project_url": "https://mapcomplete.osm.be/maps",
|
"project_url": "https://mapcomplete.osm.be/maps",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/maps/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/maps/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "tourism",
|
|
||||||
"description": "The MapComplete theme A map of maps has a layer Maps showing features with this tag",
|
|
||||||
"value": "map"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "information",
|
{
|
||||||
"description": "The MapComplete theme A map of maps has a layer Maps showing features with this tag",
|
"key": "tourism",
|
||||||
"value": "map"
|
"description": "The MapComplete theme A map of maps has a layer Maps showing features with this tag",
|
||||||
},
|
"value": "map"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Maps 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": "information",
|
||||||
},
|
"description": "The MapComplete theme A map of maps has a layer Maps showing features with this tag",
|
||||||
{
|
"value": "map"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Maps 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": "image",
|
||||||
{
|
"description": "The layer 'Maps 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 'Maps 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 'Maps 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 'Maps 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 'Maps 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": "map_source",
|
},
|
||||||
"description": "Layer 'Maps' shows and asks freeform values for key 'map_source' (in the MapComplete.osm.be theme 'A map of maps')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Maps 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": "map_source",
|
},
|
||||||
"description": "Layer 'Maps' shows map_source=OpenStreetMap¬:map_source= with a fixed text, namely 'This map is based on OpenStreetMap' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
{
|
||||||
"value": "OpenStreetMap"
|
"key": "map_source",
|
||||||
},
|
"description": "Layer 'Maps' shows and asks freeform values for key 'map_source' (in the MapComplete.osm.be theme 'A map of maps')"
|
||||||
{
|
},
|
||||||
"key": "not:map_source",
|
{
|
||||||
"description": "Layer 'Maps' shows map_source=OpenStreetMap¬:map_source= with a fixed text, namely 'This map is based on OpenStreetMap' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps') Picking this answer will delete the key not:map_source.",
|
"key": "map_source",
|
||||||
"value": ""
|
"description": "Layer 'Maps' shows map_source=OpenStreetMap¬:map_source= with a fixed text, namely 'This map is based on OpenStreetMap' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
||||||
},
|
"value": "OpenStreetMap"
|
||||||
{
|
},
|
||||||
"key": "map_source:attribution",
|
{
|
||||||
"description": "Layer 'Maps' shows map_source:attribution=yes with a fixed text, namely 'OpenStreetMap is clearly attributed, including the ODBL-license' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
"key": "not:map_source",
|
||||||
"value": "yes"
|
"description": "Layer 'Maps' shows map_source=OpenStreetMap¬:map_source= with a fixed text, namely 'This map is based on OpenStreetMap' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps') Picking this answer will delete the key not:map_source.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "map_source:attribution",
|
{
|
||||||
"description": "Layer 'Maps' shows map_source:attribution=incomplete with a fixed text, namely 'OpenStreetMap is clearly attributed, but the license is not mentioned' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
"key": "map_source:attribution",
|
||||||
"value": "incomplete"
|
"description": "Layer 'Maps' shows map_source:attribution=yes with a fixed text, namely 'OpenStreetMap is clearly attributed, including the ODBL-license' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "map_source:attribution",
|
{
|
||||||
"description": "Layer 'Maps' shows map_source:attribution=sticker with a fixed text, namely 'OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
"key": "map_source:attribution",
|
||||||
"value": "sticker"
|
"description": "Layer 'Maps' shows map_source:attribution=incomplete with a fixed text, namely 'OpenStreetMap is clearly attributed, but the license is not mentioned' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
||||||
},
|
"value": "incomplete"
|
||||||
{
|
},
|
||||||
"key": "map_source:attribution",
|
{
|
||||||
"description": "Layer 'Maps' shows map_source:attribution=none with a fixed text, namely 'There is no attribution at all' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
"key": "map_source:attribution",
|
||||||
"value": "none"
|
"description": "Layer 'Maps' shows map_source:attribution=sticker with a fixed text, namely 'OpenStreetMap wasn't mentioned, but someone put an OpenStreetMap-sticker on it' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
||||||
},
|
"value": "sticker"
|
||||||
{
|
},
|
||||||
"key": "map_source:attribution",
|
{
|
||||||
"description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the MapComplete.osm.be theme 'A map of maps')",
|
"key": "map_source:attribution",
|
||||||
"value": "no"
|
"description": "Layer 'Maps' shows map_source:attribution=none with a fixed text, namely 'There is no attribution at all' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'A map of maps')",
|
||||||
},
|
"value": "none"
|
||||||
{
|
},
|
||||||
"key": "service:bicycle:cleaning:charge",
|
{
|
||||||
"description": "Layer 'Maps' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'A map of maps')"
|
"key": "map_source:attribution",
|
||||||
},
|
"description": "Layer 'Maps' shows map_source:attribution=no with a fixed text, namely 'There is no attribution at all' (in the MapComplete.osm.be theme 'A map of maps')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "service:bicycle:cleaning:fee",
|
},
|
||||||
"description": "Layer 'Maps' 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 'A map of maps')",
|
{
|
||||||
"value": "no&service:bicycle:cleaning:charge="
|
"key": "service:bicycle:cleaning:charge",
|
||||||
},
|
"description": "Layer 'Maps' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'A map of maps')"
|
||||||
{
|
},
|
||||||
"key": "service:bicycle:cleaning:fee",
|
{
|
||||||
"description": "Layer 'Maps' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'A map of maps')",
|
"key": "service:bicycle:cleaning:fee",
|
||||||
"value": "no&"
|
"description": "Layer 'Maps' 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 'A map of maps')",
|
||||||
},
|
"value": "no&service:bicycle:cleaning:charge="
|
||||||
{
|
},
|
||||||
"key": "service:bicycle:cleaning:fee",
|
{
|
||||||
"description": "Layer 'Maps' 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 'A map of maps')",
|
"key": "service:bicycle:cleaning:fee",
|
||||||
"value": "yes"
|
"description": "Layer 'Maps' shows service:bicycle:cleaning:fee=no& with a fixed text, namely 'Free to use' (in the MapComplete.osm.be theme 'A map of maps')",
|
||||||
}
|
"value": "no&"
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"key": "service:bicycle:cleaning:fee",
|
||||||
|
"description": "Layer 'Maps' 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 'A map of maps')",
|
||||||
|
"value": "yes"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,55 +1,55 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete OpenWindPowerMap",
|
"name": "MapComplete OpenWindPowerMap",
|
||||||
"description": "A map for showing and editing wind turbines",
|
"description": "A map for showing and editing wind turbines",
|
||||||
"project_url": "https://mapcomplete.osm.be/openwindpowermap",
|
"project_url": "https://mapcomplete.osm.be/openwindpowermap",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/openwindpowermap/wind_turbine.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/openwindpowermap/wind_turbine.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, Seppe Santens",
|
"contact_name": "Pieter Vander Vennet, Seppe Santens",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "generator:source",
|
|
||||||
"description": "The MapComplete theme OpenWindPowerMap has a layer wind turbine showing features with this tag",
|
|
||||||
"value": "wind"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "generator:output:electricity",
|
{
|
||||||
"description": "Layer 'wind turbine' shows and asks freeform values for key 'generator:output:electricity' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
"key": "generator:source",
|
||||||
},
|
"description": "The MapComplete theme OpenWindPowerMap has a layer wind turbine showing features with this tag",
|
||||||
{
|
"value": "wind"
|
||||||
"key": "operator",
|
},
|
||||||
"description": "Layer 'wind turbine' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
{
|
||||||
},
|
"key": "generator:output:electricity",
|
||||||
{
|
"description": "Layer 'wind turbine' shows and asks freeform values for key 'generator:output:electricity' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
||||||
"key": "height",
|
},
|
||||||
"description": "Layer 'wind turbine' shows and asks freeform values for key 'height' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
{
|
||||||
},
|
"key": "operator",
|
||||||
{
|
"description": "Layer 'wind turbine' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
||||||
"key": "rotor:diameter",
|
},
|
||||||
"description": "Layer 'wind turbine' shows and asks freeform values for key 'rotor:diameter' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
{
|
||||||
},
|
"key": "height",
|
||||||
{
|
"description": "Layer 'wind turbine' shows and asks freeform values for key 'height' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
||||||
"key": "start_date",
|
},
|
||||||
"description": "Layer 'wind turbine' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
{
|
||||||
},
|
"key": "rotor:diameter",
|
||||||
{
|
"description": "Layer 'wind turbine' shows and asks freeform values for key 'rotor:diameter' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
||||||
"key": "image",
|
},
|
||||||
"description": "The layer 'wind turbine 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": "start_date",
|
||||||
{
|
"description": "Layer 'wind turbine' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'wind turbine 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": "image",
|
||||||
{
|
"description": "The layer 'wind turbine 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 'wind turbine 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 'wind turbine 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 'wind turbine 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 'wind turbine 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 'wind turbine 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"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,122 +1,122 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Parking",
|
"name": "MapComplete Parking",
|
||||||
"description": "This map shows different parking spots",
|
"description": "This map shows different parking spots",
|
||||||
"project_url": "https://mapcomplete.osm.be/parkings",
|
"project_url": "https://mapcomplete.osm.be/parkings",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/parkings/parkings.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/parkings/parkings.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, ",
|
"contact_name": "Pieter Vander Vennet, ",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "amenity",
|
|
||||||
"description": "The MapComplete theme Parking has a layer parking showing features with this tag",
|
|
||||||
"value": "parking"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "amenity",
|
{
|
||||||
"description": "The MapComplete theme Parking has a layer parking showing features with this tag",
|
"key": "amenity",
|
||||||
"value": "motorcycle_parking"
|
"description": "The MapComplete theme Parking has a layer parking showing features with this tag",
|
||||||
},
|
"value": "parking"
|
||||||
{
|
},
|
||||||
"key": "amenity",
|
{
|
||||||
"description": "The MapComplete theme Parking has a layer parking showing features with this tag",
|
"key": "amenity",
|
||||||
"value": "bicycle_parking"
|
"description": "The MapComplete theme Parking has a layer parking showing features with this tag",
|
||||||
},
|
"value": "motorcycle_parking"
|
||||||
{
|
},
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'parking 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": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Parking has a layer parking showing features with this tag",
|
||||||
{
|
"value": "bicycle_parking"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'parking 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": "image",
|
||||||
{
|
"description": "The layer 'parking 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 'parking 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 'parking 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 'parking 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 'parking 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": "access:description",
|
},
|
||||||
"description": "Layer 'parking' shows and asks freeform values for key 'access:description' (in the MapComplete.osm.be theme 'Parking')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'parking 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": "access",
|
},
|
||||||
"description": "Layer 'parking' shows access=yes&fee= with a fixed text, namely 'Vrij toegankelijk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
{
|
||||||
"value": "yes"
|
"key": "access:description",
|
||||||
},
|
"description": "Layer 'parking' shows and asks freeform values for key 'access:description' (in the MapComplete.osm.be theme 'Parking')"
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'parking' shows access=yes&fee= with a fixed text, namely 'Vrij toegankelijk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
"key": "access",
|
||||||
"value": ""
|
"description": "Layer 'parking' shows access=yes&fee= with a fixed text, namely 'Vrij toegankelijk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'parking' shows access=no&fee= with a fixed text, namely 'Niet toegankelijk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
"key": "fee",
|
||||||
"value": "no"
|
"description": "Layer 'parking' shows access=yes&fee= with a fixed text, namely 'Vrij toegankelijk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'parking' shows access=no&fee= with a fixed text, namely 'Niet toegankelijk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
"key": "access",
|
||||||
"value": ""
|
"description": "Layer 'parking' shows access=no&fee= with a fixed text, namely 'Niet toegankelijk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'parking' shows access=private&fee= with a fixed text, namely 'Niet toegankelijk, want privégebied' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
"key": "fee",
|
||||||
"value": "private"
|
"description": "Layer 'parking' shows access=no&fee= with a fixed text, namely 'Niet toegankelijk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'parking' shows access=private&fee= with a fixed text, namely 'Niet toegankelijk, want privégebied' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
"key": "access",
|
||||||
"value": ""
|
"description": "Layer 'parking' shows access=private&fee= with a fixed text, namely 'Niet toegankelijk, want privégebied' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
||||||
},
|
"value": "private"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'parking' shows access=permissive&fee= with a fixed text, namely 'Toegankelijk, ondanks dat het privegebied is' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
"key": "fee",
|
||||||
"value": "permissive"
|
"description": "Layer 'parking' shows access=private&fee= with a fixed text, namely 'Niet toegankelijk, want privégebied' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'parking' shows access=permissive&fee= with a fixed text, namely 'Toegankelijk, ondanks dat het privegebied is' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
"key": "access",
|
||||||
"value": ""
|
"description": "Layer 'parking' shows access=permissive&fee= with a fixed text, namely 'Toegankelijk, ondanks dat het privegebied is' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
||||||
},
|
"value": "permissive"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'parking' shows access=guided&fee= with a fixed text, namely 'Enkel toegankelijk met een gids of tijdens een activiteit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
"key": "fee",
|
||||||
"value": "guided"
|
"description": "Layer 'parking' shows access=permissive&fee= with a fixed text, namely 'Toegankelijk, ondanks dat het privegebied is' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'parking' shows access=guided&fee= with a fixed text, namely 'Enkel toegankelijk met een gids of tijdens een activiteit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
"key": "access",
|
||||||
"value": ""
|
"description": "Layer 'parking' shows access=guided&fee= with a fixed text, namely 'Enkel toegankelijk met een gids of tijdens een activiteit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
||||||
},
|
"value": "guided"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'parking' shows access=yes&fee=yes with a fixed text, namely 'Toegankelijk mits betaling' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
"key": "fee",
|
||||||
"value": "yes"
|
"description": "Layer 'parking' shows access=guided&fee= with a fixed text, namely 'Enkel toegankelijk met een gids of tijdens een activiteit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking') Picking this answer will delete the key fee.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'parking' shows access=yes&fee=yes with a fixed text, namely 'Toegankelijk mits betaling' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
"key": "access",
|
||||||
"value": "yes"
|
"description": "Layer 'parking' shows access=yes&fee=yes with a fixed text, namely 'Toegankelijk mits betaling' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "operator",
|
{
|
||||||
"description": "Layer 'parking' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Parking')"
|
"key": "fee",
|
||||||
},
|
"description": "Layer 'parking' shows access=yes&fee=yes with a fixed text, namely 'Toegankelijk mits betaling' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
||||||
{
|
"value": "yes"
|
||||||
"key": "operator",
|
},
|
||||||
"description": "Layer 'parking' shows operator=Natuurpunt with a fixed text, namely '<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door Natuurpunt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
{
|
||||||
"value": "Natuurpunt"
|
"key": "operator",
|
||||||
},
|
"description": "Layer 'parking' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Parking')"
|
||||||
{
|
},
|
||||||
"key": "operator",
|
{
|
||||||
"description": "Layer 'parking' shows operator~^(n|N)atuurpunt.*$ with a fixed text, namely '<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door {operator}' (in the MapComplete.osm.be theme 'Parking')"
|
"key": "operator",
|
||||||
}
|
"description": "Layer 'parking' shows operator=Natuurpunt with a fixed text, namely '<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door Natuurpunt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Parking')",
|
||||||
]
|
"value": "Natuurpunt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "operator",
|
||||||
|
"description": "Layer 'parking' shows operator~^(n|N)atuurpunt.*$ with a fixed text, namely '<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door {operator}' (in the MapComplete.osm.be theme 'Parking')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,13 +1,13 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Personal theme",
|
"name": "MapComplete Personal theme",
|
||||||
"description": "Create a personal theme based on all the available layers of all themes",
|
"description": "Create a personal theme based on all the available layers of all themes",
|
||||||
"project_url": "https://mapcomplete.osm.be/personal",
|
"project_url": "https://mapcomplete.osm.be/personal",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/svg/addSmall.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/svg/addSmall.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
},
|
||||||
"tags": []
|
"tags": []
|
||||||
}
|
}
|
|
@ -1,168 +1,168 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Playgrounds",
|
"name": "MapComplete Playgrounds",
|
||||||
"description": "A map with playgrounds",
|
"description": "A map with playgrounds",
|
||||||
"project_url": "https://mapcomplete.osm.be/playgrounds",
|
"project_url": "https://mapcomplete.osm.be/playgrounds",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/playgrounds/playground.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/playgrounds/playground.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, ",
|
"contact_name": "Pieter Vander Vennet, ",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "leisure",
|
|
||||||
"description": "The MapComplete theme Playgrounds has a layer Playgrounds showing features with this tag",
|
|
||||||
"value": "playground"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Playgrounds 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": "leisure",
|
||||||
},
|
"description": "The MapComplete theme Playgrounds has a layer Playgrounds showing features with this tag",
|
||||||
{
|
"value": "playground"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Playgrounds 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": "image",
|
||||||
{
|
"description": "The layer 'Playgrounds 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 'Playgrounds 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 'Playgrounds 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 'Playgrounds 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 'Playgrounds 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": "surface",
|
},
|
||||||
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'surface' (in the MapComplete.osm.be theme 'Playgrounds')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Playgrounds 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": "surface",
|
},
|
||||||
"description": "Layer 'Playgrounds' shows surface=grass with a fixed text, namely 'The surface is <b>grass</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
{
|
||||||
"value": "grass"
|
"key": "surface",
|
||||||
},
|
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'surface' (in the MapComplete.osm.be theme 'Playgrounds')"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows surface=sand with a fixed text, namely 'The surface is <b>sand</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "surface",
|
||||||
"value": "sand"
|
"description": "Layer 'Playgrounds' shows surface=grass with a fixed text, namely 'The surface is <b>grass</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "grass"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows surface=woodchips with a fixed text, namely 'The surface consist of <b>woodchips</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "surface",
|
||||||
"value": "woodchips"
|
"description": "Layer 'Playgrounds' shows surface=sand with a fixed text, namely 'The surface is <b>sand</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "sand"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows surface=paving_stones with a fixed text, namely 'The surface is <b>paving stones</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "surface",
|
||||||
"value": "paving_stones"
|
"description": "Layer 'Playgrounds' shows surface=woodchips with a fixed text, namely 'The surface consist of <b>woodchips</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "woodchips"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows surface=asphalt with a fixed text, namely 'The surface is <b>asphalt</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "surface",
|
||||||
"value": "asphalt"
|
"description": "Layer 'Playgrounds' shows surface=paving_stones with a fixed text, namely 'The surface is <b>paving stones</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "paving_stones"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows surface=concrete with a fixed text, namely 'The surface is <b>concrete</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "surface",
|
||||||
"value": "concrete"
|
"description": "Layer 'Playgrounds' shows surface=asphalt with a fixed text, namely 'The surface is <b>asphalt</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "asphalt"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows surface=unpaved with a fixed text, namely 'The surface is <b>unpaved</b>' (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "surface",
|
||||||
"value": "unpaved"
|
"description": "Layer 'Playgrounds' shows surface=concrete with a fixed text, namely 'The surface is <b>concrete</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "concrete"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows surface=paved with a fixed text, namely 'The surface is <b>paved</b>' (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "surface",
|
||||||
"value": "paved"
|
"description": "Layer 'Playgrounds' shows surface=unpaved with a fixed text, namely 'The surface is <b>unpaved</b>' (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "unpaved"
|
||||||
{
|
},
|
||||||
"key": "lit",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows lit=yes with a fixed text, namely 'This playground is lit at night' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "surface",
|
||||||
"value": "yes"
|
"description": "Layer 'Playgrounds' shows surface=paved with a fixed text, namely 'The surface is <b>paved</b>' (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "paved"
|
||||||
{
|
},
|
||||||
"key": "lit",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows lit=no with a fixed text, namely 'This playground is not lit at night' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "lit",
|
||||||
"value": "no"
|
"description": "Layer 'Playgrounds' shows lit=yes with a fixed text, namely 'This playground is lit at night' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "min_age",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'min_age' (in the MapComplete.osm.be theme 'Playgrounds')"
|
"key": "lit",
|
||||||
},
|
"description": "Layer 'Playgrounds' shows lit=no with a fixed text, namely 'This playground is not lit at night' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "max_age",
|
},
|
||||||
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'max_age' (in the MapComplete.osm.be theme 'Playgrounds')"
|
{
|
||||||
},
|
"key": "min_age",
|
||||||
{
|
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'min_age' (in the MapComplete.osm.be theme 'Playgrounds')"
|
||||||
"key": "operator",
|
},
|
||||||
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Playgrounds')"
|
{
|
||||||
},
|
"key": "max_age",
|
||||||
{
|
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'max_age' (in the MapComplete.osm.be theme 'Playgrounds')"
|
||||||
"key": "access",
|
},
|
||||||
"description": "Layer 'Playgrounds' shows access= with a fixed text, namely 'Accessible to the general public' (in the MapComplete.osm.be theme 'Playgrounds') Picking this answer will delete the key access.",
|
{
|
||||||
"value": ""
|
"key": "operator",
|
||||||
},
|
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Playgrounds')"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows access=yes with a fixed text, namely 'Accessible to the general public' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "access",
|
||||||
"value": "yes"
|
"description": "Layer 'Playgrounds' shows access= with a fixed text, namely 'Accessible to the general public' (in the MapComplete.osm.be theme 'Playgrounds') Picking this answer will delete the key access.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows access=customers with a fixed text, namely 'Only accessible for clients of the operating business' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "access",
|
||||||
"value": "customers"
|
"description": "Layer 'Playgrounds' shows access=yes with a fixed text, namely 'Accessible to the general public' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows access=students with a fixed text, namely 'Only accessible to students of the school' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "access",
|
||||||
"value": "students"
|
"description": "Layer 'Playgrounds' shows access=customers with a fixed text, namely 'Only accessible for clients of the operating business' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "customers"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows access=private with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "access",
|
||||||
"value": "private"
|
"description": "Layer 'Playgrounds' shows access=students with a fixed text, namely 'Only accessible to students of the school' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "students"
|
||||||
{
|
},
|
||||||
"key": "email",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Playgrounds')"
|
"key": "access",
|
||||||
},
|
"description": "Layer 'Playgrounds' shows access=private with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
{
|
"value": "private"
|
||||||
"key": "phone",
|
},
|
||||||
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Playgrounds')"
|
{
|
||||||
},
|
"key": "email",
|
||||||
{
|
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Playgrounds')"
|
||||||
"key": "wheelchair",
|
},
|
||||||
"description": "Layer 'Playgrounds' shows wheelchair=yes with a fixed text, namely 'Completely accessible for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
{
|
||||||
"value": "yes"
|
"key": "phone",
|
||||||
},
|
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Playgrounds')"
|
||||||
{
|
},
|
||||||
"key": "wheelchair",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows wheelchair=limited with a fixed text, namely 'Limited accessibility for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "wheelchair",
|
||||||
"value": "limited"
|
"description": "Layer 'Playgrounds' shows wheelchair=yes with a fixed text, namely 'Completely accessible for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "wheelchair",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows wheelchair=no with a fixed text, namely 'Not accessible for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "wheelchair",
|
||||||
"value": "no"
|
"description": "Layer 'Playgrounds' shows wheelchair=limited with a fixed text, namely 'Limited accessibility for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "limited"
|
||||||
{
|
},
|
||||||
"key": "opening_hours",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Playgrounds')"
|
"key": "wheelchair",
|
||||||
},
|
"description": "Layer 'Playgrounds' shows wheelchair=no with a fixed text, namely 'Not accessible for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "opening_hours",
|
},
|
||||||
"description": "Layer 'Playgrounds' shows opening_hours=sunrise-sunset with a fixed text, namely 'Accessible from sunrise till sunset' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
{
|
||||||
"value": "sunrise-sunset"
|
"key": "opening_hours",
|
||||||
},
|
"description": "Layer 'Playgrounds' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Playgrounds')"
|
||||||
{
|
},
|
||||||
"key": "opening_hours",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows opening_hours=24/7 with a fixed text, namely 'Always accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
"key": "opening_hours",
|
||||||
"value": "24/7"
|
"description": "Layer 'Playgrounds' shows opening_hours=sunrise-sunset with a fixed text, namely 'Accessible from sunrise till sunset' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
},
|
"value": "sunrise-sunset"
|
||||||
{
|
},
|
||||||
"key": "opening_hours",
|
{
|
||||||
"description": "Layer 'Playgrounds' shows opening_hours= with a fixed text, namely 'Always accessible' (in the MapComplete.osm.be theme 'Playgrounds') Picking this answer will delete the key opening_hours.",
|
"key": "opening_hours",
|
||||||
"value": ""
|
"description": "Layer 'Playgrounds' shows opening_hours=24/7 with a fixed text, namely 'Always accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Playgrounds')",
|
||||||
}
|
"value": "24/7"
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"key": "opening_hours",
|
||||||
|
"description": "Layer 'Playgrounds' shows opening_hours= with a fixed text, namely 'Always accessible' (in the MapComplete.osm.be theme 'Playgrounds') Picking this answer will delete the key opening_hours.",
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,93 +1,93 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Open Shop Map",
|
"name": "MapComplete Open Shop Map",
|
||||||
"description": "An editable map with basic shop information",
|
"description": "An editable map with basic shop information",
|
||||||
"project_url": "https://mapcomplete.osm.be/shops",
|
"project_url": "https://mapcomplete.osm.be/shops",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/shops/shop.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/shops/shop.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "shop",
|
|
||||||
"description": "The MapComplete theme Open Shop Map has a layer Shop showing features with this tag"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer '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": "shop",
|
||||||
},
|
"description": "The MapComplete theme Open Shop Map has a layer Shop showing features with this tag"
|
||||||
{
|
},
|
||||||
"key": "mapillary",
|
{
|
||||||
"description": "The layer '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": "image",
|
||||||
},
|
"description": "The layer '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 '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 '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 '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 '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 'Shop' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
"key": "wikipedia",
|
||||||
},
|
"description": "The layer '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": "shop",
|
{
|
||||||
"description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
"key": "name",
|
||||||
},
|
"description": "Layer 'Shop' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
||||||
{
|
},
|
||||||
"key": "shop",
|
{
|
||||||
"description": "Layer 'Shop' shows shop=convenience with a fixed text, namely 'Convenience store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
"key": "shop",
|
||||||
"value": "convenience"
|
"description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "shop",
|
"key": "shop",
|
||||||
"description": "Layer 'Shop' shows shop=supermarket with a fixed text, namely 'Supermarket' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
"description": "Layer 'Shop' shows shop=convenience with a fixed text, namely 'Convenience store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
||||||
"value": "supermarket"
|
"value": "convenience"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "shop",
|
"key": "shop",
|
||||||
"description": "Layer 'Shop' shows shop=clothes with a fixed text, namely 'Clothing store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
"description": "Layer 'Shop' shows shop=supermarket with a fixed text, namely 'Supermarket' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
||||||
"value": "clothes"
|
"value": "supermarket"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "shop",
|
"key": "shop",
|
||||||
"description": "Layer 'Shop' shows shop=hairdresser with a fixed text, namely 'Hairdresser' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
"description": "Layer 'Shop' shows shop=clothes with a fixed text, namely 'Clothing store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
||||||
"value": "hairdresser"
|
"value": "clothes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "shop",
|
"key": "shop",
|
||||||
"description": "Layer 'Shop' shows shop=bakery with a fixed text, namely 'Bakery' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
"description": "Layer 'Shop' shows shop=hairdresser with a fixed text, namely 'Hairdresser' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
||||||
"value": "bakery"
|
"value": "hairdresser"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "shop",
|
"key": "shop",
|
||||||
"description": "Layer 'Shop' shows shop=car_repair with a fixed text, namely 'Car repair (garage)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
"description": "Layer 'Shop' shows shop=bakery with a fixed text, namely 'Bakery' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
||||||
"value": "car_repair"
|
"value": "bakery"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "shop",
|
"key": "shop",
|
||||||
"description": "Layer 'Shop' shows shop=car with a fixed text, namely 'Car dealer' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
"description": "Layer 'Shop' shows shop=car_repair with a fixed text, namely 'Car repair (garage)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
||||||
"value": "car"
|
"value": "car_repair"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "phone",
|
"key": "shop",
|
||||||
"description": "Layer 'Shop' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
"description": "Layer 'Shop' shows shop=car with a fixed text, namely 'Car dealer' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
|
||||||
},
|
"value": "car"
|
||||||
{
|
},
|
||||||
"key": "website",
|
{
|
||||||
"description": "Layer 'Shop' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
"key": "phone",
|
||||||
},
|
"description": "Layer 'Shop' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
||||||
{
|
},
|
||||||
"key": "email",
|
{
|
||||||
"description": "Layer 'Shop' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
"key": "website",
|
||||||
},
|
"description": "Layer 'Shop' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
||||||
{
|
},
|
||||||
"key": "opening_hours",
|
{
|
||||||
"description": "Layer 'Shop' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
"key": "email",
|
||||||
}
|
"description": "Layer 'Shop' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"key": "opening_hours",
|
||||||
|
"description": "Layer 'Shop' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Open Shop Map')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,160 +1,160 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Sport pitches",
|
"name": "MapComplete Sport pitches",
|
||||||
"description": "A map showing sport pitches",
|
"description": "A map showing sport pitches",
|
||||||
"project_url": "https://mapcomplete.osm.be/sport_pitches",
|
"project_url": "https://mapcomplete.osm.be/sport_pitches",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/layers/sport_pitch/table_tennis.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/layers/sport_pitch/table_tennis.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, ",
|
"contact_name": "Pieter Vander Vennet, ",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "leisure",
|
|
||||||
"description": "The MapComplete theme Sport pitches has a layer Sport pitches showing features with this tag",
|
|
||||||
"value": "pitch"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Sport pitches 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": "leisure",
|
||||||
},
|
"description": "The MapComplete theme Sport pitches has a layer Sport pitches showing features with this tag",
|
||||||
{
|
"value": "pitch"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Sport pitches 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": "image",
|
||||||
{
|
"description": "The layer 'Sport pitches 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 'Sport pitches 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 'Sport pitches 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 'Sport pitches 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 'Sport pitches 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": "sport",
|
},
|
||||||
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'sport' (in the MapComplete.osm.be theme 'Sport pitches')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Sport pitches 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": "sport",
|
},
|
||||||
"description": "Layer 'Sport pitches' shows sport=basketball with a fixed text, namely 'Basketball is played here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
{
|
||||||
"value": "basketball"
|
"key": "sport",
|
||||||
},
|
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'sport' (in the MapComplete.osm.be theme 'Sport pitches')"
|
||||||
{
|
},
|
||||||
"key": "sport",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows sport=soccer with a fixed text, namely 'Soccer is played here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "sport",
|
||||||
"value": "soccer"
|
"description": "Layer 'Sport pitches' shows sport=basketball with a fixed text, namely 'Basketball is played here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "basketball"
|
||||||
{
|
},
|
||||||
"key": "sport",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows sport=table_tennis with a fixed text, namely 'This is a pingpong table' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "sport",
|
||||||
"value": "table_tennis"
|
"description": "Layer 'Sport pitches' shows sport=soccer with a fixed text, namely 'Soccer is played here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "soccer"
|
||||||
{
|
},
|
||||||
"key": "sport",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows sport=tennis with a fixed text, namely 'Tennis is played here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "sport",
|
||||||
"value": "tennis"
|
"description": "Layer 'Sport pitches' shows sport=table_tennis with a fixed text, namely 'This is a pingpong table' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "table_tennis"
|
||||||
{
|
},
|
||||||
"key": "sport",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows sport=korfball with a fixed text, namely 'Korfball is played here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "sport",
|
||||||
"value": "korfball"
|
"description": "Layer 'Sport pitches' shows sport=tennis with a fixed text, namely 'Tennis is played here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "tennis"
|
||||||
{
|
},
|
||||||
"key": "sport",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows sport=basket with a fixed text, namely 'Basketball is played here' (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "sport",
|
||||||
"value": "basket"
|
"description": "Layer 'Sport pitches' shows sport=korfball with a fixed text, namely 'Korfball is played here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "korfball"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'surface' (in the MapComplete.osm.be theme 'Sport pitches')"
|
"key": "sport",
|
||||||
},
|
"description": "Layer 'Sport pitches' shows sport=basket with a fixed text, namely 'Basketball is played here' (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
{
|
"value": "basket"
|
||||||
"key": "surface",
|
},
|
||||||
"description": "Layer 'Sport pitches' shows surface=grass with a fixed text, namely 'The surface is <b>grass</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
{
|
||||||
"value": "grass"
|
"key": "surface",
|
||||||
},
|
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'surface' (in the MapComplete.osm.be theme 'Sport pitches')"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows surface=sand with a fixed text, namely 'The surface is <b>sand</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "surface",
|
||||||
"value": "sand"
|
"description": "Layer 'Sport pitches' shows surface=grass with a fixed text, namely 'The surface is <b>grass</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "grass"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows surface=paving_stones with a fixed text, namely 'The surface is <b>paving stones</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "surface",
|
||||||
"value": "paving_stones"
|
"description": "Layer 'Sport pitches' shows surface=sand with a fixed text, namely 'The surface is <b>sand</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "sand"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows surface=asphalt with a fixed text, namely 'The surface is <b>asphalt</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "surface",
|
||||||
"value": "asphalt"
|
"description": "Layer 'Sport pitches' shows surface=paving_stones with a fixed text, namely 'The surface is <b>paving stones</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "paving_stones"
|
||||||
{
|
},
|
||||||
"key": "surface",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows surface=concrete with a fixed text, namely 'The surface is <b>concrete</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "surface",
|
||||||
"value": "concrete"
|
"description": "Layer 'Sport pitches' shows surface=asphalt with a fixed text, namely 'The surface is <b>asphalt</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "asphalt"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows access=public with a fixed text, namely 'Public access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "surface",
|
||||||
"value": "public"
|
"description": "Layer 'Sport pitches' shows surface=concrete with a fixed text, namely 'The surface is <b>concrete</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "concrete"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows access=limited with a fixed text, namely 'Limited access (e.g. only with an appointment, during certain hours, ...)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "access",
|
||||||
"value": "limited"
|
"description": "Layer 'Sport pitches' shows access=public with a fixed text, namely 'Public access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "public"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows access=members with a fixed text, namely 'Only accessible for members of the club' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "access",
|
||||||
"value": "members"
|
"description": "Layer 'Sport pitches' shows access=limited with a fixed text, namely 'Limited access (e.g. only with an appointment, during certain hours, ...)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "limited"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows access=private with a fixed text, namely 'Private - not accessible to the public' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "access",
|
||||||
"value": "private"
|
"description": "Layer 'Sport pitches' shows access=members with a fixed text, namely 'Only accessible for members of the club' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "members"
|
||||||
{
|
},
|
||||||
"key": "reservation",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows reservation=required with a fixed text, namely 'Making an appointment is obligatory to use this sport pitch' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "access",
|
||||||
"value": "required"
|
"description": "Layer 'Sport pitches' shows access=private with a fixed text, namely 'Private - not accessible to the public' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "private"
|
||||||
{
|
},
|
||||||
"key": "reservation",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows reservation=recommended with a fixed text, namely 'Making an appointment is recommended when using this sport pitch' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "reservation",
|
||||||
"value": "recommended"
|
"description": "Layer 'Sport pitches' shows reservation=required with a fixed text, namely 'Making an appointment is obligatory to use this sport pitch' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "required"
|
||||||
{
|
},
|
||||||
"key": "reservation",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows reservation=yes with a fixed text, namely 'Making an appointment is possible, but not necessary to use this sport pitch' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "reservation",
|
||||||
"value": "yes"
|
"description": "Layer 'Sport pitches' shows reservation=recommended with a fixed text, namely 'Making an appointment is recommended when using this sport pitch' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "recommended"
|
||||||
{
|
},
|
||||||
"key": "reservation",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows reservation=no with a fixed text, namely 'Making an appointment is not possible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "reservation",
|
||||||
"value": "no"
|
"description": "Layer 'Sport pitches' shows reservation=yes with a fixed text, namely 'Making an appointment is possible, but not necessary to use this sport pitch' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "phone",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Sport pitches')"
|
"key": "reservation",
|
||||||
},
|
"description": "Layer 'Sport pitches' shows reservation=no with a fixed text, namely 'Making an appointment is not possible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "email",
|
},
|
||||||
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Sport pitches')"
|
{
|
||||||
},
|
"key": "phone",
|
||||||
{
|
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Sport pitches')"
|
||||||
"key": "opening_hours",
|
},
|
||||||
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Sport pitches')"
|
{
|
||||||
},
|
"key": "email",
|
||||||
{
|
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Sport pitches')"
|
||||||
"key": "opening_hours",
|
},
|
||||||
"description": "Layer 'Sport pitches' shows opening_hours= with a fixed text, namely '24/7 toegankelijk' (in the MapComplete.osm.be theme 'Sport pitches') Picking this answer will delete the key opening_hours.",
|
{
|
||||||
"value": ""
|
"key": "opening_hours",
|
||||||
},
|
"description": "Layer 'Sport pitches' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Sport pitches')"
|
||||||
{
|
},
|
||||||
"key": "opening_hours",
|
{
|
||||||
"description": "Layer 'Sport pitches' shows opening_hours=24/7 with a fixed text, namely 'Always accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
"key": "opening_hours",
|
||||||
"value": "24/7"
|
"description": "Layer 'Sport pitches' shows opening_hours= with a fixed text, namely '24/7 toegankelijk' (in the MapComplete.osm.be theme 'Sport pitches') Picking this answer will delete the key opening_hours.",
|
||||||
}
|
"value": ""
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"key": "opening_hours",
|
||||||
|
"description": "Layer 'Sport pitches' shows opening_hours=24/7 with a fixed text, namely 'Always accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Sport pitches')",
|
||||||
|
"value": "24/7"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,177 +1,177 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Surveillance under Surveillance",
|
"name": "MapComplete Surveillance under Surveillance",
|
||||||
"description": "Surveillance cameras and other means of surveillance",
|
"description": "Surveillance cameras and other means of surveillance",
|
||||||
"project_url": "https://mapcomplete.osm.be/surveillance",
|
"project_url": "https://mapcomplete.osm.be/surveillance",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/surveillance/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/surveillance/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, ",
|
"contact_name": "Pieter Vander Vennet, ",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "camera:direction",
|
|
||||||
"description": "The MapComplete theme Surveillance under Surveillance has a layer Direction visualization showing features with this tag"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "direction",
|
{
|
||||||
"description": "The MapComplete theme Surveillance under Surveillance has a layer Direction visualization showing features with this tag"
|
"key": "camera:direction",
|
||||||
},
|
"description": "The MapComplete theme Surveillance under Surveillance has a layer Direction visualization showing features with this tag"
|
||||||
{
|
},
|
||||||
"key": "man_made",
|
{
|
||||||
"description": "The MapComplete theme Surveillance under Surveillance has a layer Surveillance camera's showing features with this tag",
|
"key": "direction",
|
||||||
"value": "surveillance"
|
"description": "The MapComplete theme Surveillance under Surveillance has a layer Direction visualization showing features with this tag"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance:type",
|
"key": "man_made",
|
||||||
"description": "The MapComplete theme Surveillance under Surveillance has a layer Surveillance camera's showing features with this tag",
|
"description": "The MapComplete theme Surveillance under Surveillance has a layer Surveillance camera's showing features with this tag",
|
||||||
"value": "camera"
|
"value": "surveillance"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance:type",
|
"key": "surveillance:type",
|
||||||
"description": "The MapComplete theme Surveillance under Surveillance has a layer Surveillance camera's showing features with this tag",
|
"description": "The MapComplete theme Surveillance under Surveillance has a layer Surveillance camera's showing features with this tag",
|
||||||
"value": "ALPR"
|
"value": "camera"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance:type",
|
"key": "surveillance:type",
|
||||||
"description": "The MapComplete theme Surveillance under Surveillance has a layer Surveillance camera's showing features with this tag",
|
"description": "The MapComplete theme Surveillance under Surveillance has a layer Surveillance camera's showing features with this tag",
|
||||||
"value": "ANPR"
|
"value": "ALPR"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "image",
|
"key": "surveillance:type",
|
||||||
"description": "The layer 'Surveillance camera's 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 MapComplete theme Surveillance under Surveillance has a layer Surveillance camera's showing features with this tag",
|
||||||
},
|
"value": "ANPR"
|
||||||
{
|
},
|
||||||
"key": "mapillary",
|
{
|
||||||
"description": "The layer 'Surveillance camera's 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": "image",
|
||||||
},
|
"description": "The layer 'Surveillance camera's 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 'Surveillance camera's 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 'Surveillance camera's 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 'Surveillance camera's 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 'Surveillance camera's 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": "camera:type",
|
{
|
||||||
"description": "Layer 'Surveillance camera's' shows camera:type=fixed with a fixed text, namely 'A fixed (non-moving) camera' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"key": "wikipedia",
|
||||||
"value": "fixed"
|
"description": "The layer 'Surveillance camera's 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": "camera:type",
|
"key": "camera:type",
|
||||||
"description": "Layer 'Surveillance camera's' shows camera:type=dome with a fixed text, namely 'A dome camera (which can turn)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows camera:type=fixed with a fixed text, namely 'A fixed (non-moving) camera' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "dome"
|
"value": "fixed"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "camera:type",
|
"key": "camera:type",
|
||||||
"description": "Layer 'Surveillance camera's' shows camera:type=panning with a fixed text, namely 'A panning camera' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows camera:type=dome with a fixed text, namely 'A dome camera (which can turn)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "panning"
|
"value": "dome"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "camera:direction",
|
"key": "camera:type",
|
||||||
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'camera:direction' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
"description": "Layer 'Surveillance camera's' shows camera:type=panning with a fixed text, namely 'A panning camera' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
},
|
"value": "panning"
|
||||||
{
|
},
|
||||||
"key": "camera:direction",
|
{
|
||||||
"description": "Layer 'Surveillance camera's' shows camera:direction=&direction~^..*$ with a fixed text, namely 'Films to a compass heading of {direction}' (in the MapComplete.osm.be theme 'Surveillance under Surveillance') Picking this answer will delete the key camera:direction.",
|
"key": "camera:direction",
|
||||||
"value": ""
|
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'camera:direction' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "direction",
|
"key": "camera:direction",
|
||||||
"description": "Layer 'Surveillance camera's' shows camera:direction=&direction~^..*$ with a fixed text, namely 'Films to a compass heading of {direction}' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
"description": "Layer 'Surveillance camera's' shows camera:direction=&direction~^..*$ with a fixed text, namely 'Films to a compass heading of {direction}' (in the MapComplete.osm.be theme 'Surveillance under Surveillance') Picking this answer will delete the key camera:direction.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "operator",
|
{
|
||||||
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
"key": "direction",
|
||||||
},
|
"description": "Layer 'Surveillance camera's' shows camera:direction=&direction~^..*$ with a fixed text, namely 'Films to a compass heading of {direction}' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
||||||
{
|
},
|
||||||
"key": "surveillance",
|
{
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance=public with a fixed text, namely 'A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel,...' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"key": "operator",
|
||||||
"value": "public"
|
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance",
|
"key": "surveillance",
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance=outdoor with a fixed text, namely 'An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, ...)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows surveillance=public with a fixed text, namely 'A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel,...' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "outdoor"
|
"value": "public"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance",
|
"key": "surveillance",
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance=indoor with a fixed text, namely 'A private indoor area is surveilled, e.g. a shop, a private underground parking, ...' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows surveillance=outdoor with a fixed text, namely 'An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, ...)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "indoor"
|
"value": "outdoor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "indoor",
|
"key": "surveillance",
|
||||||
"description": "Layer 'Surveillance camera's' shows indoor=yes with a fixed text, namely 'This camera is located indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows surveillance=indoor with a fixed text, namely 'A private indoor area is surveilled, e.g. a shop, a private underground parking, ...' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "yes"
|
"value": "indoor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "indoor",
|
"key": "indoor",
|
||||||
"description": "Layer 'Surveillance camera's' shows indoor=no with a fixed text, namely 'This camera is located outdoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows indoor=yes with a fixed text, namely 'This camera is located indoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "no"
|
"value": "yes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "indoor",
|
"key": "indoor",
|
||||||
"description": "Layer 'Surveillance camera's' shows indoor= with a fixed text, namely 'This camera is probably located outdoors' (in the MapComplete.osm.be theme 'Surveillance under Surveillance') Picking this answer will delete the key indoor.",
|
"description": "Layer 'Surveillance camera's' shows indoor=no with a fixed text, namely 'This camera is located outdoors' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": ""
|
"value": "no"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "level",
|
"key": "indoor",
|
||||||
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'level' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
"description": "Layer 'Surveillance camera's' shows indoor= with a fixed text, namely 'This camera is probably located outdoors' (in the MapComplete.osm.be theme 'Surveillance under Surveillance') Picking this answer will delete the key indoor.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "surveillance:zone",
|
{
|
||||||
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'surveillance:zone' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
"key": "level",
|
||||||
},
|
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'level' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
||||||
{
|
},
|
||||||
"key": "surveillance:zone",
|
{
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance:zone=parking with a fixed text, namely 'Surveills a parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"key": "surveillance:zone",
|
||||||
"value": "parking"
|
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'surveillance:zone' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance:zone",
|
"key": "surveillance:zone",
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance:zone=traffic with a fixed text, namely 'Surveills the traffic' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows surveillance:zone=parking with a fixed text, namely 'Surveills a parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "traffic"
|
"value": "parking"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance:zone",
|
"key": "surveillance:zone",
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance:zone=entrance with a fixed text, namely 'Surveills an entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows surveillance:zone=traffic with a fixed text, namely 'Surveills the traffic' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "entrance"
|
"value": "traffic"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance:zone",
|
"key": "surveillance:zone",
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance:zone=corridor with a fixed text, namely 'Surveills a corridor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows surveillance:zone=entrance with a fixed text, namely 'Surveills an entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "corridor"
|
"value": "entrance"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance:zone",
|
"key": "surveillance:zone",
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance:zone=public_transport_platform with a fixed text, namely 'Surveills a public tranport platform' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows surveillance:zone=corridor with a fixed text, namely 'Surveills a corridor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "public_transport_platform"
|
"value": "corridor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "surveillance:zone",
|
"key": "surveillance:zone",
|
||||||
"description": "Layer 'Surveillance camera's' shows surveillance:zone=shop with a fixed text, namely 'Surveills a shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows surveillance:zone=public_transport_platform with a fixed text, namely 'Surveills a public tranport platform' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "shop"
|
"value": "public_transport_platform"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "camera:mount",
|
"key": "surveillance:zone",
|
||||||
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'camera:mount' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
"description": "Layer 'Surveillance camera's' shows surveillance:zone=shop with a fixed text, namely 'Surveills a shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
},
|
"value": "shop"
|
||||||
{
|
},
|
||||||
"key": "camera:mount",
|
{
|
||||||
"description": "Layer 'Surveillance camera's' shows camera:mount=wall with a fixed text, namely 'This camera is placed against a wall' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"key": "camera:mount",
|
||||||
"value": "wall"
|
"description": "Layer 'Surveillance camera's' shows and asks freeform values for key 'camera:mount' (in the MapComplete.osm.be theme 'Surveillance under Surveillance')"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "camera:mount",
|
"key": "camera:mount",
|
||||||
"description": "Layer 'Surveillance camera's' shows camera:mount=pole with a fixed text, namely 'This camera is placed one a pole' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows camera:mount=wall with a fixed text, namely 'This camera is placed against a wall' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "pole"
|
"value": "wall"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "camera:mount",
|
"key": "camera:mount",
|
||||||
"description": "Layer 'Surveillance camera's' shows camera:mount=ceiling with a fixed text, namely 'This camera is placed on the ceiling' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
"description": "Layer 'Surveillance camera's' shows camera:mount=pole with a fixed text, namely 'This camera is placed one a pole' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
"value": "ceiling"
|
"value": "pole"
|
||||||
}
|
},
|
||||||
]
|
{
|
||||||
|
"key": "camera:mount",
|
||||||
|
"description": "Layer 'Surveillance camera's' shows camera:mount=ceiling with a fixed text, namely 'This camera is placed on the ceiling' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Surveillance under Surveillance')",
|
||||||
|
"value": "ceiling"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,137 +1,137 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Open Toilet Map",
|
"name": "MapComplete Open Toilet Map",
|
||||||
"description": "A map of public toilets",
|
"description": "A map of public toilets",
|
||||||
"project_url": "https://mapcomplete.osm.be/toilets",
|
"project_url": "https://mapcomplete.osm.be/toilets",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/toilets/toilets.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/toilets/toilets.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, MapComplete",
|
"contact_name": "Pieter Vander Vennet, MapComplete",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "amenity",
|
|
||||||
"description": "The MapComplete theme Open Toilet Map has a layer Toilets showing features with this tag",
|
|
||||||
"value": "toilets"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Toilets 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": "amenity",
|
||||||
},
|
"description": "The MapComplete theme Open Toilet Map has a layer Toilets showing features with this tag",
|
||||||
{
|
"value": "toilets"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Toilets 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": "image",
|
||||||
{
|
"description": "The layer 'Toilets 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 'Toilets 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 'Toilets 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 'Toilets 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 'Toilets 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": "access",
|
},
|
||||||
"description": "Layer 'Toilets' shows and asks freeform values for key 'access' (in the MapComplete.osm.be theme 'Open Toilet Map')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Toilets 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": "access",
|
},
|
||||||
"description": "Layer 'Toilets' shows access=yes with a fixed text, namely 'Public access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
{
|
||||||
"value": "yes"
|
"key": "access",
|
||||||
},
|
"description": "Layer 'Toilets' shows and asks freeform values for key 'access' (in the MapComplete.osm.be theme 'Open Toilet Map')"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Toilets' shows access=customers with a fixed text, namely 'Only access to customers' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "access",
|
||||||
"value": "customers"
|
"description": "Layer 'Toilets' shows access=yes with a fixed text, namely 'Public access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Toilets' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "access",
|
||||||
"value": "no"
|
"description": "Layer 'Toilets' shows access=customers with a fixed text, namely 'Only access to customers' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "customers"
|
||||||
{
|
},
|
||||||
"key": "access",
|
{
|
||||||
"description": "Layer 'Toilets' shows access=key with a fixed text, namely 'Accessible, but one has to ask a key to enter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "access",
|
||||||
"value": "key"
|
"description": "Layer 'Toilets' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'Toilets' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "access",
|
||||||
"value": "yes"
|
"description": "Layer 'Toilets' shows access=key with a fixed text, namely 'Accessible, but one has to ask a key to enter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "key"
|
||||||
{
|
},
|
||||||
"key": "fee",
|
{
|
||||||
"description": "Layer 'Toilets' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "fee",
|
||||||
"value": "no"
|
"description": "Layer 'Toilets' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "charge",
|
{
|
||||||
"description": "Layer 'Toilets' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Open Toilet Map')"
|
"key": "fee",
|
||||||
},
|
"description": "Layer 'Toilets' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "wheelchair",
|
},
|
||||||
"description": "Layer 'Toilets' shows wheelchair=yes with a fixed text, namely 'There is a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
{
|
||||||
"value": "yes"
|
"key": "charge",
|
||||||
},
|
"description": "Layer 'Toilets' shows and asks freeform values for key 'charge' (in the MapComplete.osm.be theme 'Open Toilet Map')"
|
||||||
{
|
},
|
||||||
"key": "wheelchair",
|
{
|
||||||
"description": "Layer 'Toilets' shows wheelchair=no with a fixed text, namely 'No wheelchair access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "wheelchair",
|
||||||
"value": "no"
|
"description": "Layer 'Toilets' shows wheelchair=yes with a fixed text, namely 'There is a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "toilets:position",
|
{
|
||||||
"description": "Layer 'Toilets' shows toilets:position=seated with a fixed text, namely 'There are only seated toilets' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "wheelchair",
|
||||||
"value": "seated"
|
"description": "Layer 'Toilets' shows wheelchair=no with a fixed text, namely 'No wheelchair access' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "toilets:position",
|
{
|
||||||
"description": "Layer 'Toilets' shows toilets:position=urinal with a fixed text, namely 'There are only urinals here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "toilets:position",
|
||||||
"value": "urinal"
|
"description": "Layer 'Toilets' shows toilets:position=seated with a fixed text, namely 'There are only seated toilets' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "seated"
|
||||||
{
|
},
|
||||||
"key": "toilets:position",
|
{
|
||||||
"description": "Layer 'Toilets' shows toilets:position=squat with a fixed text, namely 'There are only squat toilets here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "toilets:position",
|
||||||
"value": "squat"
|
"description": "Layer 'Toilets' shows toilets:position=urinal with a fixed text, namely 'There are only urinals here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "urinal"
|
||||||
{
|
},
|
||||||
"key": "toilets:position",
|
{
|
||||||
"description": "Layer 'Toilets' shows toilets:position=seated;urinal with a fixed text, namely 'Both seated toilets and urinals are available here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "toilets:position",
|
||||||
"value": "seated;urinal"
|
"description": "Layer 'Toilets' shows toilets:position=squat with a fixed text, namely 'There are only squat toilets here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "squat"
|
||||||
{
|
},
|
||||||
"key": "changing_table",
|
{
|
||||||
"description": "Layer 'Toilets' shows changing_table=yes with a fixed text, namely 'A changing table is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "toilets:position",
|
||||||
"value": "yes"
|
"description": "Layer 'Toilets' shows toilets:position=seated;urinal with a fixed text, namely 'Both seated toilets and urinals are available here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "seated;urinal"
|
||||||
{
|
},
|
||||||
"key": "changing_table",
|
{
|
||||||
"description": "Layer 'Toilets' shows changing_table=no with a fixed text, namely 'No changing table is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "changing_table",
|
||||||
"value": "no"
|
"description": "Layer 'Toilets' shows changing_table=yes with a fixed text, namely 'A changing table is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "changing_table:location",
|
{
|
||||||
"description": "Layer 'Toilets' shows and asks freeform values for key 'changing_table:location' (in the MapComplete.osm.be theme 'Open Toilet Map')"
|
"key": "changing_table",
|
||||||
},
|
"description": "Layer 'Toilets' shows changing_table=no with a fixed text, namely 'No changing table is available' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
{
|
"value": "no"
|
||||||
"key": "changing_table:location",
|
},
|
||||||
"description": "Layer 'Toilets' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
{
|
||||||
"value": "female_toilet"
|
"key": "changing_table:location",
|
||||||
},
|
"description": "Layer 'Toilets' shows and asks freeform values for key 'changing_table:location' (in the MapComplete.osm.be theme 'Open Toilet Map')"
|
||||||
{
|
},
|
||||||
"key": "changing_table:location",
|
{
|
||||||
"description": "Layer 'Toilets' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "changing_table:location",
|
||||||
"value": "male_toilet"
|
"description": "Layer 'Toilets' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "female_toilet"
|
||||||
{
|
},
|
||||||
"key": "changing_table:location",
|
{
|
||||||
"description": "Layer 'Toilets' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
"key": "changing_table:location",
|
||||||
"value": "wheelchair_toilet"
|
"description": "Layer 'Toilets' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
},
|
"value": "male_toilet"
|
||||||
{
|
},
|
||||||
"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')",
|
"key": "changing_table:location",
|
||||||
"value": "dedicated_room"
|
"description": "Layer 'Toilets' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Toilet Map')",
|
||||||
}
|
"value": "wheelchair_toilet"
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,170 +1,170 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Trees",
|
"name": "MapComplete Trees",
|
||||||
"description": "Map all the trees",
|
"description": "Map all the trees",
|
||||||
"project_url": "https://mapcomplete.osm.be/trees",
|
"project_url": "https://mapcomplete.osm.be/trees",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/trees/logo.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/trees/logo.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, Midgard",
|
"contact_name": "Pieter Vander Vennet, Midgard",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
{
|
|
||||||
"key": "natural",
|
|
||||||
"description": "The MapComplete theme Trees has a layer Tree showing features with this tag",
|
|
||||||
"value": "tree"
|
|
||||||
},
|
},
|
||||||
{
|
"tags": [
|
||||||
"key": "image",
|
{
|
||||||
"description": "The layer 'Tree 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": "natural",
|
||||||
},
|
"description": "The MapComplete theme Trees has a layer Tree showing features with this tag",
|
||||||
{
|
"value": "tree"
|
||||||
"key": "mapillary",
|
},
|
||||||
"description": "The layer 'Tree 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": "image",
|
||||||
{
|
"description": "The layer 'Tree 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 'Tree 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 'Tree 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 'Tree 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 'Tree 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": "height",
|
},
|
||||||
"description": "Layer 'Tree' shows height~^^[0-9.]+$$ with a fixed text, namely 'Height: {height} m' (in the MapComplete.osm.be theme 'Trees')"
|
{
|
||||||
},
|
"key": "wikipedia",
|
||||||
{
|
"description": "The layer 'Tree 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": "leaf_type",
|
},
|
||||||
"description": "Layer 'Tree' shows leaf_type=broadleaved with a fixed text, namely '<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Broadleaved' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
{
|
||||||
"value": "broadleaved"
|
"key": "height",
|
||||||
},
|
"description": "Layer 'Tree' shows height~^^[0-9.]+$$ with a fixed text, namely 'Height: {height} m' (in the MapComplete.osm.be theme 'Trees')"
|
||||||
{
|
},
|
||||||
"key": "leaf_type",
|
{
|
||||||
"description": "Layer 'Tree' shows leaf_type=needleleaved with a fixed text, namely '<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Needleleaved' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "leaf_type",
|
||||||
"value": "needleleaved"
|
"description": "Layer 'Tree' shows leaf_type=broadleaved with a fixed text, namely '<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Broadleaved' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "broadleaved"
|
||||||
{
|
},
|
||||||
"key": "leaf_type",
|
{
|
||||||
"description": "Layer 'Tree' shows leaf_type=leafless with a fixed text, namely '<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Permanently leafless' (in the MapComplete.osm.be theme 'Trees')",
|
"key": "leaf_type",
|
||||||
"value": "leafless"
|
"description": "Layer 'Tree' shows leaf_type=needleleaved with a fixed text, namely '<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Needleleaved' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "needleleaved"
|
||||||
{
|
},
|
||||||
"key": "denotation",
|
{
|
||||||
"description": "Layer 'Tree' shows denotation=landmark with a fixed text, namely 'The tree is remarkable due to its size or prominent location. It is useful for navigation.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "leaf_type",
|
||||||
"value": "landmark"
|
"description": "Layer 'Tree' shows leaf_type=leafless with a fixed text, namely '<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Permanently leafless' (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "leafless"
|
||||||
{
|
},
|
||||||
"key": "denotation",
|
{
|
||||||
"description": "Layer 'Tree' shows denotation=natural_monument with a fixed text, namely 'The tree is a natural monument, e.g. because it is especially old, or of a valuable species.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "denotation",
|
||||||
"value": "natural_monument"
|
"description": "Layer 'Tree' shows denotation=landmark with a fixed text, namely 'The tree is remarkable due to its size or prominent location. It is useful for navigation.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "landmark"
|
||||||
{
|
},
|
||||||
"key": "denotation",
|
{
|
||||||
"description": "Layer 'Tree' shows denotation=agricultural with a fixed text, namely 'The tree is used for agricultural purposes, e.g. in an orchard.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "denotation",
|
||||||
"value": "agricultural"
|
"description": "Layer 'Tree' shows denotation=natural_monument with a fixed text, namely 'The tree is a natural monument, e.g. because it is especially old, or of a valuable species.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "natural_monument"
|
||||||
{
|
},
|
||||||
"key": "denotation",
|
{
|
||||||
"description": "Layer 'Tree' shows denotation=park with a fixed text, namely 'The tree is in a park or similar (cemetery, school grounds, …).' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "denotation",
|
||||||
"value": "park"
|
"description": "Layer 'Tree' shows denotation=agricultural with a fixed text, namely 'The tree is used for agricultural purposes, e.g. in an orchard.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "agricultural"
|
||||||
{
|
},
|
||||||
"key": "denotation",
|
{
|
||||||
"description": "Layer 'Tree' shows denotation=garden with a fixed text, namely 'The tree is a residential garden.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "denotation",
|
||||||
"value": "garden"
|
"description": "Layer 'Tree' shows denotation=park with a fixed text, namely 'The tree is in a park or similar (cemetery, school grounds, …).' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "park"
|
||||||
{
|
},
|
||||||
"key": "denotation",
|
{
|
||||||
"description": "Layer 'Tree' shows denotation=avenue with a fixed text, namely 'This is a tree along an avenue.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "denotation",
|
||||||
"value": "avenue"
|
"description": "Layer 'Tree' shows denotation=garden with a fixed text, namely 'The tree is a residential garden.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "garden"
|
||||||
{
|
},
|
||||||
"key": "denotation",
|
{
|
||||||
"description": "Layer 'Tree' shows denotation=urban with a fixed text, namely 'The tree is an urban area.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "denotation",
|
||||||
"value": "urban"
|
"description": "Layer 'Tree' shows denotation=avenue with a fixed text, namely 'This is a tree along an avenue.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "avenue"
|
||||||
{
|
},
|
||||||
"key": "denotation",
|
{
|
||||||
"description": "Layer 'Tree' shows denotation=none with a fixed text, namely 'The tree is outside of an urban area.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "denotation",
|
||||||
"value": "none"
|
"description": "Layer 'Tree' shows denotation=urban with a fixed text, namely 'The tree is an urban area.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "urban"
|
||||||
{
|
},
|
||||||
"key": "leaf_cycle",
|
{
|
||||||
"description": "Layer 'Tree' shows leaf_cycle=deciduous with a fixed text, namely 'Deciduous: the tree loses its leaves for some time of the year.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "denotation",
|
||||||
"value": "deciduous"
|
"description": "Layer 'Tree' shows denotation=none with a fixed text, namely 'The tree is outside of an urban area.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "none"
|
||||||
{
|
},
|
||||||
"key": "leaf_cycle",
|
{
|
||||||
"description": "Layer 'Tree' shows leaf_cycle=evergreen with a fixed text, namely 'Evergreen.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "leaf_cycle",
|
||||||
"value": "evergreen"
|
"description": "Layer 'Tree' shows leaf_cycle=deciduous with a fixed text, namely 'Deciduous: the tree loses its leaves for some time of the year.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "deciduous"
|
||||||
{
|
},
|
||||||
"key": "name",
|
{
|
||||||
"description": "Layer 'Tree' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Trees')"
|
"key": "leaf_cycle",
|
||||||
},
|
"description": "Layer 'Tree' shows leaf_cycle=evergreen with a fixed text, namely 'Evergreen.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
{
|
"value": "evergreen"
|
||||||
"key": "name",
|
},
|
||||||
"description": "Layer 'Tree' shows name=&noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees') Picking this answer will delete the key name.",
|
{
|
||||||
"value": ""
|
"key": "name",
|
||||||
},
|
"description": "Layer 'Tree' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Trees')"
|
||||||
{
|
},
|
||||||
"key": "noname",
|
{
|
||||||
"description": "Layer 'Tree' shows name=&noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "name",
|
||||||
"value": "yes"
|
"description": "Layer 'Tree' shows name=&noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees') Picking this answer will delete the key name.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "heritage",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage=4&heritage:operator=OnroerendErfgoed with a fixed text, namely '<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Registered as heritage by <i>Onroerend Erfgoed</i> Flanders' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "noname",
|
||||||
"value": "4"
|
"description": "Layer 'Tree' shows name=&noname=yes with a fixed text, namely 'The tree does not have a name.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "heritage:operator",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage=4&heritage:operator=OnroerendErfgoed with a fixed text, namely '<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Registered as heritage by <i>Onroerend Erfgoed</i> Flanders' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "heritage",
|
||||||
"value": "OnroerendErfgoed"
|
"description": "Layer 'Tree' shows heritage=4&heritage:operator=OnroerendErfgoed with a fixed text, namely '<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Registered as heritage by <i>Onroerend Erfgoed</i> Flanders' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "4"
|
||||||
{
|
},
|
||||||
"key": "heritage",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage=4&heritage:operator=aatl with a fixed text, namely 'Registered as heritage by <i>Direction du Patrimoine culturel</i> Brussels' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "heritage:operator",
|
||||||
"value": "4"
|
"description": "Layer 'Tree' shows heritage=4&heritage:operator=OnroerendErfgoed with a fixed text, namely '<img src=\"./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg\" style=\"width:0.85em;height:1em;vertical-align:middle\" alt=\"\"/> Registered as heritage by <i>Onroerend Erfgoed</i> Flanders' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "OnroerendErfgoed"
|
||||||
{
|
},
|
||||||
"key": "heritage:operator",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage=4&heritage:operator=aatl with a fixed text, namely 'Registered as heritage by <i>Direction du Patrimoine culturel</i> Brussels' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "heritage",
|
||||||
"value": "aatl"
|
"description": "Layer 'Tree' shows heritage=4&heritage:operator=aatl with a fixed text, namely 'Registered as heritage by <i>Direction du Patrimoine culturel</i> Brussels' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "4"
|
||||||
{
|
},
|
||||||
"key": "heritage",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage=yes&heritage:operator= with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "heritage:operator",
|
||||||
"value": "yes"
|
"description": "Layer 'Tree' shows heritage=4&heritage:operator=aatl with a fixed text, namely 'Registered as heritage by <i>Direction du Patrimoine culturel</i> Brussels' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "aatl"
|
||||||
{
|
},
|
||||||
"key": "heritage:operator",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage=yes&heritage:operator= with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees') Picking this answer will delete the key heritage:operator.",
|
"key": "heritage",
|
||||||
"value": ""
|
"description": "Layer 'Tree' shows heritage=yes&heritage:operator= with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "yes"
|
||||||
{
|
},
|
||||||
"key": "heritage",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage=no&heritage:operator= with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
"key": "heritage:operator",
|
||||||
"value": "no"
|
"description": "Layer 'Tree' shows heritage=yes&heritage:operator= with a fixed text, namely 'Registered as heritage by a different organisation' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees') Picking this answer will delete the key heritage:operator.",
|
||||||
},
|
"value": ""
|
||||||
{
|
},
|
||||||
"key": "heritage:operator",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage=no&heritage:operator= with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees') Picking this answer will delete the key heritage:operator.",
|
"key": "heritage",
|
||||||
"value": ""
|
"description": "Layer 'Tree' shows heritage=no&heritage:operator= with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees')",
|
||||||
},
|
"value": "no"
|
||||||
{
|
},
|
||||||
"key": "heritage",
|
{
|
||||||
"description": "Layer 'Tree' shows heritage~^..*$ with a fixed text, namely 'Registered as heritage by a different organisation' (in the MapComplete.osm.be theme 'Trees')"
|
"key": "heritage:operator",
|
||||||
},
|
"description": "Layer 'Tree' shows heritage=no&heritage:operator= with a fixed text, namely 'Not registered as heritage' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Trees') Picking this answer will delete the key heritage:operator.",
|
||||||
{
|
"value": ""
|
||||||
"key": "ref:OnroerendErfgoed",
|
},
|
||||||
"description": "Layer 'Tree' shows and asks freeform values for key 'ref:OnroerendErfgoed' (in the MapComplete.osm.be theme 'Trees')"
|
{
|
||||||
},
|
"key": "heritage",
|
||||||
{
|
"description": "Layer 'Tree' shows heritage~^..*$ with a fixed text, namely 'Registered as heritage by a different organisation' (in the MapComplete.osm.be theme 'Trees')"
|
||||||
"key": "wikidata",
|
},
|
||||||
"description": "Layer 'Tree' shows and asks freeform values for key 'wikidata' (in the MapComplete.osm.be theme 'Trees')"
|
{
|
||||||
}
|
"key": "ref:OnroerendErfgoed",
|
||||||
]
|
"description": "Layer 'Tree' shows and asks freeform values for key 'ref:OnroerendErfgoed' (in the MapComplete.osm.be theme 'Trees')"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "wikidata",
|
||||||
|
"description": "Layer 'Tree' shows and asks freeform values for key 'wikidata' (in the MapComplete.osm.be theme 'Trees')"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,19 +1,19 @@
|
||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"project": {
|
"project": {
|
||||||
"name": "MapComplete Waste Basket",
|
"name": "MapComplete Waste Basket",
|
||||||
"description": "A map with waste baskets",
|
"description": "A map with waste baskets",
|
||||||
"project_url": "https://mapcomplete.osm.be/waste_basket",
|
"project_url": "https://mapcomplete.osm.be/waste_basket",
|
||||||
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
|
||||||
"icon_url": "https://mapcomplete.osm.be/assets/themes/waste_basket/waste_basket.svg",
|
"icon_url": "https://mapcomplete.osm.be/assets/themes/waste_basket/waste_basket.svg",
|
||||||
"contact_name": "Pieter Vander Vennet, ",
|
"contact_name": "Pieter Vander Vennet, ",
|
||||||
"contact_email": "pietervdvn@posteo.net"
|
"contact_email": "pietervdvn@posteo.net"
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
{
|
{
|
||||||
"key": "amenity",
|
"key": "amenity",
|
||||||
"description": "The MapComplete theme Waste Basket has a layer Waste Basket showing features with this tag",
|
"description": "The MapComplete theme Waste Basket has a layer Waste Basket showing features with this tag",
|
||||||
"value": "waste_basket"
|
"value": "waste_basket"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -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
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Strict equality is denoted by `key=value`. This key matches __only if__ the keypair is present exactly as stated.
|
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 a different kind of tag specification is given, your theme will fail to parse.
|
||||||
|
|
||||||
### If key is not present
|
### 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
|
### 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
|
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
|
### 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
|
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.
|
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
|
||||||
These tags cannot be used to generate an answer nor can they be used to request data upstream from overpass.
|
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`.
|
Note that the value coming from OSM will first be stripped by removing all non-numeric characters. For
|
||||||
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).
|
example, `length=42 meter` will be interpreted as `length=42` and will thus match `length<=42` and `length>=42`. In
|
||||||
However, this can be partially alleviated by using 'Units' to rewrite to a default format.
|
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
|
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.
|
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**
|
**This is an advanced feature - use with caution**
|
||||||
|
|
||||||
Some tags are automatically set or calculated - see [CalculatedTags](CalculatedTags.md) for an entire overview.
|
Some tags are automatically set or calculated - see [CalculatedTags](CalculatedTags.md) for an entire overview. If one
|
||||||
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 `:=`.
|
wants to apply such a value as tag, use a substituting-tag such, for example`survey:date:={_date:now}`. Note that the
|
||||||
The text between `{` and `}` is interpreted as a key, and the respective value is substituted into the string.
|
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}`.
|
One can also append, e.g. `key:={some_key} fixed text {some_other_key}`.
|
||||||
|
|
||||||
An assigning tag _cannot_ be used to query OpenStreetMap/Overpass.
|
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.
|
If using a key or variable which might not be defined, add a condition in the mapping to hide the option. This is
|
||||||
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.
|
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:
|
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!
|
||||||
|
a. Where and how did it start? "This project isn't going anywhere"
|
||||||
1. What is MapComplete? Three slides
|
(buurtnatuur, cyclofix, Antwerpen, Natuurpunt, Oost-Vlaanderen?, Toerisme Vlaanderen?)
|
||||||
2. Already one year old!
|
b. Where are we now? Some cool statistics
|
||||||
a. Where and how did it start? "This project isn't going anywhere"
|
3. The vision a. Your granny can use it a. pragmatism - somewhat working today is better then something perfect tomorrow
|
||||||
(buurtnatuur, cyclofix, Antwerpen, Natuurpunt, Oost-Vlaanderen?, Toerisme Vlaanderen?)
|
a. It's a trap! Cool thematic map (as iframe on website) -> the OSM rabbit hole -> easy start -> more features when
|
||||||
b. Where are we now? Some cool statistics
|
mapping more -> oh, I can make a theme too!
|
||||||
3. The vision
|
b. The pareto frontier of 'easy to use' vs 'number of features' c. The thematic approach (+ disabling/enabling
|
||||||
a. Your granny can use it
|
features per theme/view)
|
||||||
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
|
4. The future a. paid projects? Microgrant for a better theme creator? b. user contributed themes (see you next talk!)
|
||||||
a. paid projects? Microgrant for a better theme creator?
|
5. OpenStreetMap is Cool!
|
||||||
b. user contributed themes (see you next talk!)
|
|
||||||
5. OpenStreetMap is Cool!
|
|
||||||
|
|
|
@ -216,12 +216,6 @@ function createGraph(
|
||||||
}
|
}
|
||||||
|
|
||||||
class Histogram<K> {
|
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>()
|
public counts: Map<K, number> = new Map<K, number>()
|
||||||
private sortAtEnd: K[] = []
|
private sortAtEnd: K[] = []
|
||||||
|
|
||||||
|
@ -230,6 +224,11 @@ class Histogram<K> {
|
||||||
keys?.forEach(key => self.bump(key))
|
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) {
|
public bump(key: K, increase = 1) {
|
||||||
if (this.counts.has(key)) {
|
if (this.counts.has(key)) {
|
||||||
|
@ -525,7 +524,7 @@ function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: st
|
||||||
.asPie({
|
.asPie({
|
||||||
name: "Changesets per host" + appliedFilterDescription
|
name: "Changesets per host" + appliedFilterDescription
|
||||||
}).render()
|
}).render()
|
||||||
|
|
||||||
new Histogram<string>(allFeatures.map(f => f.properties.metadata.theme))
|
new Histogram<string>(allFeatures.map(f => f.properties.metadata.theme))
|
||||||
.createOthersCategory("< 25 changesets", 25)
|
.createOthersCategory("< 25 changesets", 25)
|
||||||
.addCountToName()
|
.addCountToName()
|
||||||
|
@ -618,7 +617,7 @@ const geojson = {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
writeFileSync("centerpoints.geojson",JSON.stringify(geojson, undefined, 2) )
|
writeFileSync("centerpoints.geojson", JSON.stringify(geojson, undefined, 2))
|
||||||
|
|
||||||
|
|
||||||
createGraphs(allFeatures, "")
|
createGraphs(allFeatures, "")
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
URL-parameters and URL-hash
|
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.
|
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`,
|
For example, if the url is `https://mapcomplete.osm.be/cyclofix?lat=51.0&lon=4.3&z=5&test=true#node/1234`, the
|
||||||
the URL-parameters are stated in the part between the `?` and the `#`. There are multiple, all separated by `&`, namely:
|
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 `lat` is `51.0` in this instance
|
||||||
- The url-parameter `lon` is `4.3` in this instance
|
- The url-parameter `lon` is `4.3` in this instance
|
||||||
|
@ -19,141 +18,147 @@ 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.
|
Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case.
|
||||||
|
|
||||||
language
|
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.
|
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_
|
||||||
|
|
||||||
|
|
||||||
overpassUrl
|
overpassUrl
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter The default value is _https://overpass.kumi.de/api/interpreter_
|
Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter The default value
|
||||||
|
is _https://overpass.kumi.de/api/interpreter_
|
||||||
|
|
||||||
|
|
||||||
overpassTimeout
|
overpassTimeout
|
||||||
|
@ -161,31 +166,32 @@ overpassTimeout
|
||||||
|
|
||||||
Set a different timeout (in seconds) for queries in overpass The default value is _60_
|
Set a different timeout (in seconds) for queries in overpass The default value is _60_
|
||||||
|
|
||||||
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
|
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.
|
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.
|
|
@ -4,7 +4,6 @@ import Svg from "../../Svg";
|
||||||
import Img from "../../UI/Base/Img";
|
import Img from "../../UI/Base/Img";
|
||||||
import {LocalStorageSource} from "../Web/LocalStorageSource";
|
import {LocalStorageSource} from "../Web/LocalStorageSource";
|
||||||
import {VariableUiElement} from "../../UI/Base/VariableUIElement";
|
import {VariableUiElement} from "../../UI/Base/VariableUIElement";
|
||||||
import BaseUIElement from "../../UI/BaseUIElement";
|
|
||||||
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
||||||
import {QueryParameters} from "../Web/QueryParameters";
|
import {QueryParameters} from "../Web/QueryParameters";
|
||||||
|
|
||||||
|
@ -161,16 +160,16 @@ export default class GeoLocationHandler extends VariableUiElement {
|
||||||
} else {
|
} else {
|
||||||
lastClick.setData(new Date())
|
lastClick.setData(new Date())
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
lastClick.setData(new Date())
|
lastClick.setData(new Date())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.init(true, true);
|
self.init(true, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
const latLonGiven = QueryParameters.wasInitialized("lat") && QueryParameters.wasInitialized("lon")
|
const latLonGiven = QueryParameters.wasInitialized("lat") && QueryParameters.wasInitialized("lon")
|
||||||
|
|
||||||
this.init(false, !latLonGiven);
|
this.init(false, !latLonGiven);
|
||||||
|
|
||||||
isLocked.addCallbackAndRunD(isLocked => {
|
isLocked.addCallbackAndRunD(isLocked => {
|
||||||
|
@ -180,7 +179,7 @@ export default class GeoLocationHandler extends VariableUiElement {
|
||||||
leafletMap.data?.dragging?.enable()
|
leafletMap.data?.dragging?.enable()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
this._currentGPSLocation.addCallback((location) => {
|
this._currentGPSLocation.addCallback((location) => {
|
||||||
self._previousLocationGrant.setData("granted");
|
self._previousLocationGrant.setData("granted");
|
||||||
|
|
|
@ -6,7 +6,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
||||||
|
|
||||||
export default class InstalledThemes {
|
export default class InstalledThemes {
|
||||||
public installedThemes: UIEventSource<{ layout: LayoutConfig; definition: string }[]>;
|
public installedThemes: UIEventSource<{ layout: LayoutConfig; definition: string }[]>;
|
||||||
|
|
||||||
constructor(osmConnection: OsmConnection) {
|
constructor(osmConnection: OsmConnection) {
|
||||||
this.installedThemes = osmConnection.preferencesHandler.preferences.map<{ layout: LayoutConfig, definition: string }[]>(allPreferences => {
|
this.installedThemes = osmConnection.preferencesHandler.preferences.map<{ layout: LayoutConfig, definition: string }[]>(allPreferences => {
|
||||||
const installedThemes: { layout: LayoutConfig, definition: string }[] = [];
|
const installedThemes: { layout: LayoutConfig, definition: string }[] = [];
|
||||||
|
@ -25,10 +25,10 @@ export default class InstalledThemes {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
let layoutJson;
|
let layoutJson;
|
||||||
try{
|
try {
|
||||||
layoutJson = JSON.parse(atob(customLayout.data))
|
layoutJson = JSON.parse(atob(customLayout.data))
|
||||||
}catch(e){
|
} catch (e) {
|
||||||
layoutJson = JSON.parse( Utils.UnMinify(LZString.decompressFromBase64(customLayout.data)))
|
layoutJson = JSON.parse(Utils.UnMinify(LZString.decompressFromBase64(customLayout.data)))
|
||||||
}
|
}
|
||||||
const layout = new LayoutConfig(layoutJson, false);
|
const layout = new LayoutConfig(layoutJson, false);
|
||||||
installedThemes.push({
|
installedThemes.push({
|
||||||
|
@ -43,7 +43,7 @@ export default class InstalledThemes {
|
||||||
}
|
}
|
||||||
|
|
||||||
InstalledThemes.DeleteInvalid(osmConnection, invalidThemes);
|
InstalledThemes.DeleteInvalid(osmConnection, invalidThemes);
|
||||||
|
|
||||||
return installedThemes;
|
return installedThemes;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -7,13 +7,13 @@ import Loc from "../../Models/Loc";
|
||||||
* Sets the current background layer to a layer that is actually available
|
* Sets the current background layer to a layer that is actually available
|
||||||
*/
|
*/
|
||||||
export default class LayerResetter {
|
export default class LayerResetter {
|
||||||
|
|
||||||
constructor( currentBackgroundLayer: UIEventSource<BaseLayer>,
|
constructor(currentBackgroundLayer: UIEventSource<BaseLayer>,
|
||||||
location: UIEventSource<Loc>,
|
location: UIEventSource<Loc>,
|
||||||
availableLayers: UIEventSource<BaseLayer[]>,
|
availableLayers: UIEventSource<BaseLayer[]>,
|
||||||
defaultLayerId: UIEventSource<string> = undefined) {
|
defaultLayerId: UIEventSource<string> = undefined) {
|
||||||
defaultLayerId = defaultLayerId ?? new UIEventSource<string>(AvailableBaseLayers.osmCarto.id);
|
defaultLayerId = defaultLayerId ?? new UIEventSource<string>(AvailableBaseLayers.osmCarto.id);
|
||||||
|
|
||||||
// Change the baselayer back to OSM if we go out of the current range of the layer
|
// Change the baselayer back to OSM if we go out of the current range of the layer
|
||||||
availableLayers.addCallbackAndRun(availableLayers => {
|
availableLayers.addCallbackAndRun(availableLayers => {
|
||||||
let defaultLayer = undefined;
|
let defaultLayer = undefined;
|
||||||
|
@ -28,7 +28,7 @@ export default class LayerResetter {
|
||||||
if (availableLayer.min_zoom > location.data.zoom) {
|
if (availableLayer.min_zoom > location.data.zoom) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(availableLayer.id === defaultLayerId.data){
|
if (availableLayer.id === defaultLayerId.data) {
|
||||||
defaultLayer = availableLayer;
|
defaultLayer = availableLayer;
|
||||||
}
|
}
|
||||||
return; // All good - the current layer still works!
|
return; // All good - the current layer still works!
|
||||||
|
@ -38,7 +38,7 @@ export default class LayerResetter {
|
||||||
console.log("AvailableBaseLayers-actor: detected that the current bounds aren't sufficient anymore - reverting to OSM standard")
|
console.log("AvailableBaseLayers-actor: detected that the current bounds aren't sufficient anymore - reverting to OSM standard")
|
||||||
currentBackgroundLayer.setData(defaultLayer ?? AvailableBaseLayers.osmCarto);
|
currentBackgroundLayer.setData(defaultLayer ?? AvailableBaseLayers.osmCarto);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -13,7 +13,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
||||||
export default class OverpassFeatureSource implements FeatureSource {
|
export default class OverpassFeatureSource implements FeatureSource {
|
||||||
|
|
||||||
public readonly name = "OverpassFeatureSource"
|
public readonly name = "OverpassFeatureSource"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The last loaded features of the geojson
|
* The last loaded features of the geojson
|
||||||
*/
|
*/
|
||||||
|
@ -147,7 +147,7 @@ export default class OverpassFeatureSource implements FeatureSource {
|
||||||
}
|
}
|
||||||
|
|
||||||
const bounds = this._leafletMap.data?.getBounds();
|
const bounds = this._leafletMap.data?.getBounds();
|
||||||
if(bounds === undefined){
|
if (bounds === undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ export default class PendingChangesUploader {
|
||||||
|
|
||||||
|
|
||||||
function onunload(e) {
|
function onunload(e) {
|
||||||
if(changes.pendingChanges.data.length == 0){
|
if (changes.pendingChanges.data.length == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
changes.flushChanges("onbeforeunload - probably closing or something similar");
|
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.
|
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
|
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.
|
* Makes sure the hash shows the selected element and vice-versa.
|
||||||
*/
|
*/
|
||||||
export default class SelectedFeatureHandler {
|
export default class SelectedFeatureHandler {
|
||||||
|
private static readonly _no_trigger_on = ["welcome", "copyright", "layers", "new"]
|
||||||
private readonly _featureSource: FeatureSource;
|
private readonly _featureSource: FeatureSource;
|
||||||
private readonly _hash: UIEventSource<string>;
|
private readonly _hash: UIEventSource<string>;
|
||||||
private readonly _selectedFeature: UIEventSource<any>;
|
private readonly _selectedFeature: UIEventSource<any>;
|
||||||
|
|
||||||
private static readonly _no_trigger_on = ["welcome", "copyright", "layers", "new"]
|
|
||||||
private readonly _osmApiSource: OsmApiFeatureSource;
|
private readonly _osmApiSource: OsmApiFeatureSource;
|
||||||
|
|
||||||
constructor(hash: UIEventSource<string>,
|
constructor(hash: UIEventSource<string>,
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
import * as L from "leaflet";
|
import * as L from "leaflet";
|
||||||
import Svg from "../../Svg";
|
|
||||||
import {UIEventSource} from "../UIEventSource";
|
import {UIEventSource} from "../UIEventSource";
|
||||||
import Img from "../../UI/Base/Img";
|
|
||||||
import ScrollableFullScreen from "../../UI/Base/ScrollableFullScreen";
|
import ScrollableFullScreen from "../../UI/Base/ScrollableFullScreen";
|
||||||
import AddNewMarker from "../../UI/BigComponents/AddNewMarker";
|
import AddNewMarker from "../../UI/BigComponents/AddNewMarker";
|
||||||
import FilteredLayer from "../../Models/FilteredLayer";
|
import FilteredLayer from "../../Models/FilteredLayer";
|
||||||
|
@ -32,28 +30,28 @@ export default class StrayClickHandler {
|
||||||
})
|
})
|
||||||
|
|
||||||
lastClickLocation.addCallback(function (lastClick) {
|
lastClickLocation.addCallback(function (lastClick) {
|
||||||
|
|
||||||
if (self._lastMarker !== undefined) {
|
if (self._lastMarker !== undefined) {
|
||||||
leafletMap.data?.removeLayer(self._lastMarker);
|
leafletMap.data?.removeLayer(self._lastMarker);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lastClick === undefined){
|
if (lastClick === undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedElement.setData(undefined);
|
selectedElement.setData(undefined);
|
||||||
const clickCoor : [number, number] = [lastClick.lat, lastClick.lon]
|
const clickCoor: [number, number] = [lastClick.lat, lastClick.lon]
|
||||||
self._lastMarker = L.marker(clickCoor, {
|
self._lastMarker = L.marker(clickCoor, {
|
||||||
icon: L.divIcon({
|
icon: L.divIcon({
|
||||||
html: new AddNewMarker(filteredLayers).ConstructElement(),
|
html: new AddNewMarker(filteredLayers).ConstructElement(),
|
||||||
iconSize: [50, 50],
|
iconSize: [50, 50],
|
||||||
iconAnchor: [25, 50],
|
iconAnchor: [25, 50],
|
||||||
popupAnchor: [0, -45]
|
popupAnchor: [0, -45]
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
const popup = L.popup({
|
const popup = L.popup({
|
||||||
autoPan: true,
|
autoPan: true,
|
||||||
autoPanPaddingTopLeft: [15,15],
|
autoPanPaddingTopLeft: [15, 15],
|
||||||
closeOnEscapeKey: true,
|
closeOnEscapeKey: true,
|
||||||
autoClose: true
|
autoClose: true
|
||||||
}).setContent("<div id='strayclick' style='height: 65vh'></div>");
|
}).setContent("<div id='strayclick' style='height: 65vh'></div>");
|
||||||
|
@ -61,13 +59,13 @@ export default class StrayClickHandler {
|
||||||
self._lastMarker.bindPopup(popup);
|
self._lastMarker.bindPopup(popup);
|
||||||
|
|
||||||
self._lastMarker.on("click", () => {
|
self._lastMarker.on("click", () => {
|
||||||
if(leafletMap.data.getZoom() < Constants.userJourney.minZoomLevelToAddNewPoints){
|
if (leafletMap.data.getZoom() < Constants.userJourney.minZoomLevelToAddNewPoints) {
|
||||||
self._lastMarker.closePopup()
|
self._lastMarker.closePopup()
|
||||||
leafletMap.data.flyTo(clickCoor, Constants.userJourney.minZoomLevelToAddNewPoints)
|
leafletMap.data.flyTo(clickCoor, Constants.userJourney.minZoomLevelToAddNewPoints)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uiToShow.AttachTo("strayclick")
|
uiToShow.AttachTo("strayclick")
|
||||||
uiToShow.Activate();
|
uiToShow.Activate();
|
||||||
});
|
});
|
||||||
|
|
|
@ -7,7 +7,7 @@ import Combine from "../../UI/Base/Combine";
|
||||||
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
||||||
|
|
||||||
class TitleElement extends UIEventSource<string> {
|
class TitleElement extends UIEventSource<string> {
|
||||||
|
|
||||||
private readonly _layoutToUse: UIEventSource<LayoutConfig>;
|
private readonly _layoutToUse: UIEventSource<LayoutConfig>;
|
||||||
private readonly _selectedFeature: UIEventSource<any>;
|
private readonly _selectedFeature: UIEventSource<any>;
|
||||||
private readonly _allElementsStorage: ElementStorage;
|
private readonly _allElementsStorage: ElementStorage;
|
||||||
|
@ -16,17 +16,17 @@ class TitleElement extends UIEventSource<string> {
|
||||||
selectedFeature: UIEventSource<any>,
|
selectedFeature: UIEventSource<any>,
|
||||||
allElementsStorage: ElementStorage) {
|
allElementsStorage: ElementStorage) {
|
||||||
super("MapComplete");
|
super("MapComplete");
|
||||||
|
|
||||||
this._layoutToUse = layoutToUse;
|
this._layoutToUse = layoutToUse;
|
||||||
this._selectedFeature = selectedFeature;
|
this._selectedFeature = selectedFeature;
|
||||||
this._allElementsStorage = allElementsStorage;
|
this._allElementsStorage = allElementsStorage;
|
||||||
|
|
||||||
this.syncWith(
|
this.syncWith(
|
||||||
this._selectedFeature.map(
|
this._selectedFeature.map(
|
||||||
selected => {
|
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
|
return defaultTitle
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,10 +49,9 @@ class TitleElement extends UIEventSource<string> {
|
||||||
}
|
}
|
||||||
, [Locale.language, layoutToUse]
|
, [Locale.language, layoutToUse]
|
||||||
)
|
)
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,8 @@ import {UIEventSource} from "./UIEventSource";
|
||||||
|
|
||||||
export class ElementStorage {
|
export class ElementStorage {
|
||||||
|
|
||||||
private _elements = new Map<string, UIEventSource<any>>();
|
|
||||||
public ContainingFeatures = new Map<string, any>();
|
public ContainingFeatures = new Map<string, any>();
|
||||||
|
private _elements = new Map<string, UIEventSource<any>>();
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
|
||||||
|
@ -25,16 +25,16 @@ export class ElementStorage {
|
||||||
addOrGetElement(feature: any): UIEventSource<any> {
|
addOrGetElement(feature: any): UIEventSource<any> {
|
||||||
const elementId = feature.properties.id;
|
const elementId = feature.properties.id;
|
||||||
const newProperties = feature.properties;
|
const newProperties = feature.properties;
|
||||||
|
|
||||||
const es = this.addOrGetById(elementId, newProperties)
|
const es = this.addOrGetById(elementId, newProperties)
|
||||||
|
|
||||||
// At last, we overwrite the tag of the new feature to use the tags in the already existing event source
|
// At last, we overwrite the tag of the new feature to use the tags in the already existing event source
|
||||||
feature.properties = es.data
|
feature.properties = es.data
|
||||||
|
|
||||||
if(!this.ContainingFeatures.has(elementId)){
|
if (!this.ContainingFeatures.has(elementId)) {
|
||||||
this.ContainingFeatures.set(elementId, feature);
|
this.ContainingFeatures.set(elementId, feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
return es;
|
return es;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ export class ElementStorage {
|
||||||
const debug_msg = []
|
const debug_msg = []
|
||||||
let somethingChanged = false;
|
let somethingChanged = false;
|
||||||
for (const k in newProperties) {
|
for (const k in newProperties) {
|
||||||
if(!newProperties.hasOwnProperty(k)){
|
if (!newProperties.hasOwnProperty(k)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const v = newProperties[k];
|
const v = newProperties[k];
|
||||||
|
|
|
@ -14,13 +14,13 @@ export default class FeatureDuplicatorPerLayer implements FeatureSource {
|
||||||
public readonly name;
|
public readonly name;
|
||||||
|
|
||||||
constructor(layers: UIEventSource<FilteredLayer[]>, upstream: FeatureSource) {
|
constructor(layers: UIEventSource<FilteredLayer[]>, upstream: FeatureSource) {
|
||||||
this.name = "FeatureDuplicator of "+upstream.name;
|
this.name = "FeatureDuplicator of " + upstream.name;
|
||||||
this.features = upstream.features.map(features => {
|
this.features = upstream.features.map(features => {
|
||||||
const newFeatures: { feature: any, freshness: Date }[] = [];
|
const newFeatures: { feature: any, freshness: Date }[] = [];
|
||||||
if(features === undefined){
|
if (features === undefined) {
|
||||||
return newFeatures;
|
return newFeatures;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const f of features) {
|
for (const f of features) {
|
||||||
if (f.feature._matching_layer_id) {
|
if (f.feature._matching_layer_id) {
|
||||||
// Already matched previously
|
// Already matched previously
|
||||||
|
@ -29,7 +29,7 @@ export default class FeatureDuplicatorPerLayer implements FeatureSource {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let foundALayer = false;
|
let foundALayer = false;
|
||||||
for (const layer of layers.data) {
|
for (const layer of layers.data) {
|
||||||
if (layer.layerDef.source.osmTags.matchesProperties(f.feature.properties)) {
|
if (layer.layerDef.source.osmTags.matchesProperties(f.feature.properties)) {
|
||||||
|
@ -43,7 +43,7 @@ export default class FeatureDuplicatorPerLayer implements FeatureSource {
|
||||||
id: f.feature.id,
|
id: f.feature.id,
|
||||||
type: f.feature.type,
|
type: f.feature.type,
|
||||||
properties: f.feature.properties,
|
properties: f.feature.properties,
|
||||||
_matching_layer_id : layer.layerDef.id
|
_matching_layer_id: layer.layerDef.id
|
||||||
}
|
}
|
||||||
newFeatures.push({feature: newFeature, freshness: f.freshness});
|
newFeatures.push({feature: newFeature, freshness: f.freshness});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -24,8 +24,8 @@ export class FeatureSourceUtils {
|
||||||
options = Utils.setDefaults(options, defaults);
|
options = Utils.setDefaults(options, defaults);
|
||||||
|
|
||||||
// Select all features, ignore the freshness and other data
|
// Select all features, ignore the freshness and other data
|
||||||
let featureList: any[] = featurePipeline.features.data.map((feature) =>
|
let featureList: any[] = featurePipeline.features.data.map((feature) =>
|
||||||
JSON.parse(JSON.stringify((feature.feature)))); // Make a deep copy!
|
JSON.parse(JSON.stringify((feature.feature)))); // Make a deep copy!
|
||||||
|
|
||||||
if (!options.metadata) {
|
if (!options.metadata) {
|
||||||
for (let i = 0; i < featureList.length; i++) {
|
for (let i = 0; i < featureList.length; i++) {
|
||||||
|
@ -39,7 +39,7 @@ export class FeatureSourceUtils {
|
||||||
}
|
}
|
||||||
return {type: "FeatureCollection", features: featureList}
|
return {type: "FeatureCollection", features: featureList}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,12 +57,12 @@ export default class FeatureSourceMerger implements FeatureSource {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!somethingChanged){
|
if (!somethingChanged) {
|
||||||
// We don't bother triggering an update
|
// We don't bother triggering an update
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const newList = [];
|
const newList = [];
|
||||||
all.forEach((value, key) => {
|
all.forEach((value, key) => {
|
||||||
newList.push(value)
|
newList.push(value)
|
||||||
|
|
|
@ -79,8 +79,8 @@ export default class FilteringFeatureSource implements FeatureSource {
|
||||||
if (result !== "yes") {
|
if (result !== "yes") {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const tagsFilter = layer.appliedFilters.data;
|
const tagsFilter = layer.appliedFilters.data;
|
||||||
if (tagsFilter) {
|
if (tagsFilter) {
|
||||||
if (!tagsFilter.matchesProperties(f.feature.properties)) {
|
if (!tagsFilter.matchesProperties(f.feature.properties)) {
|
||||||
|
@ -118,7 +118,7 @@ export default class FilteringFeatureSource implements FeatureSource {
|
||||||
if (l.zoom < layer.layerDef.minzoom) {
|
if (l.zoom < layer.layerDef.minzoom) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!layer.isDisplayed.data) {
|
if (!layer.isDisplayed.data) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,10 +13,10 @@ export default class GeoJsonSource implements FeatureSource {
|
||||||
|
|
||||||
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>;
|
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>;
|
||||||
public readonly name;
|
public readonly name;
|
||||||
|
public readonly isOsmCache: boolean
|
||||||
private onFail: ((errorMsg: any, url: string) => void) = undefined;
|
private onFail: ((errorMsg: any, url: string) => void) = undefined;
|
||||||
private readonly layerId: string;
|
private readonly layerId: string;
|
||||||
private readonly seenids: Set<string> = new Set<string>()
|
private readonly seenids: Set<string> = new Set<string>()
|
||||||
public readonly isOsmCache: boolean
|
|
||||||
|
|
||||||
private constructor(locationControl: UIEventSource<Loc>,
|
private constructor(locationControl: UIEventSource<Loc>,
|
||||||
flayer: { isDisplayed: UIEventSource<boolean>, layerDef: LayerConfig },
|
flayer: { isDisplayed: UIEventSource<boolean>, layerDef: LayerConfig },
|
||||||
|
|
|
@ -12,23 +12,23 @@ export default class LocalStorageSaver implements FeatureSource {
|
||||||
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>;
|
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>;
|
||||||
|
|
||||||
public readonly name = "LocalStorageSaver";
|
public readonly name = "LocalStorageSaver";
|
||||||
|
|
||||||
constructor(source: FeatureSource, layout: UIEventSource<LayoutConfig>) {
|
constructor(source: FeatureSource, layout: UIEventSource<LayoutConfig>) {
|
||||||
this.features = source.features;
|
this.features = source.features;
|
||||||
|
|
||||||
this.features.addCallbackAndRunD(features => {
|
this.features.addCallbackAndRunD(features => {
|
||||||
const now = new Date().getTime()
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const key = LocalStorageSaver.storageKey+layout.data.id
|
const key = LocalStorageSaver.storageKey + layout.data.id
|
||||||
localStorage.setItem(key, JSON.stringify(features));
|
localStorage.setItem(key, JSON.stringify(features));
|
||||||
console.log("Saved ",features.length, "elements to",key)
|
console.log("Saved ", features.length, "elements to", key)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn("Could not save the features to local storage:", e)
|
console.warn("Could not save the features to local storage:", e)
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,14 +16,14 @@ export default class LocalStorageSource implements FeatureSource {
|
||||||
if (fromStorage == null) {
|
if (fromStorage == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const loaded : { feature: any; freshness: Date | string }[]=
|
const loaded: { feature: any; freshness: Date | string }[] =
|
||||||
JSON.parse(fromStorage);
|
JSON.parse(fromStorage);
|
||||||
|
|
||||||
const parsed : { feature: any; freshness: Date }[]= loaded.map(ff => ({
|
const parsed: { feature: any; freshness: Date }[] = loaded.map(ff => ({
|
||||||
feature: ff.feature,
|
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);
|
this.features.setData(parsed);
|
||||||
console.log("Loaded ", loaded.length, " features from localstorage as cache")
|
console.log("Loaded ", loaded.length, " features from localstorage as cache")
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -19,10 +19,10 @@ export default class MetaTaggingFeatureSource implements FeatureSource {
|
||||||
const self = this;
|
const self = this;
|
||||||
this.name = "MetaTagging of " + source.name
|
this.name = "MetaTagging of " + source.name
|
||||||
|
|
||||||
if(allFeaturesSource === undefined){
|
if (allFeaturesSource === undefined) {
|
||||||
throw ("UIEVentSource is undefined")
|
throw ("UIEVentSource is undefined")
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
const featuresFreshness = source.features.data
|
const featuresFreshness = source.features.data
|
||||||
if (featuresFreshness === undefined) {
|
if (featuresFreshness === undefined) {
|
||||||
|
|
|
@ -8,17 +8,17 @@ export default class RememberingSource implements FeatureSource {
|
||||||
public readonly features: UIEventSource<{ feature: any, freshness: Date }[]>;
|
public readonly features: UIEventSource<{ feature: any, freshness: Date }[]>;
|
||||||
|
|
||||||
public readonly name;
|
public readonly name;
|
||||||
|
|
||||||
constructor(source: FeatureSource) {
|
constructor(source: FeatureSource) {
|
||||||
const self = this;
|
const self = this;
|
||||||
this.name = "RememberingSource of "+source.name;
|
this.name = "RememberingSource of " + source.name;
|
||||||
const empty = [];
|
const empty = [];
|
||||||
this.features = source.features.map(features => {
|
this.features = source.features.map(features => {
|
||||||
const oldFeatures = self.features?.data ?? empty;
|
const oldFeatures = self.features?.data ?? empty;
|
||||||
if (features === undefined) {
|
if (features === undefined) {
|
||||||
return oldFeatures;
|
return oldFeatures;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Then new ids
|
// Then new ids
|
||||||
const ids = new Set<string>(features.map(f => f.feature.properties.id + f.feature.geometry.type + f.feature._matching_layer_id));
|
const ids = new Set<string>(features.map(f => f.feature.properties.id + f.feature.geometry.type + f.feature._matching_layer_id));
|
||||||
// the old data
|
// the old data
|
||||||
|
|
|
@ -185,6 +185,60 @@ export class GeoOperations {
|
||||||
return turf.length(feature) * 1000
|
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.
|
* 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
|
* 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;
|
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) {
|
static get(feature) {
|
||||||
if (feature.bbox?.overlapsWith === undefined) {
|
if (feature.bbox?.overlapsWith === undefined) {
|
||||||
const turfBbox: number[] = turf.bbox(feature)
|
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;
|
return feature.bbox;
|
||||||
|
|
|
@ -2,8 +2,8 @@ import {Mapillary} from "./Mapillary";
|
||||||
import {Wikimedia} from "./Wikimedia";
|
import {Wikimedia} from "./Wikimedia";
|
||||||
import {Imgur} from "./Imgur";
|
import {Imgur} from "./Imgur";
|
||||||
|
|
||||||
export default class AllImageProviders{
|
export default class AllImageProviders {
|
||||||
|
|
||||||
public static ImageAttributionSource = [Imgur.singleton, Mapillary.singleton, Wikimedia.singleton]
|
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*/
|
/*Converts a value to a URL. Can return null if not applicable*/
|
||||||
public PrepareUrl(value: string): string{
|
public PrepareUrl(value: string): string {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected abstract DownloadAttribution(url: string): UIEventSource<LicenseInfo>;
|
||||||
|
|
||||||
}
|
}
|
|
@ -6,8 +6,8 @@ import {UIEventSource} from "../UIEventSource";
|
||||||
import BaseUIElement from "../../UI/BaseUIElement";
|
import BaseUIElement from "../../UI/BaseUIElement";
|
||||||
|
|
||||||
export class Imgur extends ImageAttributionSource {
|
export class Imgur extends ImageAttributionSource {
|
||||||
|
|
||||||
public static readonly singleton = new Imgur();
|
public static readonly singleton = new Imgur();
|
||||||
|
|
||||||
private constructor() {
|
private constructor() {
|
||||||
super();
|
super();
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import $ from "jquery"
|
|
||||||
import {LicenseInfo} from "./Wikimedia";
|
import {LicenseInfo} from "./Wikimedia";
|
||||||
import ImageAttributionSource from "./ImageAttributionSource";
|
import ImageAttributionSource from "./ImageAttributionSource";
|
||||||
import BaseUIElement from "../../UI/BaseUIElement";
|
import BaseUIElement from "../../UI/BaseUIElement";
|
||||||
|
|
|
@ -77,7 +77,7 @@ export class Wikimedia extends ImageAttributionSource {
|
||||||
|
|
||||||
static GetWikiData(id: number, handleWikidata: ((Wikidata) => void)) {
|
static GetWikiData(id: number, handleWikidata: ((Wikidata) => void)) {
|
||||||
const url = "https://www.wikidata.org/wiki/Special:EntityData/Q" + id + ".json";
|
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 entity = response.entities["Q" + id];
|
||||||
const commons = entity.sitelinks.commonswiki;
|
const commons = entity.sitelinks.commonswiki;
|
||||||
const wd = new Wikidata();
|
const wd = new Wikidata();
|
||||||
|
@ -139,10 +139,10 @@ export class Wikimedia extends ImageAttributionSource {
|
||||||
"titles=" + filename +
|
"titles=" + filename +
|
||||||
"&format=json&origin=*";
|
"&format=json&origin=*";
|
||||||
Utils.downloadJson(url).then(
|
Utils.downloadJson(url).then(
|
||||||
data =>{
|
data => {
|
||||||
const licenseInfo = new LicenseInfo();
|
const licenseInfo = new LicenseInfo();
|
||||||
const license = (data.query.pages[-1].imageinfo ?? [])[0]?.extmetadata;
|
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!")
|
console.error("This file has no usable metedata or license attached... Please fix the license info file yourself!")
|
||||||
source.setData(null)
|
source.setData(null)
|
||||||
return;
|
return;
|
||||||
|
@ -156,10 +156,10 @@ export class Wikimedia extends ImageAttributionSource {
|
||||||
licenseInfo.licenseShortName = license.LicenseShortName?.value;
|
licenseInfo.licenseShortName = license.LicenseShortName?.value;
|
||||||
licenseInfo.credit = license.Credit?.value;
|
licenseInfo.credit = license.Credit?.value;
|
||||||
licenseInfo.description = license.ImageDescription?.value;
|
licenseInfo.description = license.ImageDescription?.value;
|
||||||
source.setData(licenseInfo);
|
source.setData(licenseInfo);
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
return source;
|
return source;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,9 @@ interface Params {
|
||||||
export default class MetaTagging {
|
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
|
* 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
|
* 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):
|
private static createRetaggingFunc(layer: LayerConfig):
|
||||||
((params: Params, feature: any) => void) {
|
((params: Params, feature: any) => void) {
|
||||||
const calculatedTags: [string, string][] = layer.calculatedTags;
|
const calculatedTags: [string, string][] = layer.calculatedTags;
|
||||||
|
@ -111,7 +111,7 @@ export default class MetaTagging {
|
||||||
const f = (featuresPerLayer, feature: any) => {
|
const f = (featuresPerLayer, feature: any) => {
|
||||||
try {
|
try {
|
||||||
let result = func(feature);
|
let result = func(feature);
|
||||||
if(result instanceof UIEventSource){
|
if (result instanceof UIEventSource) {
|
||||||
result.addCallbackAndRunD(d => {
|
result.addCallbackAndRunD(d => {
|
||||||
if (typeof d !== "string") {
|
if (typeof d !== "string") {
|
||||||
// Make sure it is a string!
|
// Make sure it is a string!
|
||||||
|
@ -121,7 +121,7 @@ export default class MetaTagging {
|
||||||
})
|
})
|
||||||
result = result.data
|
result = result.data
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result === undefined || result === "") {
|
if (result === undefined || result === "") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,11 +8,10 @@ import {GeoOperations} from "../../GeoOperations";
|
||||||
|
|
||||||
export default class CreateNewNodeAction extends OsmChangeAction {
|
export default class CreateNewNodeAction extends OsmChangeAction {
|
||||||
|
|
||||||
|
public newElementId: string = undefined
|
||||||
private readonly _basicTags: Tag[];
|
private readonly _basicTags: Tag[];
|
||||||
private readonly _lat: number;
|
private readonly _lat: number;
|
||||||
private readonly _lon: number;
|
private readonly _lon: number;
|
||||||
|
|
||||||
public newElementId: string = undefined
|
|
||||||
private readonly _snapOnto: OsmWay;
|
private readonly _snapOnto: OsmWay;
|
||||||
private readonly _reusePointDistance: number;
|
private readonly _reusePointDistance: number;
|
||||||
|
|
||||||
|
@ -21,7 +20,7 @@ export default class CreateNewNodeAction extends OsmChangeAction {
|
||||||
this._basicTags = basicTags;
|
this._basicTags = basicTags;
|
||||||
this._lat = lat;
|
this._lat = lat;
|
||||||
this._lon = lon;
|
this._lon = lon;
|
||||||
if(lat === undefined || lon === undefined){
|
if (lat === undefined || lon === undefined) {
|
||||||
throw "Lat or lon are undefined!"
|
throw "Lat or lon are undefined!"
|
||||||
}
|
}
|
||||||
this._snapOnto = options?.snapOnto;
|
this._snapOnto = options?.snapOnto;
|
||||||
|
@ -82,20 +81,20 @@ export default class CreateNewNodeAction extends OsmChangeAction {
|
||||||
id: reusedPointId
|
id: reusedPointId
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
||||||
const locations = [...this._snapOnto.coordinates]
|
const locations = [...this._snapOnto.coordinates]
|
||||||
locations.forEach(coor => coor.reverse())
|
locations.forEach(coor => coor.reverse())
|
||||||
console.log("Locations are: ", locations)
|
console.log("Locations are: ", locations)
|
||||||
const ids = [...this._snapOnto.nodes]
|
const ids = [...this._snapOnto.nodes]
|
||||||
|
|
||||||
locations.splice(index + 1, 0, [this._lon, this._lat])
|
locations.splice(index + 1, 0, [this._lon, this._lat])
|
||||||
ids.splice(index + 1, 0, id)
|
ids.splice(index + 1, 0, id)
|
||||||
|
|
||||||
// Allright, we have to insert a new point in the way
|
// Allright, we have to insert a new point in the way
|
||||||
return [
|
return [
|
||||||
newPointChange,
|
newPointChange,
|
||||||
{
|
{
|
||||||
type:"way",
|
type: "way",
|
||||||
id: this._snapOnto.id,
|
id: this._snapOnto.id,
|
||||||
changes: {
|
changes: {
|
||||||
locations: locations,
|
locations: locations,
|
||||||
|
|
|
@ -30,7 +30,7 @@ export default class DeleteAction {
|
||||||
* Does actually delete the feature; returns the event source 'this.isDeleted'
|
* Does actually delete the feature; returns the event source 'this.isDeleted'
|
||||||
* If deletion is not allowed, triggers the callback instead
|
* 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 isDeleted = this.isDeleted
|
||||||
const self = this;
|
const self = this;
|
||||||
let deletionStarted = false;
|
let deletionStarted = false;
|
||||||
|
@ -40,23 +40,21 @@ export default class DeleteAction {
|
||||||
// Already deleted...
|
// Already deleted...
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(canBeDeleted.canBeDeleted === false){
|
if (canBeDeleted.canBeDeleted === false) {
|
||||||
// We aren't allowed to delete
|
// We aren't allowed to delete
|
||||||
deletionStarted = true;
|
deletionStarted = true;
|
||||||
onNotAllowed();
|
onNotAllowed();
|
||||||
isDeleted.setData(true);
|
isDeleted.setData(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!canBeDeleted) {
|
if (!canBeDeleted) {
|
||||||
// We are not allowed to delete (yet), this might change in the future though
|
// We are not allowed to delete (yet), this might change in the future though
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
deletionStarted = true;
|
deletionStarted = true;
|
||||||
OsmObject.DownloadObject(self._id).addCallbackAndRun(obj => {
|
OsmObject.DownloadObject(self._id).addCallbackAndRun(obj => {
|
||||||
if (obj === undefined) {
|
if (obj === undefined) {
|
||||||
|
@ -207,7 +205,7 @@ export default class DeleteAction {
|
||||||
canBeDeleted: false,
|
canBeDeleted: false,
|
||||||
reason: t.partOfOthers
|
reason: t.partOfOthers
|
||||||
})
|
})
|
||||||
}else{
|
} else {
|
||||||
// alright, this point can be safely deleted!
|
// alright, this point can be safely deleted!
|
||||||
state.setData({
|
state.setData({
|
||||||
canBeDeleted: true,
|
canBeDeleted: true,
|
||||||
|
@ -215,7 +213,6 @@ export default class DeleteAction {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/**
|
/**
|
||||||
* The logic to handle relations after a way within
|
* The logic to handle relations after a way within
|
||||||
*/
|
*/
|
||||||
import OsmChangeAction from "./OsmChangeAction";
|
import OsmChangeAction from "./OsmChangeAction";
|
||||||
import {Changes} from "../Changes";
|
import {Changes} from "../Changes";
|
||||||
import {ChangeDescription} from "./ChangeDescription";
|
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[]) {
|
constructor(partOf: OsmRelation[], newWayIds: number[], originalNodes: number[]) {
|
||||||
super()
|
super()
|
||||||
|
|
|
@ -23,18 +23,18 @@ export class Changes {
|
||||||
|
|
||||||
public readonly pendingChanges = LocalStorageSource.GetParsed<ChangeDescription[]>("pending-changes", [])
|
public readonly pendingChanges = LocalStorageSource.GetParsed<ChangeDescription[]>("pending-changes", [])
|
||||||
private readonly isUploading = new UIEventSource(false);
|
private readonly isUploading = new UIEventSource(false);
|
||||||
|
|
||||||
private readonly previouslyCreated : OsmObject[] = []
|
private readonly previouslyCreated: OsmObject[] = []
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static createChangesetFor(csId: string,
|
private static createChangesetFor(csId: string,
|
||||||
allChanges: {
|
allChanges: {
|
||||||
modifiedObjects: OsmObject[],
|
modifiedObjects: OsmObject[],
|
||||||
newObjects: OsmObject[],
|
newObjects: OsmObject[],
|
||||||
deletedObjects: OsmObject[]
|
deletedObjects: OsmObject[]
|
||||||
}): string {
|
}): string {
|
||||||
|
|
||||||
const changedElements = allChanges.modifiedObjects ?? []
|
const changedElements = allChanges.modifiedObjects ?? []
|
||||||
const newElements = allChanges.newObjects ?? []
|
const newElements = allChanges.newObjects ?? []
|
||||||
|
@ -70,6 +70,88 @@ export class Changes {
|
||||||
.map(c => c.type + "/" + c.id))
|
.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[]): {
|
private CreateChangesetObjects(changes: ChangeDescription[], downloadedOsmObjects: OsmObject[]): {
|
||||||
newObjects: OsmObject[],
|
newObjects: OsmObject[],
|
||||||
modifiedObjects: OsmObject[]
|
modifiedObjects: OsmObject[]
|
||||||
|
@ -85,7 +167,7 @@ export class Changes {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const o of this.previouslyCreated) {
|
for (const o of this.previouslyCreated) {
|
||||||
objects.set(o.type + "/" + o.id, o)
|
objects.set(o.type + "/" + o.id, o)
|
||||||
states.set(o.type + "/" + o.id, "unchanged")
|
states.set(o.type + "/" + o.id, "unchanged")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,8 +175,8 @@ export class Changes {
|
||||||
for (const change of changes) {
|
for (const change of changes) {
|
||||||
const id = change.type + "/" + change.id
|
const id = change.type + "/" + change.id
|
||||||
if (!objects.has(id)) {
|
if (!objects.has(id)) {
|
||||||
if(change.id >= 0){
|
if (change.id >= 0) {
|
||||||
throw "Did not get an object that should be known: "+id
|
throw "Did not get an object that should be known: " + id
|
||||||
}
|
}
|
||||||
// This is a new object that should be created
|
// This is a new object that should be created
|
||||||
states.set(id, "created")
|
states.set(id, "created")
|
||||||
|
@ -189,7 +271,7 @@ export class Changes {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed && state === "unchanged") {
|
if (changed && state === "unchanged") {
|
||||||
|
@ -203,7 +285,7 @@ export class Changes {
|
||||||
modifiedObjects: [],
|
modifiedObjects: [],
|
||||||
deletedObjects: []
|
deletedObjects: []
|
||||||
}
|
}
|
||||||
|
|
||||||
objects.forEach((v, id) => {
|
objects.forEach((v, id) => {
|
||||||
|
|
||||||
const state = states.get(id)
|
const state = states.get(id)
|
||||||
|
@ -221,86 +303,4 @@ export class Changes {
|
||||||
|
|
||||||
return result
|
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) {
|
}, function (err, response) {
|
||||||
if (response === undefined) {
|
if (response === undefined) {
|
||||||
console.log("err", err);
|
console.log("err", err);
|
||||||
if(options.onFail){
|
if (options.onFail) {
|
||||||
options.onFail()
|
options.onFail()
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -15,7 +15,7 @@ export interface Relation {
|
||||||
|
|
||||||
export default class ExtractRelations {
|
export default class ExtractRelations {
|
||||||
|
|
||||||
public static RegisterRelations(overpassJson: any) : void{
|
public static RegisterRelations(overpassJson: any): void {
|
||||||
const memberships = ExtractRelations.BuildMembershipTable(ExtractRelations.GetRelationElements(overpassJson))
|
const memberships = ExtractRelations.BuildMembershipTable(ExtractRelations.GetRelationElements(overpassJson))
|
||||||
State.state.knownRelations.setData(memberships)
|
State.state.knownRelations.setData(memberships)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,14 @@ export class Geocoding {
|
||||||
private static readonly host = "https://nominatim.openstreetmap.org/search?";
|
private static readonly host = "https://nominatim.openstreetmap.org/search?";
|
||||||
|
|
||||||
static Search(query: string,
|
static Search(query: string,
|
||||||
handleResult: ((places: { display_name: string, lat: number, lon: number, boundingbox: number[],
|
handleResult: ((places: {
|
||||||
osm_type: string, osm_id: string}[]) => void),
|
display_name: string, lat: number, lon: number, boundingbox: number[],
|
||||||
|
osm_type: string, osm_id: string
|
||||||
|
}[]) => void),
|
||||||
onFail: (() => void)) {
|
onFail: (() => void)) {
|
||||||
const b = State.state.leafletMap.data.getBounds();
|
const b = State.state.leafletMap.data.getBounds();
|
||||||
const url = Geocoding.host + "format=json&limit=1&viewbox=" +
|
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;
|
"&accept-language=nl&q=" + query;
|
||||||
Utils.downloadJson(
|
Utils.downloadJson(
|
||||||
url)
|
url)
|
||||||
|
|
|
@ -22,7 +22,7 @@ export default class UserDetails {
|
||||||
public dryRun: boolean;
|
public dryRun: boolean;
|
||||||
home: { lon: number; lat: number };
|
home: { lon: number; lat: number };
|
||||||
public backend: string;
|
public backend: string;
|
||||||
|
|
||||||
constructor(backend: string) {
|
constructor(backend: string) {
|
||||||
this.backend = backend;
|
this.backend = backend;
|
||||||
}
|
}
|
||||||
|
@ -47,10 +47,10 @@ export class OsmConnection {
|
||||||
public auth;
|
public auth;
|
||||||
public userDetails: UIEventSource<UserDetails>;
|
public userDetails: UIEventSource<UserDetails>;
|
||||||
public isLoggedIn: UIEventSource<boolean>
|
public isLoggedIn: UIEventSource<boolean>
|
||||||
private fakeUser: boolean;
|
|
||||||
_dryRun: boolean;
|
_dryRun: boolean;
|
||||||
public preferencesHandler: OsmPreferences;
|
public preferencesHandler: OsmPreferences;
|
||||||
public changesetHandler: ChangesetHandler;
|
public changesetHandler: ChangesetHandler;
|
||||||
|
private fakeUser: boolean;
|
||||||
private _onLoggedIn: ((userDetails: UserDetails) => void)[] = [];
|
private _onLoggedIn: ((userDetails: UserDetails) => void)[] = [];
|
||||||
private readonly _iframeMode: Boolean | boolean;
|
private readonly _iframeMode: Boolean | boolean;
|
||||||
private readonly _singlePage: boolean;
|
private readonly _singlePage: boolean;
|
||||||
|
@ -59,8 +59,9 @@ export class OsmConnection {
|
||||||
oauth_secret: string,
|
oauth_secret: string,
|
||||||
url: string
|
url: string
|
||||||
};
|
};
|
||||||
|
private isChecking = false;
|
||||||
|
|
||||||
constructor(dryRun: boolean,
|
constructor(dryRun: boolean,
|
||||||
fakeUser: boolean,
|
fakeUser: boolean,
|
||||||
oauth_token: UIEventSource<string>,
|
oauth_token: UIEventSource<string>,
|
||||||
// Used to keep multiple changesets open and to write to the correct changeset
|
// Used to keep multiple changesets open and to write to the correct changeset
|
||||||
|
@ -77,17 +78,17 @@ export class OsmConnection {
|
||||||
|
|
||||||
this.userDetails = new UIEventSource<UserDetails>(new UserDetails(this._oauth_config.url), "userDetails");
|
this.userDetails = new UIEventSource<UserDetails>(new UserDetails(this._oauth_config.url), "userDetails");
|
||||||
this.userDetails.data.dryRun = dryRun || fakeUser;
|
this.userDetails.data.dryRun = dryRun || fakeUser;
|
||||||
if(fakeUser){
|
if (fakeUser) {
|
||||||
const ud = this.userDetails.data;
|
const ud = this.userDetails.data;
|
||||||
ud.csCount = 5678
|
ud.csCount = 5678
|
||||||
ud.loggedIn= true;
|
ud.loggedIn = true;
|
||||||
ud.unreadMessages = 0
|
ud.unreadMessages = 0
|
||||||
ud.name = "Fake user"
|
ud.name = "Fake user"
|
||||||
ud.totalMessages = 42;
|
ud.totalMessages = 42;
|
||||||
}
|
}
|
||||||
const self =this;
|
const self = this;
|
||||||
this.isLoggedIn = this.userDetails.map(user => user.loggedIn).addCallback(isLoggedIn => {
|
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
|
// 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!
|
// This means someone attempted to toggle this; so we attempt to login!
|
||||||
self.AttemptLogin()
|
self.AttemptLogin()
|
||||||
|
@ -150,7 +151,7 @@ export class OsmConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
public AttemptLogin() {
|
public AttemptLogin() {
|
||||||
if(this.fakeUser){
|
if (this.fakeUser) {
|
||||||
console.log("AttemptLogin called, but ignored as fakeUser is set")
|
console.log("AttemptLogin called, but ignored as fakeUser is set")
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -191,7 +192,7 @@ export class OsmConnection {
|
||||||
data.loggedIn = true;
|
data.loggedIn = true;
|
||||||
console.log("Login completed, userinfo is ", userInfo);
|
console.log("Login completed, userinfo is ", userInfo);
|
||||||
data.name = userInfo.getAttribute('display_name');
|
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.csCount = userInfo.getElementsByTagName("changesets")[0].getAttribute("count");
|
||||||
|
|
||||||
data.img = undefined;
|
data.img = undefined;
|
||||||
|
@ -249,20 +250,19 @@ export class OsmConnection {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private isChecking = false;
|
private CheckForMessagesContinuously() {
|
||||||
private CheckForMessagesContinuously(){
|
const self = this;
|
||||||
const self =this;
|
if (this.isChecking) {
|
||||||
if(this.isChecking){
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.isChecking = true;
|
this.isChecking = true;
|
||||||
UIEventSource.Chronic(5 * 60 * 1000).addCallback(_ => {
|
UIEventSource.Chronic(5 * 60 * 1000).addCallback(_ => {
|
||||||
if (self.isLoggedIn .data) {
|
if (self.isLoggedIn.data) {
|
||||||
console.log("Checking for messages")
|
console.log("Checking for messages")
|
||||||
self.AttemptLogin();
|
self.AttemptLogin();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ export abstract class OsmObject {
|
||||||
const splitted = id.split("/");
|
const splitted = id.split("/");
|
||||||
const type = splitted[0];
|
const type = splitted[0];
|
||||||
const idN = Number(splitted[1]);
|
const idN = Number(splitted[1]);
|
||||||
if(idN <0){
|
if (idN < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,7 +438,7 @@ export class OsmWay extends OsmObject {
|
||||||
|
|
||||||
for (const nodeId of element.nodes) {
|
for (const nodeId of element.nodes) {
|
||||||
const node = nodeDict.get(nodeId)
|
const node = nodeDict.get(nodeId)
|
||||||
if(node === undefined){
|
if (node === undefined) {
|
||||||
console.error("Error: node ", nodeId, "not found in ", nodeDict)
|
console.error("Error: node ", nodeId, "not found in ", nodeDict)
|
||||||
// This is probably part of a relation which hasn't been fully downloaded
|
// This is probably part of a relation which hasn't been fully downloaded
|
||||||
continue;
|
continue;
|
||||||
|
@ -498,7 +498,7 @@ export class OsmRelation extends OsmObject {
|
||||||
|
|
||||||
let tags = this.TagsXML();
|
let tags = this.TagsXML();
|
||||||
let cs = ""
|
let cs = ""
|
||||||
if(changesetId !== undefined){
|
if (changesetId !== undefined) {
|
||||||
cs = `changeset="${changesetId}"`
|
cs = `changeset="${changesetId}"`
|
||||||
}
|
}
|
||||||
return ` <relation id="${this.id}" ${cs} ${this.VersionXML()}>
|
return ` <relation id="${this.id}" ${cs} ${this.VersionXML()}>
|
||||||
|
|
|
@ -29,7 +29,7 @@ export class OsmPreferences {
|
||||||
return this.longPreferences[prefix + key];
|
return this.longPreferences[prefix + key];
|
||||||
}
|
}
|
||||||
|
|
||||||
const source = new UIEventSource<string>(undefined, "long-osm-preference:"+prefix+key);
|
const source = new UIEventSource<string>(undefined, "long-osm-preference:" + prefix + key);
|
||||||
this.longPreferences[prefix + key] = source;
|
this.longPreferences[prefix + key] = source;
|
||||||
|
|
||||||
const allStartWith = prefix + key + "-combined";
|
const allStartWith = prefix + key + "-combined";
|
||||||
|
@ -107,7 +107,7 @@ export class OsmPreferences {
|
||||||
if (this.userDetails.data.loggedIn && this.preferences.data[key] === undefined) {
|
if (this.userDetails.data.loggedIn && this.preferences.data[key] === undefined) {
|
||||||
this.UpdatePreferences();
|
this.UpdatePreferences();
|
||||||
}
|
}
|
||||||
const pref = new UIEventSource<string>(this.preferences.data[key],"osm-preference:"+key);
|
const pref = new UIEventSource<string>(this.preferences.data[key], "osm-preference:" + key);
|
||||||
pref.addCallback((v) => {
|
pref.addCallback((v) => {
|
||||||
this.SetPreference(key, v);
|
this.SetPreference(key, v);
|
||||||
});
|
});
|
||||||
|
|
|
@ -15,7 +15,7 @@ export class Overpass {
|
||||||
private readonly _timeout: UIEventSource<number>;
|
private readonly _timeout: UIEventSource<number>;
|
||||||
private readonly _extraScripts: string[];
|
private readonly _extraScripts: string[];
|
||||||
private _includeMeta: boolean;
|
private _includeMeta: boolean;
|
||||||
|
|
||||||
constructor(filter: TagsFilter, extraScripts: string[],
|
constructor(filter: TagsFilter, extraScripts: string[],
|
||||||
interpreterUrl: UIEventSource<string>,
|
interpreterUrl: UIEventSource<string>,
|
||||||
timeout: UIEventSource<number>,
|
timeout: UIEventSource<number>,
|
||||||
|
@ -42,7 +42,7 @@ export class Overpass {
|
||||||
onFail("Runtime error (timeout)")
|
onFail("Runtime error (timeout)")
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ExtractRelations.RegisterRelations(json)
|
ExtractRelations.RegisterRelations(json)
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
|
|
@ -12,12 +12,9 @@ export default class AspectedRouting {
|
||||||
this.program = JSON.parse(JSON.stringify(program))
|
this.program = JSON.parse(JSON.stringify(program))
|
||||||
delete this.program.name
|
delete this.program.name
|
||||||
delete this.program.description
|
delete this.program.description
|
||||||
delete this.program.unit
|
delete this.program.unit
|
||||||
}
|
}
|
||||||
|
|
||||||
public evaluate(properties){
|
|
||||||
return AspectedRouting.interpret(this.program, properties)
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Interprets the given Aspected-routing program for the given properties
|
* Interprets the given Aspected-routing program for the given properties
|
||||||
*/
|
*/
|
||||||
|
@ -191,4 +188,8 @@ export default class AspectedRouting {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public evaluate(properties) {
|
||||||
|
return AspectedRouting.interpret(this.program, properties)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -96,7 +96,7 @@ export default class SimpleMetaTagger {
|
||||||
const value = feature.properties[key]
|
const value = feature.properties[key]
|
||||||
const [, denomination] = unit.findDenomination(value)
|
const [, denomination] = unit.findDenomination(value)
|
||||||
let canonical = denomination?.canonicalValue(value) ?? undefined;
|
let canonical = denomination?.canonicalValue(value) ?? undefined;
|
||||||
if(canonical === value){
|
if (canonical === value) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
console.log("Rewritten ", key, ` from '${value}' into '${canonical}'`)
|
console.log("Rewritten ", key, ` from '${value}' into '${canonical}'`)
|
||||||
|
@ -110,7 +110,7 @@ export default class SimpleMetaTagger {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if(rewritten){
|
if (rewritten) {
|
||||||
State.state.allElements.getEventSourceById(feature.id).ping();
|
State.state.allElements.getEventSourceById(feature.id).ping();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -7,18 +7,6 @@ export class And extends TagsFilter {
|
||||||
super();
|
super();
|
||||||
this.and = and
|
this.and = and
|
||||||
}
|
}
|
||||||
|
|
||||||
normalize(){
|
|
||||||
const ands = []
|
|
||||||
for (const c of this.and) {
|
|
||||||
if(c instanceof And){
|
|
||||||
ands.push(...c.and)
|
|
||||||
}else{
|
|
||||||
ands.push(c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new And(ands)
|
|
||||||
}
|
|
||||||
|
|
||||||
private static combine(filter: string, choices: string[]): string[] {
|
private static combine(filter: string, choices: string[]): string[] {
|
||||||
const values = [];
|
const values = [];
|
||||||
|
@ -28,6 +16,18 @@ export class And extends TagsFilter {
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
normalize() {
|
||||||
|
const ands = []
|
||||||
|
for (const c of this.and) {
|
||||||
|
if (c instanceof And) {
|
||||||
|
ands.push(...c.and)
|
||||||
|
} else {
|
||||||
|
ands.push(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new And(ands)
|
||||||
|
}
|
||||||
|
|
||||||
matchesProperties(tags: any): boolean {
|
matchesProperties(tags: any): boolean {
|
||||||
for (const tagsFilter of this.and) {
|
for (const tagsFilter of this.and) {
|
||||||
if (!tagsFilter.matchesProperties(tags)) {
|
if (!tagsFilter.matchesProperties(tags)) {
|
||||||
|
|
|
@ -4,19 +4,19 @@ export default class ComparingTag implements TagsFilter {
|
||||||
private readonly _key: string;
|
private readonly _key: string;
|
||||||
private readonly _predicate: (value: string) => boolean;
|
private readonly _predicate: (value: string) => boolean;
|
||||||
private readonly _representation: string;
|
private readonly _representation: string;
|
||||||
|
|
||||||
constructor(key: string, predicate : (value:string | undefined) => boolean, representation: string = "") {
|
constructor(key: string, predicate: (value: string | undefined) => boolean, representation: string = "") {
|
||||||
this._key = key;
|
this._key = key;
|
||||||
this._predicate = predicate;
|
this._predicate = predicate;
|
||||||
this._representation = representation;
|
this._representation = representation;
|
||||||
}
|
}
|
||||||
|
|
||||||
asChange(properties: any): { k: string; v: string }[] {
|
asChange(properties: any): { k: string; v: string }[] {
|
||||||
throw "A comparable tag can not be used to be uploaded to OSM"
|
throw "A comparable tag can not be used to be uploaded to OSM"
|
||||||
}
|
}
|
||||||
|
|
||||||
asHumanString(linkToWiki: boolean, shorten: boolean, properties: any) {
|
asHumanString(linkToWiki: boolean, shorten: boolean, properties: any) {
|
||||||
return this._key+this._representation
|
return this._key + this._representation
|
||||||
}
|
}
|
||||||
|
|
||||||
asOverpass(): string[] {
|
asOverpass(): string[] {
|
||||||
|
@ -38,5 +38,5 @@ export default class ComparingTag implements TagsFilter {
|
||||||
usedKeys(): string[] {
|
usedKeys(): string[] {
|
||||||
return [this._key];
|
return [this._key];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -16,7 +16,7 @@ export class RegexTag extends TagsFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static doesMatch(fromTag: string, possibleRegex: string | RegExp): boolean {
|
private static doesMatch(fromTag: string, possibleRegex: string | RegExp): boolean {
|
||||||
if(fromTag === undefined){
|
if (fromTag === undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (typeof possibleRegex === "string") {
|
if (typeof possibleRegex === "string") {
|
||||||
|
@ -45,7 +45,7 @@ export class RegexTag extends TagsFilter {
|
||||||
|
|
||||||
matchesProperties(tags: any): boolean {
|
matchesProperties(tags: any): boolean {
|
||||||
for (const key in tags) {
|
for (const key in tags) {
|
||||||
if(key === undefined){
|
if (key === undefined) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (RegexTag.doesMatch(key, this.key)) {
|
if (RegexTag.doesMatch(key, this.key)) {
|
||||||
|
@ -86,14 +86,14 @@ export class RegexTag extends TagsFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
asChange(properties: any): { k: string; v: string }[] {
|
asChange(properties: any): { k: string; v: string }[] {
|
||||||
if(this.invert){
|
if (this.invert) {
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
if (typeof this.key === "string") {
|
if (typeof this.key === "string") {
|
||||||
if( typeof this.value === "string"){
|
if (typeof this.value === "string") {
|
||||||
return [{k: this.key, v: this.value}]
|
return [{k: this.key, v: this.value}]
|
||||||
}
|
}
|
||||||
if(this.value.toString() != "/^..*$/"){
|
if (this.value.toString() != "/^..*$/") {
|
||||||
console.warn("Regex value in tag; using wildcard:", this.key, this.value)
|
console.warn("Regex value in tag; using wildcard:", this.key, this.value)
|
||||||
}
|
}
|
||||||
return [{k: this.key, v: undefined}]
|
return [{k: this.key, v: undefined}]
|
||||||
|
|
|
@ -24,19 +24,19 @@ export class Tag extends TagsFilter {
|
||||||
|
|
||||||
matchesProperties(properties: any): boolean {
|
matchesProperties(properties: any): boolean {
|
||||||
for (const propertiesKey in properties) {
|
for (const propertiesKey in properties) {
|
||||||
if(!properties.hasOwnProperty(propertiesKey)){
|
if (!properties.hasOwnProperty(propertiesKey)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (this.key === propertiesKey) {
|
if (this.key === propertiesKey) {
|
||||||
const value = properties[propertiesKey];
|
const value = properties[propertiesKey];
|
||||||
if(value === undefined){
|
if (value === undefined) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return value === this.value;
|
return value === this.value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// The tag was not found
|
// The tag was not found
|
||||||
|
|
||||||
if (this.value === "") {
|
if (this.value === "") {
|
||||||
// and it shouldn't be found!
|
// and it shouldn't be found!
|
||||||
return true;
|
return true;
|
||||||
|
@ -52,6 +52,7 @@ export class Tag extends TagsFilter {
|
||||||
}
|
}
|
||||||
return [`["${this.key}"="${this.value}"]`];
|
return [`["${this.key}"="${this.value}"]`];
|
||||||
}
|
}
|
||||||
|
|
||||||
asHumanString(linkToWiki?: boolean, shorten?: boolean) {
|
asHumanString(linkToWiki?: boolean, shorten?: boolean) {
|
||||||
let v = this.value;
|
let v = this.value;
|
||||||
if (shorten) {
|
if (shorten) {
|
||||||
|
@ -84,6 +85,6 @@ export class Tag extends TagsFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
asChange(properties: any): { k: string; v: string }[] {
|
asChange(properties: any): { k: string; v: string }[] {
|
||||||
return [{k: this.key, v: this.value}];
|
return [{k: this.key, v: this.value}];
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -10,6 +10,15 @@ import {AndOrTagConfigJson} from "../../Models/ThemeConfig/Json/TagConfigJson";
|
||||||
import {isRegExp} from "util";
|
import {isRegExp} from "util";
|
||||||
|
|
||||||
export class TagUtils {
|
export class TagUtils {
|
||||||
|
private static comparators
|
||||||
|
: [string, (a: number, b: number) => boolean][]
|
||||||
|
= [
|
||||||
|
["<=", (a, b) => a <= b],
|
||||||
|
[">=", (a, b) => a >= b],
|
||||||
|
["<", (a, b) => a < b],
|
||||||
|
[">", (a, b) => a > b],
|
||||||
|
]
|
||||||
|
|
||||||
static ApplyTemplate(template: string, tags: any): string {
|
static ApplyTemplate(template: string, tags: any): string {
|
||||||
for (const k in tags) {
|
for (const k in tags) {
|
||||||
while (template.indexOf("{" + k + "}") >= 0) {
|
while (template.indexOf("{" + k + "}") >= 0) {
|
||||||
|
@ -75,21 +84,21 @@ export class TagUtils {
|
||||||
keyValues[tagsFilter.key].push(...tagsFilter.value.split(";"));
|
keyValues[tagsFilter.key].push(...tagsFilter.value.split(";"));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(allowRegex && tagsFilter instanceof RegexTag) {
|
if (allowRegex && tagsFilter instanceof RegexTag) {
|
||||||
const key = tagsFilter.key
|
const key = tagsFilter.key
|
||||||
if(isRegExp(key)) {
|
if (isRegExp(key)) {
|
||||||
console.error("Invalid type to flatten the multiAnswer: key is a regex too", tagsFilter);
|
console.error("Invalid type to flatten the multiAnswer: key is a regex too", tagsFilter);
|
||||||
throw "Invalid type to FlattenMultiAnswer"
|
throw "Invalid type to FlattenMultiAnswer"
|
||||||
}
|
}
|
||||||
const keystr = <string>key
|
const keystr = <string>key
|
||||||
if (keyValues[keystr] === undefined) {
|
if (keyValues[keystr] === undefined) {
|
||||||
keyValues[keystr ] = [];
|
keyValues[keystr] = [];
|
||||||
}
|
}
|
||||||
keyValues[keystr].push(tagsFilter);
|
keyValues[keystr].push(tagsFilter);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
console.error("Invalid type to flatten the multiAnswer", tagsFilter);
|
console.error("Invalid type to flatten the multiAnswer", tagsFilter);
|
||||||
throw "Invalid type to FlattenMultiAnswer"
|
throw "Invalid type to FlattenMultiAnswer"
|
||||||
|
@ -138,13 +147,13 @@ export class TagUtils {
|
||||||
|
|
||||||
const actualValue = properties[splitKey].split(";");
|
const actualValue = properties[splitKey].split(";");
|
||||||
for (const neededValue of neededValues) {
|
for (const neededValue of neededValues) {
|
||||||
|
|
||||||
if(neededValue instanceof RegexTag) {
|
if (neededValue instanceof RegexTag) {
|
||||||
if(!neededValue.matchesProperties(properties)) {
|
if (!neededValue.matchesProperties(properties)) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (actualValue.indexOf(neededValue) < 0) {
|
if (actualValue.indexOf(neededValue) < 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -170,15 +179,6 @@ export class TagUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static comparators
|
|
||||||
: [string, (a: number, b: number) => boolean][]
|
|
||||||
= [
|
|
||||||
["<=", (a, b) => a <= b],
|
|
||||||
[">=", (a, b) => a >= b],
|
|
||||||
["<", (a, b) => a < b],
|
|
||||||
[">", (a, b) => a > b],
|
|
||||||
]
|
|
||||||
|
|
||||||
private static TagUnsafe(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter {
|
private static TagUnsafe(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter {
|
||||||
|
|
||||||
if (json === undefined) {
|
if (json === undefined) {
|
||||||
|
|
|
@ -11,13 +11,13 @@ export abstract class TagsFilter {
|
||||||
abstract asHumanString(linkToWiki: boolean, shorten: boolean, properties: any);
|
abstract asHumanString(linkToWiki: boolean, shorten: boolean, properties: any);
|
||||||
|
|
||||||
abstract usedKeys(): string[];
|
abstract usedKeys(): string[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the tagsFilter into a list of key-values that should be uploaded to OSM.
|
* Converts the tagsFilter into a list of key-values that should be uploaded to OSM.
|
||||||
* Throws an error if not applicable.
|
* Throws an error if not applicable.
|
||||||
*
|
*
|
||||||
* Note: properties are the already existing tags-object. It is only used in the substituting tag
|
* Note: properties are the already existing tags-object. It is only used in the substituting tag
|
||||||
*/
|
*/
|
||||||
abstract asChange(properties:any): {k: string, v:string}[]
|
abstract asChange(properties: any): { k: string, v: string }[]
|
||||||
|
|
||||||
}
|
}
|
|
@ -184,7 +184,7 @@ export class UIEventSource<T> {
|
||||||
addCallbackAndRunD(callback: (data: T) => void) {
|
addCallbackAndRunD(callback: (data: T) => void) {
|
||||||
this.addCallbackAndRun(data => {
|
this.addCallbackAndRun(data => {
|
||||||
if (data !== undefined && data !== null) {
|
if (data !== undefined && data !== null) {
|
||||||
return callback(data)
|
return callback(data)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -194,9 +194,9 @@ export class UIEventSourceTools {
|
||||||
|
|
||||||
private static readonly _download_cache = new Map<string, UIEventSource<any>>()
|
private static readonly _download_cache = new Map<string, UIEventSource<any>>()
|
||||||
|
|
||||||
public static downloadJsonCached(url: string): UIEventSource<any>{
|
public static downloadJsonCached(url: string): UIEventSource<any> {
|
||||||
const cached = UIEventSourceTools._download_cache.get(url)
|
const cached = UIEventSourceTools._download_cache.get(url)
|
||||||
if(cached !== undefined){
|
if (cached !== undefined) {
|
||||||
return cached;
|
return cached;
|
||||||
}
|
}
|
||||||
const src = new UIEventSource<any>(undefined)
|
const src = new UIEventSource<any>(undefined)
|
||||||
|
|
|
@ -48,7 +48,7 @@ export default class Hash {
|
||||||
}
|
}
|
||||||
hash.setData(newValue)
|
hash.setData(newValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener('popstate', _ => {
|
window.addEventListener('popstate', _ => {
|
||||||
let newValue = window.location.hash.substr(1);
|
let newValue = window.location.hash.substr(1);
|
||||||
if (newValue === "") {
|
if (newValue === "") {
|
||||||
|
|
|
@ -24,7 +24,7 @@ export default class LiveQueryHandler {
|
||||||
const source = new UIEventSource({});
|
const source = new UIEventSource({});
|
||||||
LiveQueryHandler[url] = source;
|
LiveQueryHandler[url] = source;
|
||||||
|
|
||||||
console.log("Fetching live data from a third-party (unknown) API:",url)
|
console.log("Fetching live data from a third-party (unknown) API:", url)
|
||||||
Utils.downloadJson(url).then(data => {
|
Utils.downloadJson(url).then(data => {
|
||||||
for (const shorthandDescription of shorthandsSet) {
|
for (const shorthandDescription of shorthandsSet) {
|
||||||
|
|
||||||
|
|
|
@ -4,19 +4,19 @@ import {UIEventSource} from "../UIEventSource";
|
||||||
* UIEventsource-wrapper around localStorage
|
* UIEventsource-wrapper around localStorage
|
||||||
*/
|
*/
|
||||||
export class LocalStorageSource {
|
export class LocalStorageSource {
|
||||||
|
|
||||||
static GetParsed<T>(key: string, defaultValue : T) : UIEventSource<T>{
|
static GetParsed<T>(key: string, defaultValue: T): UIEventSource<T> {
|
||||||
return LocalStorageSource.Get(key).map(
|
return LocalStorageSource.Get(key).map(
|
||||||
str => {
|
str => {
|
||||||
if(str === undefined){
|
if (str === undefined) {
|
||||||
return defaultValue
|
return defaultValue
|
||||||
}
|
}
|
||||||
try{
|
try {
|
||||||
return JSON.parse(str)
|
return JSON.parse(str)
|
||||||
}catch{
|
} catch {
|
||||||
return defaultValue
|
return defaultValue
|
||||||
}
|
}
|
||||||
}, [],
|
}, [],
|
||||||
value => JSON.stringify(value)
|
value => JSON.stringify(value)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -24,17 +24,17 @@ export class LocalStorageSource {
|
||||||
static Get(key: string, defaultValue: string = undefined): UIEventSource<string> {
|
static Get(key: string, defaultValue: string = undefined): UIEventSource<string> {
|
||||||
try {
|
try {
|
||||||
const saved = localStorage.getItem(key);
|
const saved = localStorage.getItem(key);
|
||||||
const source = new UIEventSource<string>(saved ?? defaultValue, "localstorage:"+key);
|
const source = new UIEventSource<string>(saved ?? defaultValue, "localstorage:" + key);
|
||||||
|
|
||||||
source.addCallback((data) => {
|
source.addCallback((data) => {
|
||||||
try{
|
try {
|
||||||
localStorage.setItem(key, data);
|
localStorage.setItem(key, data);
|
||||||
}catch(e){
|
} catch (e) {
|
||||||
// Probably exceeded the quota with this item!
|
// Probably exceeded the quota with this item!
|
||||||
// Lets nuke everything
|
// Lets nuke everything
|
||||||
localStorage.clear()
|
localStorage.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
return source;
|
return source;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -69,6 +69,10 @@ export class QueryParameters {
|
||||||
return docs.join("\n\n");
|
return docs.join("\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static wasInitialized(key: string): boolean {
|
||||||
|
return QueryParameters._wasInitialized.has(key)
|
||||||
|
}
|
||||||
|
|
||||||
private static addOrder(key) {
|
private static addOrder(key) {
|
||||||
if (this.order.indexOf(key) < 0) {
|
if (this.order.indexOf(key) < 0) {
|
||||||
this.order.push(key)
|
this.order.push(key)
|
||||||
|
@ -104,10 +108,6 @@ export class QueryParameters {
|
||||||
console.log(QueryParameters.GenerateQueryParameterDocs())
|
console.log(QueryParameters.GenerateQueryParameterDocs())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static wasInitialized(key: string) : boolean{
|
|
||||||
return QueryParameters._wasInitialized.has(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Serialize() {
|
private static Serialize() {
|
||||||
const parts = []
|
const parts = []
|
||||||
|
|
|
@ -8,5 +8,5 @@ export default interface BaseLayer {
|
||||||
min_zoom: number;
|
min_zoom: number;
|
||||||
feature: any,
|
feature: any,
|
||||||
isBest?: boolean,
|
isBest?: boolean,
|
||||||
category?: "map" | "osmbasedmap" | "photo" | "historicphoto" | string
|
category?: "map" | "osmbasedmap" | "photo" | "historicphoto" | string
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue