Merge branch 'develop' into parking

This commit is contained in:
Robin van der Linde 2022-07-13 11:02:30 +02:00
commit 228df2aa9d
No known key found for this signature in database
GPG key ID: 53956B3252478F0D
148 changed files with 10053 additions and 1118 deletions

14
.gitignore vendored
View file

@ -2,7 +2,6 @@ dist/*
node_modules
.cache/*
.idea/*
.vscode/*
scratch
assets/editor-layer-index.json
assets/generated/*
@ -24,3 +23,16 @@ index_*.ts
.~lock.*
*.doctest.ts
service-worker.js
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix

14
.gitpod.yml Normal file
View file

@ -0,0 +1,14 @@
tasks:
- init: npm run init
command: npm run start
ports:
- name: MapComplete Website
port: 1234
onOpen: open-browser
vscode:
extensions:
- "esbenp.prettier-vscode"
- "eamodio.gitlens",
- "GitHub.vscode-pull-request-github"

7
.vscode/extensions.json vendored Normal file
View file

@ -0,0 +1,7 @@
{
"recommendations": [
"esbenp.prettier-vscode",
"eamodio.gitlens",
"GitHub.vscode-pull-request-github"
]
}

21
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,21 @@
{
"json.schemas": [
{
"fileMatch": [
"/assets/layers/*/*.json",
"!/assets/layers/*/license_info.json"
],
"url": "./Docs/Schemas/LayerConfigJson.schema.json"
},
{
"fileMatch": [
"/assets/themes/*/*.json",
"!/assets/themes/*/license_info.json"
],
"url": "./Docs/Schemas/LayoutConfigJson.schema.json"
}
],
"editor.tabSize": 2,
"files.autoSave": "onFocusChange",
"search.useIgnoreFiles": true
}

14
.vscode/tasks.json vendored Normal file
View file

@ -0,0 +1,14 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start",
"path": "/",
"group": "build",
"problemMatcher": [],
"label": "MapComplete Dev",
"detail": "Run MapComplete Dev Server"
}
]
}

View file

@ -19,7 +19,7 @@ export class AllKnownLayouts {
public static AllPublicLayers(options?: {
includeInlineLayers:true | boolean
}) {
}) : LayerConfig[] {
const allLayers: LayerConfig[] = []
const seendIds = new Set<string>()
AllKnownLayouts.sharedLayers.forEach((layer, key) => {

View file

@ -39,6 +39,7 @@
+ [export_as_geojson](#export_as_geojson)
+ [minimap](#minimap)
+ [wikipedia](#wikipedia)
+ [id_presets.shop_types](#id_presetsshop_types)
+ [school.capacity](#schoolcapacity)
+ [school.gender](#schoolgender)
@ -80,6 +81,7 @@
- climbing_gym
- climbing_route
- defibrillator
- doctors
- dogpark
- drinking_water
- entrance
@ -94,6 +96,7 @@
- nature_reserve
- observation_tower
- parking
- pharmacy
- picnic_table
- play_forest
- playground
@ -106,6 +109,7 @@
- surveillance_camera
- toilet
- trail
- transit_stops
- tree_node
- viewpoint
- village_green
@ -128,14 +132,18 @@
- cafe_pub
- climbing_club
- climbing_gym
- doctors
- food
- hackerspace
- hospital
- kindergarten_childcare
- nature_reserve
- observation_tower
- pharmacy
- playground
- recycling
- school
- shops
- tertiary_education
- veterinary
@ -154,11 +162,15 @@
- cafe_pub
- climbing_club
- climbing_gym
- doctors
- food
- hackerspace
- hospital
- kindergarten_childcare
- pharmacy
- recycling
- school
- shops
- tertiary_education
- veterinary
@ -177,11 +189,15 @@
- cafe_pub
- climbing_club
- climbing_gym
- doctors
- food
- hackerspace
- hospital
- kindergarten_childcare
- pharmacy
- recycling
- school
- shops
- tertiary_education
@ -200,8 +216,11 @@
- cafe_pub
- climbing_club
- climbing_gym
- doctors
- food
- kindergarten_childcare
- pharmacy
- shops
- veterinary
@ -296,6 +315,7 @@
- food
- hackerspace
- observation_tower
- transit_stops
@ -512,6 +532,17 @@
### id_presets.shop_types
- shops
### school.capacity

View file

@ -800,6 +800,7 @@ The following layers are included in MapComplete:
- [cycleways_and_roads](./Layers/cycleways_and_roads.md)
- [defibrillator](./Layers/defibrillator.md)
- [direction](./Layers/direction.md)
- [doctors](./Layers/doctors.md)
- [dogpark](./Layers/dogpark.md)
- [drinking_water](./Layers/drinking_water.md)
- [entrance](./Layers/entrance.md)
@ -814,9 +815,12 @@ The following layers are included in MapComplete:
- [grass_in_parks](./Layers/grass_in_parks.md)
- [hackerspace](./Layers/hackerspace.md)
- [home_location](./Layers/home_location.md)
- [hospital](./Layers/hospital.md)
- [hydrant](./Layers/hydrant.md)
- [id_presets](./Layers/id_presets.md)
- [import_candidate](./Layers/import_candidate.md)
- [information_board](./Layers/information_board.md)
- [kerbs](./Layers/kerbs.md)
- [kindergarten_childcare](./Layers/kindergarten_childcare.md)
- [left_right_style](./Layers/left_right_style.md)
- [map](./Layers/map.md)
@ -828,12 +832,14 @@ The following layers are included in MapComplete:
- [observation_tower](./Layers/observation_tower.md)
- [parking](./Layers/parking.md)
- [pedestrian_path](./Layers/pedestrian_path.md)
- [pharmacy](./Layers/pharmacy.md)
- [picnic_table](./Layers/picnic_table.md)
- [play_forest](./Layers/play_forest.md)
- [playground](./Layers/playground.md)
- [public_bookcase](./Layers/public_bookcase.md)
- [recycling](./Layers/recycling.md)
- [school](./Layers/school.md)
- [shelter](./Layers/shelter.md)
- [shops](./Layers/shops.md)
- [slow_roads](./Layers/slow_roads.md)
- [split_point](./Layers/split_point.md)
@ -843,6 +849,8 @@ The following layers are included in MapComplete:
- [tertiary_education](./Layers/tertiary_education.md)
- [toilet](./Layers/toilet.md)
- [trail](./Layers/trail.md)
- [transit_routes](./Layers/transit_routes.md)
- [transit_stops](./Layers/transit_stops.md)
- [tree_node](./Layers/tree_node.md)
- [type_node](./Layers/type_node.md)
- [veterinary](./Layers/veterinary.md)

View file

@ -27,6 +27,7 @@ A layer showing where you can park your bike
- [cyclofix](https://mapcomplete.osm.be/cyclofix)
- [personal](https://mapcomplete.osm.be/personal)
- [transit](https://mapcomplete.osm.be/transit)

View file

@ -28,6 +28,7 @@ Crossings for pedestrians and cyclists
- [cycle_infra](https://mapcomplete.osm.be/cycle_infra)
- [kerbs_and_crossings](https://mapcomplete.osm.be/kerbs_and_crossings)
- [personal](https://mapcomplete.osm.be/personal)

View file

@ -17,6 +17,7 @@ All infrastructure that someone can cycle over, accompanied with questions about
- This layer is shown at zoomlevel **16** and higher
- This layer is needed as dependency for layer [barrier](#barrier)
- This layer is needed as dependency for layer [crossings](#crossings)
- This layer is needed as dependency for layer [kerbs](#kerbs)
@ -28,6 +29,7 @@ All infrastructure that someone can cycle over, accompanied with questions about
- [cycle_infra](https://mapcomplete.osm.be/cycle_infra)
- [kerbs_and_crossings](https://mapcomplete.osm.be/kerbs_and_crossings)
- [personal](https://mapcomplete.osm.be/personal)
@ -42,10 +44,10 @@ Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dcycleway' target='_blank'>cycleway</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:cycleway' target='_blank'>cycleway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dlane' target='_blank'>lane</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:cycleway' target='_blank'>cycleway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dshared_lane' target='_blank'>shared_lane</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:cycleway' target='_blank'>cycleway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dtrack' target='_blank'>track</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:cyclestreet' target='_blank'>cyclestreet</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:cyclestreet%3Dyes' target='_blank'>yes</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dresidential' target='_blank'>residential</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dtertiary' target='_blank'>tertiary</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dunclassified' target='_blank'>unclassified</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dprimary' target='_blank'>primary</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dsecondary' target='_blank'>secondary</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dpath' target='_blank'>path</a>&<a href='https://wiki.openstreetmap.org/wiki/Key:bicycle' target='_blank'>bicycle</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bicycle%3Ddesignated' target='_blank'>designated</a>
- <a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dcycleway' target='_blank'>cycleway</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:cycleway' target='_blank'>cycleway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dlane' target='_blank'>lane</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:cycleway' target='_blank'>cycleway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dshared_lane' target='_blank'>shared_lane</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:cycleway' target='_blank'>cycleway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:cycleway%3Dtrack' target='_blank'>track</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:cyclestreet' target='_blank'>cyclestreet</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:cyclestreet%3Dyes' target='_blank'>yes</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dresidential' target='_blank'>residential</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dtertiary' target='_blank'>tertiary</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dunclassified' target='_blank'>unclassified</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dprimary' target='_blank'>primary</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dsecondary' target='_blank'>secondary</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dtertiary_link' target='_blank'>tertiary_link</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dprimary_link' target='_blank'>primary_link</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dsecondary_link' target='_blank'>secondary_link</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dservice' target='_blank'>service</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dfootway' target='_blank'>footway</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dpedestrian' target='_blank'>pedestrian</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dliving_street' target='_blank'>living_street</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dpath' target='_blank'>path</a>&<a href='https://wiki.openstreetmap.org/wiki/Key:bicycle' target='_blank'>bicycle</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bicycle%3Ddesignated' target='_blank'>designated</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22cyclestreet%22%3D%22yes%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22cycleway%22%3D%22lane%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22cycleway%22%3D%22shared_lane%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22cycleway%22%3D%22track%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22cycleway%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22residential%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22tertiary%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22unclassified%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22primary%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22secondary%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22bicycle%22%3D%22designated%22%5D%5B%22highway%22%3D%22path%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22cyclestreet%22%3D%22yes%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22cycleway%22%3D%22lane%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22cycleway%22%3D%22shared_lane%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22cycleway%22%3D%22track%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22cycleway%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22residential%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22tertiary%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22unclassified%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22primary%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22secondary%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22tertiary_link%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22primary_link%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22secondary_link%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22service%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22footway%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22pedestrian%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22living_street%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22bicycle%22%3D%22designated%22%5D%5B%22highway%22%3D%22path%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)

176
Docs/Layers/doctors.md Normal file
View file

@ -0,0 +1,176 @@
doctors
=========
<img src='https://mapcomplete.osm.be/circle:white;./assets/layers/doctors/doctors.svg' height="100px">
- This layer is shown at zoomlevel **13** and higher
#### Themes using this layer
- [healthcare](https://mapcomplete.osm.be/healthcare)
- [personal](https://mapcomplete.osm.be/personal)
Basic tags for this layer
---------------------------
Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Ddoctors' target='_blank'>doctors</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Ddentist' target='_blank'>dentist</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:healthcare' target='_blank'>healthcare</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:healthcare%3Dphysiotherapist' target='_blank'>physiotherapist</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22amenity%22%3D%22doctors%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22dentist%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22healthcare%22%3D%22physiotherapist%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/healthcare:speciality#values) [healthcare:speciality](https://wiki.openstreetmap.org/wiki/Key:healthcare:speciality) | [string](../SpecialInputElements.md#string) | [general](https://wiki.openstreetmap.org/wiki/Tag:healthcare:speciality%3Dgeneral) [gynaecology](https://wiki.openstreetmap.org/wiki/Tag:healthcare:speciality%3Dgynaecology) [psychiatry](https://wiki.openstreetmap.org/wiki/Tag:healthcare:speciality%3Dpsychiatry) [paediatrics](https://wiki.openstreetmap.org/wiki/Tag:healthcare:speciality%3Dpaediatrics)
### images
This tagrendering has no question and is thus read-only
### opening_hours
The question is What are the opening hours of {title()}?
This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours)
This is rendered with <h3>Opening hours</h3>{opening_hours_table(opening_hours)}
### phone
The question is What is the phone number of {title()}?
This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone)
This is rendered with <a href='tel:{phone}'>{phone}</a>
- <a href='tel:{contact:phone}'>{contact:phone}</a> corresponds with contact:phone~^..*$
- This option cannot be chosen as answer
### email
The question is What is the email address of {title()}?
This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email)
This is rendered with <a href='mailto:{email}' target='_blank'>{email}</a>
- <a href='mailto:{contact:email}' target='_blank'>{contact:email}</a> corresponds with contact:email~^..*$
- This option cannot be chosen as answer
### website
The question is What is the website of {title()}?
This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website)
This is rendered with <a href='{website}' target='_blank'>{website}</a>
- <a href='{contact:website}' target='_blank'>{contact:website}</a> corresponds with contact:website~^..*$
- This option cannot be chosen as answer
### specialty
The question is What is this doctor specialized in?
This rendering asks information about the property [healthcare:speciality](https://wiki.openstreetmap.org/wiki/Key:healthcare:speciality)
This is rendered with This doctor is specialized in {healthcare:speciality}
- This is a general practitioner corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:healthcare:speciality' target='_blank'>healthcare:speciality</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:healthcare:speciality%3Dgeneral' target='_blank'>general</a>
- This is a gynaecologist corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:healthcare:speciality' target='_blank'>healthcare:speciality</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:healthcare:speciality%3Dgynaecology' target='_blank'>gynaecology</a>
- This is a psychiatrist corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:healthcare:speciality' target='_blank'>healthcare:speciality</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:healthcare:speciality%3Dpsychiatry' target='_blank'>psychiatry</a>
- This is a paediatrician corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:healthcare:speciality' target='_blank'>healthcare:speciality</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:healthcare:speciality%3Dpaediatrics' target='_blank'>paediatrics</a>
Only visible if `amenity=doctors` is shown
This document is autogenerated from [assets/layers/doctors/doctors.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/doctors/doctors.json)

File diff suppressed because one or more lines are too long

141
Docs/Layers/hospital.md Normal file
View file

@ -0,0 +1,141 @@
hospital
==========
<img src='https://mapcomplete.osm.be/circle:white;./assets/layers/hospital/hospital.svg' height="100px">
- This layer is shown at zoomlevel **12** and higher
#### Themes using this layer
- [healthcare](https://mapcomplete.osm.be/healthcare)
- [personal](https://mapcomplete.osm.be/personal)
Basic tags for this layer
---------------------------
Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dhospital' target='_blank'>hospital</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22amenity%22%3D%22hospital%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) |
### name
The question is What does the of the hospital ?
This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name)
This is rendered with Name of the hospital name is {name}
### phone
The question is What is the phone number of {title()}?
This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone)
This is rendered with <a href='tel:{phone}'>{phone}</a>
- <a href='tel:{contact:phone}'>{contact:phone}</a> corresponds with contact:phone~^..*$
- This option cannot be chosen as answer
### email
The question is What is the email address of {title()}?
This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email)
This is rendered with <a href='mailto:{email}' target='_blank'>{email}</a>
- <a href='mailto:{contact:email}' target='_blank'>{contact:email}</a> corresponds with contact:email~^..*$
- This option cannot be chosen as answer
### website
The question is What is the website of {title()}?
This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website)
This is rendered with <a href='{website}' target='_blank'>{website}</a>
- <a href='{contact:website}' target='_blank'>{contact:website}</a> corresponds with contact:website~^..*$
- This option cannot be chosen as answer
This document is autogenerated from [assets/layers/hospital/hospital.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/hospital/hospital.json)

398
Docs/Layers/id_presets.md Normal file

File diff suppressed because one or more lines are too long

128
Docs/Layers/kerbs.md Normal file
View file

@ -0,0 +1,128 @@
kerbs
=======
<img src='https://mapcomplete.osm.be/./assets/layers/kerbs/KerbIcon.svg' height="100px">
A layer showing kerbs.
- This layer is shown at zoomlevel **13** and higher
- This layer will automatically load [cycleways_and_roads](./cycleways_and_roads.md) into the layout as it depends on it: a preset snaps to this layer (presets[0])
- This layer will automatically load [kerbs](./kerbs.md) into the layout as it depends on it: a preset snaps to this layer (presets[0])
- This layer is needed as dependency for layer [kerbs](#kerbs)
#### Themes using this layer
- [kerbs_and_crossings](https://mapcomplete.osm.be/kerbs_and_crossings)
- [personal](https://mapcomplete.osm.be/personal)
Basic tags for this layer
---------------------------
Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:barrier' target='_blank'>barrier</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:barrier%3Dkerb' target='_blank'>kerb</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22barrier%22%3D%22kerb%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/kerb#values) [kerb](https://wiki.openstreetmap.org/wiki/Key:kerb) | Multiple choice | [raised](https://wiki.openstreetmap.org/wiki/Tag:kerb%3Draised) [lowered](https://wiki.openstreetmap.org/wiki/Tag:kerb%3Dlowered) [flush](https://wiki.openstreetmap.org/wiki/Tag:kerb%3Dflush)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/tactile_paving#values) [tactile_paving](https://wiki.openstreetmap.org/wiki/Key:tactile_paving) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dno)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/kerb:height#values) [kerb:height](https://wiki.openstreetmap.org/wiki/Key:kerb:height) | [pnat](../SpecialInputElements.md#pnat) |
### kerb-type
The question is What is the height of this kerb?
- This kerb is raised (>3 cm) corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:kerb' target='_blank'>kerb</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:kerb%3Draised' target='_blank'>raised</a>
- This kerb is lowered (~3 cm) corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:kerb' target='_blank'>kerb</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:kerb%3Dlowered' target='_blank'>lowered</a>
- This kerb is flush (~0cm) corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:kerb' target='_blank'>kerb</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:kerb%3Dflush' target='_blank'>flush</a>
- There is no kerb here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:kerb' target='_blank'>kerb</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:kerb%3Dno' target='_blank'>no</a>
- This option cannot be chosen as answer
- There is a kerb of unknown height corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:kerb' target='_blank'>kerb</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:kerb%3Dyes' target='_blank'>yes</a>
- This option cannot be chosen as answer
Only visible if `_geometry:type=Point` is shown
### tactile-paving
The question is Is there tactile paving at this kerb?
- This kerb has tactile paving. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:tactile_paving' target='_blank'>tactile_paving</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dyes' target='_blank'>yes</a>
- This kerb does not have tactile paving. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:tactile_paving' target='_blank'>tactile_paving</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dno' target='_blank'>no</a>
- This kerb has tactile paving, but it is incorrect corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:tactile_paving' target='_blank'>tactile_paving</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dincorrect' target='_blank'>incorrect</a>
- This option cannot be chosen as answer
Only visible if `_geometry:type=Point` is shown
### kerb-height
The question is What is the height of this kerb?
This rendering asks information about the property [kerb:height](https://wiki.openstreetmap.org/wiki/Key:kerb:height)
This is rendered with Kerb height: {{kerb:height}}
This document is autogenerated from [assets/layers/kerbs/kerbs.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/kerbs/kerbs.json)

View file

@ -81,6 +81,8 @@ This is rendered with The maximum allowed speed on this road is {maxspeed}
- This is a living street, which has a maxspeed of 20km/h corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dliving_street' target='_blank'>living_street</a>&_country!=be
- This option cannot be chosen as answer
- This is a living street, which has a maxspeed of 20km/h corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dliving_street' target='_blank'>living_street</a>

View file

@ -27,6 +27,7 @@ A layer showing car parkings
- [parkings](https://mapcomplete.osm.be/parkings)
- [personal](https://mapcomplete.osm.be/personal)
- [transit](https://mapcomplete.osm.be/transit)

170
Docs/Layers/pharmacy.md Normal file
View file

@ -0,0 +1,170 @@
pharmacy
==========
<img src='https://mapcomplete.osm.be/./assets/layers/pharmacy/pharmacy.svg' height="100px">
- This layer is shown at zoomlevel **13** and higher
#### Themes using this layer
- [healthcare](https://mapcomplete.osm.be/healthcare)
- [personal](https://mapcomplete.osm.be/personal)
- [shops](https://mapcomplete.osm.be/shops)
Basic tags for this layer
---------------------------
Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dpharmacy' target='_blank'>pharmacy</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22amenity%22%3D%22pharmacy%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited)
### images
This tagrendering has no question and is thus read-only
### opening_hours
The question is What are the opening hours of {title()}?
This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours)
This is rendered with <h3>Opening hours</h3>{opening_hours_table(opening_hours)}
### phone
The question is What is the phone number of {title()}?
This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone)
This is rendered with <a href='tel:{phone}'>{phone}</a>
- <a href='tel:{contact:phone}'>{contact:phone}</a> corresponds with contact:phone~^..*$
- This option cannot be chosen as answer
### email
The question is What is the email address of {title()}?
This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email)
This is rendered with <a href='mailto:{email}' target='_blank'>{email}</a>
- <a href='mailto:{contact:email}' target='_blank'>{contact:email}</a> corresponds with contact:email~^..*$
- This option cannot be chosen as answer
### website
The question is What is the website of {title()}?
This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website)
This is rendered with <a href='{website}' target='_blank'>{website}</a>
- <a href='{contact:website}' target='_blank'>{contact:website}</a> corresponds with contact:website~^..*$
- This option cannot be chosen as answer
### wheelchair
The question is Is this pharmacy easy to access on a wheelchair?
- This pharmacy is easy to access on a wheelchair corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:wheelchair' target='_blank'>wheelchair</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes' target='_blank'>yes</a>
- This pharmacy is hard to access on a wheelchair corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:wheelchair' target='_blank'>wheelchair</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno' target='_blank'>no</a>
- This pharmacy has limited access for wheelchair users corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:wheelchair' target='_blank'>wheelchair</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited' target='_blank'>limited</a>
This document is autogenerated from [assets/layers/pharmacy/pharmacy.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/pharmacy/pharmacy.json)

91
Docs/Layers/shelter.md Normal file
View file

@ -0,0 +1,91 @@
shelter
=========
<img src='https://mapcomplete.osm.be/./assets/layers/shelter/shelter.svg' height="100px">
Layer showing shelter structures
- This layer is shown at zoomlevel **13** and higher
#### Themes using this layer
- [personal](https://mapcomplete.osm.be/personal)
- [transit](https://mapcomplete.osm.be/transit)
Basic tags for this layer
---------------------------
Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dshelter' target='_blank'>shelter</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22amenity%22%3D%22shelter%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/shelter_type#values) [shelter_type](https://wiki.openstreetmap.org/wiki/Key:shelter_type) | [string](../SpecialInputElements.md#string) | [public_transport](https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dpublic_transport) [picnic_shelter](https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dpicnic_shelter) [gazebo](https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dgazebo) [weather_shelter](https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dweather_shelter) [lean_to](https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dlean_to) [pavilion](https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dpavilion) [basic_hut](https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dbasic_hut)
### shelter-type
The question is What kind of shelter is this?
This rendering asks information about the property [shelter_type](https://wiki.openstreetmap.org/wiki/Key:shelter_type)
This is rendered with Shelter type: {shelter_type}
- This is a shelter at a public transport stop. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter_type' target='_blank'>shelter_type</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dpublic_transport' target='_blank'>public_transport</a>
- This is a shelter protecting from rain at a picnic site. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter_type' target='_blank'>shelter_type</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dpicnic_shelter' target='_blank'>picnic_shelter</a>
- This is a gazebo. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter_type' target='_blank'>shelter_type</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dgazebo' target='_blank'>gazebo</a>
- This is a small shelter, primarily intended for short breaks. Usually found in the mountains or alongside roads. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter_type' target='_blank'>shelter_type</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dweather_shelter' target='_blank'>weather_shelter</a>
- This is a shed with 3 walls, primarily intended for camping. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter_type' target='_blank'>shelter_type</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dlean_to' target='_blank'>lean_to</a>
- This is a pavilion corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter_type' target='_blank'>shelter_type</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dpavilion' target='_blank'>pavilion</a>
- This is a basic hut, providing basic shelter and sleeping facilities. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter_type' target='_blank'>shelter_type</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dbasic_hut' target='_blank'>basic_hut</a>
This document is autogenerated from [assets/layers/shelter/shelter.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/shelter/shelter.json)

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,172 @@
transit_routes
================
Layer showing bus lines
- This layer is shown at zoomlevel **15** and higher
- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings`
#### Themes using this layer
- [personal](https://mapcomplete.osm.be/personal)
- [transit](https://mapcomplete.osm.be/transit)
Basic tags for this layer
---------------------------
Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:type' target='_blank'>type</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:type%3Droute' target='_blank'>route</a>
- <a href='https://wiki.openstreetmap.org/wiki/Key:route' target='_blank'>route</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:route%3Dbus' target='_blank'>bus</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22route%22%3D%22bus%22%5D%5B%22type%22%3D%22route%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/from#values) [from](https://wiki.openstreetmap.org/wiki/Key:from) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/via#values) [via](https://wiki.openstreetmap.org/wiki/Key:via) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/to#values) [to](https://wiki.openstreetmap.org/wiki/Key:to) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/colour#values) [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [color](../SpecialInputElements.md#color) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/network#values) [network](https://wiki.openstreetmap.org/wiki/Key:network) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) |
### name
The question is What is the name for this bus line? (i.e. Bus XX: From => Via => To)
This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name)
This is rendered with {name}
### from
The question is What is the starting point for this bus line?
This rendering asks information about the property [from](https://wiki.openstreetmap.org/wiki/Key:from)
This is rendered with This bus line begins at {from}
### via
The question is What is the via point for this bus line?
This rendering asks information about the property [via](https://wiki.openstreetmap.org/wiki/Key:via)
This is rendered with This bus line goes via {via}
### to
The question is What is the ending point for this bus line?
This rendering asks information about the property [to](https://wiki.openstreetmap.org/wiki/Key:to)
This is rendered with This bus line ends at {to}
### colour
The question is What is the colour for this bus line?
This rendering asks information about the property [colour](https://wiki.openstreetmap.org/wiki/Key:colour)
This is rendered with This bus line has the color {colour}
### network
The question is What network does this bus line belong to?
This rendering asks information about the property [network](https://wiki.openstreetmap.org/wiki/Key:network)
This is rendered with This bus line is part of the {network} network
### operator
The question is What company operates this bus line?
This rendering asks information about the property [operator](https://wiki.openstreetmap.org/wiki/Key:operator)
This is rendered with This bus line is operated by {operator}
This document is autogenerated from [assets/layers/transit_routes/transit_routes.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/transit_routes/transit_routes.json)

View file

@ -0,0 +1,240 @@
transit_stops
===============
<img src='https://mapcomplete.osm.be/./assets/layers/transit_stops/bus_stop.svg' height="100px">
Layer showing different types of transit stops.
- This layer is shown at zoomlevel **15** and higher
#### Themes using this layer
- [personal](https://mapcomplete.osm.be/personal)
- [transit](https://mapcomplete.osm.be/transit)
Basic tags for this layer
---------------------------
Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:highway' target='_blank'>highway</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:highway%3Dbus_stop' target='_blank'>bus_stop</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22highway%22%3D%22bus_stop%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:name%3D)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/shelter#values) [shelter](https://wiki.openstreetmap.org/wiki/Key:shelter) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:shelter%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:shelter%3Dno)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/bench#values) [bench](https://wiki.openstreetmap.org/wiki/Key:bench) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:bench%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:bench%3Dno)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/bin#values) [bin](https://wiki.openstreetmap.org/wiki/Key:bin) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:bin%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:bin%3Dno)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/tactile_paving#values) [tactile_paving](https://wiki.openstreetmap.org/wiki/Key:tactile_paving) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dno)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/lit#values) [lit](https://wiki.openstreetmap.org/wiki/Key:lit) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dno)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/departures_board#values) [departures_board](https://wiki.openstreetmap.org/wiki/Key:departures_board) | Multiple choice | [realtime](https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Drealtime) [timetable](https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Dtimetable) [interval](https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Dinterval) [no](https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Dno)
### stop_name
The question is What is the name of this stop?
This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name)
This is rendered with This stop is called <b>{name}</b>
- This stop has no name corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:noname' target='_blank'>noname</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:noname%3Dyes' target='_blank'>yes</a>
### images
This tagrendering has no question and is thus read-only
### shelter
The question is Does this stop have a shelter?
- This stop has a shelter corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter' target='_blank'>shelter</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter%3Dyes' target='_blank'>yes</a>
- This stop does not have a shelter corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter' target='_blank'>shelter</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter%3Dno' target='_blank'>no</a>
- This stop has a shelter, that's separately mapped corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shelter' target='_blank'>shelter</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shelter%3Dseparate' target='_blank'>separate</a>
- This option cannot be chosen as answer
### bench
The question is Does this stop have a bench?
- This stop has a bench corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bench' target='_blank'>bench</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bench%3Dyes' target='_blank'>yes</a>
- This stop does not have a bench corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bench' target='_blank'>bench</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bench%3Dno' target='_blank'>no</a>
- This stop has a bench, that's separately mapped corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bench' target='_blank'>bench</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bench%3Dseparate' target='_blank'>separate</a>
- This option cannot be chosen as answer
### bin
The question is Does this stop have a bin?
- This stop has a bin corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bin' target='_blank'>bin</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bin%3Dyes' target='_blank'>yes</a>
- This stop does not have a bin corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bin' target='_blank'>bin</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bin%3Dno' target='_blank'>no</a>
- This stop has a bin, that's separately mapped corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bin' target='_blank'>bin</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bin%3Dseparate' target='_blank'>separate</a>
- This option cannot be chosen as answer
### wheelchair-access
The question is Is this place accessible with a wheelchair?
- This place is specially adapted for wheelchair users corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:wheelchair' target='_blank'>wheelchair</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated' target='_blank'>designated</a>
- This place is easily reachable with a wheelchair corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:wheelchair' target='_blank'>wheelchair</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes' target='_blank'>yes</a>
- It is possible to reach this place in a wheelchair, but it is not easy corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:wheelchair' target='_blank'>wheelchair</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited' target='_blank'>limited</a>
- This place is not reachable with a wheelchair corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:wheelchair' target='_blank'>wheelchair</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno' target='_blank'>no</a>
### tactile_paving
The question is Does this stop have tactile paving?
- This stop has tactile paving corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:tactile_paving' target='_blank'>tactile_paving</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dyes' target='_blank'>yes</a>
- This stop does not have tactile paving corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:tactile_paving' target='_blank'>tactile_paving</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:tactile_paving%3Dno' target='_blank'>no</a>
### lit
The question is Is this stop lit?
- This stop is lit corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:lit' target='_blank'>lit</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:lit%3Dyes' target='_blank'>yes</a>
- This stop is not lit corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:lit' target='_blank'>lit</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:lit%3Dno' target='_blank'>no</a>
### departures_board
This tagrendering has no question and is thus read-only
- This stop has a departures board of unknown type corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:departures_board' target='_blank'>departures_board</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Dyes' target='_blank'>yes</a>
- This option cannot be chosen as answer
- This stop has a board showing realtime departure information corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:departures_board' target='_blank'>departures_board</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Drealtime' target='_blank'>realtime</a>
- This stop has a board showing realtime departure information corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:passenger_information_display' target='_blank'>passenger_information_display</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:passenger_information_display%3Dyes' target='_blank'>yes</a>
- This option cannot be chosen as answer
- This stop has a timetable showing regular departures corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:departures_board' target='_blank'>departures_board</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Dtimetable' target='_blank'>timetable</a>
- This stop has a timetable containing just the interval between departures corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:departures_board' target='_blank'>departures_board</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Dinterval' target='_blank'>interval</a>
- This stop does not have a departures board corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:departures_board' target='_blank'>departures_board</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:departures_board%3Dno' target='_blank'>no</a>
### contained_routes
This tagrendering has no question and is thus read-only
Only visible if `_contained_routes~^..*$` is shown
This document is autogenerated from [assets/layers/transit_stops/transit_stops.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/transit_stops/transit_stops.json)

View file

@ -60,6 +60,41 @@
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
"value": "secondary"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
"value": "tertiary_link"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
"value": "primary_link"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
"value": "secondary_link"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
"value": "service"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
"value": "footway"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
"value": "pedestrian"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",
"value": "living_street"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways and roads showing features with this tag",

View file

@ -0,0 +1,194 @@
{
"data_format": 1,
"project": {
"name": "MapComplete Healthcare",
"description": "On this map, various healthcare related items are shown",
"project_url": "https://mapcomplete.osm.be/healthcare",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/layers/doctors/doctors.svg",
"contact_name": "Pieter Vander Vennet, MapComplete",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "amenity",
"description": "The MapComplete theme Healthcare has a layer doctors showing features with this tag",
"value": "doctors"
},
{
"key": "amenity",
"description": "The MapComplete theme Healthcare has a layer doctors showing features with this tag",
"value": "dentist"
},
{
"key": "healthcare",
"description": "The MapComplete theme Healthcare has a layer doctors showing features with this tag",
"value": "physiotherapist"
},
{
"key": "image",
"description": "The layer 'doctors allows to upload images and adds them under the 'image'-tag (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 'doctors allows to upload images and adds them under the 'image'-tag (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 'doctors allows to upload images and adds them under the 'image'-tag (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 'doctors allows to upload images and adds them under the 'image'-tag (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 'doctors' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "phone",
"description": "Layer 'doctors' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:phone",
"description": "Layer 'doctors' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "email",
"description": "Layer 'doctors' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:email",
"description": "Layer 'doctors' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "website",
"description": "Layer 'doctors' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:website",
"description": "Layer 'doctors' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "healthcare:speciality",
"description": "Layer 'doctors' shows and asks freeform values for key 'healthcare:speciality' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "healthcare:speciality",
"description": "Layer 'doctors' shows healthcare:speciality=general with a fixed text, namely 'This is a general practitioner' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Healthcare')",
"value": "general"
},
{
"key": "healthcare:speciality",
"description": "Layer 'doctors' shows healthcare:speciality=gynaecology with a fixed text, namely 'This is a gynaecologist' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Healthcare')",
"value": "gynaecology"
},
{
"key": "healthcare:speciality",
"description": "Layer 'doctors' shows healthcare:speciality=psychiatry with a fixed text, namely 'This is a psychiatrist' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Healthcare')",
"value": "psychiatry"
},
{
"key": "healthcare:speciality",
"description": "Layer 'doctors' shows healthcare:speciality=paediatrics with a fixed text, namely 'This is a paediatrician' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Healthcare')",
"value": "paediatrics"
},
{
"key": "amenity",
"description": "The MapComplete theme Healthcare has a layer Hospital showing features with this tag",
"value": "hospital"
},
{
"key": "name",
"description": "Layer 'Hospital' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "phone",
"description": "Layer 'Hospital' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:phone",
"description": "Layer 'Hospital' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "email",
"description": "Layer 'Hospital' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:email",
"description": "Layer 'Hospital' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "website",
"description": "Layer 'Hospital' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:website",
"description": "Layer 'Hospital' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "amenity",
"description": "The MapComplete theme Healthcare has a layer pharmacy showing features with this tag",
"value": "pharmacy"
},
{
"key": "image",
"description": "The layer 'pharmacy allows to upload images and adds them under the 'image'-tag (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 'pharmacy allows to upload images and adds them under the 'image'-tag (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 'pharmacy allows to upload images and adds them under the 'image'-tag (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 'pharmacy allows to upload images and adds them under the 'image'-tag (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 'pharmacy' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "phone",
"description": "Layer 'pharmacy' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:phone",
"description": "Layer 'pharmacy' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "email",
"description": "Layer 'pharmacy' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:email",
"description": "Layer 'pharmacy' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "website",
"description": "Layer 'pharmacy' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "contact:website",
"description": "Layer 'pharmacy' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Healthcare')"
},
{
"key": "wheelchair",
"description": "Layer 'pharmacy' shows wheelchair=yes with a fixed text, namely 'This pharmacy is easy to access on a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Healthcare')",
"value": "yes"
},
{
"key": "wheelchair",
"description": "Layer 'pharmacy' shows wheelchair=no with a fixed text, namely 'This pharmacy is hard to access on a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Healthcare')",
"value": "no"
},
{
"key": "wheelchair",
"description": "Layer 'pharmacy' shows wheelchair=limited with a fixed text, namely 'This pharmacy has limited access for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Healthcare')",
"value": "limited"
}
]
}

View file

@ -0,0 +1,726 @@
{
"data_format": 1,
"project": {
"name": "MapComplete Kerbs and crossings",
"description": "A map showing kerbs and crossings",
"project_url": "https://mapcomplete.osm.be/kerbs_and_crossings",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/layers/kerbs/KerbIcon.svg",
"contact_name": "Pieter Vander Vennet, Robin van der Linde",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "cycleway"
},
{
"key": "cycleway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "lane"
},
{
"key": "cycleway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "shared_lane"
},
{
"key": "cycleway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "track"
},
{
"key": "cyclestreet",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "yes"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "residential"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "tertiary"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "unclassified"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "primary"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "secondary"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "tertiary_link"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "primary_link"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "secondary_link"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "service"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "footway"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "pedestrian"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "living_street"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "path"
},
{
"key": "bicycle",
"description": "The MapComplete theme Kerbs and crossings has a layer Cycleways and roads showing features with this tag",
"value": "designated"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways and roads' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "shared_lane"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways and roads' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (separated with paint)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "lane"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways and roads' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn separately from this road on the map.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "track"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways and roads' shows cycleway=separate with a fixed text, namely 'There is a separately drawn cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "separate"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways and roads' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "lit",
"description": "Layer 'Cycleways and roads' shows lit=yes with a fixed text, namely 'This street is lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "lit",
"description": "Layer 'Cycleways and roads' shows lit=no with a fixed text, namely 'This road is not lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "lit",
"description": "Layer 'Cycleways and roads' shows lit=sunset-sunrise with a fixed text, namely 'This road is lit at night' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "sunset-sunrise"
},
{
"key": "lit",
"description": "Layer 'Cycleways and roads' shows lit=24/7 with a fixed text, namely 'This road is lit 24/7' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "24/7"
},
{
"key": "cyclestreet",
"description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'Cycleways and roads' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'Cycleways and roads' shows with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'maxspeed' (in the MapComplete.osm.be theme 'Kerbs and crossings')"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways and roads' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "20"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways and roads' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "30"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways and roads' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "50"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways and roads' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "70"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways and roads' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "90"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:surface' (in the MapComplete.osm.be theme 'Kerbs and crossings')"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=unpaved with a fixed text, namely 'This cycleway is unpaved' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "unpaved"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "paved"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "asphalt"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "paving_stones"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "concrete"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "cobblestone"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "unhewn_cobblestone"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "sett"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "wood"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "gravel"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "fine_gravel"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "pebblestone"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways and roads' shows cycleway:surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "ground"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "excellent"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "good"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "intermediate"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "bad"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "very_bad"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "horrible"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "very_horrible"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways and roads' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "impassable"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'surface' (in the MapComplete.osm.be theme 'Kerbs and crossings')"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=unpaved with a fixed text, namely 'This cycleway is unhardened' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "unpaved"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=paved with a fixed text, namely 'This cycleway is paved' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "paved"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "asphalt"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=paving_stones with a fixed text, namely 'This cycleway is made of smooth paving stones' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "paving_stones"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "concrete"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone (unhewn or sett)' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "cobblestone"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=unhewn_cobblestone with a fixed text, namely 'This cycleway is made of raw, natural cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "unhewn_cobblestone"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=sett with a fixed text, namely 'This cycleway is made of flat, square cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "sett"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "wood"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=gravel with a fixed text, namely 'This cycleway is made of gravel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "gravel"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=fine_gravel with a fixed text, namely 'This cycleway is made of fine gravel' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "fine_gravel"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=pebblestone with a fixed text, namely 'This cycleway is made of pebblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "pebblestone"
},
{
"key": "surface",
"description": "Layer 'Cycleways and roads' shows surface=ground with a fixed text, namely 'This cycleway is made from raw ground' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "ground"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways and roads' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "excellent"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways and roads' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "good"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways and roads' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "intermediate"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways and roads' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "bad"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways and roads' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "very_bad"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways and roads' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "horrible"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways and roads' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "very_horrible"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways and roads' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "impassable"
},
{
"key": "width:carriageway",
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'width:carriageway' (in the MapComplete.osm.be theme 'Kerbs and crossings')"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D7"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign~^BE:D7;.*$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)<br>' (in the MapComplete.osm.be theme 'Kerbs and crossings')"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D9"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D10"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "none"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D7"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways and roads' shows traffic_sign~^BE:D7;.*$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)<br>' (in the MapComplete.osm.be theme 'Kerbs and crossings')"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D9"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways and roads' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D10"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G11 with a fixed text, namely 'Compulsory cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "NL:G11"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G12a with a fixed text, namely 'Compulsory (moped)cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "NL:G12a"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways and roads' shows traffic_sign=NL:G13 with a fixed text, namely 'Non-compulsory cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "NL:G13"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways and roads' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "none"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely 'Mopeds must use the cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D7;BE:M6"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely 'Speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D7;BE:M13"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely 'Mopeds and speedpedelecs must use the cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D7;BE:M14"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely 'Mopeds are not allowed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D7;BE:M7"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely 'Speedpedelecs are not allowed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D7;BE:M15"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely 'Mopeds and speedpedelecs are not allowed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "BE:D7;BE:M16"
},
{
"key": "cycleway:traffic_sign:supplementary",
"description": "Layer 'Cycleways and roads' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "none"
},
{
"key": "cycleway:buffer",
"description": "Layer 'Cycleways and roads' shows and asks freeform values for key 'cycleway:buffer' (in the MapComplete.osm.be theme 'Kerbs and crossings')"
},
{
"key": "cycleway:separation",
"description": "Layer 'Cycleways and roads' shows cycleway:separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "dashed_line"
},
{
"key": "cycleway:separation",
"description": "Layer 'Cycleways and roads' shows cycleway:separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "solid_line"
},
{
"key": "cycleway:separation",
"description": "Layer 'Cycleways and roads' shows cycleway:separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "parking_lane"
},
{
"key": "cycleway:separation",
"description": "Layer 'Cycleways and roads' shows cycleway:separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "kerb"
},
{
"key": "separation",
"description": "Layer 'Cycleways and roads' shows separation=dashed_line with a fixed text, namely 'This cycleway is separated by a dashed line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "dashed_line"
},
{
"key": "separation",
"description": "Layer 'Cycleways and roads' shows separation=solid_line with a fixed text, namely 'This cycleway is separated by a solid line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "solid_line"
},
{
"key": "separation",
"description": "Layer 'Cycleways and roads' shows separation=parking_lane with a fixed text, namely 'This cycleway is separated by a parking lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "parking_lane"
},
{
"key": "separation",
"description": "Layer 'Cycleways and roads' shows separation=kerb with a fixed text, namely 'This cycleway is separated by a kerb' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "kerb"
},
{
"key": "highway",
"description": "The MapComplete theme Kerbs and crossings has a layer Crossings showing features with this tag",
"value": "crossing"
},
{
"key": "crossing",
"description": "Layer 'Crossings' shows crossing=uncontrolled with a fixed text, namely 'Crossing, without traffic lights' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "uncontrolled"
},
{
"key": "crossing",
"description": "Layer 'Crossings' shows crossing=traffic_signals with a fixed text, namely 'Crossing with traffic signals' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "traffic_signals"
},
{
"key": "crossing",
"description": "Layer 'Crossings' shows crossing=zebra with a fixed text, namely 'Zebra crossing' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "zebra"
},
{
"key": "crossing",
"description": "Layer 'Crossings' shows crossing=unmarked with a fixed text, namely 'Crossing without crossing markings' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "unmarked"
},
{
"key": "crossing_ref",
"description": "Layer 'Crossings' shows crossing_ref=zebra with a fixed text, namely 'This is a zebra crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "zebra"
},
{
"key": "crossing_ref",
"description": "Layer 'Crossings' shows with a fixed text, namely 'This is not a zebra crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings') Picking this answer will delete the key crossing_ref.",
"value": ""
},
{
"key": "bicycle",
"description": "Layer 'Crossings' shows bicycle=yes with a fixed text, namely 'A cyclist can use this crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "bicycle",
"description": "Layer 'Crossings' shows bicycle=no with a fixed text, namely 'A cyclist can not use this crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "crossing:island",
"description": "Layer 'Crossings' shows crossing:island=yes with a fixed text, namely 'This crossing has an island in the middle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "crossing:island",
"description": "Layer 'Crossings' shows crossing:island=no with a fixed text, namely 'This crossing does not have an island in the middle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "tactile_paving",
"description": "Layer 'Crossings' shows tactile_paving=yes with a fixed text, namely 'This crossing has tactile paving' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "tactile_paving",
"description": "Layer 'Crossings' shows tactile_paving=no with a fixed text, namely 'This crossing does not have tactile paving' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "tactile_paving",
"description": "Layer 'Crossings' shows tactile_paving=incorrect with a fixed text, namely 'This crossing has tactile paving, but is not correct' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "incorrect"
},
{
"key": "button_operated",
"description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "button_operated",
"description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "red_turn:right:bicycle",
"description": "Layer 'Crossings' shows red_turn:right:bicycle=yes with a fixed text, namely 'A cyclist can turn right if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "red_turn:right:bicycle",
"description": "Layer 'Crossings' shows red_turn:right:bicycle=yes with a fixed text, namely 'A cyclist can turn right if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "red_turn:right:bicycle",
"description": "Layer 'Crossings' shows red_turn:right:bicycle=no with a fixed text, namely 'A cyclist can not turn right if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "red_turn:straight:bicycle",
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=yes with a fixed text, namely 'A cyclist can go straight on if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "red_turn:straight:bicycle",
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=yes with a fixed text, namely 'A cyclist can go straight on if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "red_turn:straight:bicycle",
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=no with a fixed text, namely 'A cyclist can not go straight on if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "barrier",
"description": "The MapComplete theme Kerbs and crossings has a layer Kerbs showing features with this tag",
"value": "kerb"
},
{
"key": "kerb",
"description": "Layer 'Kerbs' shows kerb=raised with a fixed text, namely 'This kerb is raised (>3 cm)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "raised"
},
{
"key": "kerb",
"description": "Layer 'Kerbs' shows kerb=lowered with a fixed text, namely 'This kerb is lowered (~3 cm)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "lowered"
},
{
"key": "kerb",
"description": "Layer 'Kerbs' shows kerb=flush with a fixed text, namely 'This kerb is flush (~0cm)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "flush"
},
{
"key": "kerb",
"description": "Layer 'Kerbs' shows kerb=no with a fixed text, namely 'There is no kerb here' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "kerb",
"description": "Layer 'Kerbs' shows kerb=yes with a fixed text, namely 'There is a kerb of unknown height' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "tactile_paving",
"description": "Layer 'Kerbs' shows tactile_paving=yes with a fixed text, namely 'This kerb has tactile paving.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "yes"
},
{
"key": "tactile_paving",
"description": "Layer 'Kerbs' shows tactile_paving=no with a fixed text, namely 'This kerb does not have tactile paving.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "no"
},
{
"key": "tactile_paving",
"description": "Layer 'Kerbs' shows tactile_paving=incorrect with a fixed text, namely 'This kerb has tactile paving, but it is incorrect' (in the MapComplete.osm.be theme 'Kerbs and crossings')",
"value": "incorrect"
},
{
"key": "kerb:height",
"description": "Layer 'Kerbs' shows and asks freeform values for key 'kerb:height' (in the MapComplete.osm.be theme 'Kerbs and crossings')"
}
]
}

View file

@ -84,6 +84,11 @@
"key": "maxspeed",
"description": "Layer 'Maxspeed' shows and asks freeform values for key 'maxspeed' (in the MapComplete.osm.be theme 'Maxspeed')"
},
{
"key": "highway",
"description": "Layer 'Maxspeed' shows highway=living_street&_country!=be with a fixed text, namely 'This is a living street, which has a maxspeed of 20km/h' (in the MapComplete.osm.be theme 'Maxspeed')",
"value": "living_street"
},
{
"key": "highway",
"description": "Layer 'Maxspeed' shows highway=living_street with a fixed text, namely 'This is a living street, which has a maxspeed of 20km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Maxspeed')",

File diff suppressed because it is too large Load diff

View file

@ -482,23 +482,43 @@
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' 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 'Veterinarians, dog parks and other pet-amenities')",
"value": "convenience"
"description": "Layer 'Dog-friendly shops' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "agrarian"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=supermarket with a fixed text, namely 'Supermarket' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "supermarket"
"description": "Layer 'Dog-friendly shops' shows shop=alcohol with a fixed text, namely 'Liquor Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "alcohol"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' 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 'Veterinarians, dog parks and other pet-amenities')",
"value": "clothes"
"description": "Layer 'Dog-friendly shops' shows shop=anime with a fixed text, namely 'Anime / Manga Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "anime"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=hairdresser with a fixed text, namely 'Hairdresser' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "hairdresser"
"description": "Layer 'Dog-friendly shops' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "antiques"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=appliance with a fixed text, namely 'Appliance Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "appliance"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=art with a fixed text, namely 'Art Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "art"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=baby_goods with a fixed text, namely 'Baby Goods Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "baby_goods"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=bag with a fixed text, namely 'Bag/Luggage Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "bag"
},
{
"key": "shop",
@ -507,29 +527,786 @@
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' 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 'Veterinarians, dog parks and other pet-amenities')",
"description": "Layer 'Dog-friendly shops' shows shop=bathroom_furnishing with a fixed text, namely 'Bathroom Furnishing Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "bathroom_furnishing"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=beauty with a fixed text, namely 'Beauty Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "beauty"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=bed with a fixed text, namely 'Bedding/Mattress Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "bed"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=beverages with a fixed text, namely 'Beverage Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "beverages"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=bicycle with a fixed text, namely 'Bicycle Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "bicycle"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=boat with a fixed text, namely 'Boat Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "boat"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=bookmaker with a fixed text, namely 'Bookmaker' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "bookmaker"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "books"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=brewing_supplies with a fixed text, namely 'Brewing Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "brewing_supplies"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=butcher with a fixed text, namely 'Butcher' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "butcher"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=camera with a fixed text, namely 'Camera Equipment Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "camera"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=candles with a fixed text, namely 'Candle Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "candles"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=cannabis with a fixed text, namely 'Cannabis Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "cannabis"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=car with a fixed text, namely 'Car Dealership' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "car"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=car_parts with a fixed text, namely 'Car Parts Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "car_parts"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=car_repair with a fixed text, namely 'Car Repair Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "car_repair"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' 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 'Veterinarians, dog parks and other pet-amenities')",
"value": "car"
"description": "Layer 'Dog-friendly shops' shows shop=caravan with a fixed text, namely 'RV Dealership' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "caravan"
},
{
"key": "phone",
"description": "Layer 'Dog-friendly shops' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=carpet with a fixed text, namely 'Carpet Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "carpet"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=catalogue with a fixed text, namely 'Catalog Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "catalogue"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=charity with a fixed text, namely 'Charity Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "charity"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=cheese with a fixed text, namely 'Cheese Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "cheese"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=chemist with a fixed text, namely 'Drugstore' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "chemist"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=chocolate with a fixed text, namely 'Chocolate Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "chocolate"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' 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 'Veterinarians, dog parks and other pet-amenities')",
"value": "clothes"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=coffee with a fixed text, namely 'Coffee Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "coffee"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=collector with a fixed text, namely 'Collectibles Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "collector"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=computer with a fixed text, namely 'Computer Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "computer"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=confectionery with a fixed text, namely 'Candy Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "confectionery"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' 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 'Veterinarians, dog parks and other pet-amenities')",
"value": "convenience"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=copyshop with a fixed text, namely 'Copy Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "copyshop"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=cosmetics with a fixed text, namely 'Cosmetics Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "cosmetics"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "country_store"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=craft with a fixed text, namely 'Arts & Crafts Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "craft"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=curtain with a fixed text, namely 'Curtain Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "curtain"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=dairy with a fixed text, namely 'Dairy Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "dairy"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "deli"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=department_store with a fixed text, namely 'Department Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "department_store"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=doityourself with a fixed text, namely 'DIY Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "doityourself"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=doors with a fixed text, namely 'Door Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "doors"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=dry_cleaning with a fixed text, namely 'Dry Cleaner' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "dry_cleaning"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=e-cigarette with a fixed text, namely 'E-Cigarette Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "e-cigarette"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=electrical with a fixed text, namely 'Electrical Equipment Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "electrical"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=electronics with a fixed text, namely 'Electronics Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "electronics"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=erotic with a fixed text, namely 'Erotic Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "erotic"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=fabric with a fixed text, namely 'Fabric Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "fabric"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=farm with a fixed text, namely 'Produce Stand' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "farm"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=fashion_accessories with a fixed text, namely 'Fashion Accessories Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "fashion_accessories"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=fireplace with a fixed text, namely 'Fireplace Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "fireplace"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=fishing with a fixed text, namely 'Fishing Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "fishing"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=flooring with a fixed text, namely 'Flooring Supply Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "flooring"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=florist with a fixed text, namely 'Florist' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "florist"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=frame with a fixed text, namely 'Framing Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "frame"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=frozen_food with a fixed text, namely 'Frozen Food Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "frozen_food"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=fuel with a fixed text, namely 'Fuel Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "fuel"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=funeral_directors with a fixed text, namely 'Funeral Home' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "funeral_directors"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=furniture with a fixed text, namely 'Furniture Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "furniture"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=games with a fixed text, namely 'Tabletop Game Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "games"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=garden_centre with a fixed text, namely 'Garden Center' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "garden_centre"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=gas with a fixed text, namely 'Bottled Gas Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "gas"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=general with a fixed text, namely 'General Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "general"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=gift with a fixed text, namely 'Gift Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "gift"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=greengrocer with a fixed text, namely 'Greengrocer' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "greengrocer"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=hairdresser with a fixed text, namely 'Hairdresser' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "hairdresser"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=hairdresser_supply with a fixed text, namely 'Hairdresser Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "hairdresser_supply"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=hardware with a fixed text, namely 'Hardware Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "hardware"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "health_food"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=hearing_aids with a fixed text, namely 'Hearing Aids Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "hearing_aids"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=herbalist with a fixed text, namely 'Herbalist' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "herbalist"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=hifi with a fixed text, namely 'Hifi Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "hifi"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "hobby"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=household_linen with a fixed text, namely 'Household Linen Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "household_linen"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=houseware with a fixed text, namely 'Houseware Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "houseware"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=hunting with a fixed text, namely 'Hunting Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "hunting"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=interior_decoration with a fixed text, namely 'Interior Decoration Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "interior_decoration"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=jewelry with a fixed text, namely 'Jewelry Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "jewelry"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=kiosk with a fixed text, namely 'Kiosk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "kiosk"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=kitchen with a fixed text, namely 'Kitchen Design Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "kitchen"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=laundry with a fixed text, namely 'Laundry' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "laundry"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=leather with a fixed text, namely 'Leather Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "leather"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=lighting with a fixed text, namely 'Lighting Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "lighting"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=locksmith with a fixed text, namely 'Locksmith' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "locksmith"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=lottery with a fixed text, namely 'Lottery Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "lottery"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=mall with a fixed text, namely 'Mall' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "mall"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=massage with a fixed text, namely 'Massage Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "massage"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=medical_supply with a fixed text, namely 'Medical Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "medical_supply"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=military_surplus with a fixed text, namely 'Military Surplus Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "military_surplus"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=mobile_phone with a fixed text, namely 'Mobile Phone Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "mobile_phone"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=model with a fixed text, namely 'Model Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "model"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=money_lender with a fixed text, namely 'Money Lender' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "money_lender"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=motorcycle with a fixed text, namely 'Motorcycle Dealership' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "motorcycle"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=motorcycle_repair with a fixed text, namely 'Motorcycle Repair Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "motorcycle_repair"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=music with a fixed text, namely 'Music Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "music"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=musical_instrument with a fixed text, namely 'Musical Instrument Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "musical_instrument"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "newsagent"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "nutrition_supplements"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "optician"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=outdoor with a fixed text, namely 'Outdoors Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "outdoor"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=outpost with a fixed text, namely 'Online Retailer Outpost' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "outpost"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=paint with a fixed text, namely 'Paint Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "paint"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "party"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "pastry"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "pawnbroker"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=perfumery with a fixed text, namely 'Perfume Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "perfumery"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=pet with a fixed text, namely 'Pet Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "pet"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "pet_grooming"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=photo with a fixed text, namely 'Photography Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "photo"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=pottery with a fixed text, namely 'Pottery Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "pottery"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=printer_ink with a fixed text, namely 'Printer Ink Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "printer_ink"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=psychic with a fixed text, namely 'Psychic' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "psychic"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=pyrotechnics with a fixed text, namely 'Fireworks Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "pyrotechnics"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=radiotechnics with a fixed text, namely 'Radio/Electronic Component Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "radiotechnics"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=religion with a fixed text, namely 'Religious Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "religion"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=rental with a fixed text, namely 'Rental Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "rental"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "repair"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "scuba_diving"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=seafood with a fixed text, namely 'Seafood Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "seafood"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "second_hand"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=sewing with a fixed text, namely 'Sewing Supply Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "sewing"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=shoe_repair with a fixed text, namely 'Shoe Repair Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "shoe_repair"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=shoes with a fixed text, namely 'Shoe Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "shoes"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=spices with a fixed text, namely 'Spice Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "spices"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=sports with a fixed text, namely 'Sporting Goods Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "sports"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=stationery with a fixed text, namely 'Stationery Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "stationery"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=storage_rental with a fixed text, namely 'Storage Rental' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "storage_rental"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=supermarket with a fixed text, namely 'Supermarket' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "supermarket"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=swimming_pool with a fixed text, namely 'Pool Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "swimming_pool"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=tailor with a fixed text, namely 'Tailor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "tailor"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=tattoo with a fixed text, namely 'Tattoo Parlor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "tattoo"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=tea with a fixed text, namely 'Tea Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "tea"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=telecommunication with a fixed text, namely 'Telecom Retail Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "telecommunication"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=ticket with a fixed text, namely 'Ticket Seller' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "ticket"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=tiles with a fixed text, namely 'Tile Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "tiles"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=tobacco with a fixed text, namely 'Tobacco Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "tobacco"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=tool_hire with a fixed text, namely 'Tool Rental' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "tool_hire"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=toys with a fixed text, namely 'Toy Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "toys"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=trade with a fixed text, namely 'Trade Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "trade"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=travel_agency with a fixed text, namely 'Travel Agency' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "travel_agency"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=trophy with a fixed text, namely 'Trophy Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "trophy"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=tyres with a fixed text, namely 'Tire Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "tyres"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=vacuum_cleaner with a fixed text, namely 'Vacuum Cleaner Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "vacuum_cleaner"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "variety_store"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=video with a fixed text, namely 'Video Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "video"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=video_games with a fixed text, namely 'Video Game Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "video_games"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=watches with a fixed text, namely 'Watches Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "watches"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=water with a fixed text, namely 'Drinking Water Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "water"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=water_sports with a fixed text, namely 'Watersport/Swim Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "water_sports"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=weapons with a fixed text, namely 'Weapon Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "weapons"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=wholesale with a fixed text, namely 'Wholesale Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "wholesale"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=wigs with a fixed text, namely 'Wig Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "wigs"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=window_blind with a fixed text, namely 'Window Blind Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "window_blind"
},
{
"key": "shop",
"description": "Layer 'Dog-friendly shops' shows shop=wine with a fixed text, namely 'Wine Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "wine"
},
{
"key": "opening_hours",
"description": "Layer 'Dog-friendly shops' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
},
{
"key": "website",
"description": "Layer 'Dog-friendly shops' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
},
{
"key": "contact:website",
"description": "Layer 'Dog-friendly shops' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
},
{
"key": "email",
"description": "Layer 'Dog-friendly shops' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
},
{
"key": "opening_hours",
"description": "Layer 'Dog-friendly shops' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
"key": "contact:email",
"description": "Layer 'Dog-friendly shops' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
},
{
"key": "phone",
"description": "Layer 'Dog-friendly shops' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
},
{
"key": "contact:phone",
"description": "Layer 'Dog-friendly shops' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')"
},
{
"key": "payment:cash",
@ -541,6 +1318,31 @@
"description": "Layer 'Dog-friendly shops' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "yes"
},
{
"key": "service:print:A4",
"description": "Layer 'Dog-friendly shops' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "yes"
},
{
"key": "service:print:A3",
"description": "Layer 'Dog-friendly shops' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "yes"
},
{
"key": "service:print:A2",
"description": "Layer 'Dog-friendly shops' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "yes"
},
{
"key": "service:print:A1",
"description": "Layer 'Dog-friendly shops' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "yes"
},
{
"key": "service:print:A0",
"description": "Layer 'Dog-friendly shops' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')",
"value": "yes"
},
{
"key": "amenity",
"description": "The MapComplete theme Veterinarians, dog parks and other pet-amenities has a layer veterinary showing features with this tag",

View file

@ -40,23 +40,43 @@
},
{
"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')",
"value": "convenience"
"description": "Layer 'Shop' shows shop=agrarian with a fixed text, namely 'Farm Supply Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "agrarian"
},
{
"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')",
"value": "supermarket"
"description": "Layer 'Shop' shows shop=alcohol with a fixed text, namely 'Liquor Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "alcohol"
},
{
"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')",
"value": "clothes"
"description": "Layer 'Shop' shows shop=anime with a fixed text, namely 'Anime / Manga Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "anime"
},
{
"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')",
"value": "hairdresser"
"description": "Layer 'Shop' shows shop=antiques with a fixed text, namely 'Antiques Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "antiques"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=appliance with a fixed text, namely 'Appliance Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "appliance"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=art with a fixed text, namely 'Art Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "art"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=baby_goods with a fixed text, namely 'Baby Goods Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "baby_goods"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=bag with a fixed text, namely 'Bag/Luggage Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "bag"
},
{
"key": "shop",
@ -65,29 +85,786 @@
},
{
"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=bathroom_furnishing with a fixed text, namely 'Bathroom Furnishing Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "bathroom_furnishing"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=beauty with a fixed text, namely 'Beauty Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "beauty"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=bed with a fixed text, namely 'Bedding/Mattress Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "bed"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=beverages with a fixed text, namely 'Beverage Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "beverages"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=bicycle with a fixed text, namely 'Bicycle Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "bicycle"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=boat with a fixed text, namely 'Boat Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "boat"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=bookmaker with a fixed text, namely 'Bookmaker' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "bookmaker"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=books with a fixed text, namely 'Book Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "books"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=brewing_supplies with a fixed text, namely 'Brewing Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "brewing_supplies"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=butcher with a fixed text, namely 'Butcher' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "butcher"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=camera with a fixed text, namely 'Camera Equipment Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "camera"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=candles with a fixed text, namely 'Candle Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "candles"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=cannabis with a fixed text, namely 'Cannabis Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "cannabis"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=car with a fixed text, namely 'Car Dealership' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "car"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=car_parts with a fixed text, namely 'Car Parts Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "car_parts"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=car_repair with a fixed text, namely 'Car Repair Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "car_repair"
},
{
"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')",
"value": "car"
"description": "Layer 'Shop' shows shop=caravan with a fixed text, namely 'RV Dealership' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "caravan"
},
{
"key": "phone",
"description": "Layer 'Shop' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Open Shop Map')"
"key": "shop",
"description": "Layer 'Shop' shows shop=carpet with a fixed text, namely 'Carpet Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "carpet"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=catalogue with a fixed text, namely 'Catalog Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "catalogue"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=charity with a fixed text, namely 'Charity Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "charity"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=cheese with a fixed text, namely 'Cheese Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "cheese"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=chemist with a fixed text, namely 'Drugstore' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "chemist"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=chocolate with a fixed text, namely 'Chocolate Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "chocolate"
},
{
"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')",
"value": "clothes"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=coffee with a fixed text, namely 'Coffee Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "coffee"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=collector with a fixed text, namely 'Collectibles Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "collector"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=computer with a fixed text, namely 'Computer Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "computer"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=confectionery with a fixed text, namely 'Candy Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "confectionery"
},
{
"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')",
"value": "convenience"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=copyshop with a fixed text, namely 'Copy Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "copyshop"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=cosmetics with a fixed text, namely 'Cosmetics Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "cosmetics"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=country_store with a fixed text, namely 'Country Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "country_store"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=craft with a fixed text, namely 'Arts & Crafts Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "craft"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=curtain with a fixed text, namely 'Curtain Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "curtain"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=dairy with a fixed text, namely 'Dairy Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "dairy"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=deli with a fixed text, namely 'Deli' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "deli"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=department_store with a fixed text, namely 'Department Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "department_store"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=doityourself with a fixed text, namely 'DIY Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "doityourself"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=doors with a fixed text, namely 'Door Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "doors"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=dry_cleaning with a fixed text, namely 'Dry Cleaner' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "dry_cleaning"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=e-cigarette with a fixed text, namely 'E-Cigarette Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "e-cigarette"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=electrical with a fixed text, namely 'Electrical Equipment Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "electrical"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=electronics with a fixed text, namely 'Electronics Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "electronics"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=erotic with a fixed text, namely 'Erotic Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "erotic"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=fabric with a fixed text, namely 'Fabric Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "fabric"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=farm with a fixed text, namely 'Produce Stand' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "farm"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=fashion_accessories with a fixed text, namely 'Fashion Accessories Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "fashion_accessories"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=fireplace with a fixed text, namely 'Fireplace Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "fireplace"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=fishing with a fixed text, namely 'Fishing Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "fishing"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=flooring with a fixed text, namely 'Flooring Supply Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "flooring"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=florist with a fixed text, namely 'Florist' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "florist"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=frame with a fixed text, namely 'Framing Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "frame"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=frozen_food with a fixed text, namely 'Frozen Food Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "frozen_food"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=fuel with a fixed text, namely 'Fuel Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "fuel"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=funeral_directors with a fixed text, namely 'Funeral Home' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "funeral_directors"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=furniture with a fixed text, namely 'Furniture Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "furniture"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=games with a fixed text, namely 'Tabletop Game Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "games"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=garden_centre with a fixed text, namely 'Garden Center' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "garden_centre"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=gas with a fixed text, namely 'Bottled Gas Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "gas"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=general with a fixed text, namely 'General Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "general"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=gift with a fixed text, namely 'Gift Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "gift"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=greengrocer with a fixed text, namely 'Greengrocer' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "greengrocer"
},
{
"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')",
"value": "hairdresser"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=hairdresser_supply with a fixed text, namely 'Hairdresser Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "hairdresser_supply"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=hardware with a fixed text, namely 'Hardware Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "hardware"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=health_food with a fixed text, namely 'Health Food Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "health_food"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=hearing_aids with a fixed text, namely 'Hearing Aids Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "hearing_aids"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=herbalist with a fixed text, namely 'Herbalist' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "herbalist"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=hifi with a fixed text, namely 'Hifi Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "hifi"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=hobby with a fixed text, namely 'Hobby Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "hobby"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=household_linen with a fixed text, namely 'Household Linen Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "household_linen"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=houseware with a fixed text, namely 'Houseware Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "houseware"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=hunting with a fixed text, namely 'Hunting Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "hunting"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=interior_decoration with a fixed text, namely 'Interior Decoration Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "interior_decoration"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=jewelry with a fixed text, namely 'Jewelry Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "jewelry"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=kiosk with a fixed text, namely 'Kiosk' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "kiosk"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=kitchen with a fixed text, namely 'Kitchen Design Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "kitchen"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=laundry with a fixed text, namely 'Laundry' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "laundry"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=leather with a fixed text, namely 'Leather Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "leather"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=lighting with a fixed text, namely 'Lighting Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "lighting"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=locksmith with a fixed text, namely 'Locksmith' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "locksmith"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=lottery with a fixed text, namely 'Lottery Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "lottery"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=mall with a fixed text, namely 'Mall' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "mall"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=massage with a fixed text, namely 'Massage Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "massage"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=medical_supply with a fixed text, namely 'Medical Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "medical_supply"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=military_surplus with a fixed text, namely 'Military Surplus Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "military_surplus"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=mobile_phone with a fixed text, namely 'Mobile Phone Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "mobile_phone"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=model with a fixed text, namely 'Model Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "model"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=money_lender with a fixed text, namely 'Money Lender' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "money_lender"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=motorcycle with a fixed text, namely 'Motorcycle Dealership' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "motorcycle"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=motorcycle_repair with a fixed text, namely 'Motorcycle Repair Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "motorcycle_repair"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=music with a fixed text, namely 'Music Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "music"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=musical_instrument with a fixed text, namely 'Musical Instrument Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "musical_instrument"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=newsagent with a fixed text, namely 'Newspaper/Magazine Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "newsagent"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=nutrition_supplements with a fixed text, namely 'Nutrition Supplements Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "nutrition_supplements"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=optician with a fixed text, namely 'Optician' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "optician"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=outdoor with a fixed text, namely 'Outdoors Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "outdoor"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=outpost with a fixed text, namely 'Online Retailer Outpost' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "outpost"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=paint with a fixed text, namely 'Paint Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "paint"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=party with a fixed text, namely 'Party Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "party"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=pastry with a fixed text, namely 'Pastry Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "pastry"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=pawnbroker with a fixed text, namely 'Pawn Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "pawnbroker"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=perfumery with a fixed text, namely 'Perfume Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "perfumery"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=pet with a fixed text, namely 'Pet Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "pet"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=pet_grooming with a fixed text, namely 'Pet Grooming Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "pet_grooming"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=photo with a fixed text, namely 'Photography Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "photo"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=pottery with a fixed text, namely 'Pottery Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "pottery"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=printer_ink with a fixed text, namely 'Printer Ink Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "printer_ink"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=psychic with a fixed text, namely 'Psychic' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "psychic"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=pyrotechnics with a fixed text, namely 'Fireworks Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "pyrotechnics"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=radiotechnics with a fixed text, namely 'Radio/Electronic Component Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "radiotechnics"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=religion with a fixed text, namely 'Religious Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "religion"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=rental with a fixed text, namely 'Rental Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "rental"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=repair with a fixed text, namely 'Repair Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "repair"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=scuba_diving with a fixed text, namely 'Scuba Diving Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "scuba_diving"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=seafood with a fixed text, namely 'Seafood Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "seafood"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=second_hand with a fixed text, namely 'Consignment/Thrift Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "second_hand"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=sewing with a fixed text, namely 'Sewing Supply Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "sewing"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=shoe_repair with a fixed text, namely 'Shoe Repair Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "shoe_repair"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=shoes with a fixed text, namely 'Shoe Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "shoes"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=spices with a fixed text, namely 'Spice Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "spices"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=sports with a fixed text, namely 'Sporting Goods Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "sports"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=stationery with a fixed text, namely 'Stationery Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "stationery"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=storage_rental with a fixed text, namely 'Storage Rental' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "storage_rental"
},
{
"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')",
"value": "supermarket"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=swimming_pool with a fixed text, namely 'Pool Supply Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "swimming_pool"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=tailor with a fixed text, namely 'Tailor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "tailor"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=tattoo with a fixed text, namely 'Tattoo Parlor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "tattoo"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=tea with a fixed text, namely 'Tea Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "tea"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=telecommunication with a fixed text, namely 'Telecom Retail Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "telecommunication"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=ticket with a fixed text, namely 'Ticket Seller' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "ticket"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=tiles with a fixed text, namely 'Tile Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "tiles"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=tobacco with a fixed text, namely 'Tobacco Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "tobacco"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=tool_hire with a fixed text, namely 'Tool Rental' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "tool_hire"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=toys with a fixed text, namely 'Toy Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "toys"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=trade with a fixed text, namely 'Trade Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "trade"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=travel_agency with a fixed text, namely 'Travel Agency' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "travel_agency"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=trophy with a fixed text, namely 'Trophy Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "trophy"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=tyres with a fixed text, namely 'Tire Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "tyres"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=vacuum_cleaner with a fixed text, namely 'Vacuum Cleaner Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "vacuum_cleaner"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=variety_store with a fixed text, namely 'Variety Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "variety_store"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=video with a fixed text, namely 'Video Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "video"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=video_games with a fixed text, namely 'Video Game Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "video_games"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=watches with a fixed text, namely 'Watches Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "watches"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=water with a fixed text, namely 'Drinking Water Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "water"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=water_sports with a fixed text, namely 'Watersport/Swim Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "water_sports"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=weapons with a fixed text, namely 'Weapon Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "weapons"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=wholesale with a fixed text, namely 'Wholesale Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "wholesale"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=wigs with a fixed text, namely 'Wig Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "wigs"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=window_blind with a fixed text, namely 'Window Blind Store' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "window_blind"
},
{
"key": "shop",
"description": "Layer 'Shop' shows shop=wine with a fixed text, namely 'Wine Shop' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "wine"
},
{
"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": "website",
"description": "Layer 'Shop' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "contact:website",
"description": "Layer 'Shop' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (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')"
"key": "contact:email",
"description": "Layer 'Shop' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (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": "contact:phone",
"description": "Layer 'Shop' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "payment:cash",
@ -98,6 +875,95 @@
"key": "payment:cards",
"description": "Layer 'Shop' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "yes"
},
{
"key": "service:print:A4",
"description": "Layer 'Shop' shows service:print:A4=yes with a fixed text, namely 'This shop can print on papers of size A4' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "yes"
},
{
"key": "service:print:A3",
"description": "Layer 'Shop' shows service:print:A3=yes with a fixed text, namely 'This shop can print on papers of size A3' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "yes"
},
{
"key": "service:print:A2",
"description": "Layer 'Shop' shows service:print:A2=yes with a fixed text, namely 'This shop can print on papers of size A2' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "yes"
},
{
"key": "service:print:A1",
"description": "Layer 'Shop' shows service:print:A1=yes with a fixed text, namely 'This shop can print on papers of size A1' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "yes"
},
{
"key": "service:print:A0",
"description": "Layer 'Shop' shows service:print:A0=yes with a fixed text, namely 'This shop can print on papers of size A0' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "yes"
},
{
"key": "amenity",
"description": "The MapComplete theme Open Shop Map has a layer pharmacy showing features with this tag",
"value": "pharmacy"
},
{
"key": "image",
"description": "The layer 'pharmacy allows to upload images and adds them under the 'image'-tag (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 'pharmacy allows to upload images and adds them under the 'image'-tag (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 'pharmacy allows to upload images and adds them under the 'image'-tag (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 'pharmacy allows to upload images and adds them under the 'image'-tag (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 'pharmacy' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "phone",
"description": "Layer 'pharmacy' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "contact:phone",
"description": "Layer 'pharmacy' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "email",
"description": "Layer 'pharmacy' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "contact:email",
"description": "Layer 'pharmacy' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "website",
"description": "Layer 'pharmacy' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "contact:website",
"description": "Layer 'pharmacy' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Open Shop Map')"
},
{
"key": "wheelchair",
"description": "Layer 'pharmacy' shows wheelchair=yes with a fixed text, namely 'This pharmacy is easy to access on a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "yes"
},
{
"key": "wheelchair",
"description": "Layer 'pharmacy' shows wheelchair=no with a fixed text, namely 'This pharmacy is hard to access on a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "no"
},
{
"key": "wheelchair",
"description": "Layer 'pharmacy' shows wheelchair=limited with a fixed text, namely 'This pharmacy has limited access for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Shop Map')",
"value": "limited"
}
]
}

View file

@ -0,0 +1,370 @@
{
"data_format": 1,
"project": {
"name": "MapComplete Bus routes",
"description": "Plan your trip with the help of the public transport system",
"project_url": "https://mapcomplete.osm.be/transit",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/layers/transit_stops/bus_stop.svg",
"contact_name": "Pieter Vander Vennet, Robin van der Linde",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "highway",
"description": "The MapComplete theme Bus routes has a layer Transit Stops showing features with this tag",
"value": "bus_stop"
},
{
"key": "name",
"description": "Layer 'Transit Stops' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "noname",
"description": "Layer 'Transit Stops' shows noname=yes with a fixed text, namely 'This stop has no name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "name",
"description": "Layer 'Transit Stops' shows noname=yes with a fixed text, namely 'This stop has no name' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes') Picking this answer will delete the key name.",
"value": ""
},
{
"key": "image",
"description": "The layer 'Transit 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 'Transit 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 'Transit 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 'Transit 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": "shelter",
"description": "Layer 'Transit Stops' shows shelter=yes with a fixed text, namely 'This stop has a shelter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "shelter",
"description": "Layer 'Transit Stops' shows shelter=no with a fixed text, namely 'This stop does not have a shelter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "shelter",
"description": "Layer 'Transit Stops' shows shelter=separate with a fixed text, namely 'This stop has a shelter, that's separately mapped' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "separate"
},
{
"key": "bench",
"description": "Layer 'Transit Stops' shows bench=yes with a fixed text, namely 'This stop has a bench' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "bench",
"description": "Layer 'Transit Stops' shows bench=no with a fixed text, namely 'This stop does not have a bench' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "bench",
"description": "Layer 'Transit Stops' shows bench=separate with a fixed text, namely 'This stop has a bench, that's separately mapped' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "separate"
},
{
"key": "bin",
"description": "Layer 'Transit Stops' shows bin=yes with a fixed text, namely 'This stop has a bin' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "bin",
"description": "Layer 'Transit Stops' shows bin=no with a fixed text, namely 'This stop does not have a bin' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "bin",
"description": "Layer 'Transit Stops' shows bin=separate with a fixed text, namely 'This stop has a bin, that's separately mapped' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "separate"
},
{
"key": "wheelchair",
"description": "Layer 'Transit Stops' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "designated"
},
{
"key": "wheelchair",
"description": "Layer 'Transit Stops' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "wheelchair",
"description": "Layer 'Transit Stops' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "limited"
},
{
"key": "wheelchair",
"description": "Layer 'Transit Stops' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "tactile_paving",
"description": "Layer 'Transit Stops' shows tactile_paving=yes with a fixed text, namely 'This stop has tactile paving' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "tactile_paving",
"description": "Layer 'Transit Stops' shows tactile_paving=no with a fixed text, namely 'This stop does not have tactile paving' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "lit",
"description": "Layer 'Transit Stops' shows lit=yes with a fixed text, namely 'This stop is lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "lit",
"description": "Layer 'Transit Stops' shows lit=no with a fixed text, namely 'This stop is not lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "departures_board",
"description": "Layer 'Transit Stops' shows departures_board=yes with a fixed text, namely 'This stop has a departures board of unknown type' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "departures_board",
"description": "Layer 'Transit Stops' shows departures_board=realtime with a fixed text, namely 'This stop has a board showing realtime departure information' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "realtime"
},
{
"key": "passenger_information_display",
"description": "Layer 'Transit Stops' shows passenger_information_display=yes with a fixed text, namely 'This stop has a board showing realtime departure information' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "departures_board",
"description": "Layer 'Transit Stops' shows departures_board=timetable with a fixed text, namely 'This stop has a timetable showing regular departures' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "timetable"
},
{
"key": "departures_board",
"description": "Layer 'Transit Stops' shows departures_board=interval with a fixed text, namely 'This stop has a timetable containing just the interval between departures' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "interval"
},
{
"key": "departures_board",
"description": "Layer 'Transit Stops' shows departures_board=no with a fixed text, namely 'This stop does not have a departures board' (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "type",
"description": "The MapComplete theme Bus routes has a layer Bus lines showing features with this tag",
"value": "route"
},
{
"key": "route",
"description": "The MapComplete theme Bus routes has a layer Bus lines showing features with this tag",
"value": "bus"
},
{
"key": "name",
"description": "Layer 'Bus lines' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "from",
"description": "Layer 'Bus lines' shows and asks freeform values for key 'from' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "via",
"description": "Layer 'Bus lines' shows and asks freeform values for key 'via' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "to",
"description": "Layer 'Bus lines' shows and asks freeform values for key 'to' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "colour",
"description": "Layer 'Bus lines' shows and asks freeform values for key 'colour' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "network",
"description": "Layer 'Bus lines' shows and asks freeform values for key 'network' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "operator",
"description": "Layer 'Bus lines' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "amenity",
"description": "The MapComplete theme Bus routes has a layer Bike parking showing features with this tag",
"value": "bicycle_parking"
},
{
"key": "image",
"description": "The layer 'Bike 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 'Bike 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 'Bike 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 'Bike 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": "bicycle_parking",
"description": "Layer 'Bike parking' shows and asks freeform values for key 'bicycle_parking' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "bicycle_parking",
"description": "Layer 'Bike parking' shows bicycle_parking=stands with a fixed text, namely 'Staple racks' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "stands"
},
{
"key": "bicycle_parking",
"description": "Layer 'Bike parking' shows bicycle_parking=wall_loops with a fixed text, namely 'Wheel rack/loops' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "wall_loops"
},
{
"key": "bicycle_parking",
"description": "Layer 'Bike parking' shows bicycle_parking=handlebar_holder with a fixed text, namely 'Handlebar holder' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "handlebar_holder"
},
{
"key": "bicycle_parking",
"description": "Layer 'Bike parking' shows bicycle_parking=rack with a fixed text, namely 'Rack' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "rack"
},
{
"key": "bicycle_parking",
"description": "Layer 'Bike parking' shows bicycle_parking=two_tier with a fixed text, namely 'Two-tiered' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "two_tier"
},
{
"key": "bicycle_parking",
"description": "Layer 'Bike parking' shows bicycle_parking=shed with a fixed text, namely 'Shed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "shed"
},
{
"key": "bicycle_parking",
"description": "Layer 'Bike parking' shows bicycle_parking=bollard with a fixed text, namely 'Bollard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "bollard"
},
{
"key": "bicycle_parking",
"description": "Layer 'Bike parking' shows bicycle_parking=floor with a fixed text, namely 'An area on the floor which is marked for bicycle parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "floor"
},
{
"key": "location",
"description": "Layer 'Bike parking' shows location=underground with a fixed text, namely 'Underground parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "underground"
},
{
"key": "location",
"description": "Layer 'Bike parking' shows location=surface with a fixed text, namely 'Surface level parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "surface"
},
{
"key": "location",
"description": "Layer 'Bike parking' shows location=rooftop with a fixed text, namely 'Rooftop parking' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "rooftop"
},
{
"key": "location",
"description": "Layer 'Bike parking' shows with a fixed text, namely 'Surface level parking' (in the MapComplete.osm.be theme 'Bus routes') Picking this answer will delete the key location.",
"value": ""
},
{
"key": "covered",
"description": "Layer 'Bike parking' shows covered=yes with a fixed text, namely 'This parking is covered (it has a roof)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "covered",
"description": "Layer 'Bike parking' shows covered=no with a fixed text, namely 'This parking is not covered' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "capacity",
"description": "Layer 'Bike parking' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "access",
"description": "Layer 'Bike parking' shows and asks freeform values for key 'access' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "access",
"description": "Layer 'Bike parking' 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 'Bus routes')",
"value": "yes"
},
{
"key": "access",
"description": "Layer 'Bike parking' shows access=customers with a fixed text, namely 'Access is primarily for visitors to a business' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "customers"
},
{
"key": "access",
"description": "Layer 'Bike parking' shows access=private with a fixed text, namely 'Access is limited to members of a school, company or organisation' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "private"
},
{
"key": "cargo_bike",
"description": "Layer 'Bike parking' shows cargo_bike=yes with a fixed text, namely 'This parking has room for cargo bikes' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "yes"
},
{
"key": "cargo_bike",
"description": "Layer 'Bike parking' shows cargo_bike=designated with a fixed text, namely 'This parking has designated (official) spots for cargo bikes.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "designated"
},
{
"key": "cargo_bike",
"description": "Layer 'Bike parking' shows cargo_bike=no with a fixed text, namely 'You're not allowed to park cargo bikes' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bus routes')",
"value": "no"
},
{
"key": "capacity:cargo_bike",
"description": "Layer 'Bike parking' shows and asks freeform values for key 'capacity:cargo_bike' (in the MapComplete.osm.be theme 'Bus routes')"
},
{
"key": "amenity",
"description": "The MapComplete theme Bus routes has a layer Parking showing features with this tag",
"value": "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": "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": "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": "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": "amenity",
"description": "The MapComplete theme Bus routes has a layer Shelter showing features with this tag",
"value": "shelter"
},
{
"key": "shelter_type",
"description": "The MapComplete theme Bus routes has a layer Shelter showing features with this tag",
"value": "public_transport"
}
]
}

View file

@ -3,6 +3,7 @@ import {ImmutableStore, Store, UIEventSource} from "../../UIEventSource";
import {stat} from "fs";
import FilteredLayer from "../../../Models/FilteredLayer";
import {BBox} from "../../BBox";
import {Feature} from "@turf/turf";
/**
* A simple, read only feature store.
@ -11,7 +12,7 @@ export default class StaticFeatureSource implements FeatureSource {
public readonly features: Store<{ feature: any; freshness: Date }[]>;
public readonly name: string
constructor(features: Store<{ feature: any, freshness: Date }[]>, name = "StaticFeatureSource") {
constructor(features: Store<{ feature: Feature, freshness: Date }[]>, name = "StaticFeatureSource") {
if (features === undefined) {
throw "Static feature source received undefined as source"
}
@ -19,17 +20,23 @@ export default class StaticFeatureSource implements FeatureSource {
this.features = features;
}
public static fromGeojsonAndDate(features: { feature: any, freshness: Date }[], name = "StaticFeatureSourceFromGeojsonAndDate"): StaticFeatureSource {
public static fromGeojsonAndDate(features: { feature: Feature, freshness: Date }[], name = "StaticFeatureSourceFromGeojsonAndDate"): StaticFeatureSource {
return new StaticFeatureSource(new ImmutableStore(features), name);
}
public static fromGeojson(geojson: any[], name = "StaticFeatureSourceFromGeojson"): StaticFeatureSource {
public static fromGeojson(geojson: Feature[], name = "StaticFeatureSourceFromGeojson"): StaticFeatureSource {
const now = new Date();
return StaticFeatureSource.fromGeojsonAndDate(geojson.map(feature => ({feature, freshness: now})), name);
}
static fromDateless(featureSource: Store<{ feature: any }[]>, name = "StaticFeatureSourceFromDateless") {
public static fromGeojsonStore(geojson: Store<Feature[]>, name = "StaticFeatureSourceFromGeojson"): StaticFeatureSource {
const now = new Date();
const mapped : Store<{feature: Feature, freshness: Date}[]> = geojson.map(features => features.map(feature => ({feature, freshness: now})))
return new StaticFeatureSource(mapped, name);
}
static fromDateless(featureSource: Store<{ feature: Feature }[]>, name = "StaticFeatureSourceFromDateless") {
const now = new Date();
return new StaticFeatureSource(featureSource.map(features => features.map(feature => ({
feature: feature.feature,

View file

@ -11,6 +11,7 @@ import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig";
import {Or} from "../../Tags/Or";
import {TagsFilter} from "../../Tags/TagsFilter";
import {OsmObject} from "../../Osm/OsmObject";
import {FeatureCollection} from "@turf/turf";
/**
* If a tile is needed (requested via the UIEventSource in the constructor), will download the appropriate tile and pass it via 'handleTile'
@ -136,7 +137,7 @@ export default class OsmFeatureSource {
console.log("Got tile", z, x, y, "from the osm api")
this.rawDataHandlers.forEach(handler => handler(osmJson, Tiles.tile_index(z, x, y)))
const geojson = OsmToGeoJson.default(osmJson,
const geojson = <FeatureCollection<any , {id: string}>> OsmToGeoJson.default(osmJson,
// @ts-ignore
{
flatProperties: true

View file

@ -11,7 +11,7 @@ import ChangeTagAction from "./ChangeTagAction";
import {And} from "../../Tags/And";
import {Utils} from "../../../Utils";
import {OsmConnection} from "../OsmConnection";
import {GeoJSONObject} from "@turf/turf";
import {Feature} from "@turf/turf";
import FeaturePipeline from "../../FeatureSource/FeaturePipeline";
export default class ReplaceGeometryAction extends OsmChangeAction {
@ -83,7 +83,7 @@ export default class ReplaceGeometryAction extends OsmChangeAction {
// noinspection JSUnusedGlobalSymbols
public async getPreview(): Promise<FeatureSource> {
const {closestIds, allNodesById, detachedNodes, reprojectedNodes} = await this.GetClosestIds();
const preview: GeoJSONObject[] = closestIds.map((newId, i) => {
const preview: Feature[] = closestIds.map((newId, i) => {
if (this.identicalTo[i] !== undefined) {
return undefined
}
@ -122,7 +122,7 @@ export default class ReplaceGeometryAction extends OsmChangeAction {
reprojectedNodes.forEach(({newLat, newLon, nodeId}) => {
const origNode = allNodesById.get(nodeId);
const feature = {
const feature : Feature = {
type: "Feature",
properties: {
"move": "yes",
@ -142,7 +142,7 @@ export default class ReplaceGeometryAction extends OsmChangeAction {
detachedNodes.forEach(({reason}, id) => {
const origNode = allNodesById.get(id);
const feature = {
const feature : Feature = {
type: "Feature",
properties: {
"detach": "yes",

View file

@ -35,7 +35,7 @@ export class Overpass {
this._relationTracker = relationTracker
}
public async queryGeoJson(bounds: BBox, ): Promise<[FeatureCollection, Date]> {
public async queryGeoJson(bounds: BBox): Promise<[FeatureCollection, Date]> {
const bbox = "[bbox:" + bounds.getSouth() + "," + bounds.getWest() + "," + bounds.getNorth() + "," + bounds.getEast() + "]";
const query = this.buildScript(bbox)
return this.ExecuteQuery(query);

View file

@ -314,9 +314,10 @@ export default class SimpleMetaTaggers {
lat: lat,
lon: lon,
address: {
country_code: tags._country.toLowerCase()
country_code: tags._country.toLowerCase(),
state: undefined
}
}, {tag_key: "opening_hours"});
}, <any> {tag_key: "opening_hours"});
// Recalculate!
return oh.getState() ? "yes" : "no";

View file

@ -116,12 +116,21 @@ export class TagUtils {
* Given multiple tagsfilters which can be used as answer, will take the tags with the same keys together as set.
* E.g:
*
* FlattenMultiAnswer([and: [ "x=a", "y=0;1"], and: ["x=b", "y=2"], and: ["x=", "y=3"]])
* will result in
* ["x=a;b", "y=0;1;2;3"]
* const tag = TagUtils.Tag({"and": [
* {
* and: [ "x=a", "y=0;1"],
* },
* {
* and: ["x=", "y=3"]
* },
* {
* and: ["x=b", "y=2"]
* }
* ]})
* TagUtils.FlattenMultiAnswer([tag]) // => TagUtils.Tag({and:["x=a;b", "y=0;1;2;3"] })
*
* @param tagsFilters
* @constructor
* TagUtils.FlattenMultiAnswer(([new Tag("x","y"), new Tag("a","b")])) // => new And([new Tag("x","y"), new Tag("a","b")])
* TagUtils.FlattenMultiAnswer(([new Tag("x","")])) // => new And([new Tag("x","")])
*/
static FlattenMultiAnswer(tagsFilters: TagsFilter[]): And {
if (tagsFilters === undefined) {
@ -131,7 +140,9 @@ export class TagUtils {
let keyValues = TagUtils.SplitKeys(tagsFilters);
const and: TagsFilter[] = []
for (const key in keyValues) {
and.push(new Tag(key, Utils.Dedup(keyValues[key]).join(";")));
const values = Utils.Dedup(keyValues[key]).filter(v => v !== "")
values.sort()
and.push(new Tag(key, values.join(";")));
}
return new And(and);
}

View file

@ -7,8 +7,12 @@ import {Utils} from "../../Utils";
*/
export class IdbLocalStorage {
private static readonly _sourceCache: Record<string, UIEventSource<any>> = {}
public static Get<T>(key: string, options?: { defaultValue?: T, whenLoaded?: (t: T | null) => void }): UIEventSource<T> {
if(IdbLocalStorage._sourceCache[key] !== undefined){
return IdbLocalStorage._sourceCache[key]
}
const src = new UIEventSource<T>(options?.defaultValue, "idb-local-storage:" + key)
if (Utils.runningFromConsole) {
return src;
@ -26,6 +30,7 @@ export class IdbLocalStorage {
options?.whenLoaded(null)
}
})
IdbLocalStorage._sourceCache[key] = src;
return src;
}

View file

@ -39,6 +39,14 @@ export abstract class Conversion<TIn, TOut> {
return DesugaringStep.strict(fixed)
}
public convertJoin(json: TIn, context: string, errors: string[], warnings?: string[], information?: string[]): TOut {
const fixed = this.convert(json, context)
errors?.push(...(fixed.errors ?? []))
warnings?.push(...(fixed.warnings ?? []))
information?.push(...(fixed.information ?? []))
return fixed.result
}
public andThenF<X>(f: (tout:TOut) => X ): Conversion<TIn, X>{
return new Pipe(
this,

View file

@ -45,19 +45,67 @@ class ValidateLanguageCompleteness extends DesugaringStep<any> {
}
}
export class DoesImageExist extends DesugaringStep<string> {
private readonly _knownImagePaths: Set<string>;
private readonly doesPathExist: (path: string) => boolean = undefined;
constructor(knownImagePaths: Set<string>, checkExistsSync: (path: string) => boolean = undefined) {
super("Checks if an image exists", [], "DoesImageExist");
this._knownImagePaths = knownImagePaths;
this.doesPathExist = checkExistsSync;
}
convert(image: string, context: string): { result: string; errors?: string[]; warnings?: string[]; information?: string[] } {
const errors = []
const warnings = []
const information = []
if (image.indexOf("{") >= 0) {
information.push("Ignoring image with { in the path: " + image)
return {result: image}
}
if (image === "assets/SocialImage.png") {
return {result: image}
}
if (image.match(/[a-z]*/)) {
if (Svg.All[image + ".svg"] !== undefined) {
// This is a builtin img, e.g. 'checkmark' or 'crosshair'
return {result: image};
}
}
if (!this._knownImagePaths.has(image)) {
if (this.doesPathExist === undefined) {
errors.push(`Image with path ${image} not found or not attributed; it is used in ${context}`)
} else if (!this.doesPathExist(image)) {
errors.push(`Image with path ${image} does not exist; it is used in ${context}.\n Check for typo's and missing directories in the path.`)
} else {
errors.push(`Image with path ${image} is not attributed (but it exists); execute 'npm run query:licenses' to add the license information and/or run 'npm run generate:licenses' to compile all the license info`)
}
}
return {
result: image,
errors, warnings, information
}
}
}
class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
/**
* The paths where this layer is originally saved. Triggers some extra checks
* @private
*/
private readonly _path?: string;
private readonly knownImagePaths: Set<string>;
private readonly _isBuiltin: boolean;
private _sharedTagRenderings: Map<string, any>;
private readonly _validateImage: DesugaringStep<string>;
constructor(knownImagePaths: Set<string>, path: string, isBuiltin: boolean, sharedTagRenderings: Map<string, any>) {
constructor(doesImageExist: DoesImageExist, path: string, isBuiltin: boolean, sharedTagRenderings: Map<string, any>) {
super("Doesn't change anything, but emits warnings and errors", [], "ValidateTheme");
this.knownImagePaths = knownImagePaths;
this._validateImage = doesImageExist;
this._path = path;
this._isBuiltin = isBuiltin;
this._sharedTagRenderings = sharedTagRenderings;
@ -89,26 +137,7 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
errors.push("Found a remote image: " + remoteImage + " in theme " + json.id + ", please download it.")
}
for (const image of images) {
if (image.indexOf("{") >= 0) {
information.push("Ignoring image with { in the path: " + image)
continue
}
if (image === "assets/SocialImage.png") {
continue
}
if (image.match(/[a-z]*/)) {
if (Svg.All[image + ".svg"] !== undefined) {
// This is a builtin img, e.g. 'checkmark' or 'crosshair'
continue;// =>
}
}
if (this.knownImagePaths !== undefined && !this.knownImagePaths.has(image)) {
const ctx = context === undefined ? "" : ` in a layer defined in the theme ${context}`
errors.push(`Image with path ${image} not found or not attributed; it is used in ${json.id}${ctx}`)
}
this._validateImage.convertJoin(image, context === undefined ? "" : ` in a layer defined in the theme ${context}`, errors, warnings, information)
}
if (json.icon.endsWith(".svg")) {
@ -150,9 +179,7 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
if (theme.id !== filename) {
errors.push("Theme ids should be the same as the name.json, but we got id: " + theme.id + " and filename " + filename + " (" + this._path + ")")
}
if (!this.knownImagePaths.has(theme.icon)) {
errors.push("The theme image " + theme.icon + " is not attributed or not saved locally")
}
this._validateImage.convertJoin(theme.icon, context + ".icon", errors, warnings, information);
const dups = Utils.Dupiclates(json.layers.map(layer => layer["id"]))
if (dups.length > 0) {
errors.push(`The theme ${json.id} defines multiple layers with id ${dups.join(", ")}`)
@ -166,7 +193,7 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
// The first key in the the title-field must be english, otherwise the title in the loading page will be the different language
const targetLanguage = theme.title.SupportedLanguages()[0]
if(targetLanguage !== "en"){
if (targetLanguage !== "en") {
warnings.push(`TargetLanguage is not 'en' for public theme ${theme.id}, it is ${targetLanguage}. Move 'en' up in the title of the theme and set it as the first key`)
}
@ -192,10 +219,10 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
}
export class ValidateThemeAndLayers extends Fuse<LayoutConfigJson> {
constructor(knownImagePaths: Set<string>, path: string, isBuiltin: boolean, sharedTagRenderings: Map<string, any>) {
constructor(doesImageExist: DoesImageExist, path: string, isBuiltin: boolean, sharedTagRenderings: Map<string, any>) {
super("Validates a theme and the contained layers",
new ValidateTheme(knownImagePaths, path, isBuiltin, sharedTagRenderings),
new On("layers", new Each(new ValidateLayer(undefined, false, knownImagePaths)))
new ValidateTheme(doesImageExist, path, isBuiltin, sharedTagRenderings),
new On("layers", new Each(new ValidateLayer(undefined, false, doesImageExist)))
);
}
}
@ -354,7 +381,7 @@ export class DetectShadowedMappings extends DesugaringStep<QuestionableTagRender
})
for (let j = 0; j < i; j++) {
const doesMatch = parsedConditions[j].matchesProperties(properties)
if(doesMatch && json.mappings[j].hideInAnswer === true && json.mappings[i].hideInAnswer !== true){
if (doesMatch && json.mappings[j].hideInAnswer === true && json.mappings[i].hideInAnswer !== true) {
warnings.push(`At ${context}: Mapping ${i} is shadowed by mapping ${j}. However, mapping ${j} has 'hideInAnswer' set, which will result in a different rendering in question-mode.`)
} else if (doesMatch) {
// The current mapping is shadowed!
@ -385,14 +412,15 @@ export class DetectShadowedMappings extends DesugaringStep<QuestionableTagRender
}
export class DetectMappingsWithImages extends DesugaringStep<TagRenderingConfigJson> {
private knownImagePaths: Set<string>;
constructor(knownImagePaths: Set<string>) {
private readonly _doesImageExist: DoesImageExist;
constructor(doesImageExist: DoesImageExist) {
super("Checks that 'then'clauses in mappings don't have images, but use 'icon' instead", [], "DetectMappingsWithImages");
this.knownImagePaths = knownImagePaths;
this._doesImageExist = doesImageExist;
}
/**
* const r = new DetectMappingsWithImages(new Set<string>()).convert({
* const r = new DetectMappingsWithImages(new DoesImageExist(new Set<string>())).convert({
* "mappings": [
* {
* "if": "bicycle_parking=stands",
@ -412,9 +440,9 @@ export class DetectMappingsWithImages extends DesugaringStep<TagRenderingConfigJ
* r.errors.some(msg => msg.indexOf("./assets/layers/bike_parking/staple.svg") >= 0) // => true
*/
convert(json: TagRenderingConfigJson, context: string): { result: TagRenderingConfigJson; errors?: string[]; warnings?: string[], information?: string[] } {
const errors = []
const warnings = []
const information = []
const errors: string[] = []
const warnings: string[] = []
const information: string[] = []
if (json.mappings === undefined || json.mappings.length === 0) {
return {result: json}
}
@ -432,10 +460,8 @@ export class DetectMappingsWithImages extends DesugaringStep<TagRenderingConfigJ
information.push(`${ctx}: Ignored image ${images.join(", ")} in 'then'-clause of a mapping as this check has been disabled`)
for (const image of images) {
if (this.knownImagePaths !== undefined && !this.knownImagePaths.has(image)) {
const ctx = context === undefined ? "" : ` in a layer defined in the theme ${context}`
errors.push(`Image with path ${image} not found or not attributed; it is used in ${json.id}${ctx}`)
}
this._doesImageExist.convertJoin(image, ctx, errors, warnings, information);
}
}
@ -454,10 +480,10 @@ export class DetectMappingsWithImages extends DesugaringStep<TagRenderingConfigJ
}
export class ValidateTagRenderings extends Fuse<TagRenderingConfigJson> {
constructor(layerConfig?: LayerConfigJson, knownImagePaths?: Set<string>) {
constructor(layerConfig?: LayerConfigJson, doesImageExist?: DoesImageExist) {
super("Various validation on tagRenderingConfigs",
new DetectShadowedMappings(layerConfig),
new DetectMappingsWithImages(knownImagePaths)
new DetectMappingsWithImages(doesImageExist)
);
}
}
@ -469,13 +495,13 @@ export class ValidateLayer extends DesugaringStep<LayerConfigJson> {
*/
private readonly _path?: string;
private readonly _isBuiltin: boolean;
private knownImagePaths: Set<string> | undefined;
private readonly _doesImageExist: DoesImageExist;
constructor(path: string, isBuiltin: boolean, knownImagePaths: Set<string>) {
constructor(path: string, isBuiltin: boolean, doesImageExist: DoesImageExist) {
super("Doesn't change anything, but emits warnings and errors", [], "ValidateLayer");
this._path = path;
this._isBuiltin = isBuiltin;
this.knownImagePaths = knownImagePaths
this._doesImageExist = doesImageExist
}
convert(json: LayerConfigJson, context: string): { result: LayerConfigJson; errors: string[]; warnings?: string[], information?: string[] } {
@ -563,7 +589,7 @@ export class ValidateLayer extends DesugaringStep<LayerConfigJson> {
}
}
if (json.tagRenderings !== undefined) {
const r = new On("tagRenderings", new Each(new ValidateTagRenderings(json, this.knownImagePaths))).convert(json, context)
const r = new On("tagRenderings", new Each(new ValidateTagRenderings(json, this._doesImageExist))).convert(json, context)
warnings.push(...(r.warnings ?? []))
errors.push(...(r.errors ?? []))
information.push(...(r.information ?? []))

View file

@ -31,6 +31,7 @@ import {FixedUiElement} from "../../UI/Base/FixedUiElement";
export default class LayerConfig extends WithContextLoader {
public static readonly syncSelectionAllowed = ["no", "local", "theme-only", "global"] as const;
public readonly id: string;
public readonly name: Translation;
public readonly description: Translation;
@ -44,10 +45,8 @@ export default class LayerConfig extends WithContextLoader {
public readonly maxzoom: number;
public readonly title?: TagRenderingConfig;
public readonly titleIcons: TagRenderingConfig[];
public readonly mapRendering: PointRenderingConfig[]
public readonly lineRendering: LineRenderingConfig[]
public readonly units: Unit[];
public readonly deletion: DeleteConfig | null;
public readonly allowMove: MoveConfig | null
@ -57,15 +56,11 @@ export default class LayerConfig extends WithContextLoader {
* In seconds
*/
public readonly maxAgeOfCache: number
public readonly presets: PresetConfig[];
public readonly tagRenderings: TagRenderingConfig[];
public readonly filters: FilterConfig[];
public readonly filterIsSameAs: string;
public readonly forceLoad: boolean;
public static readonly syncSelectionAllowed = ["no" , "local" , "theme-only" , "global"] as const;
public readonly syncSelection: (typeof LayerConfig.syncSelectionAllowed)[number] // this is a trick to conver a constant array of strings into a type union of these values
constructor(
@ -74,18 +69,24 @@ export default class LayerConfig extends WithContextLoader {
official: boolean = true
) {
context = context + "." + json.id;
const translationContext = "layers:"+json.id
const translationContext = "layers:" + json.id
super(json, context)
this.id = json.id;
if (typeof json === "string") {
throw `Not a valid layer: the layerConfig is a string. 'npm run generate:layeroverview' might be needed (at ${context})`
}
if (json.id === undefined) {
throw "Not a valid layer: id is undefined: " + JSON.stringify(json)
throw `Not a valid layer: id is undefined: ${JSON.stringify(json)} (At ${context})`
}
if (json.source === undefined) {
throw "Layer " + this.id + " does not define a source section (" + context + ")"
}
if (json.source.osmTags === undefined) {
throw "Layer " + this.id + " does not define a osmTags in the source section - these should always be present, even for geojson layers (" + context + ")"
}
@ -98,8 +99,8 @@ export default class LayerConfig extends WithContextLoader {
}
this.maxAgeOfCache = json.source.maxCacheAge ?? 24 * 60 * 60 * 30
if(json.syncSelection !== undefined && LayerConfig.syncSelectionAllowed.indexOf(json.syncSelection) < 0){
throw context+ " Invalid sync-selection: must be one of "+LayerConfig.syncSelectionAllowed.map(v => `'${v}'`).join(", ")+" but got '"+json.syncSelection+"'"
if (json.syncSelection !== undefined && LayerConfig.syncSelectionAllowed.indexOf(json.syncSelection) < 0) {
throw context + " Invalid sync-selection: must be one of " + LayerConfig.syncSelectionAllowed.map(v => `'${v}'`).join(", ") + " but got '" + json.syncSelection + "'"
}
this.syncSelection = json.syncSelection ?? "no";
const osmTags = TagUtils.Tag(
@ -107,8 +108,8 @@ export default class LayerConfig extends WithContextLoader {
context + "source.osmTags"
);
if(Constants.priviliged_layers.indexOf(this.id) < 0 && osmTags.isNegative()){
throw context + "The source states tags which give a very wide selection: it only uses negative expressions, which will result in too much and unexpected data. Add at least one required tag. The tags are:\n\t"+osmTags.asHumanString(false, false, {});
if (Constants.priviliged_layers.indexOf(this.id) < 0 && osmTags.isNegative()) {
throw context + "The source states tags which give a very wide selection: it only uses negative expressions, which will result in too much and unexpected data. Add at least one required tag. The tags are:\n\t" + osmTags.asHumanString(false, false, {});
}
if (json.source["geoJsonSource"] !== undefined) {
@ -138,8 +139,8 @@ export default class LayerConfig extends WithContextLoader {
this.allowSplit = json.allowSplit ?? false;
this.name = Translations.T(json.name, translationContext + ".name");
if(json.units!==undefined && !Array.isArray(json.units)){
throw "At "+context+".units: the 'units'-section should be a list; you probably have an object there"
if (json.units !== undefined && !Array.isArray(json.units)) {
throw "At " + context + ".units: the 'units'-section should be a list; you probably have an object there"
}
this.units = (json.units ?? []).map(((unitJson, i) => Unit.fromJson(unitJson, `${context}.unit[${i}]`)))
@ -167,8 +168,8 @@ export default class LayerConfig extends WithContextLoader {
const index = kv.indexOf("=");
let key = kv.substring(0, index).trim();
const r = "[a-z_][a-z0-9:]*"
if(key.match(r) === null){
throw "At "+context+" invalid key for calculated tag: "+key+"; it should match "+r
if (key.match(r) === null) {
throw "At " + context + " invalid key for calculated tag: " + key + "; it should match " + r
}
const isStrict = key.endsWith(':')
if (isStrict) {
@ -190,6 +191,9 @@ export default class LayerConfig extends WithContextLoader {
this.doNotDownload = json.doNotDownload ?? false;
this.passAllFeatures = json.passAllFeatures ?? false;
this.minzoom = json.minzoom ?? 0;
if(json["minZoom"] !== undefined){
throw "At "+context+": minzoom is written all lowercase"
}
this.minzoomVisible = json.minzoomVisible ?? this.minzoom;
this.shownByDefault = json.shownByDefault ?? true;
this.forceLoad = json.forceLoad ?? false;
@ -350,7 +354,7 @@ export default class LayerConfig extends WithContextLoader {
, addedByDefault = false, canBeIncluded = true): BaseUIElement {
const extraProps = []
extraProps.push("This layer is shown at zoomlevel **"+this.minzoom+"** and higher")
extraProps.push("This layer is shown at zoomlevel **" + this.minzoom + "** and higher")
if (canBeIncluded) {
if (addedByDefault) {
@ -440,7 +444,7 @@ export default class LayerConfig extends WithContextLoader {
let overpassLink: BaseUIElement = undefined;
if (Constants.priviliged_layers.indexOf(this.id) < 0) {
try {
overpassLink = new Link("Execute on overpass", Overpass.AsOverpassTurboLink(<TagsFilter> new And(neededTags).optimize()))
overpassLink = new Link("Execute on overpass", Overpass.AsOverpassTurboLink(<TagsFilter>new And(neededTags).optimize()))
} catch (e) {
console.error("Could not generate overpasslink for " + this.id)
}

View file

@ -177,7 +177,8 @@ export default class TagRenderingConfig {
throw "Tagrendering has a 'mappings'-object, but expected a list (" + context + ")"
}
this.mappings = json.mappings.map((m, i) => TagRenderingConfig.ExtractMapping(m, i, translationKey, context, this.multiAnswer, this.question !== undefined));
const commonIconSize = Utils.NoNull(json.mappings.map(m => m.icon !== undefined ? m.icon["class"] : undefined))[0] ?? "small"
this.mappings = json.mappings.map((m, i) => TagRenderingConfig.ExtractMapping(m, i, translationKey, context, this.multiAnswer, this.question !== undefined, commonIconSize));
}
if (this.question && this.freeform?.key === undefined && this.mappings === undefined) {
@ -288,7 +289,7 @@ export default class TagRenderingConfig {
public static ExtractMapping(mapping: MappingConfigJson, i: number, translationKey: string,
context: string,
multiAnswer?: boolean, isQuestionable?: boolean) {
multiAnswer?: boolean, isQuestionable?: boolean, commonSize: string = "small") {
const ctx = `${translationKey}.mappings.${i}`
if (mapping.if === undefined) {
@ -327,7 +328,7 @@ export default class TagRenderingConfig {
}
let icon = undefined;
let iconClass = "small"
let iconClass = commonSize
if (mapping.icon !== undefined) {
if (typeof mapping.icon === "string" && mapping.icon !== "") {
icon = mapping.icon
@ -352,7 +353,7 @@ export default class TagRenderingConfig {
}
if (hideInAnswer !== true && !(mp.ifnot?.isUsableAsAnswer() ?? true)) {
throw `${context}.mapping[${i}].ifnot: This value cannot be used to answer a question, probably because it contains a regex or an OR. Either change it or set 'hideInAnswer'`
throw `${context}.mapping[${i}].ifnot: This value cannot be used to answer a question, probably because it contains a regex or an OR. If a contributor were to pick this as an option, MapComplete wouldn't be able to determine which tags to add.\n Either change it or set 'hideInAnswer'`
}
}
@ -363,7 +364,7 @@ export default class TagRenderingConfig {
* Returns true if it is known or not shown, false if the question should be asked
* @constructor
*/
public IsKnown(tags: any): boolean {
public IsKnown(tags: Record<string, string>): boolean {
if (this.condition &&
!this.condition.matchesProperties(tags)) {
// Filtered away by the condition, so it is kindof known
@ -399,7 +400,7 @@ export default class TagRenderingConfig {
* @param tags
* @constructor
*/
public GetRenderValues(tags: any): { then: Translation, icon?: string, iconClass?: string }[] {
public GetRenderValues(tags: Record<string, string>): { then: Translation, icon?: string, iconClass?: string }[] {
if (!this.multiAnswer) {
return [this.GetRenderValueWithImage(tags)]
}
@ -409,7 +410,7 @@ export default class TagRenderingConfig {
let freeformKeyDefined = this.freeform?.key !== undefined;
let usedFreeformValues = new Set<string>()
// We run over all the mappings first, to check if the mapping matches
const applicableMappings: { then: TypedTranslation<any>, img?: string }[] = Utils.NoNull((this.mappings ?? [])?.map(mapping => {
const applicableMappings: { then: TypedTranslation<Record<string, string>>, img?: string }[] = Utils.NoNull((this.mappings ?? [])?.map(mapping => {
if (mapping.if === undefined) {
return mapping;
}

View file

@ -28,7 +28,10 @@ export default class ScrollableFullScreen extends UIElement {
constructor(title: ((options: { mode: string }) => BaseUIElement),
content: ((options: { mode: string, resetScrollSignal: UIEventSource<void> }) => BaseUIElement),
hashToShow: string,
isShown: UIEventSource<boolean> = new UIEventSource<boolean>(false)
isShown: UIEventSource<boolean> = new UIEventSource<boolean>(false),
options?: {
setHash?: true | boolean
}
) {
super();
this.hashToShow = hashToShow;
@ -53,16 +56,21 @@ export default class ScrollableFullScreen extends UIElement {
const self = this;
const setHash = options?.setHash ?? true;
if(setHash){
Hash.hash.addCallback(h => {
if (h === undefined) {
isShown.setData(false)
}
})
}
isShown.addCallback(isShown => {
if (isShown) {
// We first must set the hash, then activate the panel
// If the order is wrong, this will cause the panel to disactivate again
if(setHash){
Hash.hash.setData(hashToShow)
}
self.Activate();
} else {
// Some cleanup...

View file

@ -159,6 +159,12 @@ class SingleLayerSelectionButton extends Toggle {
export default class BackgroundMapSwitch extends Combine {
/**
* Three buttons to easily switch map layers between OSM, aerial and some map.
* @param state
* @param currentBackground
* @param options
*/
constructor(
state: {
locationControl: UIEventSource<Loc>,

View file

@ -48,7 +48,10 @@ export default class LeftControls extends Combine {
}
return new Lazy(() => {
const tagsSource = state.allElements.getEventSourceById(feature.properties.id)
return new FeatureInfoBox(tagsSource, currentViewFL.layerDef, state, "currentview", guiState.currentViewControlIsOpened)
return new FeatureInfoBox(tagsSource, currentViewFL.layerDef, state, {
hashToShow: "currentview",
isShown: guiState.currentViewControlIsOpened
})
.SetClass("md:floating-element-width")
})
})).SetStyle("width: 40rem").SetClass("block")

View file

@ -93,7 +93,7 @@ export class CompareToAlreadyExistingNotes extends Combine implements FlowStep<{
state,
zoomToFeatures: true,
leafletMap: comparisonMap.leafletMap,
features: new StaticFeatureSource(partitionedImportPoints.map(p => p.hasNearby)),
features: StaticFeatureSource.fromGeojsonStore(partitionedImportPoints.map(p => p.hasNearby)),
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state)
})

View file

@ -22,12 +22,17 @@ import ShowDataLayer from "../ShowDataLayer/ShowDataLayer";
import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource";
import ValidatedTextField from "../Input/ValidatedTextField";
import {LocalStorageSource} from "../../Logic/Web/LocalStorageSource";
import * as currentview from "../../assets/layers/current_view/current_view.json"
import * as import_candidate from "../../assets/layers/import_candidate/import_candidate.json"
import {GeoOperations} from "../../Logic/GeoOperations";
import FeatureInfoBox from "../Popup/FeatureInfoBox";
import {ImportUtils} from "./ImportUtils";
import Translations from "../i18n/Translations";
import ShowDataMultiLayer from "../ShowDataLayer/ShowDataMultiLayer";
import FilteredLayer, {FilterState} from "../../Models/FilteredLayer";
import {Feature, FeatureCollection} from "@turf/turf";
import * as currentview from "../../assets/layers/current_view/current_view.json"
import {CheckBox} from "../Input/Checkboxes";
import BackgroundMapSwitch from "../BigComponents/BackgroundMapSwitch";
/**
* Given the data to import, the bbox and the layer, will query overpass for similar items
@ -41,15 +46,16 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
state,
params: { bbox: BBox, layer: LayerConfig, theme: string, features: any[] }) {
const t = Translations.t.importHelper.conflationChecker
const bbox = params.bbox.padAbsolute(0.0001)
const layer = params.layer;
const toImport: {features: any[]} = params;
const toImport: { features: any[] } = params;
let overpassStatus = new UIEventSource<{ error: string } | "running" | "success" | "idle" | "cached">("idle")
const cacheAge = new UIEventSource<number>(undefined);
function loadDataFromOverpass(){
function loadDataFromOverpass() {
// Load the data!
const url = Constants.defaultOverpassUrls[1]
const relationTracker = new RelationsTracker()
@ -73,23 +79,31 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
whenLoaded: (v) => {
if (v !== undefined && v !== null) {
console.log("Loaded from local storage:", v)
const [geojson, date] = v;
const timeDiff = (new Date().getTime() - date.getTime()) / 1000;
console.log("Loaded ", geojson.features.length, " features; cache is ", timeDiff, "seconds old")
cacheAge.setData(timeDiff)
overpassStatus.setData("cached")
}else{
loadDataFromOverpass()
}
}
});
const cacheAge = fromLocalStorage.map(d => {
if(d === undefined || d[1] === undefined){
return undefined
}
const [_, loadedDate] = d
return (new Date().getTime() - loadedDate.getTime()) / 1000;
})
cacheAge.addCallbackD(timeDiff => {
if (timeDiff < 24 * 60 * 60) {
// Recently cached!
overpassStatus.setData("cached")
return;
}
cacheAge.setData(-1)
}
} else {
loadDataFromOverpass()
}
});
})
const geojson: Store<any> = fromLocalStorage.map(d => {
const geojson: Store<FeatureCollection> = fromLocalStorage.map(d => {
if (d === undefined) {
return undefined
}
@ -99,9 +113,10 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
const background = new UIEventSource<BaseLayer>(AvailableBaseLayers.osmCarto)
const location = new UIEventSource<Loc>({lat: 0, lon: 0, zoom: 1})
const currentBounds = new UIEventSource<BBox>(undefined)
const zoomLevel = ValidatedTextField.ForType("pnat").ConstructInputElement()
const zoomLevel = ValidatedTextField.ForType("pnat").ConstructInputElement({
value: LocalStorageSource.GetParsed<string>("importer-zoom-level", "0")
})
zoomLevel.SetClass("ml-1 border border-black")
zoomLevel.GetValue().syncWith(LocalStorageSource.Get("importer-zoom-level", "14"), true)
const osmLiveData = Minimap.createMiniMap({
allowMoving: true,
location,
@ -110,18 +125,24 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
attribution: new Attribution(location, state.osmConnection.userDetails, undefined, currentBounds)
})
osmLiveData.SetClass("w-full").SetStyle("height: 500px")
const preview = new StaticFeatureSource(geojson.map(geojson => {
const geojsonFeatures : Store<Feature[]> = geojson.map(geojson => {
if (geojson?.features === undefined) {
return []
}
const zoomedEnough: boolean = osmLiveData.location.data.zoom >= Number(zoomLevel.GetValue().data)
if (!zoomedEnough) {
const currentZoom = zoomLevel.GetValue().data
const zoomedEnough: boolean = osmLiveData.location.data.zoom >= Number(currentZoom)
if (currentZoom !== undefined && !zoomedEnough) {
return []
}
const bounds = osmLiveData.bounds.data
if(bounds === undefined){
return geojson.features;
}
return geojson.features.filter(f => BBox.get(f).overlapsWith(bounds))
}, [osmLiveData.bounds, zoomLevel.GetValue()]));
}, [osmLiveData.bounds, zoomLevel.GetValue()])
const preview = StaticFeatureSource.fromGeojsonStore(geojsonFeatures)
new ShowDataLayer({
layerToShow: new LayerConfig(currentview),
@ -134,12 +155,16 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
])
})
new ShowDataLayer({
layerToShow: layer,
new ShowDataMultiLayer({
//layerToShow: layer,
layers: new UIEventSource<FilteredLayer[]>([{
layerDef: layer,
isDisplayed: new UIEventSource<boolean>(true),
appliedFilters: new UIEventSource<Map<string, FilterState>>(undefined)
}]),
state,
leafletMap: osmLiveData.leafletMap,
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state),
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state, {setHash: false}),
zoomToFeatures: false,
features: preview
})
@ -148,7 +173,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
layerToShow: new LayerConfig(import_candidate),
state,
leafletMap: osmLiveData.leafletMap,
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state),
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state, {setHash: false}),
zoomToFeatures: false,
features: StaticFeatureSource.fromGeojson(toImport.features)
})
@ -164,7 +189,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
matchedFeaturesMap.SetClass("w-full").SetStyle("height: 500px")
// Featuresource showing OSM-features which are nearby a toImport-feature
const nearbyFeatures = new StaticFeatureSource(geojson.map(osmData => {
const geojsonMapped: Store<Feature[]> = geojson.map(osmData => {
if (osmData?.features === undefined) {
return []
}
@ -172,31 +197,36 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
return osmData.features.filter(f =>
toImport.features.some(imp =>
maxDist >= GeoOperations.distanceBetween(imp.geometry.coordinates, GeoOperations.centerpointCoordinates(f))))
}, [nearbyCutoff.GetValue().stabilized(500)]));
}, [nearbyCutoff.GetValue().stabilized(500)])
const nearbyFeatures = StaticFeatureSource.fromGeojsonStore(geojsonMapped);
const paritionedImport = ImportUtils.partitionFeaturesIfNearby(toImport, geojson, nearbyCutoff.GetValue().map(Number));
// Featuresource showing OSM-features which are nearby a toImport-feature
const toImportWithNearby = new StaticFeatureSource(paritionedImport.map(els => els?.hasNearby ?? []));
new ShowDataLayer({
layerToShow: layer,
state,
leafletMap: matchedFeaturesMap.leafletMap,
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state),
zoomToFeatures: true,
features: nearbyFeatures
})
const toImportWithNearby = StaticFeatureSource.fromGeojsonStore(paritionedImport.map(els => els?.hasNearby ?? []));
toImportWithNearby.features.addCallback(nearby => console.log("The following features are near an already existing object:", nearby))
new ShowDataLayer({
layerToShow: new LayerConfig(import_candidate),
state,
leafletMap: matchedFeaturesMap.leafletMap,
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state),
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state, {setHash: false}),
zoomToFeatures: false,
features: toImportWithNearby
})
const showOsmLayer = new CheckBox(t.showOsmLayerInConflationMap, true)
new ShowDataLayer({
layerToShow: layer,
state,
leafletMap: matchedFeaturesMap.leafletMap,
popup: (tags, layer) => new FeatureInfoBox(tags, layer, state, {setHash: false}),
zoomToFeatures: true,
features: nearbyFeatures,
doShowLayer: showOsmLayer.GetValue()
})
const t = Translations.t.importHelper.conflationChecker
const conflationMaps = new Combine([
new VariableUiElement(
@ -225,9 +255,9 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
})),
new Title(t.titleLive),
t.importCandidatesCount.Subs({count:toImport.features.length }),
t.importCandidatesCount.Subs({count: toImport.features.length}),
new VariableUiElement(geojson.map(geojson => {
if(geojson?.features?.length === undefined || geojson?.features?.length === 0){
if (geojson?.features?.length === undefined || geojson?.features?.length === 0) {
return t.nothingLoaded.Subs(layer).SetClass("alert")
}
return new Combine([
@ -236,16 +266,26 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
])
})),
osmLiveData,
new Combine([
t.zoomLevelSelection,
zoomLevel,
new VariableUiElement(osmLiveData.location.map(location => {
return t.zoomIn.Subs({needed:zoomLevel, current: location.zoom })
} )),
return t.zoomIn.Subs(<any>{current: location.zoom})
})),
]).SetClass("flex"),
new Title(t.titleNearby),
new Combine([t.mapShowingNearbyIntro, nearbyCutoff]).SetClass("flex"),
new VariableUiElement(toImportWithNearby.features.map(feats =>
t.nearbyWarn.Subs({count: feats.length}).SetClass("alert"))),
t.setRangeToZero,
matchedFeaturesMap]).SetClass("flex flex-col")
matchedFeaturesMap,
new Combine([
new BackgroundMapSwitch({backgroundLayer: background, locationControl: matchedFeaturesMap.location}, background),
showOsmLayer,
]).SetClass("flex")
]).SetClass("flex flex-col")
super([
new Title(t.title),
new VariableUiElement(overpassStatus.map(d => {
@ -270,7 +310,11 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
])
this.Value = paritionedImport.map(feats => ({theme: params.theme, features: feats?.noNearby, layer: params.layer}))
this.Value = paritionedImport.map(feats => ({
theme: params.theme,
features: feats?.noNearby,
layer: params.layer
}))
this.IsValid = this.Value.map(v => v?.features !== undefined && v.features.length > 0)
}

View file

@ -1,8 +1,13 @@
import {Store} from "../../Logic/UIEventSource";
import {GeoOperations} from "../../Logic/GeoOperations";
import {Feature, Geometry} from "@turf/turf";
export class ImportUtils {
public static partitionFeaturesIfNearby(toPartitionFeatureCollection: ({ features: any[] }), compareWith: Store<{ features: any[] }>, cutoffDistanceInMeters: Store<number>): Store<{ hasNearby: any[], noNearby: any[] }> {
public static partitionFeaturesIfNearby(
toPartitionFeatureCollection: ({ features: Feature<Geometry>[] }),
compareWith: Store<{ features: Feature[] }>,
cutoffDistanceInMeters: Store<number>)
: Store<{ hasNearby: Feature[], noNearby: Feature[] }> {
return compareWith.map(osmData => {
if (osmData?.features === undefined) {
return undefined
@ -16,7 +21,7 @@ export class ImportUtils {
const noNearby = []
for (const toImportElement of toPartitionFeatureCollection.features) {
const hasNearbyFeature = osmData.features.some(f =>
maxDist >= GeoOperations.distanceBetween(toImportElement.geometry.coordinates, GeoOperations.centerpointCoordinates(f)))
maxDist >= GeoOperations.distanceBetween(<any> toImportElement.geometry.coordinates, GeoOperations.centerpointCoordinates(f)))
if (hasNearbyFeature) {
hasNearby.push(toImportElement)
} else {

View file

@ -24,6 +24,7 @@ import ScrollableFullScreen from "../Base/ScrollableFullScreen";
import Title from "../Base/Title";
import CheckBoxes from "../Input/Checkboxes";
import {AllTagsPanel} from "../AllTagsPanel";
import BackgroundMapSwitch from "../BigComponents/BackgroundMapSwitch";
class PreviewPanel extends ScrollableFullScreen {
@ -109,6 +110,10 @@ export class MapPreview extends Combine implements FlowStep<{ bbox: BBox, layer:
bounds: currentBounds,
attribution: new Attribution(location, state.osmConnection.userDetails, undefined, currentBounds)
})
const layerControl = new BackgroundMapSwitch( {
backgroundLayer: background,
locationControl: location
},background)
map.SetClass("w-full").SetStyle("height: 500px")
new ShowDataMultiLayer({
@ -147,6 +152,7 @@ export class MapPreview extends Combine implements FlowStep<{ bbox: BBox, layer:
mismatchIndicator,
map,
layerControl,
confirm
]);

View file

@ -10,7 +10,7 @@ export class CheckBox extends InputElementMap<number[], boolean> {
new CheckBoxes([el]),
(x0, x1) => x0 === x1,
t => t.length > 0,
x => x ? [0] : []
x => x ? [0] : [],
);
if(defaultValue !== undefined){
this.GetValue().setData(defaultValue)

View file

@ -1,5 +1,5 @@
import {InputElement} from "./InputElement";
import {UIEventSource} from "../../Logic/UIEventSource";
import {Store, UIEventSource} from "../../Logic/UIEventSource";
export default class InputElementMap<T, X> extends InputElement<X> {
@ -13,7 +13,7 @@ export default class InputElementMap<T, X> extends InputElement<X> {
isSame: (x0: X, x1: X) => boolean,
toX: (t: T) => X,
fromX: (x: X) => T,
extraSources: UIEventSource<any>[] = []
extraSources: Store<any>[] = []
) {
super();
this.isSame = isSame;

View file

@ -0,0 +1,255 @@
import {UIElement} from "../UIElement";
import {InputElement} from "./InputElement";
import BaseUIElement from "../BaseUIElement";
import {Store, UIEventSource} from "../../Logic/UIEventSource";
import Translations from "../i18n/Translations";
import Locale from "../i18n/Locale";
import Combine from "../Base/Combine";
import {TextField} from "./TextField";
import Svg from "../../Svg";
import {VariableUiElement} from "../Base/VariableUIElement";
/**
* A single 'pill' which can hide itself if the search criteria is not met
*/
class SelfHidingToggle extends UIElement implements InputElement<boolean> {
private readonly _shown: BaseUIElement;
public readonly _selected: UIEventSource<boolean>
public readonly isShown: Store<boolean> = new UIEventSource<boolean>(true);
public readonly forceSelected: UIEventSource<boolean>
private readonly _squared: boolean;
public constructor(
shown: string | BaseUIElement,
mainTerm: Record<string, string>,
search: Store<string>,
options?: {
searchTerms?: Record<string, string[]>,
selected?: UIEventSource<boolean>,
forceSelected?: UIEventSource<boolean>,
squared?: boolean
}
) {
super();
this._shown = Translations.W(shown);
this._squared = options?.squared ?? false;
const searchTerms: Record<string, string[]> = {};
for (const lng in options?.searchTerms ?? []) {
if (lng === "_context") {
continue
}
searchTerms[lng] = options?.searchTerms[lng]?.map(SelfHidingToggle.clean)
}
for (const lng in mainTerm) {
if (lng === "_context") {
continue
}
const main = SelfHidingToggle.clean( mainTerm[lng])
searchTerms[lng] = [main].concat(searchTerms[lng] ?? [])
}
const selected = this._selected = options?.selected ?? new UIEventSource<boolean>(false);
const forceSelected = this.forceSelected = options?.forceSelected ?? new UIEventSource<boolean>(false)
this.isShown = search.map(s => {
if (s === undefined || s.length === 0) {
return true;
}
if (selected.data && !forceSelected.data) {
return true
}
s = s?.trim()?.toLowerCase()
return searchTerms[Locale.language.data].some(t => t.indexOf(s) >= 0);
}, [selected, Locale.language])
const self = this;
this.isShown.addCallbackAndRun(shown => {
if (shown) {
self.RemoveClass("hidden")
} else {
self.SetClass("hidden")
}
})
}
private static clean(s: string) : string{
return s?.trim()?.toLowerCase()?.replace(/[-]/, "")
}
GetValue(): UIEventSource<boolean> {
return this._selected
}
IsValid(t: boolean): boolean {
return true;
}
protected InnerRender(): string | BaseUIElement {
let el: BaseUIElement = this._shown;
const selected = this._selected;
selected.addCallbackAndRun(selected => {
if (selected) {
el.SetClass("border-4")
el.RemoveClass("border")
el.SetStyle("margin: 0")
} else {
el.SetStyle("margin: 3px")
el.SetClass("border")
el.RemoveClass("border-4")
}
})
const forcedSelection = this.forceSelected
el.onClick(() => {
if(forcedSelection.data){
selected.setData(true)
}else{
selected.setData(!selected.data);
}
})
if(!this._squared){
el.SetClass("rounded-full")
}
return el.SetClass("border border-black p-1 px-4")
}
}
/**
* The searchable mappings selector is a selector which shows various pills from which one (or more) options can be chosen.
* A searchfield can be used to filter the values
*/
export class SearchablePillsSelector<T> extends Combine implements InputElement<T[]> {
private selectedElements: UIEventSource<T[]>;
public readonly someMatchFound: Store<boolean>;
constructor(
values: { show: BaseUIElement, value: T, mainTerm: Record<string, string>, searchTerms?: Record<string, string[]> }[],
options?: {
mode?: "select-one" | "select-many",
selectedElements?: UIEventSource<T[]>,
searchValue?: UIEventSource<string>,
onNoMatches?: BaseUIElement,
onNoSearchMade?: BaseUIElement,
selectIfSingle?: false | boolean,
searchAreaClass?: string
}) {
const search = new TextField({value: options?.searchValue})
const searchBar = new Combine([Svg.search_svg().SetClass("w-8 normal-background"), search.SetClass("w-full")])
.SetClass("flex items-center border-2 border-black m-2")
const searchValue = search.GetValue().map(s => s?.trim()?.toLowerCase())
const selectedElements = options?.selectedElements ?? new UIEventSource<T[]>([]);
const mode = options?.mode ?? "select-one";
const onEmpty = options?.onNoMatches ?? Translations.t.general.noMatchingMapping
const mappedValues: { show: SelfHidingToggle, mainTerm: Record<string, string>, value: T }[] = values.map(v => {
const vIsSelected = new UIEventSource(false);
selectedElements.addCallbackAndRunD(selectedElements => {
vIsSelected.setData(selectedElements.some(t => t === v.value))
})
vIsSelected.addCallback(selected => {
if (selected) {
if (mode === "select-one") {
selectedElements.setData([v.value])
} else if (!selectedElements.data.some(t => t === v.value)) {
selectedElements.data.push(v.value);
selectedElements.ping()
}
} else {
for (let i = 0; i < selectedElements.data.length; i++) {
const t = selectedElements.data[i]
if (t == v.value) {
selectedElements.data.splice(i, 1)
selectedElements.ping()
break;
}
}
}
})
const toggle = new SelfHidingToggle(v.show, v.mainTerm, searchValue, {
searchTerms: v.searchTerms,
selected: vIsSelected,
squared: mode === "select-many"
})
return {
...v,
show: toggle
};
})
let somethingShown: Store<boolean>
if (options.selectIfSingle) {
let forcedSelection : { value: T, show: SelfHidingToggle } = undefined
somethingShown = searchValue.map(_ => {
let totalShown = 0;
let lastShownValue: { value: T, show: SelfHidingToggle }
for (const mv of mappedValues) {
const valueIsShown = mv.show.isShown.data
if (valueIsShown) {
totalShown++;
lastShownValue = mv
}
}
if (totalShown == 1) {
if (this.selectedElements.data.indexOf(lastShownValue.value) < 0) {
this.selectedElements.setData([lastShownValue.value])
lastShownValue.show.forceSelected.setData(true)
forcedSelection = lastShownValue
}
} else if (forcedSelection != undefined) {
forcedSelection?.show?.forceSelected?.setData(false)
forcedSelection = undefined;
this.selectedElements.setData([])
}
return totalShown > 0
}, mappedValues.map(mv => mv.show.GetValue()))
} else {
somethingShown = searchValue.map(_ => mappedValues.some(mv => mv.show.isShown.data), mappedValues.map(mv => mv.show.GetValue()))
}
super([
searchBar,
new VariableUiElement(Locale.language.map(lng => {
if (options?.onNoSearchMade !== undefined && (searchValue.data === undefined || searchValue.data.length === 0)) {
return options?.onNoSearchMade
}
if (!somethingShown.data) {
return onEmpty
}
mappedValues.sort((a, b) => a.mainTerm[lng] < b.mainTerm[lng] ? -1 : 1)
return new Combine(mappedValues.map(e => e.show))
.SetClass("flex flex-wrap w-full content-start")
.SetClass(options?.searchAreaClass ?? "")
}, [somethingShown, searchValue]))
])
this.selectedElements = selectedElements;
this.someMatchFound = somethingShown;
}
public GetValue(): UIEventSource<T[]> {
return this.selectedElements;
}
IsValid(t: T[]): boolean {
return true;
}
}

View file

@ -477,9 +477,10 @@ export class OH {
lat: tags._lat,
lon: tags._lon,
address: {
country_code: tags._country.toLowerCase()
country_code: tags._country.toLowerCase(),
state: undefined
},
}, {tag_key: "opening_hours"});
}, <any> {tag_key: "opening_hours"});
}
/*

View file

@ -25,16 +25,20 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
tags: UIEventSource<any>,
layerConfig: LayerConfig,
state: FeaturePipelineState,
options?: {
hashToShow?: string,
isShown?: UIEventSource<boolean>,
setHash?: true | boolean
}
) {
if (state === undefined) {
throw "State is undefined!"
}
super(() => FeatureInfoBox.GenerateTitleBar(tags, layerConfig, state),
() => FeatureInfoBox.GenerateContent(tags, layerConfig, state),
hashToShow ?? tags.data.id ?? "item",
isShown);
options?.hashToShow ?? tags.data.id ?? "item",
options?.isShown,
options);
if (layerConfig === undefined) {
throw "Undefined layerconfig";
@ -50,7 +54,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
const titleIcons = new Combine(
layerConfig.titleIcons.map(icon => {
return new TagRenderingAnswer(tags, icon, state,
"block h-8 max-h-8 align-baseline box-content sm:p-0.5").SetClass("flex");
"block h-8 max-h-8 align-baseline box-content sm:p-0.5 titleicon");
}
))
.SetClass("flex flex-row flex-wrap pt-0.5 sm:pt-1 items-center mr-2")

View file

@ -31,6 +31,7 @@ import FeaturePipelineState from "../../Logic/State/FeaturePipelineState";
import Title from "../Base/Title";
import {OsmConnection} from "../../Logic/Osm/OsmConnection";
import {GeoOperations} from "../../Logic/GeoOperations";
import {SearchablePillsSelector} from "../Input/SearchableMappingsSelector";
/**
* Shows the question element.
@ -38,7 +39,7 @@ import {GeoOperations} from "../../Logic/GeoOperations";
*/
export default class TagRenderingQuestion extends Combine {
constructor(tags: UIEventSource<any>,
constructor(tags: UIEventSource<Record<string, string> & {id: string}>,
configuration: TagRenderingConfig,
state?: FeaturePipelineState,
options?: {
@ -87,7 +88,7 @@ export default class TagRenderingQuestion extends Combine {
))
const save = () => {
const selection = inputElement.GetValue().data;
const selection = TagUtils.FlattenMultiAnswer([inputElement.GetValue().data]);
if (selection) {
(state?.changes)
.applyAction(new ChangeTagAction(
@ -141,20 +142,29 @@ export default class TagRenderingQuestion extends Combine {
private static GenerateInputElement(
state: FeaturePipelineState,
configuration: TagRenderingConfig,
applicableMappings: { if: TagsFilter, then: TypedTranslation<object>, icon?: string, ifnot?: TagsFilter, addExtraTags: Tag[] }[],
applicableMappings: { if: TagsFilter, then: TypedTranslation<object>, icon?: string, ifnot?: TagsFilter, addExtraTags: Tag[], searchTerms?: Record<string, string[]> }[],
applicableUnit: Unit,
tagsSource: UIEventSource<any>,
feedback: UIEventSource<Translation>
): ReadonlyInputElement<TagsFilter> {
// FreeForm input will be undefined if not present; will already contain a special input element if applicable
const ff = TagRenderingQuestion.GenerateFreeform(state, configuration, applicableUnit, tagsSource, feedback);
const hasImages = applicableMappings.findIndex(mapping => mapping.icon !== undefined) >= 0
let inputEls: InputElement<TagsFilter>[];
const ifNotsPresent = applicableMappings.some(mapping => mapping.ifnot !== undefined)
if (applicableMappings.length > 8 &&
(configuration.freeform?.type === undefined || configuration.freeform?.type === "string") &&
(!configuration.multiAnswer || configuration.freeform === undefined)) {
return TagRenderingQuestion.GenerateSearchableSelector(state, configuration, applicableMappings, tagsSource)
}
// FreeForm input will be undefined if not present; will already contain a special input element if applicable
const ff = TagRenderingQuestion.GenerateFreeform(state, configuration, applicableUnit, tagsSource, feedback);
function allIfNotsExcept(excludeIndex: number): TagsFilter[] {
if (configuration.mappings === undefined || configuration.mappings.length === 0) {
return undefined
@ -221,6 +231,100 @@ export default class TagRenderingQuestion extends Combine {
}
private static GenerateSearchableSelector(
state: FeaturePipelineState,
configuration: TagRenderingConfig,
applicableMappings: { if: TagsFilter; ifnot?: TagsFilter, then: TypedTranslation<object>; icon?: string; iconClass?: string, addExtraTags: Tag[], searchTerms?: Record<string, string[]> }[], tagsSource: UIEventSource<any>): InputElement<TagsFilter> {
const values: { show: BaseUIElement, value: number, mainTerm: Record<string, string>, searchTerms?: Record<string, string[]> }[] = []
for (let i = 0; i < applicableMappings.length; i++) {
const mapping = applicableMappings[i];
const tr = mapping.then.Subs(tagsSource.data)
const patchedMapping = <{ iconClass: "small-height", then: TypedTranslation<object> }>{
...mapping,
iconClass: `small-height`,
icon: mapping.icon ?? "./assets/svg/none.svg"
}
const fancy = TagRenderingQuestion.GenerateMappingContent(patchedMapping, tagsSource, state).SetClass("normal-background")
values.push({
show: fancy,
value: i,
mainTerm: tr.translations,
searchTerms: mapping.searchTerms
})
}
const searchValue: UIEventSource<string> = new UIEventSource<string>(undefined)
const ff = configuration.freeform
let onEmpty: BaseUIElement = undefined
if (ff !== undefined) {
onEmpty = new VariableUiElement(searchValue.map(search => configuration.render.Subs({[ff.key]: search})))
}
const classes = "h-64 overflow-scroll"
const presetSearch = new SearchablePillsSelector<number>(values, {
selectIfSingle: true,
mode: configuration.multiAnswer ? "select-many" : "select-one",
searchValue,
onNoMatches: onEmpty?.SetClass(classes).SetClass("flex justify-center items-center"),
searchAreaClass: classes
})
return new InputElementMap<number[], And>(presetSearch,
(x0, x1) => {
if (x0 == x1) {
return true;
}
if (x0 === undefined || x1 === undefined) {
return false;
}
if (x0.and.length !== x1.and.length) {
return false;
}
for (let i = 0; i < x0.and.length; i++) {
if (x1.and[i] != x0.and[i]) {
return false
}
}
return true;
},
(selected) => {
if (ff !== undefined && searchValue.data?.length > 0 && !presetSearch.someMatchFound.data) {
const t = new Tag(ff.key, searchValue.data)
if (ff.addExtraTags) {
return new And([t, ...ff.addExtraTags])
}
return new And([t]);
}
if (selected === undefined || selected.length == 0) {
return undefined;
}
const tfs = Utils.NoNull(applicableMappings.map((mapping, i) => {
if (selected.indexOf(i) >= 0) {
return mapping.if
} else {
return mapping.ifnot
}
}))
console.log("Got tags", tfs)
return new And(tfs);
},
(tf) => {
if (tf === undefined) {
return []
}
const selected: number[] = []
for (let i = 0; i < applicableMappings.length; i++) {
const mapping = applicableMappings[i]
if (tf.and.some(t => mapping.if == t)) {
selected.push(i)
}
}
return selected;
},
[searchValue, presetSearch.someMatchFound]
);
}
private static GenerateMultiAnswer(
configuration: TagRenderingConfig,
@ -337,7 +441,7 @@ export default class TagRenderingQuestion extends Combine {
then: Translation,
addExtraTags: Tag[],
icon?: string,
iconClass?: string
iconClass?: "small" | "medium" | "large" | "small-height"
}, ifNot?: TagsFilter[]): InputElement<TagsFilter> {
let tagging: TagsFilter = mapping.if;
@ -358,13 +462,13 @@ export default class TagRenderingQuestion extends Combine {
private static GenerateMappingContent(mapping: {
then: Translation,
icon?: string,
iconClass?: string
iconClass?: "small" | "medium" | "large" | "small-height" | "medium-height" | "large-height"
}, tagsSource: UIEventSource<any>, state: FeaturePipelineState): BaseUIElement {
const text = new SubstitutedTranslation(mapping.then, tagsSource, state)
if (mapping.icon === undefined) {
return text;
}
return new Combine([new Img(mapping.icon).SetClass("mapping-icon-"+(mapping.iconClass ?? "small")), text]).SetClass("flex")
return new Combine([new Img(mapping.icon).SetClass("mr-1 mapping-icon-" + (mapping.iconClass ?? "small")), text]).SetClass("flex items-center")
}
private static GenerateFreeform(state: FeaturePipelineState, configuration: TagRenderingConfig, applicableUnit: Unit, tags: UIEventSource<any>, feedback: UIEventSource<Translation>)
@ -412,7 +516,7 @@ export default class TagRenderingQuestion extends Combine {
const tagsData = tags.data;
const feature = state?.allElements?.ContainingFeatures?.get(tagsData.id)
const center = feature != undefined ? GeoOperations.centerpointCoordinates(feature) : [0,0]
const center = feature != undefined ? GeoOperations.centerpointCoordinates(feature) : [0, 0]
const input: InputElement<string> = ValidatedTextField.ForType(configuration.freeform.type)?.ConstructInputElement({
country: () => tagsData._country,
location: [center[1], center[0]],
@ -428,8 +532,8 @@ export default class TagRenderingQuestion extends Combine {
input?.GetValue().setData(tagsData[freeform.key] ?? freeform.default);
// Add a length check
input?.GetValue().addCallbackD((v : string | undefined) => {
if(v?.length >= 255){
input?.GetValue().addCallbackD((v: string | undefined) => {
if (v?.length >= 255) {
feedback.setData(Translations.t.validation.tooLong.Subs({count: v.length}))
}
})
@ -451,7 +555,7 @@ export default class TagRenderingQuestion extends Combine {
public static CreateTagExplanation(selectedValue: Store<TagsFilter>,
tags: Store<object>,
state?: {osmConnection?: OsmConnection}){
state?: { osmConnection?: OsmConnection }) {
return new VariableUiElement(
selectedValue.map(
(tagsFilter: TagsFilter) => {

View file

@ -1,4 +1,4 @@
import {UIEventSource} from "../../Logic/UIEventSource";
import {Store, UIEventSource} from "../../Logic/UIEventSource";
import LayerConfig from "../../Models/ThemeConfig/LayerConfig";
import {ShowDataLayerOptions} from "./ShowDataLayerOptions";
import {ElementStorage} from "../../Logic/ElementStorage";
@ -20,7 +20,7 @@ We don't actually import it here. It is imported in the 'MinimapImplementation'-
export default class ShowDataLayerImplementation {
private static dataLayerIds = 0
private readonly _leafletMap: UIEventSource<L.Map>;
private readonly _leafletMap: Store<L.Map>;
private readonly _enablePopups: boolean;
private readonly _features: RenderingMultiPlexerFeatureSource
private readonly _layerToShow: LayerConfig;

View file

@ -7,7 +7,7 @@ import ScrollableFullScreen from "../Base/ScrollableFullScreen";
export interface ShowDataLayerOptions {
features: FeatureSource,
selectedElement?: UIEventSource<any>,
leafletMap: UIEventSource<L.Map>,
leafletMap: Store<L.Map>,
popup?: undefined | ((tags: UIEventSource<any>, layer: LayerConfig) => ScrollableFullScreen),
zoomToFeatures?: false | boolean,
doShowLayer?: Store<boolean>,

View file

@ -1,14 +1,14 @@
/**
* SHows geojson on the given leaflet map, but attempts to figure out the correct layer first
*/
import {UIEventSource} from "../../Logic/UIEventSource";
import {Store} from "../../Logic/UIEventSource";
import ShowDataLayer from "./ShowDataLayer";
import PerLayerFeatureSourceSplitter from "../../Logic/FeatureSource/PerLayerFeatureSourceSplitter";
import FilteredLayer from "../../Models/FilteredLayer";
import {ShowDataLayerOptions} from "./ShowDataLayerOptions";
export default class ShowDataMultiLayer {
constructor(options: ShowDataLayerOptions & { layers: UIEventSource<FilteredLayer[]> }) {
constructor(options: ShowDataLayerOptions & { layers: Store<FilteredLayer[]> }) {
new PerLayerFeatureSourceSplitter(options.layers, (perLayer => {
const newOptions = {

View file

@ -49,6 +49,9 @@ export class SubstitutedTranslation extends VariableUiElement {
const allElements = SubstitutedTranslation.ExtractSpecialComponents(txt, extraMappings).map(
proto => {
if (proto.fixed !== undefined) {
if(tagsSource === undefined){
return Utils.SubstituteKeys(proto.fixed, undefined)
}
return new VariableUiElement(tagsSource.map(tags => Utils.SubstituteKeys(proto.fixed, tags)));
}
const viz = proto.special;

View file

@ -284,7 +284,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
* @param useLang
* @constructor
*/
public static SubstituteKeys(txt: string | undefined, tags: any, useLang?: string): string | undefined {
public static SubstituteKeys(txt: string | undefined, tags?: any, useLang?: string): string | undefined {
if (txt === undefined) {
return undefined
}
@ -294,7 +294,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
while (match) {
const key = match[1]
let v = tags[key]
let v = tags === undefined ? undefined : tags[key]
if (v !== undefined) {
if (v["toISOString"] != undefined) {

View file

@ -1,11 +1,11 @@
{
"contributors": [
{
"commits": 4040,
"commits": 4109,
"contributor": "Pieter Vander Vennet"
},
{
"commits": 86,
"commits": 112,
"contributor": "Robin van der Linde"
},
{
@ -124,6 +124,10 @@
"commits": 5,
"contributor": "David Haberthür"
},
{
"commits": 4,
"contributor": "AlexanderRebai"
},
{
"commits": 4,
"contributor": "OliNau"
@ -148,6 +152,10 @@
"commits": 3,
"contributor": "Léo Villeveygoux"
},
{
"commits": 2,
"contributor": "Andrews Leruth"
},
{
"commits": 2,
"contributor": "pdassori"
@ -188,6 +196,10 @@
"commits": 2,
"contributor": "Stanislas Gueniffey"
},
{
"commits": 1,
"contributor": "loviuz"
},
{
"commits": 1,
"contributor": "kjonosm"

View file

@ -84,7 +84,8 @@
"id": "Beragam karya seni",
"pt": "Diversas obras de arte",
"hu": "Szobrok, mellszobrok, graffitik és egyéb műalkotások nyílt világtérképe",
"da": "Forskellige kunstværker"
"da": "Forskellige kunstværker",
"ca": "Un mapa obert d'estàtues, busts, grafitis i altres obres d'art del tot el món"
},
"minzoom": 12,
"presets": [

View file

@ -711,7 +711,7 @@
}
],
"description": {
"nl": "Deze laag toont zitbanken en enkele vragen over deze zitbanken",
"nl": "Een zitbank is een houten, metalen, stenen, … oppervlak waar een mens kan zitten. Deze laag toont ze en stelt er enkele vragen over.",
"en": "A bench is a wooden, metal, stone, … surface where a human can sit. This layers visualises them and asks a few questions about them.",
"fr": "Un banc est une surface en bois, métal, pierre… sur laquelle un humain peut s'asseoir. Cette couche permet de les visualiser et pose des questions à leur sujet.",
"de": "Diese Karte stellt Sitzbänke aus Holz, Metall, Stein, … dar und stellt ein paar Fragen, um weitere Informationen zu ergänzen.",

View file

@ -141,7 +141,8 @@
"en": "<h3>Contains {_contained_climbing_routes_count} routes</h3> <ul>{_contained_climbing_routes}</ul>",
"fr": "<h3>Contient {_contained_climbing_routes_count} voies</h3> <ul>{_contained_climbing_routes}</ul>",
"it": "<h3>Contiene {_contained_climbing_routes_count} vie</h3> <ul>{_contained_climbing_routes}</ul>",
"de": "<h3> Enthält {_contained_climbing_routes_count} Routen</h3> <ul>{_contained_climbing_routes}</ul>"
"de": "<h3> Enthält {_contained_climbing_routes_count} Routen</h3> <ul>{_contained_climbing_routes}</ul>",
"nl": "<h3>Bevat {_contained_climbing_routes_count} routes</h3> <ul>{_contained_climbing_routes}</ul>"
},
"condition": "_contained_climbing_routes~*",
"id": "Contained_climbing_routes"

View file

@ -66,7 +66,8 @@
"ja": "ここで登坂はできますか?",
"nb_NO": "Er klatring mulig her?",
"fr": "Est-il possible descalader ici ?",
"it": "È possibile arrampicarsi qua?"
"it": "È possibile arrampicarsi qua?",
"nl": "Is klimmen hier mogelijk?"
},
"mappings": [
{

View file

@ -40,7 +40,8 @@
"title": {
"render": {
"en": "Way",
"nl": "Weg"
"nl": "Weg",
"de": "Weg"
},
"mappings": [
{
@ -83,7 +84,8 @@
},
"then": {
"nl": "Weg met fietssugestiestrook {name}",
"en": "Road with shared lane {name}"
"en": "Road with shared lane {name}",
"de": "Straße mit gemeinsam genutzter Fahrspur {name}"
}
},
{
@ -106,7 +108,8 @@
},
"then": {
"nl": "Weg met fietsstrook {name}",
"en": "Road with bike lane {name}"
"en": "Road with bike lane {name}",
"de": "Straße mit Fahrradstreifen {name}"
}
},
{
@ -129,7 +132,8 @@
},
"then": {
"nl": "Weg met fietspad naast de weg {name}",
"en": "Road with cycleway next to the road {name}"
"en": "Road with cycleway next to the road {name}",
"de": "Straße mit Radweg neben der Straße {name}"
}
},
{

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="14"
height="14"
viewBox="0 0 14 14">
<rect
width="14"
height="14"
x="0"
y="0"
id="canvas"
style="fill:none;stroke:none;visibility:hidden" />
<path
d="m 7,8 c 2,0 2,1 2,3 0,1 -1.009121,3 0,3 1,0 1.751359,-1.142963 2,-3 C 11.248641,9.142963 11,8 11,7 11,5 12,3 12,2 12,1 11.599761,0.21742 11,0 9,0 9,1 7,1 5,1 5,0 3,0 2.400799,0.21742 2,1 2,2 2,3 3,5 3,7 3,8 2.87761,9.57334 3,11 3.12239,12.42666 4,14 5,14 6.008702,14 5,12 5,11 5,9 5,8 7,8 z"
id="dentist" style="fill:#BF0000"/>
</svg>

After

Width:  |  Height:  |  Size: 739 B

View file

@ -0,0 +1,147 @@
{
"id": "doctors",
"name": {
"en": "doctors"
},
"description": {
"en": "This layer shows doctor offices, dentists and other healthcare facilities"
},
"source": {
"osmTags": {
"or": [
"amenity=doctors",
"amenity=dentist",
"healthcare=physiotherapist"
]
}
},
"title": {
"render": {
"en": "Doctors Office {name}"
},
"mappings": [
{
"if": "amenity=doctors",
"then": "Doctors Office {name}"
},
{
"if": "amenity=dentist",
"then": "Dentists office {name}"
},
{
"if": "healthcare=physiotherapist",
"then": "Physiotherapists office {name}"
}
]
},
"minzoom": 13,
"tagRenderings": [
"images",
"opening_hours",
"phone",
"email",
"website",
{
"question": {
"en": "What is the name of this doctors place?"
},
"render": {
"en": "This doctors place is called {name}"
},
"freeform": {
"key": "name"
},
"id": "name"
},
{
"condition": "amenity=doctors",
"id": "specialty",
"render": {
"en": "This doctor is specialized in {healthcare:speciality}"
},
"question": {
"en": "What is this doctor specialized in?"
},
"freeform": {
"key": "healthcare:speciality"
},
"mappings": [
{
"if": "healthcare:speciality=general",
"then": {
"en": "This is a general practitioner"
}
},
{
"if": "healthcare:speciality=gynaecology",
"then": {
"en": "This is a gynaecologist"
}
},
{
"if": "healthcare:speciality=psychiatry",
"then": {
"en": "This is a psychiatrist"
}
},
{
"if": "healthcare:speciality=paediatrics",
"then": {
"en": "This is a paediatrician"
}
}
]
}
],
"presets": [
{
"title": {
"en": "a doctors office"
},
"tags": [
"amenity=doctors"
]
},
{
"title": {
"en": "a dentists office"
},
"tags": [
"amenity=dentist"
]
},
{
"title": {
"en": "a physiotherapists office"
},
"tags": [
"healthcare=physiotherapist"
]
}
],
"filter": [
{
"id": "opened-now",
"options": [
{
"question": {
"en": "Opened now"
},
"osmTags": "_isOpen=yes"
}
]
}
],
"mapRendering": [
{
"icon": {
"render": "circle:white;./assets/layers/doctors/doctors.svg"
},
"iconSize": "40,40,center",
"location": [
"point",
"centroid"
]
}
]
}

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="500"
height="500"
viewBox="0 0 14 14">
<rect
width="14"
height="14"
x="0"
y="0"
id="canvas"
style="fill:none;stroke:none;visibility:hidden" />
<path
d="M 7,1 C 5.83929,1 4.667834,1.5047052 3.875,2.5 3.187514,3.3630449 3,4 2.90625,5.0000004 0.01009,5.0238004 0,6.0817104 0,13 l 14,0 C 14,6.0817104 13.9899,5.0237504 11.09375,5.0000004 11,4 10.795537,3.3460958 10.125,2.5 9.334655,1.5027279 8.16071,1 7,1 z M 7,3 C 8.281412,2.99511 9,4 9.0625,5.0000004 l -4.125,0 C 5,4 5.718588,3.0048937 7,3 z m -1,3.0000004 2,0 L 8,8 l 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 z"
id="doctor" style="fill:#BF0000" />
</svg>

After

Width:  |  Height:  |  Size: 861 B

View file

@ -0,0 +1,22 @@
[
{
"path": "dentist.svg",
"license": "CC0",
"authors": [
"OSM Carto"
],
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Dentist-14.svg"
]
},
{
"path": "doctors.svg",
"license": "cc0",
"authors": [
"osmcarto"
],
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Doctors-14.svg"
]
}
]

View file

@ -792,7 +792,8 @@
"question": {
"en": "Accepts cash",
"de": "Akzeptiert Bargeld",
"es": "Acepta efectivo"
"es": "Acepta efectivo",
"nl": "Accepteert cash"
}
}
]
@ -805,7 +806,8 @@
"question": {
"en": "Accepts payment cards",
"de": "Akzeptiert Kartenzahlung",
"es": "Acepta tarjetas de pago"
"es": "Acepta tarjetas de pago",
"nl": "Accepteert betaalkaarten"
}
}
]
@ -814,10 +816,16 @@
"deletion": {
"nonDeleteMappings": [
{
"if": "amenity=cafe",
"if": "amenity=pub",
"then": {
"en": "This is actually a pub"
}
},
{
"if": "amenity=cafe",
"then": {
"en": "This is actually a cafe"
}
}
],
"softDeletionTags": {

View file

@ -0,0 +1,44 @@
{
"id": "hospital",
"name": {
"en": "Hospital"
},
"title": {
"render": {
"en": "Hospital"
}
},
"minzoom": 12,
"source": {
"osmTags": "amenity=hospital"
},
"tagRenderings": [
{
"id": "name",
"render": {
"en": "Name of the hospital name is {name}"
},
"question": {
"en": "What does the of the hospital ?"
},
"freeform": {
"key": "name"
}
},
"phone",
"email",
"website"
],
"mapRendering": [
{
"icon": {
"render": "circle:white;./assets/layers/hospital/hospital.svg"
},
"iconSize": "40,40,center",
"location": [
"point",
"centroid"
]
}
]
}

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg
width="14"
height="14"
version="1.1"
viewBox="0 0 3.7042 3.7042"
xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 -293.3)">
<path transform="matrix(.26458 0 0 .26458 0 293.3)"
d="m7 0a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm-1 3h2v3h3v2h-3v3h-2v-3h-3v-2h3v-3z"
fill="#BF0000"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 397 B

View file

@ -0,0 +1,12 @@
[
{
"path": "hospital.svg",
"license": "CC-0",
"authors": [
"osmcarto"
],
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Hospital-14.svg"
]
}
]

View file

@ -3,9 +3,7 @@
"description": "Layer containing various presets and questions generated by ID. These are meant to be reused in other layers by importing the tagRenderings with `id_preset.<tagrendering>",
"#dont-translate": "*",
"source": {
"osmTags": {
"and": []
}
"osmTags": "id~*"
},
"mapRendering": null,
"tagRenderings": [

View file

@ -2,11 +2,13 @@
"id": "kerbs",
"name": {
"en": "Kerbs",
"nl": "Stoepranden"
"nl": "Stoepranden",
"de": "Bordsteine"
},
"description": {
"en": "A layer showing kerbs.",
"nl": "Een laag met stoepranden."
"nl": "Een laag met stoepranden.",
"de": "Eine Ebene, die Bordsteine zeigt."
},
"source": {
"osmTags": "barrier=kerb"
@ -15,7 +17,8 @@
"title": {
"render": {
"en": "Kerb",
"nl": "Stoeprand"
"nl": "Stoeprand",
"de": "Bordstein"
}
},
"mapRendering": [
@ -56,14 +59,16 @@
"id": "kerb-type",
"question": {
"en": "What is the height of this kerb?",
"nl": "Hoe hoog is deze stoeprand?"
"nl": "Hoe hoog is deze stoeprand?",
"de": "Wie hoch ist der Bordstein?"
},
"mappings": [
{
"if": "kerb=raised",
"then": {
"en": "This kerb is raised (>3 cm)",
"nl": "Deze stoeprand is hoog (>3 cm)"
"nl": "Deze stoeprand is hoog (>3 cm)",
"de": "Der Bordstein ist erhöht (>3 cm)"
},
"icon": {
"path": "./assets/layers/kerbs/raised.svg",
@ -74,7 +79,8 @@
"if": "kerb=lowered",
"then": {
"en": "This kerb is lowered (~3 cm)",
"nl": "Deze stoeprand is verlaagd (~3 cm)"
"nl": "Deze stoeprand is verlaagd (~3 cm)",
"de": "Der Bordstein ist abgesenkt (~3 cm)"
},
"icon": {
"path": "./assets/layers/kerbs/lowered.svg",
@ -85,7 +91,8 @@
"if": "kerb=flush",
"then": {
"en": "This kerb is flush (~0cm)",
"nl": "Deze stoeprand is vlak (~0cm)"
"nl": "Deze stoeprand is vlak (~0cm)",
"de": "Der Bordstein ist bündig (~0cm)"
},
"icon": {
"path": "./assets/layers/kerbs/flush.svg",
@ -96,7 +103,8 @@
"if": "kerb=no",
"then": {
"en": "There is no kerb here",
"nl": "Er is hier geen stoeprand"
"nl": "Er is hier geen stoeprand",
"de": "Hier gibt es keinen Bordstein"
},
"hideInAnswer": true,
"icon": {
@ -108,7 +116,8 @@
"if": "kerb=yes",
"then": {
"en": "There is a kerb of unknown height",
"nl": "Er is een stoeprand met onbekende hoogte"
"nl": "Er is een stoeprand met onbekende hoogte",
"de": "Es gibt einen Bordstein mit unbekannter Höhe"
},
"hideInAnswer": true
}
@ -118,25 +127,29 @@
{
"id": "tactile-paving",
"question": {
"en": "Is there tactile paving at this kerb?"
"en": "Is there tactile paving at this kerb?",
"de": "Gibt es am Bordstein ein taktiles Pflaster?"
},
"mappings": [
{
"if": "tactile_paving=yes",
"then": {
"en": "This kerb has tactile paving."
"en": "This kerb has tactile paving.",
"de": "Der Bordstein hat ein taktiles Pflaster."
}
},
{
"if": "tactile_paving=no",
"then": {
"en": "This kerb does not have tactile paving."
"en": "This kerb does not have tactile paving.",
"de": "Der Bordstein hat kein taktiles Pflaster."
}
},
{
"if": "tactile_paving=incorrect",
"then": {
"en": "This kerb has tactile paving, but it is incorrect"
"en": "This kerb has tactile paving, but it is incorrect",
"de": "Der Bordstein hat ein taktiles Pflaster, das aber falsch ist"
},
"hideInAnswer": true
}
@ -147,17 +160,20 @@
"id": "kerb-height",
"question": {
"en": "What is the height of this kerb?",
"nl": "Hoe hoog is deze stoeprand?"
"nl": "Hoe hoog is deze stoeprand?",
"de": "Wie hoch ist der Bordstein?"
},
"render": {
"en": "Kerb height: {kerb:height}",
"nl": "Stoeprandhoogte: {kerb:height}"
"en": "Kerb height: {{kerb:height}}",
"nl": "Stoeprandhoogte: {{kerb:height}}",
"de": "Bordsteinhöhe: {{kerb:height}}"
},
"freeform": {
"key": "kerb:height",
"placeholder": {
"en": "Height of the kerb",
"nl": "Hoogte van de stoeprand"
"nl": "Hoogte van de stoeprand",
"de": "Höhe des Bordsteins"
},
"type": "pnat"
}
@ -167,14 +183,16 @@
{
"title": {
"en": "a kerb",
"nl": "een stoeprand"
"nl": "een stoeprand",
"de": "einen Bordstein"
},
"tags": [
"barrier=kerb"
],
"description": {
"en": "Kerb in a footway",
"nl": "Stoeprand in een voetpad"
"nl": "Stoeprand in een voetpad",
"de": "Bordstein in einem Fußweg"
},
"preciseInput": {
"maxSnapDistance": 10,
@ -193,42 +211,48 @@
{
"question": {
"en": "All types of kerbs",
"nl": "Alle typen stoepranden"
"nl": "Alle typen stoepranden",
"de": "Alle Arten von Bordsteinen"
}
},
{
"osmTags": "kerb=raised",
"question": {
"en": "Raised kerb (>3 cm)",
"nl": "Hoge stoeprand (>3 cm)"
"nl": "Hoge stoeprand (>3 cm)",
"de": "Erhöhter Bordstein (>3 cm)"
}
},
{
"osmTags": "kerb=lowered",
"question": {
"en": "Lowered kerb (~3 cm)",
"nl": "Verlaagde stoeprand (~3 cm)"
"nl": "Verlaagde stoeprand (~3 cm)",
"de": "Abgesenkter Bordstein (~3 cm)"
}
},
{
"osmTags": "kerb=flush",
"question": {
"en": "Flush kerb (~0cm)",
"nl": "Vlakke stoeprand (~0cm)"
"nl": "Vlakke stoeprand (~0cm)",
"de": "Bündiger Bordstein (~0cm)"
}
},
{
"osmTags": "kerb=no",
"question": {
"en": "No kerb",
"nl": "Geen stoeprand"
"nl": "Geen stoeprand",
"de": "Kein Bordstein"
}
},
{
"osmTags": "kerb=",
"question": {
"en": "Kerb with unknown height",
"nl": "Stoeprand met onbekende hoogte"
"nl": "Stoeprand met onbekende hoogte",
"de": "Bordstein mit unbekannter Höhe"
}
}
]
@ -238,25 +262,29 @@
"options": [
{
"question": {
"en": "Kerbs with or without tactile paving"
"en": "Kerbs with or without tactile paving",
"de": "Bordsteine mit oder ohne taktilem Pflaster"
}
},
{
"osmTags": "tactile_paving=yes",
"question": {
"en": "Kerb with tactile paving"
"en": "Kerb with tactile paving",
"de": "Bordstein mit taktilem Pflaster"
}
},
{
"osmTags": "tactile_paving=no",
"question": {
"en": "Kerb without tactile paving"
"en": "Kerb without tactile paving",
"de": "Bordstein ohne taktilem Pflaster"
}
},
{
"osmTags": "tactile_paving=",
"question": {
"en": "Kerb wihout information about tactile paving"
"en": "Kerb wihout information about tactile paving",
"de": "Bordstein ohne Informationen über taktiles Pflaster"
}
}
]
@ -273,11 +301,13 @@
],
"human": {
"en": "centimeters",
"nl": "centimeter"
"nl": "centimeter",
"de": "Zentimeter"
},
"humanSingular": {
"en": "centimeter",
"nl": "centimeter"
"nl": "centimeter",
"de": "Zentimeter"
},
"default": true
},
@ -289,11 +319,13 @@
],
"human": {
"en": "meters",
"nl": "meter"
"nl": "meter",
"de": "Meter"
},
"humanSingular": {
"en": "meter",
"nl": "meter"
"nl": "meter",
"de": "Meter"
}
}
],

View file

@ -42,20 +42,23 @@
"if": "name=",
"then": {
"en": "Road without a name",
"de": "Straße ohne Namen"
"de": "Straße ohne Namen",
"nl": "Weg zonder een naam"
}
}
]
},
"description": {
"en": "Shows the allowed speed for every road",
"de": "Zeigt die zulässige Geschwindigkeit für jede Straße an"
"de": "Zeigt die zulässige Geschwindigkeit für jede Straße an",
"nl": "Toont de toegestane snelheid voor elke weg"
},
"tagRenderings": [
{
"render": {
"en": "The maximum allowed speed on this road is {maxspeed}",
"de": "Die zulässige Höchstgeschwindigkeit auf dieser Straße ist {maxspeed}"
"de": "Die zulässige Höchstgeschwindigkeit auf dieser Straße ist {maxspeed}",
"nl": "De maximum toegestane snelheid op deze weg is {maxspeed}"
},
"question": {
"es": "Qué velocidad tiene",
@ -68,6 +71,24 @@
"type": "pnat"
},
"mappings": [
{
"if": {
"and": [
"highway=living_street",
"_country!=be"
]
},
"then": {
"en": "This is a living street, which has a maxspeed of 20km/h",
"de": "Dies ist eine Wohnstraße, auf der eine Höchstgeschwindigkeit von 20 km/h gilt",
"nl": "Dit is een woonerf en heeft dus een maximale snelheid van 20km/h"
},
"icon": {
"path": "./assets/layers/maxspeed/living_street_be.svg",
"class": "large"
},
"hideInAnswer": true
},
{
"if": "highway=living_street",
"then": {

View file

@ -0,0 +1,12 @@
[
{
"path": "pharmacy.svg",
"license": "CC0",
"authors": [
"OSM-carto"
],
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Pharmacy-14.svg"
]
}
]

View file

@ -0,0 +1,64 @@
{
"id": "pharmacy",
"name": {
"en": "pharmacy"
},
"title": {
"render": {
"en": "{name}"
}
},
"source": {
"osmTags": {
"and": [
"amenity=pharmacy"
]
}
},
"minzoom": 13,
"tagRenderings": [
"images",
"opening_hours",
"phone",
"email",
"website",
{
"id": "wheelchair",
"question": {
"en": "Is this pharmacy easy to access on a wheelchair?"
},
"mappings": [
{
"if": "wheelchair=yes",
"then": {
"en": "This pharmacy is easy to access on a wheelchair"
}
},
{
"if": "wheelchair=no",
"then": {
"en": "This pharmacy is hard to access on a wheelchair"
}
},
{
"if": "wheelchair=limited",
"then": {
"en": "This pharmacy has limited access for wheelchair users"
}
}
]
}
],
"mapRendering": [
{
"icon": {
"render": "./assets/layers/pharmacy/pharmacy.svg"
},
"iconSize": "40,40,bottom",
"location": [
"point",
"centroid"
]
}
]
}

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="500" height="500" viewBox="0 0 14 14">
<rect width="14" height="14" x="0" y="0" id="canvas" style="fill:none;stroke:none;visibility:hidden"/>
<path d="m 4,4 -2,2 0,8 10,0 0,-8 -2,-2.0000003 z m 2,2 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 z M 4,0 4,3 10,3 10,0 z" id="pharmacy" style="fill:#BF0000"/>
</svg>

After

Width:  |  Height:  |  Size: 493 B

View file

@ -0,0 +1,92 @@
{
"id": "rainbow_crossings",
"name": {
"en": "Crossings with rainbow paintings"
},
"description": {
"en": "A layer showing pedestrian crossings with rainbow paintings"
},
"source": {
"osmTags":
"highway=crossing"
},
"minzoom": 17,
"title": {
"render": {
"en": "Crossing"
}
},
"presets": [
{
"title": {
"en": "a crossing"
},
"tags": [
"highway=crossing"
],
"description": {
"en": "Pedestrian crossing"
},
"preciseInput": {
"preferredBackground": [
"photo"
],
"snapToLayer": "cycleways_and_roads",
"maxSnapDistance": 25
}
}
],
"tagRenderings": [
"images",
{
"id": "crossing-with-rainbow",
"question": {
"en": "Does this crossing has rainbow paintings?"
},
"condition": "highway=crossing",
"mappings": [
{
"if": "crossing:marking=rainbow",
"then": {
"en": "This crossing has rainbow paintings"
},
"icon": {
"path": "./assets/themes/rainbow_crossings/logo.svg",
"class": "medium"
}
},
{
"if": "not:crossing:marking=rainbow",
"then": {
"en": "No rainbow paintings here"
},
"icon": "./assets/themes/rainbow_crossings/crossing.svg"
},
{
"if": "crossing:marking!=rainbow",
"then": {
"en": "No rainbow paintings here"
},
"icon": "./assets/themes/rainbow_crossings/crossing.svg",
"hideInAnswer": true
}
]
}
],
"mapRendering": [
{
"icon": {
"render": "./assets/themes/rainbow_crossings/crossing.svg",
"mappings": [{
"if": "crossing:marking=rainbow",
"then": "./assets/themes/rainbow_crossings/logo.svg"
}]
},
"iconSize": "40,40,center",
"location": [
"point",
"centroid"
]
}
]
}

View file

@ -469,7 +469,8 @@
"nl": "Dit is een recyclingcontainer",
"de": "Dies ist ein Recycling-Container",
"es": "Esto es un contenedor de reciclaje",
"it": "Questo è un contenitore per il riciclo di rifiuti"
"it": "Questo è un contenitore per il riciclo di rifiuti",
"ca": "Açò és un contenidor de reciclatge"
}
},
{
@ -479,7 +480,8 @@
"nl": "Dit is een recyclingcentrum",
"de": "Dies ist ein Wertstoffhof",
"es": "Esto es un centro de reciclaje",
"it": "Questo è un centro per la raccola e riciclo di rifiuti"
"it": "Questo è un centro per la raccola e riciclo di rifiuti",
"ca": "Açò és un centre de reciclatge"
}
},
{
@ -529,7 +531,8 @@
"nl": "Dit recyclagecentrum heet <b>{name}</b>",
"de": "Dieser Wertstoffhof heißt <b>{name}</b>",
"es": "Este centro de reciclaje se llama <b>{name}</b>",
"it": "Questo centro raccolta e riciclo rifiuti si chiama <b>{name}</b>"
"it": "Questo centro raccolta e riciclo rifiuti si chiama <b>{name}</b>",
"ca": "Aquest centre de reciclatge s'anomena <b>{name}</b>"
},
"freeform": {
"key": "name"
@ -586,7 +589,8 @@
"nl": "Deze container is buiten",
"de": "Der Container befindet sich im Freien",
"es": "Este contenedor se sitúa en el exterior",
"it": "Questo contenitore è all'aperto"
"it": "Questo contenitore è all'aperto",
"ca": "Aquest contenidor està situat a l'aire lliure"
}
}
]
@ -624,7 +628,8 @@
"en": "Beverage cartons can be recycled here",
"nl": "Drankpakken kunnen hier gerecycled worden",
"de": "Getränkekartons können hier recycelt werden",
"it": "Cartoni per bevande"
"it": "Cartoni per bevande",
"ca": "Ací es poden reciclar els cartons de begudes"
},
"icon": {
"path": "./assets/layers/recycling/beverage_cartons.svg",
@ -639,7 +644,8 @@
"nl": "Blikken kunnen hier gerecycled worden",
"de": "Dosen können hier recycelt werden",
"es": "Aquí se pueden reciclar latas",
"it": "Lattine"
"it": "Lattine",
"ca": "Ací es poden reciclar llaunes"
},
"icon": {
"path": "./assets/layers/recycling/cans.svg",
@ -713,7 +719,8 @@
"nl": "Organisch afval kan hier gerecycled worden",
"de": "Bio-Abfall kann hier recycelt werden",
"es": "Aquí se pueden reciclar residuos orgánicos",
"it": "Umido"
"it": "Umido",
"ca": "Ací es poden reciclar residus orgànics"
},
"hideInAnswer": true,
"icon": {
@ -729,7 +736,8 @@
"nl": "Glazen flessen kunnen hier gerecycled worden",
"de": "Glasflaschen können hier recycelt werden",
"es": "Aquí se pueden reciclar botellas de cristal",
"it": "Bottiglie di vetro"
"it": "Bottiglie di vetro",
"ca": "Ací es poden reciclar ampolles de vidre"
},
"icon": {
"path": "./assets/layers/recycling/glass_bottles.svg",
@ -744,7 +752,8 @@
"nl": "Glas kan hier gerecycled worden",
"de": "Glas kann hier recycelt werden",
"es": "Aquí se puede reciclar cristal",
"it": "Vetro"
"it": "Vetro",
"ca": "Ací es pot reciclar vidre"
},
"icon": {
"path": "./assets/layers/recycling/glass.svg",
@ -759,7 +768,8 @@
"nl": "Kranten kunnen hier gerecycled worden",
"de": "Zeitungen können hier recycelt werden",
"es": "Aquí se pueden reciclar periódicos",
"it": "Giornali"
"it": "Giornali",
"ca": "Ací es poden reciclar diaris"
},
"icon": {
"path": "./assets/layers/recycling/newspaper.svg",
@ -774,7 +784,8 @@
"nl": "Papier kan hier gerecycled worden",
"de": "Papier kann hier recycelt werden",
"es": "Aquí se puede reciclar papel",
"it": "Carta"
"it": "Carta",
"ca": "Ací es pot reciclar paper"
},
"icon": {
"path": "./assets/layers/recycling/paper.svg",
@ -789,7 +800,8 @@
"nl": "Plastic flessen kunnen hier gerecycled worden",
"de": "Plastikflaschen können hier recycelt werden",
"es": "Aquí se pueden reciclar botellas de plástico",
"it": "Bottiglie di platica"
"it": "Bottiglie di platica",
"ca": "Ací es poden reciclar ampolles de plàstic"
},
"icon": {
"path": "./assets/layers/recycling/plastic_bottles.svg",
@ -804,7 +816,8 @@
"nl": "Plastic verpakking kan hier gerecycled worden",
"de": "Kunststoffverpackungen können hier recycelt werden",
"es": "Aquí se pueden reciclar embalajes plásticos",
"it": "Confezioni di plastica"
"it": "Confezioni di plastica",
"ca": "Ací es poden reciclar envasos de plàstic"
},
"icon": {
"path": "./assets/layers/recycling/plastic_packaging.svg",
@ -819,7 +832,8 @@
"nl": "Plastic kan hier gerecycled worden",
"de": "Kunststoff kann hier recycelt werden",
"es": "Aquí se puede reciclar plástico",
"it": "Plastica"
"it": "Plastica",
"ca": "Ací es pot reciclar plàstic"
},
"icon": {
"path": "./assets/layers/recycling/plastic.svg",
@ -902,7 +916,8 @@
"en": "Residual waste can be recycled here",
"nl": "Restafval kan hier gerecycled worden",
"de": "Restmüll kann hier recycelt werden",
"it": "Secco"
"it": "Secco",
"ca": "Ací es pot reciclar el rebuig"
},
"icon": {
"path": "./assets/layers/waste_disposal/waste_disposal.svg",
@ -918,8 +933,9 @@
"en": "This recycling facility is operated by {operator}",
"nl": "Deze recyclingfaciliteit wordt beheerd door {operator}",
"de": "Diese Recyclinganlage wird betrieben von {operator}",
"es": "Esta facilidad de reciclado la opera {operator}",
"it": "Questa struttura di raccola e riciclo è gestita da {operator}"
"es": "Esta infraestructura de reciclado la opera {operator}",
"it": "Questa struttura di raccola e riciclo è gestita da {operator}",
"ca": "Aquesta infraestuctura de reciclatge està operada per {operator}"
},
"question": {
"en": "What company operates this recycling facility?",

View file

@ -322,7 +322,8 @@
"inline": true,
"placeholder": {
"en": "Language in lowercase English",
"nl": "Taal in lowercase Engel"
"nl": "Taal in lowercase Engel",
"de": "Sprache in Englisch in Kleinbuchstaben"
},
"addExtraTags": [
"fixme=Freeform tag `school:language` used, to be doublechecked"
@ -342,21 +343,24 @@
"if": "school:language=french",
"then": {
"en": "French is the main language of {name}",
"nl": "Frans is de voertaal van {name}"
"nl": "Frans is de voertaal van {name}",
"de": "Französisch ist die Hauptsprache von {name}"
}
},
{
"if": "school:language=dutch",
"then": {
"en": "Dutch is the main language of {name}",
"nl": "Nederlands is de voertaal van {name}"
"nl": "Nederlands is de voertaal van {name}",
"de": "Niederländisch ist die Hauptsprache von {name}"
}
},
{
"if": "school:language=german",
"then": {
"en": "German is the main language of {name}",
"nl": "Duits is de voertaal van {name}"
"nl": "Duits is de voertaal van {name}",
"de": "Deutsch ist die Hauptsprache von {name}"
}
},
{

View file

@ -0,0 +1,12 @@
[
{
"path": "shelter.svg",
"license": "MIT",
"authors": [
"Diemen Design"
],
"sources": [
"https://icon-icons.com/icon/map-shelter/158301"
]
}
]

View file

@ -0,0 +1,88 @@
{
"id": "shelter",
"name": {
"en": "Shelter"
},
"description": {
"en": "Layer showing shelter structures"
},
"source": {
"osmTags": {
"and": [
"amenity=shelter"
]
}
},
"minzoom": 13,
"title": {
"render": {
"en": "Shelter"
}
},
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"icon": "./assets/layers/shelter/shelter.svg"
}
],
"tagRenderings": [
{
"id": "shelter-type",
"mappings": [
{
"if": "shelter_type=public_transport",
"then": {
"en": "This is a shelter at a public transport stop."
}
},
{
"if": "shelter_type=picnic_shelter",
"then": {
"en": "This is a shelter protecting from rain at a picnic site."
}
},
{
"if": "shelter_type=gazebo",
"then": {
"en": "This is a gazebo."
}
},
{
"if": "shelter_type=weather_shelter",
"then": {
"en": "This is a small shelter, primarily intended for short breaks. Usually found in the mountains or alongside roads."
}
},
{
"if": "shelter_type=lean_to",
"then": {
"en": "This is a shed with 3 walls, primarily intended for camping."
}
},
{
"if": "shelter_type=pavilion",
"then": {
"en": "This is a pavilion"
}
},
{
"if": "shelter_type=basic_hut",
"then": "This is a basic hut, providing basic shelter and sleeping facilities."
}
],
"question": {
"en": "What kind of shelter is this?"
},
"render": {
"en": "Shelter type: {shelter_type}"
},
"freeform": {
"key": "shelter_type",
"type": "string"
}
}
]
}

View file

@ -0,0 +1 @@
<svg role="img" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14"><path d="M 4.4352679,0.99999571 3.578125,2.7143027 l 0.4017857,0 0.8973214,-1.71430699 -0.4419642,0 z m 3.4285714,0 -0.8571429,1.71430699 0.4017857,0 0.8973215,-1.71430699 -0.4419643,0 z m 3.4285707,0 -0.857143,1.71430699 0.401786,0 0.897322,-1.71430699 -0.441965,0 z M 1.8571429,2.7143027 1,4.4286098 l 0.4017857,0 0.8989955,-1.7143071 -0.4436383,0 z m 3.4352678,0 -0.8571428,1.7143071 0.4017857,0 0.8973214,-1.7143071 -0.4419643,0 z m 3.4285714,0 -0.8571428,1.7143071 0.4017857,0 0.8973214,-1.7143071 -0.4419643,0 z m 3.4285709,0 -0.857143,1.7143071 0.401786,0 0.897322,-1.7143071 -0.441965,0 z m -9.0066959,1.7143071 -0.8571428,1.714307 0.4017857,0 0.8989955,-1.714307 -0.4436384,0 z m 6.842076,0 -0.8571429,1.714307 0.4017857,0 0.8989951,-1.714307 -0.4436379,0 z M 7,5.2857633 l -6,3.428614 1.7142857,0 0.8571429,-0.3431962 0,4.1853199 0,0.01507 a 0.42857143,0.42857675 0 0 0 0.2059152,0.366634 0.42857143,0.42857675 0 0 0 0.4319196,0.0067 0.42857143,0.42857675 0 0 0 0.219308,-0.373322 l 0,-4.5435832 L 7,7.0000703 l 2.5714286,1.0279145 0,4.5435832 a 0.42857143,0.42857675 0 0 0 0.2059148,0.366634 0.42857143,0.42857675 0 0 0 0.4319206,0.0067 0.42857143,0.42857675 0 0 0 0.219307,-0.37332 l 0,-4.2003869 0.857143,0.3431962 1.714286,0 -6,-3.428614 z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -105,6 +105,15 @@
"question": {
"en": "What kind of shop is this?",
"nl": "Wat voor soort winkel is dit?"
},
"render": {
"en": "This is a {shop}"
},
"freeform": {
"key": "shop",
"addExtraTags": [
"fixme=freeform shop key used, to be reviewed"
]
}
}
},
@ -113,6 +122,57 @@
"email",
"phone",
"payment-options",
{
"id": "copyshop-print-sizes",
"condition": {
"or": [
"shop~.*copyshop.*",
"shop~.*stationary.*",
"service:print=yes"
]
},
"question": {
"en": "What paper formats does this shop offer?"
},
"multiAnswer": true,
"mappings": [
{
"if": "service:print:A4=yes",
"then": {
"en": "This shop can print on papers of size A4"
},
"ifnot": "service:print:A4=no"
},
{
"if": "service:print:A3=yes",
"then": {
"en": "This shop can print on papers of size A3"
},
"ifnot": "service:print:A3=no"
},
{
"if": "service:print:A2=yes",
"then": {
"en": "This shop can print on papers of size A2"
},
"ifnot": "service:print:A2=no"
},
{
"if": "service:print:A1=yes",
"then": {
"en": "This shop can print on papers of size A1"
},
"ifnot": "service:print:A1=no"
},
{
"if": "service:print:A0=yes",
"then": {
"en": "This shop can print on papers of size A0"
},
"ifnot": "service:print:A0=no"
}
]
},
"questions",
"reviews"
],

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" width="375px" height="375px" viewBox="0 0 375 375" version="1.1">
<g id="surface1">
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(48.627451%,72.156864%,18.431373%);fill-opacity:1;" d="m 240,270 c -10.51214,0 -17.06362,5.31218 -21.09208,8.22243 L 200,295 l -13.40899,9.13092 4.81906,-4.41221 c -2.45204,1.98626 -8.43462,9.4328 -9.5545,12.00606 -0.80851,1.8688 -2.80916,16.5391 -2.8094,18.50388 L 180,345 h 100.00002 v -28.12499 l 0.95383,-24.02418 C 279.36417,275.26526 275,275 260,275 Z"/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 224.78416,27.867714 C 207.83633,20.892181 205,30 201.4908,33.483328 c -3.13355,3.110444 -4.18514,6.793339 -4.92975,13.162944 C 195,60 200,60 212.17552,64.021358 c 8.42757,2.783478 13.09879,0.933943 17.36376,-3.873285 3.30497,-3.725168 5.40227,-4.73171 6.11084,-11.873509 0.8525,-8.592508 0.044,-15.916436 -10.86596,-20.40685 z M 190,65 c -9.52441,-0.917061 -12.07747,2.762778 -15,5 l -5,10 -10,20 c -5,5 -7.02649,20.45319 0,25 l 11.46579,6.14143 c -13.95723,6.14722 -25.90358,8.69174 -40.41254,12.50155 -8.92858,2.34449 -19.88001,3.37632 -28.56099,7.76485 -9.014982,4.55739 -14.786174,10.31022 -19.927371,17.45223 -9.072982,1.05932 -32.906871,14.0154 -42.052984,31.2902 -3.839032,7.65623 -19.072351,74.0743 -3.955093,80.72348 5.708983,1.27809 15.640201,-0.70601 15.599701,-13.86338 -0.108001,-35.02595 0.339952,-65.14068 25.79507,-79.45023 C 78.825248,201.92336 80.834978,208.68765 90,225 l -20,40 -16.32953,39.88548 c -2.522365,5.62883 -3.243613,13.4183 5.077871,19.11488 C 64.372524,326.54946 73.614821,320.68296 75,315 L 98.669339,262.36113 117.54355,243.09234 141.10638,216.635 c 28.64298,4.09511 70.89542,-1.80723 100.97701,-26.39969 h 28.16814 l -11.82569,23.9346 C 250,220 255.27742,230.99587 260.8042,233.88839 270,240 277.18878,230.56171 280,225 l 18.46458,-40.05047 c 0.90355,-11.60271 -2.04845,-13.5154 -9.80084,-17.04381 -11.12002,-1.78157 1.65674,0.0402 0,0 v -0.1326 c -13.56808,-2.82951 -25.38466,-1.28029 -37.30881,0 7.75126,-22.2122 23.68226,-38.18561 43.3733,-36.63364 13.04658,10.51921 29.18544,30.02218 28.45642,28.99055 -1.37763,-1.9495 0.55254,2.10376 2.17266,3.91304 2.13859,2.37925 5.19256,3.73586 8.39458,3.73005 6.21306,0 11.24811,-5.02833 11.24811,-11.23109 -0.002,-1.19274 -1.78451,-15.41319 -2.16003,-16.5454 l -8.47284,-29.82576 -0.30859,0.0877 c -1.75045,-4.985 -5.20489,-9.19557 -9.75592,-11.890135 L 332,85 c 1.14686,-1.622582 2,-3 1,-5 -2,-2 -6,-1 -9,1 l -14,9 c -12.49469,-3.56121 -33.58022,-3.171563 -55.22958,6.252257 -3.15809,1.41264 -18.18315,7.408833 -28.06798,12.733063 -0.14174,-0.36321 -0.13182,-0.62598 -0.30664,-1.00807 L 216.9494,91.939125 210,75 c -1.75586,-3.835199 -2.84028,-5.186845 -7.17863,-6.731979 -0.50012,-0.05264 -5.7694,-2.017607 -6.27893,-2.020137 z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -43,6 +43,17 @@
"https://www.provincieantwerpen.be/"
]
},
{
"path": "equestrian.svg",
"license": "CC0",
"authors": [
"Hufkratzer"
],
"sources": [
"https://github.com/pietervdvn/MapComplete/issues/920",
" https://gist.githubusercontent.com/Hufkratzer/81abcfe749ce8f99257e38f58633dd72/raw/8fa614a983807724f7110793b57344cc70dc34bc/equestrian.svg"
]
},
{
"path": "lock.svg",
"license": "CC-BY-SA 4.0",

View file

@ -506,7 +506,8 @@
"sport=soccer",
"sport=table_tennis",
"sport=tennis",
"sport=volleyball"
"sport=volleyball",
"sport=equestrian"
]
},
"then": "circle:white;./assets/layers/sport_pitch/{sport}.svg"

View file

@ -9,7 +9,7 @@
"source": {
"osmTags": "highway=street_lamp"
},
"minZoom": 16,
"minzoom": 16,
"title": {
"render": {
"en": "Street Lamp",

View file

@ -0,0 +1,141 @@
{
"id": "transit_routes",
"name": {
"en": "Bus lines"
},
"description": {
"en": "Layer showing bus lines"
},
"source": {
"osmTags": {
"and": [
"type=route",
"route=bus"
]
}
},
"minzoom": 15,
"title": {
"render": {
"en": "Bus line"
},
"mappings": [
{
"if": "name~*",
"then": {
"en": "{name}"
}
}
]
},
"mapRendering": [
{
"color": {
"render": {
"en": "#ff0000"
},
"mappings": [
{
"if": "colour~*",
"then": "{colour}"
}
]
}
}
],
"tagRenderings": [
{
"id": "name",
"freeform": {
"key": "name",
"type": "string",
"placeholder": "Bus XX: From => Via => To"
},
"render": "{name}",
"question": {
"en": "What is the name for this bus line? (i.e. Bus XX: From => Via => To)"
}
},
{
"id": "from",
"freeform": {
"key": "from",
"type": "string",
"placeholder": "City, Stop Name"
},
"render": {
"en": "This bus line begins at {from}"
},
"question": {
"en": "What is the starting point for this bus line?"
}
},
{
"id": "via",
"freeform": {
"key": "via",
"type": "string",
"placeholder": "City, Stop Name"
},
"render": {
"en": "This bus line goes via {via}"
},
"question": {
"en": "What is the via point for this bus line?"
}
},
{
"id": "to",
"freeform": {
"key": "to",
"type": "string",
"placeholder": "City, Stop Name"
},
"render": {
"en": "This bus line ends at {to}"
},
"question": {
"en": "What is the ending point for this bus line?"
}
},
{
"id": "colour",
"freeform": {
"key": "colour",
"type": "color"
},
"render": {
"en": "This bus line has the color {colour}"
},
"question": {
"en": "What is the colour for this bus line?"
}
},
{
"id": "network",
"freeform": {
"key": "network",
"type": "string"
},
"render": {
"en": "This bus line is part of the {network} network"
},
"question": {
"en": "What network does this bus line belong to?"
}
},
{
"id": "operator",
"freeform": {
"key": "operator",
"type": "string"
},
"render": {
"en": "This bus line is operated by {operator}"
},
"question": {
"en": "What company operates this bus line?"
}
}
]
}

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
viewBox="0 0 500 500"
version="1.1"
id="svg4"
sodipodi:docname="bus_stop.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview6"
showgrid="false"
inkscape:zoom="25.986174"
inkscape:cx="-2.629287"
inkscape:cy="10.208516"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M 100,0 50,50 v 400 h 32.8125 c 0,0 5.057445,50 40.6375,50 34.45648,0 39.05,-50 39.05,-50 h 175 c 0,0 5.7171,50 39.05,50 40.82343,0 40.6375,-50 40.6375,-50 H 450 V 50 L 400,0 Z m 50,50 h 200 v 50 H 150 Z M 100,150 H 400 V 300 H 100 Z m 0,200 h 50 v 50 h -50 z m 250,0 h 50 v 50 h -50 z"
id="path2"
style="stroke-width:50" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,15 @@
[
{
"path": "bus_stop.svg",
"license": "CC0",
"authors": [
"Andy Allan",
"Michael Glanznig",
"Paul Norman",
"Paul Dicker"
],
"sources": [
"https://github.com/gravitystorm/openstreetmap-carto/blob/master/symbols/highway/bus_stop.svg"
]
}
]

View file

@ -0,0 +1,260 @@
{
"id": "transit_stops",
"name": {
"en": "Transit Stops"
},
"description": {
"en": "Layer showing different types of transit stops."
},
"source": {
"osmTags": {
"or": [
"highway=bus_stop"
]
}
},
"minzoom": 15,
"title": {
"render": {
"en": "Transit Stop"
},
"mappings": [
{
"if": "name~*",
"then": {
"en": "Stop {name}"
}
}
]
},
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"icon": {
"render": "./assets/layers/transit_stops/bus_stop.svg",
"mappings": []
},
"label": "<div style=\"background: white; display: block\">{name}</div>"
}
],
"calculatedTags": [
"_routes=feat.memberships()",
"_contained_routes_properties=feat.memberships().map(p => {return {id: p.relation.id, name: p.relation.properties.name} }).filter((v,i,a)=>a.findIndex(t=>(JSON.stringify(t) === JSON.stringify(v)))===i)",
"_contained_route_ids=JSON.parse(feat.properties._contained_routes_properties ?? '[]').map(p => p.id)",
"_contained_routes=JSON.parse(feat.properties._contained_routes_properties ?? '[]').map(p => `<li><a href='#relation/${p.id}'>${p.name ?? 'bus route'}</a></li>`).join('')",
"_contained_routes_count=JSON.parse(feat.properties._contained_routes_properties ?? '[]').length"
],
"tagRenderings": [
{
"id": "stop_name",
"render": {
"en": "This stop is called <b>{name}</b>"
},
"freeform": {
"key": "name",
"type": "string",
"addExtraTags": [
"noname="
],
"placeholder": {
"en": "Name of the stop"
}
},
"mappings": [
{
"if": {
"and": [
"noname=yes",
"name="
]
},
"then": {
"en": "This stop has no name"
}
}
],
"question": {
"en": "What is the name of this stop?"
},
"placeholder": "Name of the stop"
},
"images",
{
"id": "shelter",
"mappings": [
{
"if": "shelter=yes",
"then": {
"en": "This stop has a shelter"
}
},
{
"if": "shelter=no",
"then": {
"en": "This stop does not have a shelter"
}
},
{
"if": "shelter=separate",
"then": {
"en": "This stop has a shelter, that's separately mapped"
},
"hideInAnswer": true
}
],
"question": {
"en": "Does this stop have a shelter?"
}
},
{
"id": "bench",
"mappings": [
{
"if": "bench=yes",
"then": {
"en": "This stop has a bench"
}
},
{
"if": "bench=no",
"then": {
"en": "This stop does not have a bench"
}
},
{
"if": "bench=separate",
"then": {
"en": "This stop has a bench, that's separately mapped"
},
"hideInAnswer": true
}
],
"question": {
"en": "Does this stop have a bench?"
}
},
{
"id": "bin",
"mappings": [
{
"if": "bin=yes",
"then": {
"en": "This stop has a bin"
}
},
{
"if": "bin=no",
"then": {
"en": "This stop does not have a bin"
}
},
{
"if": "bin=separate",
"then": {
"en": "This stop has a bin, that's separately mapped"
},
"hideInAnswer": true
}
],
"question": {
"en": "Does this stop have a bin?"
}
},
"wheelchair-access",
{
"id": "tactile_paving",
"mappings": [
{
"if": "tactile_paving=yes",
"then": {
"en": "This stop has tactile paving"
}
},
{
"if": "tactile_paving=no",
"then": {
"en": "This stop does not have tactile paving"
}
}
],
"question": {
"en": "Does this stop have tactile paving?"
}
},
{
"id": "lit",
"mappings": [
{
"if": "lit=yes",
"then": {
"en": "This stop is lit"
}
},
{
"if": "lit=no",
"then": {
"en": "This stop is not lit"
}
}
],
"question": {
"en": "Is this stop lit?"
}
},
{
"id": "departures_board",
"mappings": [
{
"if": "departures_board=yes",
"then": {
"en": "This stop has a departures board of unknown type"
},
"hideInAnswer": true
},
{
"if": "departures_board=realtime",
"then": {
"en": "This stop has a board showing realtime departure information"
}
},
{
"if": "passenger_information_display=yes",
"then": {
"en": "This stop has a board showing realtime departure information"
},
"hideInAnswer": true
},
{
"if": "departures_board=timetable",
"then": {
"en": "This stop has a timetable showing regular departures"
}
},
{
"if": "departures_board=interval",
"then": {
"en": "This stop has a timetable containing just the interval between departures"
}
},
{
"if": "departures_board=no",
"then": {
"en": "This stop does not have a departures board"
}
}
]
},
{
"render": {
"en": "<h3>{_contained_routes_count} routes stop at this stop</h3> <ul>{_contained_routes}</ul>"
},
"condition": "_contained_routes~*",
"id": "contained_routes"
}
],
"filter": [],
"allowMove": false
}

View file

@ -33,7 +33,7 @@
"nb_NO": "Velkommen til det åpne kunstverkskartet, et kart over statuer, byster, grafitti, og andre kunstverk i verden",
"hu": "Szobrok, mellszobrok, graffitik és egyéb műalkotások nyílt világtérképe",
"pl": "Witaj w Open Artwork Map, mapie pomników, popierś, graffitti i innych dzieł sztuki z całego świata",
"ca": "Benvingut a Open Artwork Map, un mapa d'estàtues, busts, grafitis i altres obres d'art del tot el món",
"ca": "Un mapa obert d'estàtues, busts, grafitis i altres obres d'art del tot el món",
"zh_Hans": "欢迎使用Open Artwork Map一个雕塑、半身像、涂鸦和其他全球艺术品的地图",
"fil": "Malugod na pag-dating sa Open Artwork Map, ang mapa ng mga bantayog, graffiti, at iba pang likhang sining sa buong mundo"
},

View file

@ -18,7 +18,8 @@
"id": "Peta dengan stasiun persewaan sepeda dan toko penyewaan sepeda",
"fr": "Une carte avec des stations et magasins de location de vélos",
"es": "Un mapa con estaciones de alquiler de bicicletas y tiendas de alquiler de bicicletas",
"nb_NO": "Sykkelutleiestasjoner og sykkelutleiebutikker"
"nb_NO": "Sykkelutleiestasjoner og sykkelutleiebutikker",
"ca": "Un mapa amb estacions de lloguer de bicicletes i botigues de lloguer de bicicletes"
},
"description": {
"en": "On this map, you'll find the many bicycle rental stations as they are known by OpenStreetMap",
@ -27,7 +28,8 @@
"fr": "Vous trouverez sur cette carte toutes les stations de location de vélo telles qu'elles sont référencées dans OpenStreetMap",
"es": "En este mapa, encontrarás numerosas estaciones de alquiler de bicicletas que son conocidas por OpenStreetMap",
"da": "På dette kort finder du de mange cykeludlejningsstationer, som OpenStreetMap kender dem",
"nb_NO": "Her finner du mange sykkelutleiestasjoner slik de er kjent for OpenStreetMap"
"nb_NO": "Her finner du mange sykkelutleiestasjoner slik de er kjent for OpenStreetMap",
"ca": "En aquest mapa, trobaràs nombroses estacions de lloguer de bicicletes que són conegudes per OpenStreetMap"
},
"maintainer": "",
"icon": "./assets/themes/bicycle_rental/logo.svg",

View file

@ -38,7 +38,7 @@
{
"builtin": "bicycle_library",
"override": {
"minZoom": 0
"minzoom": 0
}
}
]

View file

@ -10,7 +10,8 @@
"hu": "Távcsövek",
"fr": "Jumelles",
"es": "Binoculares",
"da": "Kikkerter"
"da": "Kikkerter",
"ca": "Binoculars"
},
"shortDescription": {
"en": "A map with fixed binoculars",
@ -21,7 +22,8 @@
"zh_Hant": "固定望遠鏡的地圖",
"hu": "Rögzített távcsövek (binokulárok) térképe",
"fr": "Une carte de jumelles panoramiques",
"es": "Un mapa con prismáticos fijos"
"es": "Un mapa con prismáticos fijos",
"ca": "Un mapa amb prismàtics fixos"
},
"description": {
"en": "A map with binoculars fixed in place with a pole. It can typically be found on touristic locations, viewpoints, on top of panoramic towers or occasionally on a nature reserve.",
@ -32,7 +34,8 @@
"hu": "Rúdra rögzített távcsövek térképe. Jellemzően turisztikailag érdekes, panorámás helyeken, kilátótornyok tetején vagy természetvédelmi területen találhatók.",
"fr": "Une carte des longue-vues fixes. Se trouve typiquement sur les sites touristiques, les points de vue, les tours panoramiques ou dans les réserves naturelles.",
"es": "Un mapa con prismáticos fijos en un poste. Suele encontrarse en lugares turísticos, miradores, en lo alto de torres panorámicas u ocasionalmente en una reserva natural.",
"nb_NO": "Stedsbundne kikkerter på påle. Vanligvis på turiststeder, utkikkspunkter, på toppen av utsiktstårn, og noen ganger i naturreservat."
"nb_NO": "Stedsbundne kikkerter på påle. Vanligvis på turiststeder, utkikkspunkter, på toppen av utsiktstårn, og noen ganger i naturreservat.",
"ca": "Un mapa amb prismàtics fixos en un pal. Sol trobar-se en llocs turístics, miradors, a la part alta de torres panoràmiques o ocasionalment en una reserva natural."
},
"maintainer": "",
"icon": "./assets/layers/binocular/telescope.svg",

View file

@ -28,7 +28,8 @@
"it": "Una libreria pubblica è una piccola cabina a lato della strada, un locale, una vecchia cabina telefonica o qualche altro luogo in cui sono tenuti libri. Chiunque può lasciare o prendere libri. Scopo della mappa è individuarle. Se scopri nuove librerie nelle vicinanze, puoi facilmente aggiungerle con un account OpenStreetMap.",
"hu": "A nyilvános könyvespolc egy kis utcai szekrény, doboz, régi telefonfülke vagy más tárgy, ahol könyveket tárolnak. Bárki tehet rá vagy vihet el róla könyvet. Ez a térkép ezeket a könyvespolcokat kívánja összegyűjteni. Ha felfedezett egy új könyvespolcot a közelben, akkor egy ingyenes OpenStreetMap-fiókkal gyorsan fel is rajzolhatja a térképre.",
"es": "Una librería pública es un pequeño armario en la calle, una caja, una vieja cabina telefónica o algún otro objeto donde se guardan libros. Todo el mundo puede colocar o coger un libro. Este mapa pretende recoger todas estas librerías. Puedes descubrir nuevas librerías cercanas y, con una cuenta gratuita de OpenStreetMap, añadir rápidamente tus librerías favoritas.",
"da": "Et offentligt bogskab er et lille skab, en kasse, en gammel telefonboks eller andre steder, hvor bøger opbevares. Alle kan lægge eller tage en bog. Dette kort har til formål at samle alle disse bogskabe. Du kan opdage nye bogkasser i nærheden og med en gratis OpenStreetMap-konto hurtigt tilføje dine yndlingsbogkasser."
"da": "Et offentligt bogskab er et lille skab, en kasse, en gammel telefonboks eller andre steder, hvor bøger opbevares. Alle kan lægge eller tage en bog. Dette kort har til formål at samle alle disse bogskabe. Du kan opdage nye bogkasser i nærheden og med en gratis OpenStreetMap-konto hurtigt tilføje dine yndlingsbogkasser.",
"ca": "Una llibreria pública és un xicotet armari al carrer, una caixa, una vella cabina telefònica o algun altre objecte on es guarden llibres. Tothom pot col·locar o agafar un llibre. Aquest mapa pretén recollir totes aquestes llibreries. Pots descobrir noves llibreries pròximes i, amb un compte gratuït de OpenStreetMap, afegir ràpidament les teues llibreries favorites."
},
"icon": "./assets/themes/bookcases/bookcase.svg",
"startLat": 0,

Some files were not shown because too many files have changed in this diff Show more