diff --git a/.vscode/settings.json b/.vscode/settings.json index ff6d1b68d..25b1f4dbe 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,5 +16,6 @@ } ], "editor.tabSize": 2, - "files.autoSave": "onFocusChange" -} \ No newline at end of file + "files.autoSave": "onFocusChange", + "search.useIgnoreFiles": true + } \ No newline at end of file diff --git a/Docs/BuiltinIndex.md b/Docs/BuiltinIndex.md index 83872f143..1670e123b 100644 --- a/Docs/BuiltinIndex.md +++ b/Docs/BuiltinIndex.md @@ -136,6 +136,7 @@ - playground - recycling - school + - shops - tertiary_education - veterinary @@ -159,6 +160,7 @@ - kindergarten_childcare - recycling - school + - shops - tertiary_education - veterinary @@ -182,6 +184,7 @@ - kindergarten_childcare - recycling - school + - shops - tertiary_education @@ -202,6 +205,7 @@ - climbing_gym - food - kindergarten_childcare + - shops - veterinary diff --git a/Docs/BuiltinLayers.md b/Docs/BuiltinLayers.md index 8754f882e..5ad662e77 100644 --- a/Docs/BuiltinLayers.md +++ b/Docs/BuiltinLayers.md @@ -817,6 +817,7 @@ The following layers are included in MapComplete: - [hydrant](./Layers/hydrant.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) diff --git a/Docs/Development_deployment.md b/Docs/Development_deployment.md index 64b3c9563..ab29c60d3 100644 --- a/Docs/Development_deployment.md +++ b/Docs/Development_deployment.md @@ -46,37 +46,31 @@ Development using Windows For Windows you can use the devcontainer, or the WSL subsystem. -Raw installation +To use the devcontainer in Visual Studio Code: -0. Clone the repo -1. Install `npm` and install `ts-node` globally with `npm install -g ts-node` -2. Execute `npm run init`. It will install and build some assets -3. Run `npm run start` to start the dev server - -To use the WSL in Visual Studio Code: - -1. Install a WSL Distribution (e.g. Ubuntu) -2. Install basic dependencies `sudo apt install make g++` -3. Install NVM `wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash` -4. Use NVM to install node 16.x: `nvm install 16.9.1` -5. Activate the node version: `nvm use 16.9.1` -6. Install `npm` using `sudo apt install npm`. -7. Install the [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) extension and it's dependencies. -8. Open a remote WSL window using the button in the bottom left. -9. Make a fork and clone the repository. -10. Run `npm run init` and generate some additional dependencies and generated files. Note that it'll install the - dependencies too -11. Run `npm run start` to host a local testversion at http://localhost:1234/index.html -12. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename` +0. Make sure you have installed + the [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + extension and it's dependencies. +1. Make a fork and clone the repository. +2. After cloning, Visual Studio Code will ask you if you want to use the devcontainer. +3. Then you can either clone it again in a volume (for better performance), or open the current folder in a container. +4. By now, you should be able to run `npm run start` to host a local testversion at http://localhost:1234/index.html +5. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename` or `userlayout=true#` as [Query parameter](URL_Parameters.md). Note that the shorter URLs ( e.g. `bookcases.html`, `aed.html`, ...) _don't_ exist on the development version. -To use WSL without Visual Studio Code you can replace steps 7 and 8 by opening up a WSL terminal +To use the WSL in Visual Studio Code: -On mac ------- - -Install the `Command line tools for XCode which you can find [here](https://developer.apple.com/download/all/). You might need an apple dev account for this. +0. Make sure you have installed the [Remote - WSL]() extension and it's dependencies. +1. Open a remote WSL window using the button in the bottom left. +2. Make a fork and clone the repository. +3. Install `npm` using `sudo apt install npm`. +4. Run `npm run init` and generate some additional dependencies and generated files. Note that it'll install the + dependencies too +5. Run `npm run start` to host a local testversion at http://localhost:1234/index.html +6. By default, a landing page with available themes is served. In order to load a single theme, use `layout=themename` + or `userlayout=true#` as [Query parameter](URL_Parameters.md). Note that the shorter URLs ( + e.g. `bookcases.html`, `aed.html`, ...) _don't_ exist on the development version. Automatic deployment -------------------- diff --git a/Docs/Layers/crossings.md b/Docs/Layers/crossings.md index aaf3f4d5f..644447e10 100644 --- a/Docs/Layers/crossings.md +++ b/Docs/Layers/crossings.md @@ -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) diff --git a/Docs/Layers/cycleways_and_roads.md b/Docs/Layers/cycleways_and_roads.md index 468ba725b..7d2222aec 100644 --- a/Docs/Layers/cycleways_and_roads.md +++ b/Docs/Layers/cycleways_and_roads.md @@ -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: - - highway=cycleway|cycleway=lane|cycleway=shared_lane|cycleway=track|cyclestreet=yes|highway=residential|highway=tertiary|highway=unclassified|highway=primary|highway=secondary|highway=path&bicycle=designated + - highway=cycleway|cycleway=lane|cycleway=shared_lane|cycleway=track|cyclestreet=yes|highway=residential|highway=tertiary|highway=unclassified|highway=primary|highway=secondary|highway=tertiary_link|highway=primary_link|highway=secondary_link|highway=service|highway=footway|highway=pedestrian|highway=living_street|highway=path&bicycle=designated -[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) diff --git a/Docs/Layers/doctors.md b/Docs/Layers/doctors.md new file mode 100644 index 000000000..45b9a24cd --- /dev/null +++ b/Docs/Layers/doctors.md @@ -0,0 +1,176 @@ + + + doctors +========= + + + + + + + + + + + - 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: + + + + - amenity=doctors|amenity=dentist|healthcare=physiotherapist + + +[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 +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/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

Opening hours

{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 {phone} + + + + + + - {contact:phone} 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 {email} + + + + + + - {contact:email} 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 {website} + + + + + + - {contact:website} 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 healthcare:speciality=general + - This is a gynaecologist corresponds with healthcare:speciality=gynaecology + - This is a psychiatrist corresponds with healthcare:speciality=psychiatry + - This is a paediatrician corresponds with healthcare:speciality=paediatrics + + +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) \ No newline at end of file diff --git a/Docs/Layers/dogshop.md b/Docs/Layers/dogshop.md index 6195f5798..3dd700051 100644 --- a/Docs/Layers/dogshop.md +++ b/Docs/Layers/dogshop.md @@ -61,11 +61,11 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | Multiple choice | [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | @@ -94,36 +94,239 @@ This is rendered with This shop is called {name} -### shops-shop +### shops-type-from-id -The question is What does this shop sell? - -This rendering asks information about the property [shop](https://wiki.openstreetmap.org/wiki/Key:shop) - -This is rendered with This shop sells {shop} +The question is What kind of shop is this? - - Convenience store corresponds with shop=convenience - - Supermarket corresponds with shop=supermarket - - Clothing store corresponds with shop=clothes - - Hairdresser corresponds with shop=hairdresser + - Farm Supply Shop corresponds with shop=agrarian + - Liquor Store corresponds with shop=alcohol + - Anime / Manga Shop corresponds with shop=anime + - Antiques Shop corresponds with shop=antiques + - Appliance Store corresponds with shop=appliance + - Art Store corresponds with shop=art + - Baby Goods Store corresponds with shop=baby_goods + - Bag/Luggage Store corresponds with shop=bag - Bakery corresponds with shop=bakery - - Car repair (garage) corresponds with shop=car_repair - - Car dealer corresponds with shop=car + - Bathroom Furnishing Store corresponds with shop=bathroom_furnishing + - Beauty Shop corresponds with shop=beauty + - Bedding/Mattress Store corresponds with shop=bed + - Beverage Store corresponds with shop=beverages + - Bicycle Shop corresponds with shop=bicycle + - Boat Store corresponds with shop=boat + - Bookmaker corresponds with shop=bookmaker + - Book Store corresponds with shop=books + - Brewing Supply Store corresponds with shop=brewing_supplies + - Butcher corresponds with shop=butcher + - Camera Equipment Store corresponds with shop=camera + - Candle Shop corresponds with shop=candles + - Cannabis Shop corresponds with shop=cannabis + - Car Dealership corresponds with shop=car + - Car Parts Store corresponds with shop=car_parts + - Car Repair Shop corresponds with shop=car_repair + - RV Dealership corresponds with shop=caravan + - Carpet Store corresponds with shop=carpet + - Catalog Shop corresponds with shop=catalogue + - Charity Store corresponds with shop=charity + - Cheese Store corresponds with shop=cheese + - Drugstore corresponds with shop=chemist + - Chocolate Store corresponds with shop=chocolate + - Clothing Store corresponds with shop=clothes + - Coffee Store corresponds with shop=coffee + - Collectibles Shop corresponds with shop=collector + - Computer Store corresponds with shop=computer + - Candy Store corresponds with shop=confectionery + - Convenience Store corresponds with shop=convenience + - Copy Store corresponds with shop=copyshop + - Cosmetics Store corresponds with shop=cosmetics + - Country Store corresponds with shop=country_store + - Arts & Crafts Store corresponds with shop=craft + - Curtain Store corresponds with shop=curtain + - Dairy Store corresponds with shop=dairy + - Deli corresponds with shop=deli + - Department Store corresponds with shop=department_store + - DIY Store corresponds with shop=doityourself + - Door Shop corresponds with shop=doors + - Dry Cleaner corresponds with shop=dry_cleaning + - E-Cigarette Shop corresponds with shop=e-cigarette + - Electrical Equipment Store corresponds with shop=electrical + - Electronics Store corresponds with shop=electronics + - Erotic Store corresponds with shop=erotic + - Fabric Store corresponds with shop=fabric + - Produce Stand corresponds with shop=farm + - Fashion Accessories Store corresponds with shop=fashion_accessories + - Fireplace Store corresponds with shop=fireplace + - Fishing Shop corresponds with shop=fishing + - Flooring Supply Shop corresponds with shop=flooring + - Florist corresponds with shop=florist + - Framing Shop corresponds with shop=frame + - Frozen Food Store corresponds with shop=frozen_food + - Fuel Shop corresponds with shop=fuel + - Funeral Home corresponds with shop=funeral_directors + - Furniture Store corresponds with shop=furniture + - Tabletop Game Store corresponds with shop=games + - Garden Center corresponds with shop=garden_centre + - Bottled Gas Shop corresponds with shop=gas + - General Store corresponds with shop=general + - Gift Shop corresponds with shop=gift + - Greengrocer corresponds with shop=greengrocer + - Hairdresser corresponds with shop=hairdresser + - Hairdresser Supply Store corresponds with shop=hairdresser_supply + - Hardware Store corresponds with shop=hardware + - Health Food Shop corresponds with shop=health_food + - Hearing Aids Store corresponds with shop=hearing_aids + - Herbalist corresponds with shop=herbalist + - Hifi Store corresponds with shop=hifi + - Hobby Shop corresponds with shop=hobby + - Household Linen Shop corresponds with shop=household_linen + - Houseware Store corresponds with shop=houseware + - Hunting Shop corresponds with shop=hunting + - Interior Decoration Store corresponds with shop=interior_decoration + - Jewelry Store corresponds with shop=jewelry + - Kiosk corresponds with shop=kiosk + - Kitchen Design Store corresponds with shop=kitchen + - Laundry corresponds with shop=laundry + - Leather Store corresponds with shop=leather + - Lighting Store corresponds with shop=lighting + - Locksmith corresponds with shop=locksmith + - Lottery Shop corresponds with shop=lottery + - Mall corresponds with shop=mall + - Massage Shop corresponds with shop=massage + - Medical Supply Store corresponds with shop=medical_supply + - Military Surplus Store corresponds with shop=military_surplus + - Mobile Phone Store corresponds with shop=mobile_phone + - Model Shop corresponds with shop=model + - Money Lender corresponds with shop=money_lender + - Motorcycle Dealership corresponds with shop=motorcycle + - Motorcycle Repair Shop corresponds with shop=motorcycle_repair + - Music Store corresponds with shop=music + - Musical Instrument Store corresponds with shop=musical_instrument + - Newspaper/Magazine Shop corresponds with shop=newsagent + - Nutrition Supplements Store corresponds with shop=nutrition_supplements + - Optician corresponds with shop=optician + - Outdoors Store corresponds with shop=outdoor + - Online Retailer Outpost corresponds with shop=outpost + - Paint Store corresponds with shop=paint + - Party Supply Store corresponds with shop=party + - Pastry Shop corresponds with shop=pastry + - Pawn Shop corresponds with shop=pawnbroker + - Perfume Store corresponds with shop=perfumery + - Pet Store corresponds with shop=pet + - Pet Grooming Store corresponds with shop=pet_grooming + - Photography Store corresponds with shop=photo + - Pottery Store corresponds with shop=pottery + - Printer Ink Store corresponds with shop=printer_ink + - Psychic corresponds with shop=psychic + - Fireworks Store corresponds with shop=pyrotechnics + - Radio/Electronic Component Store corresponds with shop=radiotechnics + - Religious Store corresponds with shop=religion + - Rental Shop corresponds with shop=rental + - Repair Shop corresponds with shop=repair + - Scuba Diving Shop corresponds with shop=scuba_diving + - Seafood Shop corresponds with shop=seafood + - Consignment/Thrift Store corresponds with shop=second_hand + - Sewing Supply Shop corresponds with shop=sewing + - Shoe Repair Shop corresponds with shop=shoe_repair + - Shoe Store corresponds with shop=shoes + - Spice Shop corresponds with shop=spices + - Sporting Goods Store corresponds with shop=sports + - Stationery Store corresponds with shop=stationery + - Storage Rental corresponds with shop=storage_rental + - Supermarket corresponds with shop=supermarket + - Pool Supply Store corresponds with shop=swimming_pool + - Tailor corresponds with shop=tailor + - Tattoo Parlor corresponds with shop=tattoo + - Tea Store corresponds with shop=tea + - Telecom Retail Store corresponds with shop=telecommunication + - Ticket Seller corresponds with shop=ticket + - Tile Shop corresponds with shop=tiles + - Tobacco Shop corresponds with shop=tobacco + - Tool Rental corresponds with shop=tool_hire + - Toy Store corresponds with shop=toys + - Trade Shop corresponds with shop=trade + - Travel Agency corresponds with shop=travel_agency + - Trophy Shop corresponds with shop=trophy + - Tire Store corresponds with shop=tyres + - Vacuum Cleaner Store corresponds with shop=vacuum_cleaner + - Variety Store corresponds with shop=variety_store + - Video Store corresponds with shop=video + - Video Game Store corresponds with shop=video_games + - Watches Shop corresponds with shop=watches + - Drinking Water Shop corresponds with shop=water + - Watersport/Swim Shop corresponds with shop=water_sports + - Weapon Shop corresponds with shop=weapons + - Wholesale Store corresponds with shop=wholesale + - Wig Shop corresponds with shop=wigs + - Window Blind Store corresponds with shop=window_blind + - Wine Shop corresponds with shop=wine -### shops-phone +### opening_hours -The question is What is the phone number? +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

Opening hours

{opening_hours_table(opening_hours)} + + + + + +### 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 {website} + + + + + + - {contact:website} corresponds with contact:website~^..*$ + - 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 {email} + + + + + + - {contact:email} corresponds with contact:email~^..*$ + - This option cannot be chosen as answer + + + + +### 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) @@ -133,44 +336,8 @@ This is rendered with {phone} -### shops-website - - - -The question is What is the website of this shop? - -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) - -This is rendered with {website} - - - - - -### shops-email - - - -The question is What is the email address of this shop? - -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) - -This is rendered with {email} - - - - - -### shops-opening_hours - - - -The question is What are the opening hours of this shop? - -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) - -This is rendered with {opening_hours_table(opening_hours)} - + - {contact:phone} corresponds with contact:phone~^..*$ + - This option cannot be chosen as answer diff --git a/Docs/Layers/hospital.md b/Docs/Layers/hospital.md new file mode 100644 index 000000000..0d2a9f22f --- /dev/null +++ b/Docs/Layers/hospital.md @@ -0,0 +1,141 @@ + + + hospital +========== + + + + + + + + + + + - 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: + + + + - amenity=hospital + + +[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 +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | + + + + +### 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 {phone} + + + + + + - {contact:phone} 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 {email} + + + + + + - {contact:email} 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 {website} + + + + + + - {contact:website} 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) \ No newline at end of file diff --git a/Docs/Layers/id_presets.md b/Docs/Layers/id_presets.md new file mode 100644 index 000000000..4acedc9a9 --- /dev/null +++ b/Docs/Layers/id_presets.md @@ -0,0 +1,398 @@ + + + id_presets +============ + + + + + +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. + + + + + + + - This layer is shown at zoomlevel **0** and higher + - This layer cannot be toggled in the filter view. If you import this layer in your theme, override `title` to make this toggleable. + - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` + - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` + + + + + Basic tags for this layer +--------------------------- + + + +Elements must have the all of following tags to be shown on this layer: + + + + - id~^..*$ + + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22id%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 +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | Multiple choice | [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | Multiple choice | [boutique](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboutique) [fashion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion) [vacant](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacant) [yes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dyes) [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) + + + + +### shop_types + + + +This tagrendering has no question and is thus read-only + + + + + + - Farm Supply Shop corresponds with shop=agrarian + - Liquor Store corresponds with shop=alcohol + - Anime / Manga Shop corresponds with shop=anime + - Antiques Shop corresponds with shop=antiques + - Appliance Store corresponds with shop=appliance + - Art Store corresponds with shop=art + - Baby Goods Store corresponds with shop=baby_goods + - Bag/Luggage Store corresponds with shop=bag + - Bakery corresponds with shop=bakery + - Bathroom Furnishing Store corresponds with shop=bathroom_furnishing + - Beauty Shop corresponds with shop=beauty + - Bedding/Mattress Store corresponds with shop=bed + - Beverage Store corresponds with shop=beverages + - Bicycle Shop corresponds with shop=bicycle + - Boat Store corresponds with shop=boat + - Bookmaker corresponds with shop=bookmaker + - Book Store corresponds with shop=books + - Brewing Supply Store corresponds with shop=brewing_supplies + - Butcher corresponds with shop=butcher + - Camera Equipment Store corresponds with shop=camera + - Candle Shop corresponds with shop=candles + - Cannabis Shop corresponds with shop=cannabis + - Car Dealership corresponds with shop=car + - Car Parts Store corresponds with shop=car_parts + - Car Repair Shop corresponds with shop=car_repair + - RV Dealership corresponds with shop=caravan + - Carpet Store corresponds with shop=carpet + - Catalog Shop corresponds with shop=catalogue + - Charity Store corresponds with shop=charity + - Cheese Store corresponds with shop=cheese + - Drugstore corresponds with shop=chemist + - Chocolate Store corresponds with shop=chocolate + - Clothing Store corresponds with shop=clothes + - Coffee Store corresponds with shop=coffee + - Collectibles Shop corresponds with shop=collector + - Computer Store corresponds with shop=computer + - Candy Store corresponds with shop=confectionery + - Convenience Store corresponds with shop=convenience + - Copy Store corresponds with shop=copyshop + - Cosmetics Store corresponds with shop=cosmetics + - Country Store corresponds with shop=country_store + - Arts & Crafts Store corresponds with shop=craft + - Curtain Store corresponds with shop=curtain + - Dairy Store corresponds with shop=dairy + - Deli corresponds with shop=deli + - Department Store corresponds with shop=department_store + - DIY Store corresponds with shop=doityourself + - Door Shop corresponds with shop=doors + - Dry Cleaner corresponds with shop=dry_cleaning + - E-Cigarette Shop corresponds with shop=e-cigarette + - Electrical Equipment Store corresponds with shop=electrical + - Electronics Store corresponds with shop=electronics + - Erotic Store corresponds with shop=erotic + - Fabric Store corresponds with shop=fabric + - Produce Stand corresponds with shop=farm + - Fashion Accessories Store corresponds with shop=fashion_accessories + - Fireplace Store corresponds with shop=fireplace + - Fishing Shop corresponds with shop=fishing + - Flooring Supply Shop corresponds with shop=flooring + - Florist corresponds with shop=florist + - Framing Shop corresponds with shop=frame + - Frozen Food Store corresponds with shop=frozen_food + - Fuel Shop corresponds with shop=fuel + - Funeral Home corresponds with shop=funeral_directors + - Furniture Store corresponds with shop=furniture + - Tabletop Game Store corresponds with shop=games + - Garden Center corresponds with shop=garden_centre + - Bottled Gas Shop corresponds with shop=gas + - General Store corresponds with shop=general + - Gift Shop corresponds with shop=gift + - Greengrocer corresponds with shop=greengrocer + - Hairdresser corresponds with shop=hairdresser + - Hairdresser Supply Store corresponds with shop=hairdresser_supply + - Hardware Store corresponds with shop=hardware + - Health Food Shop corresponds with shop=health_food + - Hearing Aids Store corresponds with shop=hearing_aids + - Herbalist corresponds with shop=herbalist + - Hifi Store corresponds with shop=hifi + - Hobby Shop corresponds with shop=hobby + - Household Linen Shop corresponds with shop=household_linen + - Houseware Store corresponds with shop=houseware + - Hunting Shop corresponds with shop=hunting + - Interior Decoration Store corresponds with shop=interior_decoration + - Jewelry Store corresponds with shop=jewelry + - Kiosk corresponds with shop=kiosk + - Kitchen Design Store corresponds with shop=kitchen + - Laundry corresponds with shop=laundry + - Leather Store corresponds with shop=leather + - Lighting Store corresponds with shop=lighting + - Locksmith corresponds with shop=locksmith + - Lottery Shop corresponds with shop=lottery + - Mall corresponds with shop=mall + - Massage Shop corresponds with shop=massage + - Medical Supply Store corresponds with shop=medical_supply + - Military Surplus Store corresponds with shop=military_surplus + - Mobile Phone Store corresponds with shop=mobile_phone + - Model Shop corresponds with shop=model + - Money Lender corresponds with shop=money_lender + - Motorcycle Dealership corresponds with shop=motorcycle + - Motorcycle Repair Shop corresponds with shop=motorcycle_repair + - Music Store corresponds with shop=music + - Musical Instrument Store corresponds with shop=musical_instrument + - Newspaper/Magazine Shop corresponds with shop=newsagent + - Nutrition Supplements Store corresponds with shop=nutrition_supplements + - Optician corresponds with shop=optician + - Outdoors Store corresponds with shop=outdoor + - Online Retailer Outpost corresponds with shop=outpost + - Paint Store corresponds with shop=paint + - Party Supply Store corresponds with shop=party + - Pastry Shop corresponds with shop=pastry + - Pawn Shop corresponds with shop=pawnbroker + - Perfume Store corresponds with shop=perfumery + - Pet Store corresponds with shop=pet + - Pet Grooming Store corresponds with shop=pet_grooming + - Photography Store corresponds with shop=photo + - Pottery Store corresponds with shop=pottery + - Printer Ink Store corresponds with shop=printer_ink + - Psychic corresponds with shop=psychic + - Fireworks Store corresponds with shop=pyrotechnics + - Radio/Electronic Component Store corresponds with shop=radiotechnics + - Religious Store corresponds with shop=religion + - Rental Shop corresponds with shop=rental + - Repair Shop corresponds with shop=repair + - Scuba Diving Shop corresponds with shop=scuba_diving + - Seafood Shop corresponds with shop=seafood + - Consignment/Thrift Store corresponds with shop=second_hand + - Sewing Supply Shop corresponds with shop=sewing + - Shoe Repair Shop corresponds with shop=shoe_repair + - Shoe Store corresponds with shop=shoes + - Spice Shop corresponds with shop=spices + - Sporting Goods Store corresponds with shop=sports + - Stationery Store corresponds with shop=stationery + - Storage Rental corresponds with shop=storage_rental + - Supermarket corresponds with shop=supermarket + - Pool Supply Store corresponds with shop=swimming_pool + - Tailor corresponds with shop=tailor + - Tattoo Parlor corresponds with shop=tattoo + - Tea Store corresponds with shop=tea + - Telecom Retail Store corresponds with shop=telecommunication + - Ticket Seller corresponds with shop=ticket + - Tile Shop corresponds with shop=tiles + - Tobacco Shop corresponds with shop=tobacco + - Tool Rental corresponds with shop=tool_hire + - Toy Store corresponds with shop=toys + - Trade Shop corresponds with shop=trade + - Travel Agency corresponds with shop=travel_agency + - Trophy Shop corresponds with shop=trophy + - Tire Store corresponds with shop=tyres + - Vacuum Cleaner Store corresponds with shop=vacuum_cleaner + - Variety Store corresponds with shop=variety_store + - Video Store corresponds with shop=video + - Video Game Store corresponds with shop=video_games + - Watches Shop corresponds with shop=watches + - Drinking Water Shop corresponds with shop=water + - Watersport/Swim Shop corresponds with shop=water_sports + - Weapon Shop corresponds with shop=weapons + - Wholesale Store corresponds with shop=wholesale + - Wig Shop corresponds with shop=wigs + - Window Blind Store corresponds with shop=window_blind + - Wine Shop corresponds with shop=wine + + + + +### shop_rendering + + + +This tagrendering has no question and is thus read-only + + + + + + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=boutique + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=fashion + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=vacant + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=yes + - circle:white;./assets/layers/id_presets/fas-tractor.svg corresponds with shop=agrarian + - circle:white;./assets/layers/id_presets/fas-wine-bottle.svg corresponds with shop=alcohol + - circle:white;./assets/layers/id_presets/fas-dragon.svg corresponds with shop=anime + - circle:white;./assets/layers/id_presets/temaki-furniture.svg corresponds with shop=antiques + - circle:white;./assets/layers/id_presets/temaki-laundry.svg corresponds with shop=appliance + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=art + - circle:white;./assets/layers/id_presets/fas-baby-carriage.svg corresponds with shop=baby_goods + - circle:white;./assets/layers/id_presets/fas-suitcase-rolling.svg corresponds with shop=bag + - circle:white;./assets/layers/id_presets/maki-bakery.svg corresponds with shop=bakery + - circle:white;./assets/layers/id_presets/fas-bath.svg corresponds with shop=bathroom_furnishing + - circle:white;./assets/layers/id_presets/temaki-lipstick.svg corresponds with shop=beauty + - circle:white;./assets/layers/id_presets/maki-lodging.svg corresponds with shop=bed + - circle:white;./assets/layers/id_presets/temaki-bottles.svg corresponds with shop=beverages + - circle:white;./assets/layers/id_presets/maki-bicycle.svg corresponds with shop=bicycle + - circle:white;./assets/layers/id_presets/temaki-boat.svg corresponds with shop=boat + - circle:white;./assets/layers/id_presets/temaki-money_hand.svg corresponds with shop=bookmaker + - circle:white;./assets/layers/id_presets/fas-book.svg corresponds with shop=books + - circle:white;./assets/layers/id_presets/temaki-storage_fermenter.svg corresponds with shop=brewing_supplies + - circle:white;./assets/layers/id_presets/temaki-cleaver.svg corresponds with shop=butcher + - circle:white;./assets/layers/id_presets/fas-camera-retro.svg corresponds with shop=camera + - circle:white;./assets/layers/id_presets/fas-cannabis.svg corresponds with shop=cannabis + - circle:white;./assets/layers/id_presets/maki-car.svg corresponds with shop=car + - circle:white;./assets/layers/id_presets/fas-car-battery.svg corresponds with shop=car_parts + - circle:white;./assets/layers/id_presets/maki-car-repair.svg corresponds with shop=car_repair + - circle:white;./assets/layers/id_presets/temaki-camper_trailer.svg corresponds with shop=caravan + - circle:white;./assets/layers/id_presets/fas-tape.svg corresponds with shop=carpet + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=catalogue + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=charity + - circle:white;./assets/layers/id_presets/fas-cheese.svg corresponds with shop=cheese + - circle:white;./assets/layers/id_presets/maki-confectionery.svg corresponds with shop=chocolate + - circle:white;./assets/layers/id_presets/maki-clothing-store.svg corresponds with shop=clothes + - circle:white;./assets/layers/id_presets/temaki-coffee.svg corresponds with shop=coffee + - circle:white;./assets/layers/id_presets/fas-laptop.svg corresponds with shop=computer + - circle:white;./assets/layers/id_presets/maki-confectionery.svg corresponds with shop=confectionery + - circle:white;./assets/layers/id_presets/fas-print.svg corresponds with shop=copyshop + - circle:white;./assets/layers/id_presets/temaki-lipstick.svg corresponds with shop=cosmetics + - circle:white;./assets/layers/id_presets/fas-hat-cowboy-side.svg corresponds with shop=country_store + - circle:white;./assets/layers/id_presets/temaki-curtains.svg corresponds with shop=curtain + - circle:white;./assets/layers/id_presets/fas-cheese.svg corresponds with shop=dairy + - circle:white;./assets/layers/id_presets/temaki-meat.svg corresponds with shop=deli + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=department_store + - circle:white;./assets/layers/id_presets/temaki-tools.svg corresponds with shop=doityourself + - circle:white;./assets/layers/id_presets/fas-door-open.svg corresponds with shop=doors + - circle:white;./assets/layers/id_presets/temaki-clothes_hanger.svg corresponds with shop=dry_cleaning + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=e-cigarette + - circle:white;./assets/layers/id_presets/temaki-power.svg corresponds with shop=electrical + - circle:white;./assets/layers/id_presets/fas-plug.svg corresponds with shop=electronics + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=erotic + - circle:white;./assets/layers/id_presets/fas-tape.svg corresponds with shop=fabric + - circle:white;./assets/layers/id_presets/temaki-fashion_accessories.svg corresponds with shop=fashion_accessories + - circle:white;./assets/layers/id_presets/temaki-fireplace.svg corresponds with shop=fireplace + - circle:white;./assets/layers/id_presets/temaki-ice_fishing.svg corresponds with shop=fishing + - circle:white;./assets/layers/id_presets/temaki-tools.svg corresponds with shop=flooring + - circle:white;./assets/layers/id_presets/maki-florist.svg corresponds with shop=florist + - circle:white;./assets/layers/id_presets/fas-vector-square.svg corresponds with shop=frame + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=frozen_food + - circle:white;./assets/layers/id_presets/temaki-propane_tank.svg corresponds with shop=fuel + - circle:white;./assets/layers/id_presets/maki-cemetery.svg corresponds with shop=funeral_directors + - circle:white;./assets/layers/id_presets/fas-couch.svg corresponds with shop=furniture + - circle:white;./assets/layers/id_presets/fas-dice.svg corresponds with shop=games + - circle:white;./assets/layers/id_presets/maki-garden-centre.svg corresponds with shop=garden_centre + - circle:white;./assets/layers/id_presets/temaki-propane_tank.svg corresponds with shop=gas + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=general + - circle:white;./assets/layers/id_presets/maki-gift.svg corresponds with shop=gift + - circle:white;./assets/layers/id_presets/fas-carrot.svg corresponds with shop=greengrocer + - circle:white;./assets/layers/id_presets/temaki-beauty_salon.svg corresponds with shop=hairdresser + - circle:white;./assets/layers/id_presets/temaki-hair_care.svg corresponds with shop=hairdresser_supply + - circle:white;./assets/layers/id_presets/temaki-tools.svg corresponds with shop=hardware + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=health_food + - circle:white;./assets/layers/id_presets/temaki-hearing_aid.svg corresponds with shop=hearing_aids + - circle:white;./assets/layers/id_presets/fas-leaf.svg corresponds with shop=herbalist + - circle:white;./assets/layers/id_presets/temaki-speaker.svg corresponds with shop=hifi + - circle:white;./assets/layers/id_presets/fas-dragon.svg corresponds with shop=hobby + - circle:white;./assets/layers/id_presets/temaki-cloth.svg corresponds with shop=household_linen + - circle:white;./assets/layers/id_presets/fas-blender.svg corresponds with shop=houseware + - circle:white;./assets/layers/id_presets/temaki-bow_and_arrow.svg corresponds with shop=hunting + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=interior_decoration + - circle:white;./assets/layers/id_presets/maki-jewelry-store.svg corresponds with shop=jewelry + - circle:white;./assets/layers/id_presets/fas-store.svg corresponds with shop=kiosk + - circle:white;./assets/layers/id_presets/temaki-kitchen_sink.svg corresponds with shop=kitchen + - circle:white;./assets/layers/id_presets/temaki-laundry.svg corresponds with shop=laundry + - circle:white;./assets/layers/id_presets/temaki-handbag.svg corresponds with shop=leather + - circle:white;./assets/layers/id_presets/temaki-desk_lamp.svg corresponds with shop=lighting + - circle:white;./assets/layers/id_presets/fas-key.svg corresponds with shop=locksmith + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=mall + - circle:white;./assets/layers/id_presets/temaki-spa.svg corresponds with shop=massage + - circle:white;./assets/layers/id_presets/fas-crutch.svg corresponds with shop=medical_supply + - circle:white;./assets/layers/id_presets/temaki-military.svg corresponds with shop=military_surplus + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=model + - circle:white;./assets/layers/id_presets/temaki-money_hand.svg corresponds with shop=money_lender + - circle:white;./assets/layers/id_presets/fas-motorcycle.svg corresponds with shop=motorcycle + - circle:white;./assets/layers/id_presets/temaki-motorcycle_repair.svg corresponds with shop=motorcycle_repair + - circle:white;./assets/layers/id_presets/fas-compact-disc.svg corresponds with shop=music + - circle:white;./assets/layers/id_presets/fas-guitar.svg corresponds with shop=musical_instrument + - circle:white;./assets/layers/id_presets/fas-newspaper.svg corresponds with shop=newsagent + - circle:white;./assets/layers/id_presets/fas-pills.svg corresponds with shop=nutrition_supplements + - circle:white;./assets/layers/id_presets/maki-optician.svg corresponds with shop=optician + - circle:white;./assets/layers/id_presets/temaki-compass.svg corresponds with shop=outdoor + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=outpost + - circle:white;./assets/layers/id_presets/fas-paint-roller.svg corresponds with shop=paint + - circle:white;./assets/layers/id_presets/temaki-balloon.svg corresponds with shop=party + - circle:white;./assets/layers/id_presets/maki-bakery.svg corresponds with shop=pastry + - circle:white;./assets/layers/id_presets/temaki-money_hand.svg corresponds with shop=pawnbroker + - circle:white;./assets/layers/id_presets/temaki-perfume.svg corresponds with shop=perfumery + - circle:white;./assets/layers/id_presets/fas-cat.svg corresponds with shop=pet + - circle:white;./assets/layers/id_presets/temaki-pet_grooming.svg corresponds with shop=pet_grooming + - circle:white;./assets/layers/id_presets/fas-camera-retro.svg corresponds with shop=photo + - circle:white;./assets/layers/id_presets/temaki-vase.svg corresponds with shop=pottery + - circle:white;./assets/layers/id_presets/fas-print.svg corresponds with shop=printer_ink + - circle:white;./assets/layers/id_presets/temaki-psychic.svg corresponds with shop=psychic + - circle:white;./assets/layers/id_presets/temaki-rocket_firework.svg corresponds with shop=pyrotechnics + - circle:white;./assets/layers/id_presets/fas-microchip.svg corresponds with shop=radiotechnics + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=religion + - circle:white;./assets/layers/id_presets/fas-dolly.svg corresponds with shop=rental + - circle:white;./assets/layers/id_presets/temaki-scuba_diving.svg corresponds with shop=scuba_diving + - circle:white;./assets/layers/id_presets/temaki-fish_cleaning.svg corresponds with shop=seafood + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=second_hand + - circle:white;./assets/layers/id_presets/temaki-needle_and_spool.svg corresponds with shop=sewing + - circle:white;./assets/layers/id_presets/temaki-hammer_shoe.svg corresponds with shop=shoe_repair + - circle:white;./assets/layers/id_presets/maki-shoe.svg corresponds with shop=shoes + - circle:white;./assets/layers/id_presets/temaki-spice_bottle.svg corresponds with shop=spices + - circle:white;./assets/layers/id_presets/fas-futbol.svg corresponds with shop=sports + - circle:white;./assets/layers/id_presets/fas-paperclip.svg corresponds with shop=stationery + - circle:white;./assets/layers/id_presets/temaki-storage_rental.svg corresponds with shop=storage_rental + - circle:white;./assets/layers/id_presets/maki-grocery.svg corresponds with shop=supermarket + - circle:white;./assets/layers/id_presets/temaki-needle_and_spool.svg corresponds with shop=tailor + - circle:white;./assets/layers/id_presets/temaki-tattoo_machine.svg corresponds with shop=tattoo + - circle:white;./assets/layers/id_presets/maki-teahouse.svg corresponds with shop=tea + - circle:white;./assets/layers/id_presets/maki-telephone.svg corresponds with shop=telecommunication + - circle:white;./assets/layers/id_presets/temaki-tiling.svg corresponds with shop=tiles + - circle:white;./assets/layers/id_presets/temaki-pipe.svg corresponds with shop=tobacco + - circle:white;./assets/layers/id_presets/temaki-tools.svg corresponds with shop=tool_hire + - circle:white;./assets/layers/id_presets/fas-rocket.svg corresponds with shop=toys + - circle:white;./assets/layers/id_presets/temaki-tools.svg corresponds with shop=trade + - circle:white;./assets/layers/id_presets/fas-suitcase.svg corresponds with shop=travel_agency + - circle:white;./assets/layers/id_presets/fas-trophy.svg corresponds with shop=trophy + - circle:white;./assets/layers/id_presets/temaki-tire.svg corresponds with shop=tyres + - circle:white;./assets/layers/id_presets/temaki-vacuum.svg corresponds with shop=vacuum_cleaner + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=variety_store + - circle:white;./assets/layers/id_presets/temaki-movie_rental.svg corresponds with shop=video + - circle:white;./assets/layers/id_presets/maki-gaming.svg corresponds with shop=video_games + - circle:white;./assets/layers/id_presets/maki-watch.svg corresponds with shop=watches + - circle:white;./assets/layers/id_presets/temaki-water_bottle.svg corresponds with shop=water + - circle:white;./assets/layers/id_presets/temaki-dagger.svg corresponds with shop=weapons + - circle:white;./assets/layers/id_presets/maki-warehouse.svg corresponds with shop=wholesale + - circle:white;./assets/layers/id_presets/maki-shop.svg corresponds with shop=wigs + - circle:white;./assets/layers/id_presets/temaki-window.svg corresponds with shop=window_blind + - circle:white;./assets/layers/id_presets/maki-alcohol-shop.svg corresponds with shop=wine + + +This document is autogenerated from [assets/layers/id_presets/id_presets.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/id_presets/id_presets.json) \ No newline at end of file diff --git a/Docs/Layers/kerbs.md b/Docs/Layers/kerbs.md new file mode 100644 index 000000000..638ea1d40 --- /dev/null +++ b/Docs/Layers/kerbs.md @@ -0,0 +1,128 @@ + + + kerbs +======= + + + + + +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: + + + + - barrier=kerb + + +[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 +----------- | ------ | ------------------------------------------ +[](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) +[](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) +[](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 kerb=raised + - This kerb is lowered (~3 cm) corresponds with kerb=lowered + - This kerb is flush (~0cm) corresponds with kerb=flush + - There is no kerb here corresponds with kerb=no + - This option cannot be chosen as answer + - There is a kerb of unknown height corresponds with kerb=yes + - 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 tactile_paving=yes + - This kerb does not have tactile paving. corresponds with tactile_paving=no + - This kerb has tactile paving, but it is incorrect corresponds with tactile_paving=incorrect + - 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) \ No newline at end of file diff --git a/Docs/Layers/pharmacy.md b/Docs/Layers/pharmacy.md new file mode 100644 index 000000000..8434ce7ae --- /dev/null +++ b/Docs/Layers/pharmacy.md @@ -0,0 +1,170 @@ + + + pharmacy +========== + + + + + + + + + + + - 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: + + + + - amenity=pharmacy + + +[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 +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | +[](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | +[](https://taginfo.openstreetmap.org/keys/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

Opening hours

{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 {phone} + + + + + + - {contact:phone} 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 {email} + + + + + + - {contact:email} 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 {website} + + + + + + - {contact:website} 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 wheelchair=yes + - This pharmacy is hard to access on a wheelchair corresponds with wheelchair=no + - This pharmacy has limited access for wheelchair users corresponds with wheelchair=limited + + +This document is autogenerated from [assets/layers/pharmacy/pharmacy.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/pharmacy/pharmacy.json) \ No newline at end of file diff --git a/Docs/Layers/shelter.md b/Docs/Layers/shelter.md new file mode 100644 index 000000000..f3649328b --- /dev/null +++ b/Docs/Layers/shelter.md @@ -0,0 +1,91 @@ + + + shelter +========= + + + + + +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: + + + + - amenity=shelter + + +[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 +----------- | ------ | ------------------------------------------ +[](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 shelter_type=public_transport + - This is a shelter protecting from rain at a picnic site. corresponds with shelter_type=picnic_shelter + - This is a gazebo. corresponds with shelter_type=gazebo + - This is a small shelter, primarily intended for short breaks. Usually found in the mountains or alongside roads. corresponds with shelter_type=weather_shelter + - This is a shed with 3 walls, primarily intended for camping. corresponds with shelter_type=lean_to + - This is a pavilion corresponds with shelter_type=pavilion + - This is a basic hut, providing basic shelter and sleeping facilities. corresponds with shelter_type=basic_hut + + +This document is autogenerated from [assets/layers/shelter/shelter.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/shelter/shelter.json) \ No newline at end of file diff --git a/Docs/Layers/shops.md b/Docs/Layers/shops.md index 23eb5eeb4..a3e22cec5 100644 --- a/Docs/Layers/shops.md +++ b/Docs/Layers/shops.md @@ -5,7 +5,7 @@ - + A shop @@ -62,11 +62,11 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | -[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) -[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/shop#values) [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | Multiple choice | [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [hobby](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhobby) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) +[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | -[](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | +[](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | @@ -95,36 +95,239 @@ This is rendered with This shop is called {name} -### shops-shop +### shops-type-from-id -The question is What does this shop sell? - -This rendering asks information about the property [shop](https://wiki.openstreetmap.org/wiki/Key:shop) - -This is rendered with This shop sells {shop} +The question is What kind of shop is this? - - Convenience store corresponds with shop=convenience - - Supermarket corresponds with shop=supermarket - - Clothing store corresponds with shop=clothes - - Hairdresser corresponds with shop=hairdresser + - Farm Supply Shop corresponds with shop=agrarian + - Liquor Store corresponds with shop=alcohol + - Anime / Manga Shop corresponds with shop=anime + - Antiques Shop corresponds with shop=antiques + - Appliance Store corresponds with shop=appliance + - Art Store corresponds with shop=art + - Baby Goods Store corresponds with shop=baby_goods + - Bag/Luggage Store corresponds with shop=bag - Bakery corresponds with shop=bakery - - Car repair (garage) corresponds with shop=car_repair - - Car dealer corresponds with shop=car + - Bathroom Furnishing Store corresponds with shop=bathroom_furnishing + - Beauty Shop corresponds with shop=beauty + - Bedding/Mattress Store corresponds with shop=bed + - Beverage Store corresponds with shop=beverages + - Bicycle Shop corresponds with shop=bicycle + - Boat Store corresponds with shop=boat + - Bookmaker corresponds with shop=bookmaker + - Book Store corresponds with shop=books + - Brewing Supply Store corresponds with shop=brewing_supplies + - Butcher corresponds with shop=butcher + - Camera Equipment Store corresponds with shop=camera + - Candle Shop corresponds with shop=candles + - Cannabis Shop corresponds with shop=cannabis + - Car Dealership corresponds with shop=car + - Car Parts Store corresponds with shop=car_parts + - Car Repair Shop corresponds with shop=car_repair + - RV Dealership corresponds with shop=caravan + - Carpet Store corresponds with shop=carpet + - Catalog Shop corresponds with shop=catalogue + - Charity Store corresponds with shop=charity + - Cheese Store corresponds with shop=cheese + - Drugstore corresponds with shop=chemist + - Chocolate Store corresponds with shop=chocolate + - Clothing Store corresponds with shop=clothes + - Coffee Store corresponds with shop=coffee + - Collectibles Shop corresponds with shop=collector + - Computer Store corresponds with shop=computer + - Candy Store corresponds with shop=confectionery + - Convenience Store corresponds with shop=convenience + - Copy Store corresponds with shop=copyshop + - Cosmetics Store corresponds with shop=cosmetics + - Country Store corresponds with shop=country_store + - Arts & Crafts Store corresponds with shop=craft + - Curtain Store corresponds with shop=curtain + - Dairy Store corresponds with shop=dairy + - Deli corresponds with shop=deli + - Department Store corresponds with shop=department_store + - DIY Store corresponds with shop=doityourself + - Door Shop corresponds with shop=doors + - Dry Cleaner corresponds with shop=dry_cleaning + - E-Cigarette Shop corresponds with shop=e-cigarette + - Electrical Equipment Store corresponds with shop=electrical + - Electronics Store corresponds with shop=electronics + - Erotic Store corresponds with shop=erotic + - Fabric Store corresponds with shop=fabric + - Produce Stand corresponds with shop=farm + - Fashion Accessories Store corresponds with shop=fashion_accessories + - Fireplace Store corresponds with shop=fireplace + - Fishing Shop corresponds with shop=fishing + - Flooring Supply Shop corresponds with shop=flooring + - Florist corresponds with shop=florist + - Framing Shop corresponds with shop=frame + - Frozen Food Store corresponds with shop=frozen_food + - Fuel Shop corresponds with shop=fuel + - Funeral Home corresponds with shop=funeral_directors + - Furniture Store corresponds with shop=furniture + - Tabletop Game Store corresponds with shop=games + - Garden Center corresponds with shop=garden_centre + - Bottled Gas Shop corresponds with shop=gas + - General Store corresponds with shop=general + - Gift Shop corresponds with shop=gift + - Greengrocer corresponds with shop=greengrocer + - Hairdresser corresponds with shop=hairdresser + - Hairdresser Supply Store corresponds with shop=hairdresser_supply + - Hardware Store corresponds with shop=hardware + - Health Food Shop corresponds with shop=health_food + - Hearing Aids Store corresponds with shop=hearing_aids + - Herbalist corresponds with shop=herbalist + - Hifi Store corresponds with shop=hifi + - Hobby Shop corresponds with shop=hobby + - Household Linen Shop corresponds with shop=household_linen + - Houseware Store corresponds with shop=houseware + - Hunting Shop corresponds with shop=hunting + - Interior Decoration Store corresponds with shop=interior_decoration + - Jewelry Store corresponds with shop=jewelry + - Kiosk corresponds with shop=kiosk + - Kitchen Design Store corresponds with shop=kitchen + - Laundry corresponds with shop=laundry + - Leather Store corresponds with shop=leather + - Lighting Store corresponds with shop=lighting + - Locksmith corresponds with shop=locksmith + - Lottery Shop corresponds with shop=lottery + - Mall corresponds with shop=mall + - Massage Shop corresponds with shop=massage + - Medical Supply Store corresponds with shop=medical_supply + - Military Surplus Store corresponds with shop=military_surplus + - Mobile Phone Store corresponds with shop=mobile_phone + - Model Shop corresponds with shop=model + - Money Lender corresponds with shop=money_lender + - Motorcycle Dealership corresponds with shop=motorcycle + - Motorcycle Repair Shop corresponds with shop=motorcycle_repair + - Music Store corresponds with shop=music + - Musical Instrument Store corresponds with shop=musical_instrument + - Newspaper/Magazine Shop corresponds with shop=newsagent + - Nutrition Supplements Store corresponds with shop=nutrition_supplements + - Optician corresponds with shop=optician + - Outdoors Store corresponds with shop=outdoor + - Online Retailer Outpost corresponds with shop=outpost + - Paint Store corresponds with shop=paint + - Party Supply Store corresponds with shop=party + - Pastry Shop corresponds with shop=pastry + - Pawn Shop corresponds with shop=pawnbroker + - Perfume Store corresponds with shop=perfumery + - Pet Store corresponds with shop=pet + - Pet Grooming Store corresponds with shop=pet_grooming + - Photography Store corresponds with shop=photo + - Pottery Store corresponds with shop=pottery + - Printer Ink Store corresponds with shop=printer_ink + - Psychic corresponds with shop=psychic + - Fireworks Store corresponds with shop=pyrotechnics + - Radio/Electronic Component Store corresponds with shop=radiotechnics + - Religious Store corresponds with shop=religion + - Rental Shop corresponds with shop=rental + - Repair Shop corresponds with shop=repair + - Scuba Diving Shop corresponds with shop=scuba_diving + - Seafood Shop corresponds with shop=seafood + - Consignment/Thrift Store corresponds with shop=second_hand + - Sewing Supply Shop corresponds with shop=sewing + - Shoe Repair Shop corresponds with shop=shoe_repair + - Shoe Store corresponds with shop=shoes + - Spice Shop corresponds with shop=spices + - Sporting Goods Store corresponds with shop=sports + - Stationery Store corresponds with shop=stationery + - Storage Rental corresponds with shop=storage_rental + - Supermarket corresponds with shop=supermarket + - Pool Supply Store corresponds with shop=swimming_pool + - Tailor corresponds with shop=tailor + - Tattoo Parlor corresponds with shop=tattoo + - Tea Store corresponds with shop=tea + - Telecom Retail Store corresponds with shop=telecommunication + - Ticket Seller corresponds with shop=ticket + - Tile Shop corresponds with shop=tiles + - Tobacco Shop corresponds with shop=tobacco + - Tool Rental corresponds with shop=tool_hire + - Toy Store corresponds with shop=toys + - Trade Shop corresponds with shop=trade + - Travel Agency corresponds with shop=travel_agency + - Trophy Shop corresponds with shop=trophy + - Tire Store corresponds with shop=tyres + - Vacuum Cleaner Store corresponds with shop=vacuum_cleaner + - Variety Store corresponds with shop=variety_store + - Video Store corresponds with shop=video + - Video Game Store corresponds with shop=video_games + - Watches Shop corresponds with shop=watches + - Drinking Water Shop corresponds with shop=water + - Watersport/Swim Shop corresponds with shop=water_sports + - Weapon Shop corresponds with shop=weapons + - Wholesale Store corresponds with shop=wholesale + - Wig Shop corresponds with shop=wigs + - Window Blind Store corresponds with shop=window_blind + - Wine Shop corresponds with shop=wine -### shops-phone +### opening_hours -The question is What is the phone number? +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

Opening hours

{opening_hours_table(opening_hours)} + + + + + +### 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 {website} + + + + + + - {contact:website} corresponds with contact:website~^..*$ + - 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 {email} + + + + + + - {contact:email} corresponds with contact:email~^..*$ + - This option cannot be chosen as answer + + + + +### 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) @@ -134,44 +337,8 @@ This is rendered with {phone} -### shops-website - - - -The question is What is the website of this shop? - -This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website) - -This is rendered with {website} - - - - - -### shops-email - - - -The question is What is the email address of this shop? - -This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email) - -This is rendered with {email} - - - - - -### shops-opening_hours - - - -The question is What are the opening hours of this shop? - -This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) - -This is rendered with {opening_hours_table(opening_hours)} - + - {contact:phone} corresponds with contact:phone~^..*$ + - This option cannot be chosen as answer diff --git a/Docs/Layers/transit_routes.md b/Docs/Layers/transit_routes.md new file mode 100644 index 000000000..f5cc1f06a --- /dev/null +++ b/Docs/Layers/transit_routes.md @@ -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: + + + + - type=route + - route=bus + + +[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 +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/from#values) [from](https://wiki.openstreetmap.org/wiki/Key:from) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/via#values) [via](https://wiki.openstreetmap.org/wiki/Key:via) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/to#values) [to](https://wiki.openstreetmap.org/wiki/Key:to) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/colour#values) [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [color](../SpecialInputElements.md#color) | +[](https://taginfo.openstreetmap.org/keys/network#values) [network](https://wiki.openstreetmap.org/wiki/Key:network) | [string](../SpecialInputElements.md#string) | +[](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) \ No newline at end of file diff --git a/Docs/Layers/transit_stops.md b/Docs/Layers/transit_stops.md new file mode 100644 index 000000000..562fd107b --- /dev/null +++ b/Docs/Layers/transit_stops.md @@ -0,0 +1,240 @@ + + + transit_stops +=============== + + + + + +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: + + + + - highway=bus_stop + + +[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 +----------- | ------ | ------------------------------------------ +[](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:name%3D) +[](https://taginfo.openstreetmap.org/keys/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) +[](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) +[](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) +[](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) +[](https://taginfo.openstreetmap.org/keys/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) +[](https://taginfo.openstreetmap.org/keys/lit#values) [lit](https://wiki.openstreetmap.org/wiki/Key:lit) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:lit%3Dno) +[](https://taginfo.openstreetmap.org/keys/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 {name} + + + + + + - This stop has no name corresponds with noname=yes + + + + +### 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 shelter=yes + - This stop does not have a shelter corresponds with shelter=no + - This stop has a shelter, that's separately mapped corresponds with shelter=separate + - This option cannot be chosen as answer + + + + +### bench + + + +The question is Does this stop have a bench? + + + + + + - This stop has a bench corresponds with bench=yes + - This stop does not have a bench corresponds with bench=no + - This stop has a bench, that's separately mapped corresponds with bench=separate + - This option cannot be chosen as answer + + + + +### bin + + + +The question is Does this stop have a bin? + + + + + + - This stop has a bin corresponds with bin=yes + - This stop does not have a bin corresponds with bin=no + - This stop has a bin, that's separately mapped corresponds with bin=separate + - 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 wheelchair=designated + - This place is easily reachable with a wheelchair corresponds with wheelchair=yes + - It is possible to reach this place in a wheelchair, but it is not easy corresponds with wheelchair=limited + - This place is not reachable with a wheelchair corresponds with wheelchair=no + + + + +### tactile_paving + + + +The question is Does this stop have tactile paving? + + + + + + - This stop has tactile paving corresponds with tactile_paving=yes + - This stop does not have tactile paving corresponds with tactile_paving=no + + + + +### lit + + + +The question is Is this stop lit? + + + + + + - This stop is lit corresponds with lit=yes + - This stop is not lit corresponds with lit=no + + + + +### departures_board + + + +This tagrendering has no question and is thus read-only + + + + + + - This stop has a departures board of unknown type corresponds with departures_board=yes + - This option cannot be chosen as answer + - This stop has a board showing realtime departure information corresponds with departures_board=realtime + - This stop has a board showing realtime departure information corresponds with passenger_information_display=yes + - This option cannot be chosen as answer + - This stop has a timetable showing regular departures corresponds with departures_board=timetable + - This stop has a timetable containing just the interval between departures corresponds with departures_board=interval + - This stop does not have a departures board corresponds with departures_board=no + + + + +### 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) \ No newline at end of file diff --git a/Docs/Making_Your_Own_Theme.md b/Docs/Making_Your_Own_Theme.md index b7c2e349c..80c27a7f4 100644 --- a/Docs/Making_Your_Own_Theme.md +++ b/Docs/Making_Your_Own_Theme.md @@ -322,7 +322,7 @@ Every field is documented in the source code itself - you can find them here: - [The top level `LayoutConfig`](https://github.com/pietervdvn/MapComplete/blob/master/Models/ThemeConfig/Json/LayoutConfigJson.ts) - [A layer object `LayerConfig`](https://github.com/pietervdvn/MapComplete/blob/master/Models/ThemeConfig/Json/LayerConfigJson.ts) -- [The `TagRendering`](https://github.com/pietervdvn/MapComplete/blob/master/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson.ts) +- [The `TagRendering`](https://github.com/pietervdvn/MapComplete/blob/master/Models/ThemeConfig/Json/TagRenderingConfigJson.ts) - At last, the exact semantics of tags are documented [here](Tags_format.md) A JSON schema file is available in `Docs/Schemas` - use `LayoutConfig.schema.json` to validate a theme file. diff --git a/Docs/TagInfo/mapcomplete_cycle_infra.json b/Docs/TagInfo/mapcomplete_cycle_infra.json index 89bccd1df..b68fd2ec2 100644 --- a/Docs/TagInfo/mapcomplete_cycle_infra.json +++ b/Docs/TagInfo/mapcomplete_cycle_infra.json @@ -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", diff --git a/Docs/TagInfo/mapcomplete_healthcare.json b/Docs/TagInfo/mapcomplete_healthcare.json new file mode 100644 index 000000000..5f7b5e2d1 --- /dev/null +++ b/Docs/TagInfo/mapcomplete_healthcare.json @@ -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 '{contact:phone}' (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 '{contact:email}' (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 '{contact:website}' (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 '{contact:phone}' (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 '{contact:email}' (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 '{contact:website}' (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 '{contact:phone}' (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 '{contact:email}' (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 '{contact:website}' (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" + } + ] +} \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_kerbs_and_crossings.json b/Docs/TagInfo/mapcomplete_kerbs_and_crossings.json new file mode 100644 index 000000000..cdc0aabad --- /dev/null +++ b/Docs/TagInfo/mapcomplete_kerbs_and_crossings.json @@ -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)
' (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)
' (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')" + } + ] +} \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_personal.json b/Docs/TagInfo/mapcomplete_personal.json index 17547df86..343700b4e 100644 --- a/Docs/TagInfo/mapcomplete_personal.json +++ b/Docs/TagInfo/mapcomplete_personal.json @@ -3903,6 +3903,41 @@ "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", "value": "secondary" }, + { + "key": "highway", + "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", + "value": "tertiary_link" + }, + { + "key": "highway", + "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", + "value": "primary_link" + }, + { + "key": "highway", + "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", + "value": "secondary_link" + }, + { + "key": "highway", + "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", + "value": "service" + }, + { + "key": "highway", + "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", + "value": "footway" + }, + { + "key": "highway", + "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", + "value": "pedestrian" + }, + { + "key": "highway", + "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", + "value": "living_street" + }, { "key": "highway", "description": "The MapComplete theme Personal theme has a layer Cycleways and roads showing features with this tag", @@ -5617,6 +5652,55 @@ "key": "wikipedia", "description": "The layer 'Information boards allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "barrier", + "description": "The MapComplete theme Personal theme 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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "value": "incorrect" + }, + { + "key": "kerb:height", + "description": "Layer 'Kerbs' shows and asks freeform values for key 'kerb:height' (in the MapComplete.osm.be theme 'Personal theme')" + }, { "key": "tourism", "description": "The MapComplete theme Personal theme has a layer Maps showing features with this tag", @@ -6650,27 +6734,43 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the MapComplete.osm.be theme 'Personal theme')" + "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 'Personal theme')", + "value": "agrarian" }, { "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 'Personal theme')", - "value": "convenience" + "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 'Personal theme')", + "value": "alcohol" }, { "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 'Personal theme')", - "value": "supermarket" + "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 'Personal theme')", + "value": "anime" }, { "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 'Personal theme')", - "value": "clothes" + "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 'Personal theme')", + "value": "antiques" }, { "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 'Personal theme')", - "value": "hairdresser" + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "value": "bag" }, { "key": "shop", @@ -6679,29 +6779,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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", "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 'Personal theme')", - "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 'Personal theme')", + "value": "caravan" }, { - "key": "phone", - "description": "Layer 'Shop' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Personal theme')" + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "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 'Personal theme')", + "value": "wine" + }, + { + "key": "opening_hours", + "description": "Layer 'Shop' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Personal theme')" }, { "key": "website", "description": "Layer 'Shop' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Personal theme')" }, + { + "key": "contact:website", + "description": "Layer 'Shop' shows contact:website~^..*$ with a fixed text, namely '{contact:website}' (in the MapComplete.osm.be theme 'Personal theme')" + }, { "key": "email", "description": "Layer 'Shop' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Personal theme')" }, { - "key": "opening_hours", - "description": "Layer 'Shop' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Personal theme')" + "key": "contact:email", + "description": "Layer 'Shop' shows contact:email~^..*$ with a fixed text, namely '{contact:email}' (in the MapComplete.osm.be theme 'Personal theme')" + }, + { + "key": "phone", + "description": "Layer 'Shop' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Personal theme')" + }, + { + "key": "contact:phone", + "description": "Layer 'Shop' shows contact:phone~^..*$ with a fixed text, namely '{contact:phone}' (in the MapComplete.osm.be theme 'Personal theme')" }, { "key": "payment:cash", diff --git a/Docs/TagInfo/mapcomplete_pets.json b/Docs/TagInfo/mapcomplete_pets.json index b64e71825..125b76155 100644 --- a/Docs/TagInfo/mapcomplete_pets.json +++ b/Docs/TagInfo/mapcomplete_pets.json @@ -478,27 +478,43 @@ }, { "key": "shop", - "description": "Layer 'Dog-friendly shops' shows and asks freeform values for key 'shop' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')" + "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=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=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=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=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=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=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=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=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 +523,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 '{contact:website}' (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 '{contact:email}' (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 '{contact:phone}' (in the MapComplete.osm.be theme 'Veterinarians, dog parks and other pet-amenities')" }, { "key": "payment:cash", diff --git a/Docs/TagInfo/mapcomplete_shops.json b/Docs/TagInfo/mapcomplete_shops.json index aa0fd7a71..8d07b36e3 100644 --- a/Docs/TagInfo/mapcomplete_shops.json +++ b/Docs/TagInfo/mapcomplete_shops.json @@ -36,27 +36,43 @@ }, { "key": "shop", - "description": "Layer 'Shop' shows and asks freeform values for key 'shop' (in the MapComplete.osm.be theme 'Open Shop Map')" + "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=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=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=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=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=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=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=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=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 +81,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 '{contact:website}' (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 '{contact:email}' (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 '{contact:phone}' (in the MapComplete.osm.be theme 'Open Shop Map')" }, { "key": "payment:cash", diff --git a/Docs/TagInfo/mapcomplete_transit.json b/Docs/TagInfo/mapcomplete_transit.json new file mode 100644 index 000000000..bfab04cb1 --- /dev/null +++ b/Docs/TagInfo/mapcomplete_transit.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/Logic/FeatureSource/Sources/StaticFeatureSource.ts b/Logic/FeatureSource/Sources/StaticFeatureSource.ts index fac0243a9..3a1b3baca 100644 --- a/Logic/FeatureSource/Sources/StaticFeatureSource.ts +++ b/Logic/FeatureSource/Sources/StaticFeatureSource.ts @@ -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, 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, diff --git a/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts b/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts index c7cdae0a4..330c0386f 100644 --- a/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts @@ -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 = > OsmToGeoJson.default(osmJson, // @ts-ignore { flatProperties: true diff --git a/Logic/Osm/Actions/ReplaceGeometryAction.ts b/Logic/Osm/Actions/ReplaceGeometryAction.ts index 0e0fa84e7..4e125f2a5 100644 --- a/Logic/Osm/Actions/ReplaceGeometryAction.ts +++ b/Logic/Osm/Actions/ReplaceGeometryAction.ts @@ -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 { 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", diff --git a/Logic/Osm/Overpass.ts b/Logic/Osm/Overpass.ts index 889d6bae2..d4a5621a0 100644 --- a/Logic/Osm/Overpass.ts +++ b/Logic/Osm/Overpass.ts @@ -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); diff --git a/Logic/SimpleMetaTagger.ts b/Logic/SimpleMetaTagger.ts index fa2501bd1..e1383afb7 100644 --- a/Logic/SimpleMetaTagger.ts +++ b/Logic/SimpleMetaTagger.ts @@ -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"}); + }, {tag_key: "opening_hours"}); // Recalculate! return oh.getState() ? "yes" : "no"; diff --git a/Logic/Tags/TagUtils.ts b/Logic/Tags/TagUtils.ts index 7086f7a14..0440ffd2a 100644 --- a/Logic/Tags/TagUtils.ts +++ b/Logic/Tags/TagUtils.ts @@ -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"] - * - * @param tagsFilters - * @constructor + * 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"] }) + * + * 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); } diff --git a/Logic/Web/IdbLocalStorage.ts b/Logic/Web/IdbLocalStorage.ts index 78930e011..f3d929866 100644 --- a/Logic/Web/IdbLocalStorage.ts +++ b/Logic/Web/IdbLocalStorage.ts @@ -7,8 +7,12 @@ import {Utils} from "../../Utils"; */ export class IdbLocalStorage { - + private static readonly _sourceCache: Record> = {} + public static Get(key: string, options?: { defaultValue?: T, whenLoaded?: (t: T | null) => void }): UIEventSource { + if(IdbLocalStorage._sourceCache[key] !== undefined){ + return IdbLocalStorage._sourceCache[key] + } const src = new UIEventSource(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; } diff --git a/Models/ThemeConfig/Conversion/Validation.ts b/Models/ThemeConfig/Conversion/Validation.ts index 36da25536..ea49777a9 100644 --- a/Models/ThemeConfig/Conversion/Validation.ts +++ b/Models/ThemeConfig/Conversion/Validation.ts @@ -75,8 +75,8 @@ export class DoesImageExist extends DesugaringStep { return {result: image}; } } - - if (this._knownImagePaths !== undefined && !this._knownImagePaths.has(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)) { diff --git a/Models/ThemeConfig/LayerConfig.ts b/Models/ThemeConfig/LayerConfig.ts index 635691fcd..4779f5ebc 100644 --- a/Models/ThemeConfig/LayerConfig.ts +++ b/Models/ThemeConfig/LayerConfig.ts @@ -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,10 +108,10 @@ 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) { throw context + "Use 'geoJson' instead of 'geoJsonSource'"; } @@ -118,7 +119,7 @@ export default class LayerConfig extends WithContextLoader { if (json.source["geojson"] !== undefined) { throw context + "Use 'geoJson' instead of 'geojson' (the J is a capital letter)"; } - + this.source = new SourceConfig( { @@ -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) { @@ -343,14 +344,14 @@ export default class LayerConfig extends WithContextLoader { } public GenerateDocumentation(usedInThemes: string[], layerIsNeededBy?: Map, dependencies: { - context?: string; - reason: string; - neededLayer: string; - }[] = [] - , addedByDefault = false, canBeIncluded = true): BaseUIElement { + context?: string; + reason: string; + neededLayer: string; + }[] = [] + , 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 +441,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( new And(neededTags).optimize())) + overpassLink = new Link("Execute on overpass", Overpass.AsOverpassTurboLink(new And(neededTags).optimize())) } catch (e) { console.error("Could not generate overpasslink for " + this.id) } diff --git a/Models/ThemeConfig/TagRenderingConfig.ts b/Models/ThemeConfig/TagRenderingConfig.ts index 619e28c2f..67141780b 100644 --- a/Models/ThemeConfig/TagRenderingConfig.ts +++ b/Models/ThemeConfig/TagRenderingConfig.ts @@ -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 diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts index 68d3c4944..2e15e95e2 100644 --- a/UI/Base/ScrollableFullScreen.ts +++ b/UI/Base/ScrollableFullScreen.ts @@ -28,7 +28,10 @@ export default class ScrollableFullScreen extends UIElement { constructor(title: ((options: { mode: string }) => BaseUIElement), content: ((options: { mode: string, resetScrollSignal: UIEventSource }) => BaseUIElement), hashToShow: string, - isShown: UIEventSource = new UIEventSource(false) + isShown: UIEventSource = new UIEventSource(false), + options?: { + setHash?: true | boolean + } ) { super(); this.hashToShow = hashToShow; @@ -53,16 +56,21 @@ export default class ScrollableFullScreen extends UIElement { const self = this; - Hash.hash.addCallback(h => { - if (h === undefined) { - isShown.setData(false) - } - }) + 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 - Hash.hash.setData(hashToShow) + if(setHash){ + Hash.hash.setData(hashToShow) + } self.Activate(); } else { // Some cleanup... diff --git a/UI/BigComponents/BackgroundMapSwitch.ts b/UI/BigComponents/BackgroundMapSwitch.ts index 68e3e77d9..b249f5abb 100644 --- a/UI/BigComponents/BackgroundMapSwitch.ts +++ b/UI/BigComponents/BackgroundMapSwitch.ts @@ -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, diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts index 5255f5a59..30af72531 100644 --- a/UI/BigComponents/LeftControls.ts +++ b/UI/BigComponents/LeftControls.ts @@ -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") diff --git a/UI/ImportFlow/ConflationChecker.ts b/UI/ImportFlow/ConflationChecker.ts index 250da0ea9..88c394bf8 100644 --- a/UI/ImportFlow/ConflationChecker.ts +++ b/UI/ImportFlow/ConflationChecker.ts @@ -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 @@ -36,20 +41,21 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea public readonly IsValid public readonly Value: Store<{ features: any[], theme: string }> - + constructor( 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(undefined); - - - function loadDataFromOverpass(){ + + + function loadDataFromOverpass() { // Load the data! const url = Constants.defaultOverpassUrls[1] const relationTracker = new RelationsTracker() @@ -66,42 +72,49 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea overpassStatus.setData({error}) }) } - - + + const fromLocalStorage = IdbLocalStorage.Get<[any, Date]>("importer-overpass-cache-" + layer.id, { - + 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) - if (timeDiff < 24 * 60 * 60) { - // Recently cached! - overpassStatus.setData("cached") - return; - } - cacheAge.setData(-1) + overpassStatus.setData("cached") } - 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; + } else { + loadDataFromOverpass() + } + }) - const geojson: Store = fromLocalStorage.map(d => { + const geojson: Store = fromLocalStorage.map(d => { if (d === undefined) { return undefined } return d[0] }) - + const background = new UIEventSource(AvailableBaseLayers.osmCarto) const location = new UIEventSource({lat: 0, lon: 0, zoom: 1}) const currentBounds = new UIEventSource(undefined) - const zoomLevel = ValidatedTextField.ForType("pnat").ConstructInputElement() + const zoomLevel = ValidatedTextField.ForType("pnat").ConstructInputElement({ + value: LocalStorageSource.GetParsed("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 +123,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 = 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 +153,16 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea ]) }) - - new ShowDataLayer({ - layerToShow: layer, + new ShowDataMultiLayer({ + //layerToShow: layer, + layers: new UIEventSource([{ + layerDef: layer, + isDisplayed: new UIEventSource(true), + appliedFilters: new UIEventSource>(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 +171,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 +187,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 = geojson.map(osmData => { if (osmData?.features === undefined) { return [] } @@ -172,32 +195,37 @@ 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( geojson.map(geojson => { @@ -218,34 +246,44 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea return t.cacheExpired } return new Combine([t.loadedDataAge.Subs({age: Utils.toHumanTime(age)}), - new SubtleButton(Svg.reload_svg().SetClass("h-8"), t.reloadTheCache) - .onClick(loadDataFromOverpass) - .SetClass("h-12") + new SubtleButton(Svg.reload_svg().SetClass("h-8"), t.reloadTheCache) + .onClick(loadDataFromOverpass) + .SetClass("h-12") ]) })), new Title(t.titleLive), - t.importCandidatesCount.Subs({count:toImport.features.length }), - new VariableUiElement(geojson.map(geojson => { - if(geojson?.features?.length === undefined || geojson?.features?.length === 0){ + t.importCandidatesCount.Subs({count: toImport.features.length}), + new VariableUiElement(geojson.map(geojson => { + if (geojson?.features?.length === undefined || geojson?.features?.length === 0) { return t.nothingLoaded.Subs(layer).SetClass("alert") - } - return new Combine([ + } + return new Combine([ t.osmLoaded.Subs({count: geojson.features.length, name: layer.name}), - - ]) - })), + + ]) + })), osmLiveData, - new VariableUiElement(osmLiveData.location.map(location => { - return t.zoomIn.Subs({needed:zoomLevel, current: location.zoom }) - } )), + new Combine([ + t.zoomLevelSelection, + zoomLevel, + new VariableUiElement(osmLiveData.location.map(location => { + return t.zoomIn.Subs({current: location.zoom}) + })), + ]).SetClass("flex"), new Title(t.titleNearby), new Combine([t.mapShowingNearbyIntro, nearbyCutoff]).SetClass("flex"), - new VariableUiElement(toImportWithNearby.features.map(feats => + 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 +308,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) } diff --git a/UI/ImportFlow/ImportUtils.ts b/UI/ImportFlow/ImportUtils.ts index 5ce200fff..850cbacfc 100644 --- a/UI/ImportFlow/ImportUtils.ts +++ b/UI/ImportFlow/ImportUtils.ts @@ -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): Store<{ hasNearby: any[], noNearby: any[] }> { + public static partitionFeaturesIfNearby( + toPartitionFeatureCollection: ({ features: Feature[] }), + compareWith: Store<{ features: Feature[] }>, + cutoffDistanceInMeters: Store) + : 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( toImportElement.geometry.coordinates, GeoOperations.centerpointCoordinates(f))) if (hasNearbyFeature) { hasNearby.push(toImportElement) } else { diff --git a/UI/ImportFlow/MapPreview.ts b/UI/ImportFlow/MapPreview.ts index f4e8d666e..cb1a1049f 100644 --- a/UI/ImportFlow/MapPreview.ts +++ b/UI/ImportFlow/MapPreview.ts @@ -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 ]); diff --git a/UI/Input/Checkboxes.ts b/UI/Input/Checkboxes.ts index 3b0e1da96..236e7b831 100644 --- a/UI/Input/Checkboxes.ts +++ b/UI/Input/Checkboxes.ts @@ -4,13 +4,13 @@ import {Utils} from "../../Utils"; import BaseUIElement from "../BaseUIElement"; import InputElementMap from "./InputElementMap"; -export class CheckBox extends InputElementMap { +export class CheckBox extends InputElementMap { constructor(el: BaseUIElement , defaultValue?: boolean) { super( new CheckBoxes([el]), (x0, x1) => x0 === x1, t => t.length > 0, - x => x ? [0] : [] + x => x ? [0] : [], ); if(defaultValue !== undefined){ this.GetValue().setData(defaultValue) diff --git a/UI/Input/InputElementMap.ts b/UI/Input/InputElementMap.ts index 3cb1a60cc..0f0d74d0c 100644 --- a/UI/Input/InputElementMap.ts +++ b/UI/Input/InputElementMap.ts @@ -1,5 +1,5 @@ import {InputElement} from "./InputElement"; -import {UIEventSource} from "../../Logic/UIEventSource"; +import {Store, UIEventSource} from "../../Logic/UIEventSource"; export default class InputElementMap extends InputElement { @@ -13,7 +13,7 @@ export default class InputElementMap extends InputElement { isSame: (x0: X, x1: X) => boolean, toX: (t: T) => X, fromX: (x: X) => T, - extraSources: UIEventSource[] = [] + extraSources: Store[] = [] ) { super(); this.isSame = isSame; diff --git a/UI/Input/SearchableMappingsSelector.ts b/UI/Input/SearchableMappingsSelector.ts new file mode 100644 index 000000000..191230ece --- /dev/null +++ b/UI/Input/SearchableMappingsSelector.ts @@ -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 { + private readonly _shown: BaseUIElement; + public readonly _selected: UIEventSource + public readonly isShown: Store = new UIEventSource(true); + public readonly forceSelected: UIEventSource + private readonly _squared: boolean; + public constructor( + shown: string | BaseUIElement, + mainTerm: Record, + search: Store, + options?: { + searchTerms?: Record, + selected?: UIEventSource, + forceSelected?: UIEventSource, + squared?: boolean + } + ) { + super(); + this._shown = Translations.W(shown); + this._squared = options?.squared ?? false; + const searchTerms: Record = {}; + 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(false); + const forceSelected = this.forceSelected = options?.forceSelected ?? new UIEventSource(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 { + 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 extends Combine implements InputElement { + private selectedElements: UIEventSource; + + public readonly someMatchFound: Store; + + constructor( + values: { show: BaseUIElement, value: T, mainTerm: Record, searchTerms?: Record }[], + options?: { + mode?: "select-one" | "select-many", + selectedElements?: UIEventSource, + searchValue?: UIEventSource, + 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([]); + const mode = options?.mode ?? "select-one"; + const onEmpty = options?.onNoMatches ?? Translations.t.general.noMatchingMapping + + const mappedValues: { show: SelfHidingToggle, mainTerm: Record, 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 + 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 { + return this.selectedElements; + } + + IsValid(t: T[]): boolean { + return true; + } + + +} + diff --git a/UI/OpeningHours/OpeningHours.ts b/UI/OpeningHours/OpeningHours.ts index a37e831d8..57e4683e6 100644 --- a/UI/OpeningHours/OpeningHours.ts +++ b/UI/OpeningHours/OpeningHours.ts @@ -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"}); + }, {tag_key: "opening_hours"}); } /* diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts index 52fa5c664..a277a7d7f 100644 --- a/UI/Popup/FeatureInfoBox.ts +++ b/UI/Popup/FeatureInfoBox.ts @@ -25,16 +25,20 @@ export default class FeatureInfoBox extends ScrollableFullScreen { tags: UIEventSource, layerConfig: LayerConfig, state: FeaturePipelineState, - hashToShow?: string, - isShown?: UIEventSource, + options?: { + hashToShow?: string, + isShown?: UIEventSource, + 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") diff --git a/UI/Popup/TagRenderingQuestion.ts b/UI/Popup/TagRenderingQuestion.ts index 9278a86c7..ed00ceb82 100644 --- a/UI/Popup/TagRenderingQuestion.ts +++ b/UI/Popup/TagRenderingQuestion.ts @@ -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, + constructor(tags: UIEventSource & {id: string}>, configuration: TagRenderingConfig, state?: FeaturePipelineState, options?: { @@ -81,13 +82,13 @@ export default class TagRenderingQuestion extends Combine { const feedback = new UIEventSource(undefined) const inputElement: ReadonlyInputElement = - new VariableInputElement(applicableMappingsSrc.map(applicableMappings => { - return TagRenderingQuestion.GenerateInputElement(state, configuration, applicableMappings, applicableUnit, tags, feedback) + new VariableInputElement(applicableMappingsSrc.map(applicableMappings => { + return TagRenderingQuestion.GenerateInputElement(state, configuration, applicableMappings, applicableUnit, tags, feedback) } )) - + 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, icon?: string, ifnot?: TagsFilter, addExtraTags: Tag[] }[], + applicableMappings: { if: TagsFilter, then: TypedTranslation, icon?: string, ifnot?: TagsFilter, addExtraTags: Tag[], searchTerms?: Record }[], applicableUnit: Unit, tagsSource: UIEventSource, feedback: UIEventSource ): ReadonlyInputElement { - // 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[]; 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; icon?: string; iconClass?: string, addExtraTags: Tag[], searchTerms?: Record }[], tagsSource: UIEventSource): InputElement { + const values: { show: BaseUIElement, value: number, mainTerm: Record, searchTerms?: Record }[] = [] + 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 }>{ + ...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 = new UIEventSource(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(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(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 { 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, 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, feedback: UIEventSource) @@ -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 = ValidatedTextField.ForType(configuration.freeform.type)?.ConstructInputElement({ country: () => tagsData._country, location: [center[1], center[0]], @@ -423,13 +527,13 @@ export default class TagRenderingQuestion extends Combine { placeholder: configuration.freeform.placeholder, feedback }); - + // Init with correct value 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})) } }) @@ -448,10 +552,10 @@ export default class TagRenderingQuestion extends Combine { return inputTagsFilter; } - + public static CreateTagExplanation(selectedValue: Store, tags: Store, - state?: {osmConnection?: OsmConnection}){ + state?: { osmConnection?: OsmConnection }) { return new VariableUiElement( selectedValue.map( (tagsFilter: TagsFilter) => { diff --git a/UI/ShowDataLayer/ShowDataLayerImplementation.ts b/UI/ShowDataLayer/ShowDataLayerImplementation.ts index 4a2df70d8..34e45646e 100644 --- a/UI/ShowDataLayer/ShowDataLayerImplementation.ts +++ b/UI/ShowDataLayer/ShowDataLayerImplementation.ts @@ -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; + private readonly _leafletMap: Store; private readonly _enablePopups: boolean; private readonly _features: RenderingMultiPlexerFeatureSource private readonly _layerToShow: LayerConfig; diff --git a/UI/ShowDataLayer/ShowDataLayerOptions.ts b/UI/ShowDataLayer/ShowDataLayerOptions.ts index cd0dfd7f4..036faaf43 100644 --- a/UI/ShowDataLayer/ShowDataLayerOptions.ts +++ b/UI/ShowDataLayer/ShowDataLayerOptions.ts @@ -7,7 +7,7 @@ import ScrollableFullScreen from "../Base/ScrollableFullScreen"; export interface ShowDataLayerOptions { features: FeatureSource, selectedElement?: UIEventSource, - leafletMap: UIEventSource, + leafletMap: Store, popup?: undefined | ((tags: UIEventSource, layer: LayerConfig) => ScrollableFullScreen), zoomToFeatures?: false | boolean, doShowLayer?: Store, diff --git a/UI/ShowDataLayer/ShowDataMultiLayer.ts b/UI/ShowDataLayer/ShowDataMultiLayer.ts index 374539b60..4e20d1020 100644 --- a/UI/ShowDataLayer/ShowDataMultiLayer.ts +++ b/UI/ShowDataLayer/ShowDataMultiLayer.ts @@ -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 }) { + constructor(options: ShowDataLayerOptions & { layers: Store }) { new PerLayerFeatureSourceSplitter(options.layers, (perLayer => { const newOptions = { diff --git a/UI/SubstitutedTranslation.ts b/UI/SubstitutedTranslation.ts index 4a9b37dc3..a2ec63764 100644 --- a/UI/SubstitutedTranslation.ts +++ b/UI/SubstitutedTranslation.ts @@ -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; diff --git a/Utils.ts b/Utils.ts index 68a485c80..0da5a205e 100644 --- a/Utils.ts +++ b/Utils.ts @@ -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) { diff --git a/assets/contributors.json b/assets/contributors.json index 30b90b91e..d64759d47 100644 --- a/assets/contributors.json +++ b/assets/contributors.json @@ -1,11 +1,11 @@ { "contributors": [ { - "commits": 4040, + "commits": 4054, "contributor": "Pieter Vander Vennet" }, { - "commits": 86, + "commits": 103, "contributor": "Robin van der Linde" }, { @@ -188,6 +188,10 @@ "commits": 2, "contributor": "Stanislas Gueniffey" }, + { + "commits": 1, + "contributor": "loviuz" + }, { "commits": 1, "contributor": "kjonosm" diff --git a/assets/layers/artwork/artwork.json b/assets/layers/artwork/artwork.json index c8112879f..b4ae9380b 100644 --- a/assets/layers/artwork/artwork.json +++ b/assets/layers/artwork/artwork.json @@ -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": [ diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json index 25fe94364..38ad7f365 100644 --- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json +++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json @@ -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}" } }, { diff --git a/assets/layers/doctors/dentist.svg b/assets/layers/doctors/dentist.svg new file mode 100644 index 000000000..7c9728084 --- /dev/null +++ b/assets/layers/doctors/dentist.svg @@ -0,0 +1,20 @@ + + + + + + + diff --git a/assets/layers/doctors/doctors.json b/assets/layers/doctors/doctors.json index 2c34b4538..1d883134c 100644 --- a/assets/layers/doctors/doctors.json +++ b/assets/layers/doctors/doctors.json @@ -1,76 +1,138 @@ { - "id": "doctors", - "name": { - "en": "doctors" + "id": "doctors", + "name": { + "en": "doctors" + }, + "source": { + "osmTags": { + "or": [ + "amenity=doctors", + "amenity=dentist", + "healthcare=physiotherapist" + ] + } + }, + "title": { + "render": { + "en": "Doctors Office {name}" }, - "title": { - "render": { - "en": "Doctors Office {name}" - } - }, - "source": { - "osmTags": { - "and": [ - "amenity=doctors" - ] - } - }, - "minzoom": 13, - "tagRenderings": [ - "images", - "opening_hours", - "phone", - "email", - "website", - { - "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" - } - } - ] - } - ], - "mapRendering": [ - { - "icon": { - "render": "pin:#6BC4F7;./assets/layers/doctors/doctors.svg" - }, - "iconSize": "40,40,bottom", - "location": [ - "point", - "centroid" - ] - } + "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", + { + "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", + "mappings": [ + { + "if": "amenity=dentist", + "then": "circle:white;./assets/layers/doctors/dentist.svg" + } + ] + }, + "iconSize": "40,40,center", + "location": [ + "point", + "centroid" + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/doctors/license_info.json b/assets/layers/doctors/license_info.json index 90889fdc6..e47e39881 100644 --- a/assets/layers/doctors/license_info.json +++ b/assets/layers/doctors/license_info.json @@ -1,4 +1,14 @@ [ + { + "path": "dentist.svg", + "license": "cc0", + "authors": [ + "osmcarto" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Dentist-14.svg" + ] + }, { "path": "doctors.svg", "license": "cc0", diff --git a/assets/layers/food/food.json b/assets/layers/food/food.json index ef7cfa9bd..7289dfe15 100644 --- a/assets/layers/food/food.json +++ b/assets/layers/food/food.json @@ -814,10 +814,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": { diff --git a/assets/layers/hospital/hospital.json b/assets/layers/hospital/hospital.json new file mode 100644 index 000000000..b773e9992 --- /dev/null +++ b/assets/layers/hospital/hospital.json @@ -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" + ] + } + ] +} \ No newline at end of file diff --git a/assets/layers/hospital/hospital.svg b/assets/layers/hospital/hospital.svg new file mode 100644 index 000000000..5ef1a4b63 --- /dev/null +++ b/assets/layers/hospital/hospital.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/assets/layers/hospital/license_info.json b/assets/layers/hospital/license_info.json new file mode 100644 index 000000000..8a37d59ec --- /dev/null +++ b/assets/layers/hospital/license_info.json @@ -0,0 +1,12 @@ +[ + { + "path": "hospital.svg", + "license": "CC-0", + "authors": [ + "osmcarto" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Hospital-14.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/id_presets/id_presets.json b/assets/layers/id_presets/id_presets.json index 9d170b584..1c30d295e 100644 --- a/assets/layers/id_presets/id_presets.json +++ b/assets/layers/id_presets/id_presets.json @@ -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.", "#dont-translate": "*", "source": { - "osmTags": { - "and": [] - } + "osmTags": "id~*" }, "mapRendering": null, "tagRenderings": [ diff --git a/assets/layers/kerbs/kerbs.json b/assets/layers/kerbs/kerbs.json index a9f20f6de..af185c4d4 100644 --- a/assets/layers/kerbs/kerbs.json +++ b/assets/layers/kerbs/kerbs.json @@ -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}}" + "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" } } ], diff --git a/assets/layers/maxspeed/maxspeed.json b/assets/layers/maxspeed/maxspeed.json index fe5caaec6..dbf5d65f9 100644 --- a/assets/layers/maxspeed/maxspeed.json +++ b/assets/layers/maxspeed/maxspeed.json @@ -68,6 +68,19 @@ "type": "pnat" }, "mappings": [ + { + "if": { + "and":["highway=living_street","_country!=be"] + }, + "then": { + "en": "This is a living street" + }, + "icon": { + "path": "./assets/layers/maxspeed/living_street_be.svg", + "class": "large" + }, + "hideInAnswer": true + }, { "if": "highway=living_street", "then": { diff --git a/assets/layers/pharmacy/license_info.json b/assets/layers/pharmacy/license_info.json new file mode 100644 index 000000000..ec982334c --- /dev/null +++ b/assets/layers/pharmacy/license_info.json @@ -0,0 +1,12 @@ +[ + { + "path": "pharmacy.svg", + "license": "CC0", + "authors": [ + "OSM-carto" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Pharmacy-14.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/pharmacy/pharmacy.json b/assets/layers/pharmacy/pharmacy.json new file mode 100644 index 000000000..2d982829a --- /dev/null +++ b/assets/layers/pharmacy/pharmacy.json @@ -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" + ] + } + ] +} \ No newline at end of file diff --git a/assets/layers/pharmacy/pharmacy.svg b/assets/layers/pharmacy/pharmacy.svg new file mode 100644 index 000000000..fe46542ad --- /dev/null +++ b/assets/layers/pharmacy/pharmacy.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/layers/recycling/recycling.json b/assets/layers/recycling/recycling.json index 7d41eb387..8629eed98 100644 --- a/assets/layers/recycling/recycling.json +++ b/assets/layers/recycling/recycling.json @@ -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 {name}", "de": "Dieser Wertstoffhof heißt {name}", "es": "Este centro de reciclaje se llama {name}", - "it": "Questo centro raccolta e riciclo rifiuti si chiama {name}" + "it": "Questo centro raccolta e riciclo rifiuti si chiama {name}", + "ca": "Aquest centre de reciclatge s'anomena {name}" }, "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?", diff --git a/assets/layers/school/school.json b/assets/layers/school/school.json index 257431656..ae5cf3809 100644 --- a/assets/layers/school/school.json +++ b/assets/layers/school/school.json @@ -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}" } }, { diff --git a/assets/layers/shops/shops.json b/assets/layers/shops/shops.json index d72121c86..dd8538c8f 100644 --- a/assets/layers/shops/shops.json +++ b/assets/layers/shops/shops.json @@ -105,6 +105,13 @@ "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 +120,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" ], diff --git a/assets/layers/sport_pitch/equestrian.svg b/assets/layers/sport_pitch/equestrian.svg new file mode 100644 index 000000000..2f6efdee0 --- /dev/null +++ b/assets/layers/sport_pitch/equestrian.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/layers/sport_pitch/license_info.json b/assets/layers/sport_pitch/license_info.json index 17c0c3c83..a8bdf0d2d 100644 --- a/assets/layers/sport_pitch/license_info.json +++ b/assets/layers/sport_pitch/license_info.json @@ -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", diff --git a/assets/layers/sport_pitch/sport_pitch.json b/assets/layers/sport_pitch/sport_pitch.json index c41991b8c..5ed7edc72 100644 --- a/assets/layers/sport_pitch/sport_pitch.json +++ b/assets/layers/sport_pitch/sport_pitch.json @@ -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" diff --git a/assets/themes/artwork/artwork.json b/assets/themes/artwork/artwork.json index 62a5ceb4c..62576821c 100644 --- a/assets/themes/artwork/artwork.json +++ b/assets/themes/artwork/artwork.json @@ -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" }, diff --git a/assets/themes/bicycle_rental/bicycle_rental.json b/assets/themes/bicycle_rental/bicycle_rental.json index f24ff9306..9c01107a0 100644 --- a/assets/themes/bicycle_rental/bicycle_rental.json +++ b/assets/themes/bicycle_rental/bicycle_rental.json @@ -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", diff --git a/assets/themes/binoculars/binoculars.json b/assets/themes/binoculars/binoculars.json index 95e17aab7..e0959f23e 100644 --- a/assets/themes/binoculars/binoculars.json +++ b/assets/themes/binoculars/binoculars.json @@ -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", diff --git a/assets/themes/bookcases/bookcases.json b/assets/themes/bookcases/bookcases.json index 19f0636ba..479338017 100644 --- a/assets/themes/bookcases/bookcases.json +++ b/assets/themes/bookcases/bookcases.json @@ -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, diff --git a/assets/themes/campersite/campersite.json b/assets/themes/campersite/campersite.json index dbd7934d1..1b3baa8e9 100644 --- a/assets/themes/campersite/campersite.json +++ b/assets/themes/campersite/campersite.json @@ -37,7 +37,8 @@ "fr": "Ce site collecte les zones de camping officielles ainsi que les aires de vidange. Il est possible d’ajouter des détails à propos des services proposés ainsi que leurs coûts. Ajoutez vos images et avis. C’est un site et une application. Les données sont stockées sur OpenStreetMap, elles seront toujours gratuites et peuvent être réutilisées par n’importe quelle application.", "de": "Eine Karte für offizielle Wohnmobilstellplätze und Orte zur Entsorgung von Schmutzwasser. Sie können Details über die angebotenen Dienstleistungen und die Kosten hinzufügen, oder Bilder und Bewertungen ergänzen. Dies ist eine Webseite und eine Webapp. Die Daten werden in OpenStreetMap gespeichert, so dass sie für immer kostenlos sind und von jeder App weiterverwendet werden können.", "hu": "Ez az oldal az összes olyan hivatalos lakóautós megállóhelyet és helyet gyűjti össze, ahol szürke és fekete szennyvizet lehet üríteni. Hozzáadhat részleteket a nyújtott szolgáltatásokról és a költségekről, valamint képeket és értékeléseket. Ez egyszerre egy weboldal és egy webes alkalmazás. Az adatokat az OpenStreetMapen tároljuk, így mindig ingyenesek lesznek, és bármelyik alkalmazás újra felhasználhatja őket.", - "es": "Este sitio recoge todos los lugares oficiales de parada de caravanas y los lugares donde se pueden verter las aguas grises y negras. Puedes añadir detalles sobre los servicios prestados y el coste. Añade fotos y reseñas. Este es un sitio web y una aplicación web. Los datos se almacenan en OpenStreetMap, por lo que serán gratuitos para siempre y podrán ser reutilizados por cualquier aplicación." + "es": "Este sitio recoge todos los lugares oficiales de parada de caravanas y los lugares donde se pueden verter las aguas grises y negras. Puedes añadir detalles sobre los servicios prestados y el coste. Añade fotos y reseñas. Este es un sitio web y una aplicación web. Los datos se almacenan en OpenStreetMap, por lo que serán gratuitos para siempre y podrán ser reutilizados por cualquier aplicación.", + "ca": "Aquest lloc recull tots els llocs oficials de parada de caravanes i els llocs on es poden abocar les aigües grises i negres. Pots afegir detalls sobre els serveis prestats i el cost. Afig fotos i ressenyes. Aquest és un lloc web i una aplicació web. Les dades s'emmagatzemen en OpenStreetMap, per la qual cosa seran gratuïts per sempre i podran ser reutilitzats per qualsevol aplicació." }, "maintainer": "joost schouppe", "icon": "./assets/themes/campersite/caravan.svg", @@ -175,7 +176,8 @@ "pt_BR": "Este lugar cobra alguma taxa?", "de": "Wird hier eine Gebühr erhoben?", "es": "¿Este lugar cobra una tarifa?", - "nb_NO": "Tar dette stedet en avgift?" + "nb_NO": "Tar dette stedet en avgift?", + "ca": "Aquest lloc cobra una taxa?" }, "mappings": [ { @@ -197,7 +199,8 @@ "id": "Anda perlu membayar untuk menggunakannya", "es": "Necesitas pagar por su uso", "da": "Du skal betale for brug", - "nb_NO": "Man må betale for bruk" + "nb_NO": "Man må betale for bruk", + "ca": "Heu de pagar per l'ús" } }, { @@ -220,7 +223,8 @@ "pt_BR": "Pode ser usado de graça", "de": "Nutzung kostenlos", "es": "Se puede usar de manera gratuita", - "da": "Kan bruges gratis" + "da": "Kan bruges gratis", + "ca": "Es pot utilitzar gratuïtament" }, "addExtraTags": [ "charge=" @@ -241,7 +245,8 @@ "pt_BR": "Este lugar cobra {charge}", "de": "Die Gebühr beträgt {charge}", "es": "Este lugar cobra {charge}", - "da": "Dette sted koster {charge}" + "da": "Dette sted koster {charge}", + "ca": "Aquest lloc cobra {charge}" }, "question": { "en": "How much does this place charge?", @@ -255,7 +260,8 @@ "pt_BR": "Quanto este lugar cobra?", "de": "Wie hoch sind die Gebühren hier?", "es": "¿Cuánto cobra este lugar?", - "da": "Hvor meget koster dette sted?" + "da": "Hvor meget koster dette sted?", + "ca": "Quant cobra aquest lloc?" }, "freeform": { "key": "charge" @@ -337,7 +343,8 @@ "de": "{capacity} Wohnmobile können diesen Platz gleichzeitig nutzen", "nl": "{capacity} campers kunnen deze plaats tegelijk gebruiken", "es": "{capacity} los campistas pueden utilizar este lugar al mismo tiempo", - "da": "{capacity} campister kan bruge dette sted på samme tid" + "da": "{capacity} campister kan bruge dette sted på samme tid", + "ca": "{capacity} els acampadors poden utilitzar aquest lloc al mateix temps" }, "question": { "en": "How many campers can stay here? (skip if there is no obvious number of spaces or allowed vehicles)", @@ -350,7 +357,8 @@ "de": "Wie viele Wohnmobile können hier parken? (Überspringen, wenn es keine offensichtliche Anzahl von Stellplätzen oder erlaubten Fahrzeugen gibt)", "nl": "Hoeveel campers kunnen hier overnachten? (sla dit over als er geen duidelijk aantal plaatsen of aangeduid maximum is)", "es": "¿Cuántos campistas pueden alojarse aquí? (omitir si no hay un número evidente de plazas o vehículos permitidos)", - "da": "Hvor mange campister kan bo her? (spring over, hvis der ikke er noget åbenlyst antal pladser eller tilladte køretøjer)" + "da": "Hvor mange campister kan bo her? (spring over, hvis der ikke er noget åbenlyst antal pladser eller tilladte køretøjer)", + "ca": "Quants acampadors poden allotjar-se ací? (ometre si no hi ha un nombre evident de places o vehicles permesos)" }, "freeform": { "key": "capacity", @@ -373,7 +381,8 @@ "nl": "Biedt deze plaats internettoegang?", "es": "¿Este lugar tiene acceso a internet?", "da": "Er der internetadgang på dette sted?", - "nb_NO": "Tilbyr stedet tilgang til Internett?" + "nb_NO": "Tilbyr stedet tilgang til Internett?", + "ca": "Aquest lloc proporciona accés a Internet?" }, "mappings": [ { @@ -419,7 +428,8 @@ "nl": "Er is internettoegang", "es": "Hay acceso a internet", "da": "Der er internetadgang", - "nb_NO": "Det finnes tilgang til Internett" + "nb_NO": "Det finnes tilgang til Internett", + "ca": "Hi ha accés a Internet" }, "hideInAnswer": true }, @@ -442,7 +452,8 @@ "nl": "Er is geen internettoegang", "es": "No hay acceso a internet", "da": "Der er ingen internetadgang", - "nb_NO": "Det finnes ingen tilgang til Internett" + "nb_NO": "Det finnes ingen tilgang til Internett", + "ca": "No hi ha accés a Internet" } } ] @@ -461,7 +472,8 @@ "nl": "Moet je betalen voor internettoegang?", "es": "¿Tienes que pagar por el acceso a internet?", "da": "Skal man betale for internetadgang?", - "nb_NO": "Må man betale for tilgang til Internett?" + "nb_NO": "Må man betale for tilgang til Internett?", + "ca": "Has de pagar per l'accés a Internet?" }, "mappings": [ { @@ -482,7 +494,8 @@ "nl": "Je moet extra betalen voor internettoegang", "es": "Tienes que pagar a mayores por el acceso a internet", "da": "Man skal betale ekstra for internetadgang", - "nb_NO": "Tilgang til Internett koster ekstra" + "nb_NO": "Tilgang til Internett koster ekstra", + "ca": "Heu de pagar un extra per accedir a Internet" } }, { @@ -503,7 +516,8 @@ "nl": "Je hoeft niet extra te betalen voor internettoegang", "es": "No tienes que pagar a mayores por el acceso a internet", "da": "Man behøver ikke at betale ekstra for internetadgang", - "nb_NO": "Man må ikke betale ekstra for tilgang til Internett" + "nb_NO": "Man må ikke betale ekstra for tilgang til Internett", + "ca": "No cal pagar extra per l'accés a Internet" } } ], @@ -648,7 +662,8 @@ "de": "Es gibt einige Plätze für Langzeitmieten, aber auch eine tageweise Anmietung ist möglich", "es": "Sí, hay algunas plazas de alquiler a largo plazo, pero también puedes alojarte por días", "nl": "Er zijn enkele plaatsen om op lange termijn te huren, maar je kan ook enkele dagen blijven", - "nb_NO": "Det finnes noen plasser for langtidsleie, men man kan også bruke dem på dagsbasis" + "nb_NO": "Det finnes noen plasser for langtidsleie, men man kan også bruke dem på dagsbasis", + "ca": "Hi ha alguns punts per al lloguer a llarg termini, però també es pot romandre diàriament" } }, { @@ -669,7 +684,8 @@ "es": "No, no hay huéspedes permanentes aquí", "da": "Nej, der er ingen faste gæster her", "nl": "Hier wonen geen permanente gasten", - "nb_NO": "Det er ingen permanente gjester her" + "nb_NO": "Det er ingen permanente gjester her", + "ca": "No hi han hostes permanents aquí" } }, { @@ -706,7 +722,8 @@ "de": "Mehr Details über diesen Ort: {description}", "nl": "Meer details over deze plaats: {description}", "es": "Más detalles sobre este lugar:{description}", - "da": "Flere oplysninger om dette sted: {description}" + "da": "Flere oplysninger om dette sted: {description}", + "ca": "Més detalls sobre aquest lloc: {description}" }, "question": { "en": "Would you like to add a general description of this place? (Do not repeat information previously asked or shown above. Please keep it objective - opinions go into the reviews)", @@ -717,7 +734,8 @@ "fr": "Souhaitez-vous ajouter une description générale du lieu ? (Ne pas répéter les informations précédentes et rester neutre, les opinions vont dans les avis)", "de": "Möchten Sie eine allgemeine Beschreibung für diesen Ort hinzufügen? (Bitte wiederholen Sie keine Informationen, die Sie bereits zuvor angegeben haben. Bitte bleiben Sie objektiv - Meinungen gehen in die Bewertungen ein)", "nl": "Wil je graag een algemene beschrijving toevoegen van deze plaats? (Herhaal hier niet de antwoorden op de vragen die reeds gesteld zijn. Hou het objectief - je kan je mening geven via een review)", - "es": "¿Te gustaría añadir una descripción general de este lugar? (No repitas información previamente preguntada o mostrada arriba. Por favor mantenla objetiva - las opiniones van en la de opiniones)" + "es": "¿Te gustaría añadir una descripción general de este lugar? (No repitas información previamente preguntada o mostrada arriba. Por favor mantenla objetiva - las opiniones van en la de opiniones)", + "ca": "T'agradaria afegir una descripció general d'aquest lloc? (No repeteixis informació prèviament preguntada o mostrada a dalt. Si us plau mantín-la objectiva - les opinions van en les «reviews»)" }, "freeform": { "key": "description", @@ -758,7 +776,8 @@ "nl": "Voeg een nieuwe officiële camperplaats toe. Dit zijn speciaal aangeduide plaatsen waar het toegestaan is om te overnachten met een camper. Ze kunnen er uitzien als een parking, of soms eerder als een camping. Soms staan ze niet ter plaatse aangeduid, maar heeft de gemeente wel degelijk beslist dat dit een camperplaats is. Een parking voor campers waar je niet mag overnachten is géén camperplaats. ", "zh_Hant": "新增正式露營地點,通常是設計給過夜的露營者的地點。看起來像是真的露營地或是一般的停車場,而且也許沒有任何指標,但在城鎮被定議地點。如果一般給露營者的停車場並不是用來過夜,則不是露營地點 ", "hu": "Új hivatalos lakóautóhely hozzáadása. Ez arra vannak kijelölve, hogy lakóautóval ott éjszakázzunk. Lehet, hogy úgy néz ki, mint egy igazi kemping, de az is lehet, hogy csak olyan, mint egy parkoló. Előfordulhat, hogy egyáltalán nem jelzik őket, hanem csak egy önkormányzati határozatban vannak kijelölve. A lakóautósoknak szánt olyan hagyományos parkolók, ahol nem várhatóan nem fognak éjszakázni, -nem minősül- lakóautóhelynek. ", - "es": "Añade un nuevo sitio de acampada oficial. Son lugares designados para pasar la noche con tu caravana. Pueden parecerse a un camping real o simplemente a un aparcamiento. Puede que no estén señalizados en absoluto, sino que simplemente estén definidos en una decisión municipal. Un aparcamiento normal destinado a los campistas en el que no se espera que se pase la noche, no es un camping. " + "es": "Añade un nuevo sitio de acampada oficial. Son lugares designados para pasar la noche con tu caravana. Pueden parecerse a un camping real o simplemente a un aparcamiento. Puede que no estén señalizados en absoluto, sino que simplemente estén definidos en una decisión municipal. Un aparcamiento normal destinado a los campistas en el que no se espera que se pase la noche, no es un camping. ", + "ca": "Afig un nou lloc d'acampada oficial. Són llocs designats per a passar la nit amb la teua caravana. Poden semblar-se a un càmping real o simplement a un aparcament. Pot ser que no estiguen senyalitzats en absolut, sinó que simplement estiguen definits per una decisió municipal. Un aparcament normal destinat als acampadors en el qual no s'espera que es passe la nit, no és un càmping. " } } ], diff --git a/assets/themes/cycle_infra/cycle-infra.svg b/assets/themes/cycle_infra/cycle-infra.svg index abd6dea01..ebec25137 100644 --- a/assets/themes/cycle_infra/cycle-infra.svg +++ b/assets/themes/cycle_infra/cycle-infra.svg @@ -1,376 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - \ No newline at end of file + diff --git a/assets/themes/cyclofix/cyclofix.json b/assets/themes/cyclofix/cyclofix.json index 48a2c58bb..3222af44e 100644 --- a/assets/themes/cyclofix/cyclofix.json +++ b/assets/themes/cyclofix/cyclofix.json @@ -12,7 +12,8 @@ "it": "Cyclofix - una mappa libera per chi va in bici", "nb_NO": "Cyclofix — et åpent kart for syklister", "hu": "Cyclofix – nyílt térkép kerékpárosoknak", - "es": "Cyclofix - un mapa abierto para ciclistas" + "es": "Cyclofix - un mapa abierto para ciclistas", + "ca": "Cyclofix - un mapa obert per a ciclistes" }, "description": { "en": "The goal of this map is to present cyclists with an easy-to-use solution to find the appropriate infrastructure for their needs.

You can track your precise location (mobile only) and select layers that are relevant for you in the bottom left corner. You can also use this tool to add or edit pins (points of interest) to the map and provide more data by answering the questions.

All changes you make will automatically be saved in the global database of OpenStreetMap and can be freely re-used by others.

For more information about the cyclofix project, go to cyclofix.osm.be.", diff --git a/assets/themes/doctors/doctors.json b/assets/themes/doctors/doctors.json deleted file mode 100644 index 7c191b571..000000000 --- a/assets/themes/doctors/doctors.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "id": "doctors", - "title": { - "en": "Doctors" - }, - "description": { - "en": "On this map, publicly accessible doctors offices are shown and can be easily added" - }, - "maintainer": "MapComplete", - "icon": "./assets/layers/doctors/doctors.svg", - "version": "0", - "startLat": 50.8465573, - "defaultBackgroundId": "CartoDB.Voyager", - "startLon": 4.351697, - "startZoom": 16, - "widenFactor": 2, - "layers": [ - "doctors" - ] -} \ No newline at end of file diff --git a/assets/themes/healthcare/healthcare.json b/assets/themes/healthcare/healthcare.json new file mode 100644 index 000000000..482d21396 --- /dev/null +++ b/assets/themes/healthcare/healthcare.json @@ -0,0 +1,22 @@ +{ + "id": "healthcare", + "title": { + "en": "Healthcare" + }, + "description": { + "en": "On this map, various healthcare related items are shown" + }, + "maintainer": "MapComplete", + "icon": "./assets/layers/doctors/doctors.svg", + "version": "0", + "startLat": 50.8465573, + "defaultBackgroundId": "CartoDB.Voyager", + "startLon": 4.351697, + "startZoom": 16, + "widenFactor": 2, + "layers": [ + "doctors", + "hospital", + "pharmacy" + ] +} \ No newline at end of file diff --git a/assets/themes/kerbs_and_crossings/kerbs_and_crossings.json b/assets/themes/kerbs_and_crossings/kerbs_and_crossings.json index ddb32ee8d..1052e41f3 100644 --- a/assets/themes/kerbs_and_crossings/kerbs_and_crossings.json +++ b/assets/themes/kerbs_and_crossings/kerbs_and_crossings.json @@ -4,11 +4,13 @@ "version": "20211215", "title": { "en": "Kerbs and crossings", - "nl": "Stoepranden en oversteekplaatsen" + "nl": "Stoepranden en oversteekplaatsen", + "de": "Bordsteine und Überwege" }, "description": { "en": "A map showing kerbs and crossings.", - "nl": "Een kaart met stoepranden en oversteekplaatsen." + "nl": "Een kaart met stoepranden en oversteekplaatsen.", + "de": "Eine Karte mit Bordsteinen und Überwegen." }, "icon": "./assets/layers/kerbs/KerbIcon.svg", "startZoom": 19, diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index f02bc13de..02a85df6c 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -151,10 +151,6 @@ "if": "theme=cyclofix", "then": "./assets/themes/cyclofix/logo.svg" }, - { - "if": "theme=doctors", - "then": "./assets/layers/doctors/doctors.svg" - }, { "if": "theme=drinking_water", "then": "./assets/themes/drinking_water/logo.svg" @@ -211,6 +207,10 @@ "if": "theme=hailhydrant", "then": "./assets/themes/hailhydrant/logo.svg" }, + { + "if": "theme=healthcare", + "then": "./assets/layers/doctors/doctors.svg" + }, { "if": "theme=kerbs_and_crossings", "then": "./assets/layers/kerbs/KerbIcon.svg" diff --git a/assets/themes/shops/shops.json b/assets/themes/shops/shops.json index 7c30d980c..bb01f6ad2 100644 --- a/assets/themes/shops/shops.json +++ b/assets/themes/shops/shops.json @@ -42,6 +42,7 @@ "startZoom": 1, "widenFactor": 3, "layers": [ - "shops" + "shops", + "pharmacy" ] } \ No newline at end of file diff --git a/assets/themes/waste/waste.json b/assets/themes/waste/waste.json index 951942fe1..355c78768 100644 --- a/assets/themes/waste/waste.json +++ b/assets/themes/waste/waste.json @@ -16,7 +16,8 @@ "nl": "Kaart met afvalbakken en recyclingfaciliteiten.", "de": "Eine Karte mit Abfalleimern und Recyclingeinrichtungen.", "fr": "Carte des poubelles et infrastructures de recyclage.", - "it": "Mappa dei cestini per i rifiuti e i centri di raccolta e riciclo rifiuti." + "it": "Mappa dei cestini per i rifiuti e i centri di raccolta e riciclo rifiuti.", + "ca": "Mapa que mostra papereres i infraestructures de reciclatge." }, "icon": "./assets/layers/recycling/recycling-14.svg", "startZoom": 19, diff --git a/assets/translators.json b/assets/translators.json index 721102bf3..b57c1c805 100644 --- a/assets/translators.json +++ b/assets/translators.json @@ -5,7 +5,7 @@ "contributor": "Pieter Vander Vennet" }, { - "commits": 135, + "commits": 138, "contributor": "kjon" }, { @@ -18,11 +18,11 @@ }, { "commits": 30, - "contributor": "Iago" + "contributor": "Babos Gábor" }, { - "commits": 29, - "contributor": "Babos Gábor" + "commits": 30, + "contributor": "Iago" }, { "commits": 29, @@ -92,6 +92,10 @@ "commits": 9, "contributor": "Jacque Fresco" }, + { + "commits": 8, + "contributor": "paunofu" + }, { "commits": 7, "contributor": "Niels Elgaard Larsen" @@ -160,10 +164,6 @@ "commits": 4, "contributor": "BMN" }, - { - "commits": 4, - "contributor": "paunofu" - }, { "commits": 4, "contributor": "Hiroshi Miura" diff --git a/css/index-tailwind-output.css b/css/index-tailwind-output.css index 6bef61478..36f99ace6 100644 --- a/css/index-tailwind-output.css +++ b/css/index-tailwind-output.css @@ -950,6 +950,10 @@ video { margin-top: -3rem; } +.mr-1 { + margin-right: 0.25rem; +} + .mb-0 { margin-bottom: 0px; } @@ -1038,6 +1042,10 @@ video { height: 6rem; } +.h-8 { + height: 2rem; +} + .h-full { height: 100%; } @@ -1050,10 +1058,6 @@ video { height: 3rem; } -.h-8 { - height: 2rem; -} - .h-1\/2 { height: 50%; } @@ -1122,6 +1126,14 @@ video { width: 100%; } +.w-8 { + width: 2rem; +} + +.w-1 { + width: 0.25rem; +} + .w-24 { width: 6rem; } @@ -1138,10 +1150,6 @@ video { width: 3rem; } -.w-8 { - width: 2rem; -} - .w-0 { width: 0px; } @@ -1282,6 +1290,10 @@ video { flex-wrap: wrap-reverse; } +.content-start { + align-content: flex-start; +} + .items-end { align-items: flex-end; } @@ -1533,6 +1545,15 @@ video { padding-right: 0px; } +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + .pb-12 { padding-bottom: 3rem; } @@ -1601,10 +1622,6 @@ video { padding-top: 0.125rem; } -.pr-2 { - padding-right: 0.5rem; -} - .pl-6 { padding-left: 1.5rem; } @@ -1668,10 +1685,6 @@ video { font-weight: 600; } -.font-medium { - font-weight: 500; -} - .uppercase { text-transform: uppercase; } @@ -1701,10 +1714,6 @@ video { --tw-ordinal: ordinal; } -.leading-6 { - line-height: 1.5rem; -} - .tracking-tight { letter-spacing: -0.025em; } @@ -1912,6 +1921,14 @@ svg, img { height: 100%; } +.titleicon img { + width: unset; +} + +.titleicon svg { + width: unset; +} + .svg-catch svg path { fill: var(--catch-detail-color) !important; stroke: var(--catch-detail-color) !important; @@ -2458,6 +2475,27 @@ input { /* Additional class on the first layer filter */ } +.mapping-icon-small-height { + /* A mapping icon type */ + height: 2rem; + margin-right: 0.5rem; + width: unset; +} + +.mapping-icon-medium-height { + /* A mapping icon type */ + height: 3rem; + margin-right: 0.5rem; + width: unset; +} + +.mapping-icon-large-height { + /* A mapping icon type */ + height: 5rem; + margin-right: 0.5rem; + width: unset; +} + .mapping-icon-small { /* A mapping icon type */ width: 1.5rem; @@ -2507,16 +2545,6 @@ input { color: var(--unsubtle-detail-color-contrast); } -.group:hover .group-hover\:text-blue-800 { - --tw-text-opacity: 1; - color: rgba(30, 64, 175, var(--tw-text-opacity)); -} - -.group:hover .group-hover\:text-blue-900 { - --tw-text-opacity: 1; - color: rgba(30, 58, 138, var(--tw-text-opacity)); -} - @media (min-width: 640px) { .sm\:mx-auto { margin-left: auto; diff --git a/hospital.svg b/hospital.svg new file mode 100644 index 000000000..5ef1a4b63 --- /dev/null +++ b/hospital.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/index.css b/index.css index 7e8799923..85da5cdc7 100644 --- a/index.css +++ b/index.css @@ -137,6 +137,13 @@ svg, img { height: 100%; } +.titleicon img { + width: unset; +} + +.titleicon svg { + width: unset; +} .svg-catch svg path { fill: var(--catch-detail-color) !important; stroke: var(--catch-detail-color) !important; @@ -620,6 +627,27 @@ input { /* Additional class on the first layer filter */ } +.mapping-icon-small-height { + /* A mapping icon type */ + height: 1.5rem; + margin-right: 0.5rem; + width: unset; +} + +.mapping-icon-medium-height { + /* A mapping icon type */ + height: 3rem; + margin-right: 0.5rem; + width: unset; +} + +.mapping-icon-large-height { + /* A mapping icon type */ + height: 5rem; + margin-right: 0.5rem; + width: unset; +} + .mapping-icon-small { /* A mapping icon type */ diff --git a/langs/ca.json b/langs/ca.json index 7c2b0f105..3d5ffb952 100644 --- a/langs/ca.json +++ b/langs/ca.json @@ -239,6 +239,9 @@ "wednesday": "Dimecres" }, "welcomeBack": "Has entrat, benvingut/da.", + "welcomeExplanation": { + "addNew": "Toqueu el mapa per afegir un nou PDI." + }, "wikipedia": { "createNewWikidata": "Crear un ítem de Wikidata", "doSearch": "Cerca adalt per veure els resultats", @@ -265,6 +268,9 @@ "doDelete": "Esborrar imatge", "dontDelete": "Cancel·lar", "isDeleted": "Esborrada", + "nearbyPictures": { + "browseNearby": "Cerca imatges properes…" + }, "pleaseLogin": "Entrar per pujar una foto", "respectPrivacy": "Respecta la privacitat. No fotografiïs gent o matrícules. No facis servir imatges de Google Maps, Google Streetview o altres fonts amb copyright.", "toBig": "La teva imatge és massa gran ara que medeix {actual_size}. Usa imatges de com a molt {max_size}", diff --git a/langs/da.json b/langs/da.json index 0f2e9ce1e..3f7f21761 100644 --- a/langs/da.json +++ b/langs/da.json @@ -332,7 +332,7 @@ "title": "Sammenlign med eksisterende data", "titleLive": "Live data på OSM", "titleNearby": "Elementer i nærheden", - "zoomIn": "Live data bliver vist på zoomniveau mindst {needed}. Det aktuelle zoomniveau er {current}" + "zoomIn": "Det aktuelle zoomniveau er {current}" }, "createNotes": { "creating": "Oprettede {count} noter ud af {total}", diff --git a/langs/de.json b/langs/de.json index f5ea64aaa..c2364515a 100644 --- a/langs/de.json +++ b/langs/de.json @@ -360,7 +360,7 @@ "title": "Mit vorhandenen Daten vergleichen", "titleLive": "Live-Daten auf OSM", "titleNearby": "Objekte in der Nähe", - "zoomIn": "Live-Daten werden ab Zoomstufe {needed} angezeigt. Die aktuelle Zoomstufe ist {current}" + "zoomIn": "Die aktuelle Zoomstufe ist {current}" }, "createNotes": { "creating": "{count} Notizen von {total} erstellt", diff --git a/langs/en.json b/langs/en.json index e0109cc12..e893fb262 100644 --- a/langs/en.json +++ b/langs/en.json @@ -160,6 +160,7 @@ }, "nameInlineQuestion": "The name of this {category} is $$$", "next": "Next", + "noMatchingMapping": "No entries mapped your search…", "noNameCategory": "{category} without a name", "noTagsSelected": "No tags selected", "notValid": "Select a valid value to continue", @@ -355,6 +356,7 @@ "osmLoaded": "{count} elements are loaded from OpenStreetMap which match the layer {name}.", "reloadTheCache": "Clear the cache and query overpass again", "setRangeToZero": "Set the range to 0 or 1 if you want to import them all", + "showOsmLayerInConflationMap": "Show the OSM data", "states": { "error": "Could not load latest data from overpass due to {error}", "idle": "Checking local storage…", @@ -364,7 +366,8 @@ "title": "Compare with existing data", "titleLive": "Live data on OSM", "titleNearby": "Nearby features", - "zoomIn": "The live data is shown if the zoomlevel is at least {needed}. The current zoom level is {current}" + "zoomIn": "The current zoom level is {current}", + "zoomLevelSelection": "The live data is shown if the zoomlevel is at least: " }, "createNotes": { "creating": "Created {count} notes out of {total}", diff --git a/langs/layers/ca.json b/langs/layers/ca.json index 231cd932e..05d81fa9a 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -3,6 +3,7 @@ "description": "Adreces" }, "artwork": { + "description": "Un mapa obert d'estàtues, busts, grafitis i altres obres d'art del tot el món", "name": "Obres d'art", "tagRenderings": { "artwork-artwork_type": { @@ -824,12 +825,72 @@ "recycling": { "name": "Residus", "tagRenderings": { + "container-location": { + "mappings": { + "2": { + "then": "Aquest contenidor està situat a l'aire lliure" + } + } + }, "opening_hours": { "mappings": { "0": { "then": "24/7" } } + }, + "operator": { + "render": "Aquesta infraestuctura de reciclatge està operada per {operator}" + }, + "recycling-accepts": { + "mappings": { + "1": { + "then": "Ací es poden reciclar els cartons de begudes" + }, + "2": { + "then": "Ací es poden reciclar llaunes" + }, + "7": { + "then": "Ací es poden reciclar residus orgànics" + }, + "8": { + "then": "Ací es poden reciclar ampolles de vidre" + }, + "9": { + "then": "Ací es pot reciclar vidre" + }, + "10": { + "then": "Ací es poden reciclar diaris" + }, + "11": { + "then": "Ací es pot reciclar paper" + }, + "12": { + "then": "Ací es poden reciclar ampolles de plàstic" + }, + "13": { + "then": "Ací es poden reciclar envasos de plàstic" + }, + "14": { + "then": "Ací es pot reciclar plàstic" + }, + "20": { + "then": "Ací es pot reciclar el rebuig" + } + } + }, + "recycling-centre-name": { + "render": "Aquest centre de reciclatge s'anomena {name}" + }, + "recycling-type": { + "mappings": { + "0": { + "then": "Açò és un contenidor de reciclatge" + }, + "1": { + "then": "Açò és un centre de reciclatge" + } + } } } }, diff --git a/langs/layers/de.json b/langs/layers/de.json index 9d5aa66f5..525455f6d 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -3095,12 +3095,21 @@ "1": { "then": "Radweg" }, + "2": { + "then": "Straße mit gemeinsam genutzter Fahrspur {name}" + }, "3": { "then": "Gemeinsame Fahrspur" }, + "4": { + "then": "Straße mit Fahrradstreifen {name}" + }, "5": { "then": "Fahrradspur" }, + "6": { + "then": "Straße mit Radweg neben der Straße {name}" + }, "7": { "then": "Radweg neben der Straße" }, @@ -3110,7 +3119,8 @@ "9": { "then": "Fahrradstraße" } - } + }, + "render": "Weg" } }, "defibrillator": { @@ -4057,6 +4067,116 @@ "render": "Informationstafel" } }, + "kerbs": { + "description": "Eine Ebene, die Bordsteine zeigt.", + "filter": { + "0": { + "options": { + "0": { + "question": "Alle Arten von Bordsteinen" + }, + "1": { + "question": "Erhöhter Bordstein (>3 cm)" + }, + "2": { + "question": "Abgesenkter Bordstein (~3 cm)" + }, + "3": { + "question": "Bündiger Bordstein (~0cm)" + }, + "4": { + "question": "Kein Bordstein" + }, + "5": { + "question": "Bordstein mit unbekannter Höhe" + } + } + }, + "1": { + "options": { + "0": { + "question": "Bordsteine mit oder ohne taktilem Pflaster" + }, + "1": { + "question": "Bordstein mit taktilem Pflaster" + }, + "2": { + "question": "Bordstein ohne taktilem Pflaster" + }, + "3": { + "question": "Bordstein ohne Informationen über taktiles Pflaster" + } + } + } + }, + "name": "Bordsteine", + "presets": { + "0": { + "description": "Bordstein in einem Fußweg", + "title": "einen Bordstein" + } + }, + "tagRenderings": { + "kerb-height": { + "freeform": { + "placeholder": "Höhe des Bordsteins" + }, + "question": "Wie hoch ist der Bordstein?", + "render": "Bordsteinhöhe: {{kerb:height}}" + }, + "kerb-type": { + "mappings": { + "0": { + "then": "Der Bordstein ist erhöht (>3 cm)" + }, + "1": { + "then": "Der Bordstein ist abgesenkt (~3 cm)" + }, + "2": { + "then": "Der Bordstein ist bündig (~0cm)" + }, + "3": { + "then": "Hier gibt es keinen Bordstein" + }, + "4": { + "then": "Es gibt einen Bordstein mit unbekannter Höhe" + } + }, + "question": "Wie hoch ist der Bordstein?" + }, + "tactile-paving": { + "mappings": { + "0": { + "then": "Der Bordstein hat ein taktiles Pflaster." + }, + "1": { + "then": "Der Bordstein hat kein taktiles Pflaster." + }, + "2": { + "then": "Der Bordstein hat ein taktiles Pflaster, das aber falsch ist" + } + }, + "question": "Gibt es am Bordstein ein taktiles Pflaster?" + } + }, + "title": { + "render": "Bordstein" + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": "Zentimeter", + "humanSingular": "Zentimeter" + }, + "1": { + "human": "Meter", + "humanSingular": "Meter" + } + } + } + } + }, "kindergarten_childcare": { "name": "Kindergärten und Kinderkrippen", "presets": { @@ -5047,10 +5167,22 @@ "question": "Welche Geschlechter können sich an dieser Schule anmelden?" }, "language": { + "freeform": { + "placeholder": "Sprache in Englisch in Kleinbuchstaben" + }, "mappings": { "0": { "then": "Die Hauptsprache dieser Schule ist unbekannt" }, + "1": { + "then": "Französisch ist die Hauptsprache von {name}" + }, + "2": { + "then": "Niederländisch ist die Hauptsprache von {name}" + }, + "3": { + "then": "Deutsch ist die Hauptsprache von {name}" + }, "4": { "then": "Die Hauptsprache dieser Schule ist unbekannt" } @@ -5149,6 +5281,9 @@ "tagRenderings": { "shops-name": { "question": "Wie ist der Name dieses Geschäfts?" + }, + "shops-type-from-id": { + "question": "Was ist das für ein Geschäft?" } }, "title": { diff --git a/langs/layers/en.json b/langs/layers/en.json index e077d30cd..0b3b8a767 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -3255,6 +3255,52 @@ "description": "This layer visualizes directions", "name": "Direction visualization" }, + "doctors": { + "filter": { + "0": { + "options": { + "0": { + "question": "Opened now" + } + } + } + }, + "name": "doctors", + "presets": { + "0": { + "title": "a doctors office" + }, + "1": { + "title": "a dentists office" + }, + "2": { + "title": "a physiotherapists office" + } + }, + "tagRenderings": { + "specialty": { + "mappings": { + "0": { + "then": "This is a general practitioner" + }, + "1": { + "then": "This is a gynaecologist" + }, + "2": { + "then": "This is a psychiatrist" + }, + "3": { + "then": "This is a paediatrician" + } + }, + "question": "What is this doctor specialized in?", + "render": "This doctor is specialized in {healthcare:speciality}" + } + }, + "title": { + "render": "Doctors Office {name}" + } + }, "dogpark": { "name": "dog parks", "presets": { @@ -3572,6 +3618,9 @@ "nonDeleteMappings": { "0": { "then": "This is actually a pub" + }, + "1": { + "then": "This is actually a cafe" } } }, @@ -3995,6 +4044,18 @@ "render": "Hackerspace" } }, + "hospital": { + "name": "Hospital", + "tagRenderings": { + "name": { + "question": "What does the of the hospital ?", + "render": "Name of the hospital name is {name}" + } + }, + "title": { + "render": "Hospital" + } + }, "hydrant": { "description": "Map layer to show fire hydrants.", "name": "Map of hydrants", @@ -4629,6 +4690,28 @@ "description": "Pedestrian footpaths, especially used for indoor navigation and snapping entrances to this layer", "name": "Pedestrian paths" }, + "pharmacy": { + "name": "pharmacy", + "tagRenderings": { + "wheelchair": { + "mappings": { + "0": { + "then": "This pharmacy is easy to access on a wheelchair" + }, + "1": { + "then": "This pharmacy is hard to access on a wheelchair" + }, + "2": { + "then": "This pharmacy has limited access for wheelchair users" + } + }, + "question": "Is this pharmacy easy to access on a wheelchair?" + } + }, + "title": { + "render": "{name}" + } + }, "picnic_table": { "description": "The layer showing picnic tables", "name": "Picnic tables", @@ -5322,6 +5405,26 @@ "question": "What kind of shop is this?" } }, + "copyshop-print-sizes": { + "mappings": { + "0": { + "then": "This shop can print on papers of size A4" + }, + "1": { + "then": "This shop can print on papers of size A3" + }, + "2": { + "then": "This shop can print on papers of size A2" + }, + "3": { + "then": "This shop can print on papers of size A1" + }, + "4": { + "then": "This shop can print on papers of size A0" + } + }, + "question": "What paper formats does this shop offer?" + }, "shops-name": { "question": "What is the name of this shop?" } diff --git a/langs/layers/es.json b/langs/layers/es.json index f2b061f1c..8ea7f34c7 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -3259,7 +3259,7 @@ }, "operator": { "question": "¿Que empresa opera esta facilidad de reciclado?", - "render": "Esta facilidad de reciclado la opera {operator}" + "render": "Esta infraestructura de reciclado la opera {operator}" }, "recycling-accepts": { "mappings": { diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 3380b5390..9613c44f3 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -248,7 +248,7 @@ } }, "bench": { - "description": "Deze laag toont zitbanken en enkele vragen over deze zitbanken", + "description": "Een zitbank is een houten, metalen, stenen, … oppervlak waar een mens kan zitten. Deze laag toont ze en stelt er enkele vragen over.", "name": "Zitbanken", "presets": { "0": { @@ -2455,6 +2455,9 @@ }, "question": "Wat is de naam van dit Klimgelegenheid?", "render": "{name}" + }, + "Contained_climbing_routes": { + "render": "

Bevat {_contained_climbing_routes_count} routes

    {_contained_climbing_routes}
" } }, "title": { @@ -2548,7 +2551,8 @@ "2": { "then": "Klimmen is hier niet mogelijk" } - } + }, + "question": "Is klimmen hier mogelijk?" } }, "title": { @@ -3541,6 +3545,20 @@ "question": "Heeft een halal menu" } } + }, + "4": { + "options": { + "0": { + "question": "Accepteert cash" + } + } + }, + "5": { + "options": { + "0": { + "question": "Accepteert betaalkaarten" + } + } } }, "name": "Eetgelegenheden", @@ -4170,7 +4188,8 @@ "0": { "then": "Dit is een woonerf en heeft dus een maximale snelheid van 20km/h" } - } + }, + "render": "De maximum toegestane snelheid op deze weg is {maxspeed}" } }, "units": { @@ -4186,6 +4205,14 @@ } } } + }, + "description": "Toont de toegestane snelheid voor elke weg", + "title": { + "mappings": { + "0": { + "then": "Weg zonder een naam" + } + } } }, "nature_reserve": { @@ -6404,4 +6431,4 @@ } } } -} \ No newline at end of file +} diff --git a/langs/nb_NO.json b/langs/nb_NO.json index 6fe174c8c..329a1076d 100644 --- a/langs/nb_NO.json +++ b/langs/nb_NO.json @@ -309,7 +309,7 @@ "title": "Sammenlign med eksisterende data", "titleLive": "Sanntidsdata på OSM", "titleNearby": "Funksjoner i nærheten", - "zoomIn": "Sanntidsdata vises hvis forstørrelsesnivået er minst {needed}. Nåværende forstørrelsesnivå er {current}." + "zoomIn": "Nåværende forstørrelsesnivå er {current}." }, "createNotes": { "creating": "Opprettet {count} notater av {total}", diff --git a/langs/nl.json b/langs/nl.json index 51f855be3..0e4fd61e7 100644 --- a/langs/nl.json +++ b/langs/nl.json @@ -360,7 +360,7 @@ "title": "Vergelijking met bestaande data", "titleLive": "Data van OSM", "titleNearby": "Objecten in de buurt", - "zoomIn": "De OSM-data wordt getoond vanaf zoomniveau {needed}. Het huidige zoomniveau is {current}" + "zoomIn": "Het huidige zoomniveau is {current}" }, "createNotes": { "creating": "{count} van {total} kaartnota's werden gemaakt", diff --git a/langs/themes/ca.json b/langs/themes/ca.json index 29777fa7a..724f5c12a 100644 --- a/langs/themes/ca.json +++ b/langs/themes/ca.json @@ -4,7 +4,7 @@ "title": "Mapa obert de desfibril·ladors (DEA)" }, "artwork": { - "description": "Benvingut a Open Artwork Map, un mapa d'estàtues, busts, grafitis i altres obres d'art del tot el món", + "description": "Un mapa obert d'estàtues, busts, grafitis i altres obres d'art del tot el món", "title": "Open Artwork Map" }, "benches": { @@ -13,9 +13,17 @@ "title": "Bancs" }, "bicycle_rental": { + "description": "En aquest mapa, trobaràs nombroses estacions de lloguer de bicicletes que són conegudes per OpenStreetMap", + "shortDescription": "Un mapa amb estacions de lloguer de bicicletes i botigues de lloguer de bicicletes", "title": "Lloguer de bicicletes" }, + "binoculars": { + "description": "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.", + "shortDescription": "Un mapa amb prismàtics fixos", + "title": "Binoculars" + }, "bookcases": { + "description": "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.", "title": "Open Bookcase Map" }, "cafes_and_pubs": { @@ -23,20 +31,73 @@ "title": "Cafés i bars" }, "campersite": { + "description": "Aquest lloc recull tots els llocs oficials de parada de caravanes i els llocs on es poden abocar les aigües grises i negres. Pots afegir detalls sobre els serveis prestats i el cost. Afig fotos i ressenyes. Aquest és un lloc web i una aplicació web. Les dades s'emmagatzemen en OpenStreetMap, per la qual cosa seran gratuïts per sempre i podran ser reutilitzats per qualsevol aplicació.", "layers": { "0": { "description": "llocs d'acampada", "name": "Llocs d'acampada", "presets": { "0": { + "description": "Afig un nou lloc d'acampada oficial. Són llocs designats per a passar la nit amb la teua caravana. Poden semblar-se a un càmping real o simplement a un aparcament. Pot ser que no estiguen senyalitzats en absolut, sinó que simplement estiguen definits per una decisió municipal. Un aparcament normal destinat als acampadors en el qual no s'espera que es passe la nit, no és un càmping. ", "title": "un lloc d'acampada" } }, "tagRenderings": { + "caravansites-capacity": { + "question": "Quants acampadors poden allotjar-se ací? (ometre si no hi ha un nombre evident de places o vehicles permesos)", + "render": "{capacity} els acampadors poden utilitzar aquest lloc al mateix temps" + }, + "caravansites-charge": { + "question": "Quant cobra aquest lloc?", + "render": "Aquest lloc cobra {charge}" + }, + "caravansites-description": { + "question": "T'agradaria afegir una descripció general d'aquest lloc? (No repeteixis informació prèviament preguntada o mostrada a dalt. Si us plau mantín-la objectiva - les opinions van en les «reviews»)", + "render": "Més detalls sobre aquest lloc: {description}" + }, + "caravansites-fee": { + "mappings": { + "0": { + "then": "Heu de pagar per l'ús" + }, + "1": { + "then": "Es pot utilitzar gratuïtament" + } + }, + "question": "Aquest lloc cobra una taxa?" + }, "caravansites-internet": { "mappings": { "0": { "then": "Hi ha accés a internet" + }, + "1": { + "then": "Hi ha accés a Internet" + }, + "2": { + "then": "No hi ha accés a Internet" + } + }, + "question": "Aquest lloc proporciona accés a Internet?" + }, + "caravansites-internet-fee": { + "mappings": { + "0": { + "then": "Heu de pagar un extra per accedir a Internet" + }, + "1": { + "then": "No cal pagar extra per l'accés a Internet" + } + }, + "question": "Has de pagar per l'accés a Internet?" + }, + "caravansites-long-term": { + "mappings": { + "0": { + "then": "Hi ha alguns punts per al lloguer a llarg termini, però també es pot romandre diàriament" + }, + "1": { + "then": "No hi han hostes permanents aquí" } } } @@ -123,6 +184,9 @@ "shortDescription": "Un mapa de carrers ciclistes", "title": "Carrers ciclistes" }, + "cyclofix": { + "title": "Cyclofix - un mapa obert per a ciclistes" + }, "drinking_water": { "title": "Aigua potable" }, @@ -290,6 +354,7 @@ "title": "Arbres" }, "waste": { + "description": "Mapa que mostra papereres i infraestructures de reciclatge.", "title": "Brossa" }, "waste_basket": { diff --git a/langs/themes/de.json b/langs/themes/de.json index 2ad828ca4..7702fbfbb 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -647,6 +647,72 @@ "shortDescription": "Hydranten, Feuerlöscher, Feuerwachen und Rettungswachen.", "title": "Hydranten, Feuerlöscher, Feuerwachen und Rettungswachen" }, + "kerbs_and_crossings": { + "description": "Eine Karte mit Bordsteinen und Überwegen.", + "title": "Bordsteine und Überwege" + }, + "mapcomplete-changes": { + "description": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen", + "layers": { + "0": { + "description": "Zeigt alle MapComplete Änderungen", + "filter": { + "0": { + "options": { + "0": { + "question": "Themenname enthält {search}" + } + } + }, + "1": { + "options": { + "0": { + "question": "Erstellt von {search}" + } + } + }, + "2": { + "options": { + "0": { + "question": "Nicht erstellt von {search}" + } + } + } + }, + "name": "Zentrum der Änderungssätze", + "tagRenderings": { + "contributor": { + "render": "Geändert von {_last_edit:contributor}" + }, + "render_id": { + "render": "Änderungssatz {id}" + }, + "theme": { + "mappings": { + "0": { + "then": "Änderung mit inoffiziellem Thema {theme}" + } + }, + "render": "Änderung mit Thema {theme}" + } + }, + "title": { + "render": "Änderungssatz für {theme}" + } + }, + "1": { + "override": { + "tagRenderings": { + "link_to_more": { + "render": "Weitere Statistiken finden Sie hier" + } + } + } + } + }, + "shortDescription": "Zeigt die mit MapComplete vorgenommenen Änderungen", + "title": "Mit MapComplete vorgenommene Änderungen" + }, "maps": { "description": "Auf dieser Karte findest du alle Karten, die OpenStreetMap kennt - typischerweise eine große Karte auf einer Informationstafel, die das Gebiet, die Stadt oder die Region zeigt, z.B. eine touristische Karte auf der Rückseite einer Plakatwand, eine Karte eines Naturschutzgebietes, eine Karte der Radwegenetze in der Region, ...)

Wenn eine Karte fehlt, können Sie diese leicht auf OpenStreetMap kartieren.", "shortDescription": "Dieses Thema zeigt alle (touristischen) Karten, die OpenStreetMap kennt", diff --git a/langs/themes/en.json b/langs/themes/en.json index 4fb6f8226..b3e3d3a17 100644 --- a/langs/themes/en.json +++ b/langs/themes/en.json @@ -647,6 +647,10 @@ "shortDescription": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.", "title": "Hydrants, Extinguishers, Fire stations, and Ambulance stations" }, + "healthcare": { + "description": "On this map, various healthcare related items are shown", + "title": "Healthcare" + }, "kerbs_and_crossings": { "description": "A map showing kerbs and crossings.", "title": "Kerbs and crossings" diff --git a/license_info.json b/license_info.json new file mode 100644 index 000000000..8a37d59ec --- /dev/null +++ b/license_info.json @@ -0,0 +1,12 @@ +[ + { + "path": "hospital.svg", + "license": "CC-0", + "authors": [ + "osmcarto" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Hospital-14.svg" + ] + } +] \ No newline at end of file diff --git a/package.json b/package.json index 58c8dabfa..1d97a1908 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "generate:cache:speelplekken": "npm run generate:layeroverview && ts-node scripts/generateCache.ts speelplekken 14 ../MapComplete-data/speelplekken_cache/ 51.20 4.35 51.09 4.56", "generate:cache:natuurpunt": "npm run generate:layeroverview && ts-node scripts/generateCache.ts natuurpunt 12 ../MapComplete-data/natuurpunt_cache/ 50.40 2.1 51.54 6.4 --generate-point-overview nature_reserve,visitor_information_centre", "generate:cache:natuurpunt:mini": "ts-node scripts/generateCache.ts natuurpunt 12 ../../git/MapComplete-data/natuurpunt_cache_mini/ 51.00792239979105 4.497699737548828 51.0353492224462554 4.539070129394531 --generate-point-overview nature_reserve,visitor_information_centre", - "generate:layeroverview": "ts-node scripts/generateLayerOverview.ts --no-fail", + "generate:layeroverview": "ts-node scripts/generateLayerOverview.ts", "generate:licenses": "ts-node scripts/generateLicenseInfo.ts --no-fail", "query:licenses": "ts-node scripts/generateLicenseInfo.ts --query", "generate:report": "cd Docs/Tools && ./compileStats.sh && git commit . -m 'New statistics ands graphs' && git push", @@ -36,7 +36,7 @@ "generate:schemas": "ts2json-schema -p Models/ThemeConfig/Json/ -o Docs/Schemas/ -t tsconfig.json -R . -m \".*ConfigJson\" && ts-node scripts/fixSchemas.ts ", "generate:service-worker": "tsc service-worker.ts && git_hash=$(git rev-parse HEAD) && sed -i \"s/GITHUB-COMMIT/$git_hash/\" service-worker.js", "optimize-images": "cd assets/generated/ && find -name '*.png' -exec optipng '{}' \\; && echo 'PNGs are optimized'", - "reset:layeroverview": "echo {\\\"layers\\\":[], \\\"themes\\\":[]} > ./assets/generated/known_layers_and_themes.json && echo {\\\"layers\\\": []} > ./assets/generated/known_layers.json", + "reset:layeroverview": "echo {\\\"layers\\\":[], \\\"themes\\\":[]} > ./assets/generated/known_layers_and_themes.json && echo {\\\"layers\\\": []} > ./assets/generated/known_layers.json && rm ./asssets/generated/layers/* && rm ./assets/generated/themes/*", "generate": "mkdir -p ./assets/generated; npm run reset:layeroverview; npm run generate:images; npm run generate:charging-stations; npm run generate:translations; npm run generate:licenses; npm run generate:layeroverview; npm run generate:service-worker", "generate:charging-stations": "cd ./assets/layers/charging_station && ts-node csvToJson.ts && cd -", "prepare-deploy": "npm run generate:service-worker && ./scripts/build.sh", diff --git a/scripts/ScriptUtils.ts b/scripts/ScriptUtils.ts index 651ad4351..a86f3b2d4 100644 --- a/scripts/ScriptUtils.ts +++ b/scripts/ScriptUtils.ts @@ -45,13 +45,103 @@ export default class ScriptUtils { }) } - - private static async DownloadJSON(url: string, headers?: any): Promise{ + + public static erasableLog(...text) { + process.stdout.write("\r " + text.join(" ") + " \r") + } + + public static sleep(ms) { + if (ms <= 0) { + process.stdout.write("\r \r") + return; + } + return new Promise((resolve) => { + process.stdout.write("\r Sleeping for " + (ms / 1000) + "s \r") + setTimeout(resolve, 1000); + }).then(() => ScriptUtils.sleep(ms - 1000)); + } + + public static getLayerPaths(): string[] { + return ScriptUtils.readDirRecSync("./assets/layers") + .filter(path => path.indexOf(".json") > 0) + .filter(path => path.indexOf(".proto.json") < 0) + .filter(path => path.indexOf("license_info.json") < 0) + } + + public static getLayerFiles(): { parsed: LayerConfigJson, path: string }[] { + return ScriptUtils.readDirRecSync("./assets/layers") + .filter(path => path.indexOf(".json") > 0) + .filter(path => path.indexOf(".proto.json") < 0) + .filter(path => path.indexOf("license_info.json") < 0) + .map(path => { + try { + const contents = readFileSync(path, "UTF8") + if (contents === "") { + throw "The file " + path + " is empty, did you properly save?" + } + + const parsed = JSON.parse(contents); + return {parsed, path} + } catch (e) { + console.error("Could not parse file ", "./assets/layers/" + path, "due to ", e) + throw e + } + }) + } + + public static getThemePaths(): string[] { + return ScriptUtils.readDirRecSync("./assets/themes") + .filter(path => path.endsWith(".json") && !path.endsWith(".proto.json")) + .filter(path => path.indexOf("license_info.json") < 0) + } + + public static getThemeFiles(): { parsed: LayoutConfigJson, path: string }[] { + return this.getThemePaths() + .map(path => { + try { + const contents = readFileSync(path, "UTF8"); + if (contents === "") { + throw "The file " + path + " is empty, did you properly save?" + } + const parsed = JSON.parse(contents); + return {parsed: parsed, path: path} + } catch (e) { + console.error("Could not read file ", path, "due to ", e) + throw e + } + }); + } + + public static TagInfoHistogram(key: string): Promise<{ + data: { count: number, value: string, fraction: number }[] + }> { + const url = `https://taginfo.openstreetmap.org/api/4/key/values?key=${key}&filter=all&lang=en&sortname=count&sortorder=desc&page=1&rp=17&qtype=value` + return ScriptUtils.DownloadJSON(url) + } + + public static async ReadSvg(path: string): Promise { + if (!existsSync(path)) { + throw "File not found: " + path + } + const root = await xml2js.parseStringPromise(readFileSync(path, "UTF8")) + return root.svg + } + + public static async ReadSvgSync(path: string, callback: ((svg: any) => void)): Promise { + xml2js.parseString(readFileSync(path, "UTF8"), {async: false}, (err, root) => { + if (err) { + throw err + } + callback(root["svg"]); + }) + } + + private static async DownloadJSON(url: string, headers?: any): Promise { const data = await ScriptUtils.Download(url, headers); return JSON.parse(data.content) } - private static Download(url, headers?: any): Promise<{content: string}> { + private static Download(url, headers?: any): Promise<{ content: string }> { return new Promise((resolve, reject) => { try { headers = headers ?? {} @@ -83,84 +173,4 @@ export default class ScriptUtils { } - public static erasableLog(...text) { - process.stdout.write("\r " + text.join(" ") + " \r") - } - - public static sleep(ms) { - if (ms <= 0) { - process.stdout.write("\r \r") - return; - } - return new Promise((resolve) => { - process.stdout.write("\r Sleeping for " + (ms / 1000) + "s \r") - setTimeout(resolve, 1000); - }).then(() => ScriptUtils.sleep(ms - 1000)); - } - - public static getLayerFiles(): { parsed: LayerConfigJson, path: string }[] { - return ScriptUtils.readDirRecSync("./assets/layers") - .filter(path => path.indexOf(".json") > 0) - .filter(path => path.indexOf(".proto.json") < 0) - .filter(path => path.indexOf("license_info.json") < 0) - .map(path => { - try { - const contents = readFileSync(path, "UTF8") - if (contents === "") { - throw "The file " + path + " is empty, did you properly save?" - } - - const parsed = JSON.parse(contents); - return {parsed, path} - } catch (e) { - console.error("Could not parse file ", "./assets/layers/" + path, "due to ", e) - throw e - } - }) - } - - public static getThemeFiles(): { parsed: LayoutConfigJson, path: string }[] { - return ScriptUtils.readDirRecSync("./assets/themes") - .filter(path => path.endsWith(".json") && !path.endsWith(".proto.json")) - .filter(path => path.indexOf("license_info.json") < 0) - .map(path => { - try { - const contents = readFileSync(path, "UTF8"); - if (contents === "") { - throw "The file " + path + " is empty, did you properly save?" - } - const parsed = JSON.parse(contents); - return {parsed: parsed, path: path} - } catch (e) { - console.error("Could not read file ", path, "due to ", e) - throw e - } - }); - } - - - public static TagInfoHistogram(key: string): Promise<{ - data: { count: number, value: string, fraction: number }[] - }> { - const url = `https://taginfo.openstreetmap.org/api/4/key/values?key=${key}&filter=all&lang=en&sortname=count&sortorder=desc&page=1&rp=17&qtype=value` - return ScriptUtils.DownloadJSON(url) - } - - public static async ReadSvg(path: string): Promise{ - if(!existsSync(path)){ - throw "File not found: "+path - } - const root = await xml2js.parseStringPromise(readFileSync(path, "UTF8")) - return root.svg - } - - public static async ReadSvgSync(path: string, callback: ((svg: any) => void)): Promise{ - xml2js.parseString(readFileSync(path, "UTF8"),{async: false} , (err, root) => { - if(err){ - throw err - } - callback(root["svg"]); - }) - } - } diff --git a/scripts/build.sh b/scripts/build.sh index 804ce9b52..c194cfe9d 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -10,9 +10,10 @@ mkdir dist 2> /dev/null mkdir dist/assets 2> /dev/null # This script ends every line with '&&' to chain everything. A failure will thus stop the build -npm run generate:editor-layer-index +npm run generate:editor-layer-index && +npm run reset:layeroverview npm run generate && -npm run generate:layeroverview && # generate:layeroverview has to be run twice: the personal theme won't pick up all the layers otherwise +npm run generate:layeroverview --force && # generate:layeroverview has to be run twice: the personal theme won't pick up all the layers otherwise; first time happens in 'npm run generate' npm run test && npm run generate:layouts diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 866155db8..36fb6d9e5 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -1,5 +1,5 @@ import ScriptUtils from "./ScriptUtils"; -import {existsSync, mkdirSync, readFileSync, writeFileSync} from "fs"; +import {existsSync, mkdirSync, readFileSync, statSync, writeFileSync} from "fs"; import * as licenses from "../assets/generated/license_info.json" import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; @@ -26,6 +26,51 @@ import {Utils} from "../Utils"; class LayerOverviewUtils { + public static readonly layerPath = "./assets/generated/layers/" + public static readonly themePath = "./assets/generated/themes/" + + private static publicLayerIdsFrom(themefiles: LayoutConfigJson[]): Set { + const publicThemes = [].concat(...themefiles + .filter(th => !th.hideFromOverview)) + + return new Set([].concat(...publicThemes.map(th => this.extractLayerIdsFrom(th)))) + } + + private static extractLayerIdsFrom(themeFile: LayoutConfigJson, includeInlineLayers = true): string[] { + const publicLayerIds = [] + for (const publicLayer of themeFile.layers) { + if (typeof publicLayer === "string") { + publicLayerIds.push(publicLayer) + continue + } + if (publicLayer["builtin"] !== undefined) { + const bi = publicLayer["builtin"] + if (typeof bi === "string") { + publicLayerIds.push(bi) + continue + } + bi.forEach(id => publicLayerIds.push(id)) + continue + } + if (includeInlineLayers) { + publicLayerIds.push(publicLayer["id"]) + } + } + return publicLayerIds + } + + shouldBeUpdated(sourcefile: string | string[], targetfile: string): boolean { + if (!existsSync(targetfile)) { + return true; + } + const targetModified = statSync(targetfile).mtime + if (typeof sourcefile === "string") { + sourcefile = [sourcefile] + } + + return sourcefile.some(sourcefile => statSync(sourcefile).mtime > targetModified) + } + writeSmallOverview(themes: { id: string, title: any, shortDescription: any, icon: string, hideFromOverview: boolean, mustHaveLanguage: boolean, layers: (LayerConfigJson | string | { builtin })[] }[]) { const perId = new Map(); for (const theme of themes) { @@ -70,22 +115,22 @@ class LayerOverviewUtils { } writeTheme(theme: LayoutConfigJson) { - if (!existsSync("./assets/generated/themes")) { - mkdirSync("./assets/generated/themes"); + if (!existsSync(LayerOverviewUtils.themePath)) { + mkdirSync(LayerOverviewUtils.themePath); } - writeFileSync(`./assets/generated/themes/${theme.id}.json`, JSON.stringify(theme, null, " "), "UTF8"); + writeFileSync(`${LayerOverviewUtils.themePath}${theme.id}.json`, JSON.stringify(theme, null, " "), "UTF8"); } writeLayer(layer: LayerConfigJson) { - if (!existsSync("./assets/generated/layers")) { - mkdirSync("./assets/generated/layers"); + if (!existsSync(LayerOverviewUtils.layerPath)) { + mkdirSync(LayerOverviewUtils.layerPath); } - writeFileSync(`./assets/generated/layers/${layer.id}.json`, JSON.stringify(layer, null, " "), "UTF8"); + writeFileSync(`${LayerOverviewUtils.layerPath}${layer.id}.json`, JSON.stringify(layer, null, " "), "UTF8"); } getSharedTagRenderings(doesImageExist: DoesImageExist): Map { const dict = new Map(); - + const validator = new ValidateTagRenderings(undefined, doesImageExist); for (const key in questions["default"]) { if (key === "id") { @@ -94,7 +139,7 @@ class LayerOverviewUtils { questions[key].id = key; questions[key]["source"] = "shared-questions" const config = questions[key] - validator.convertStrict(config, "generate-layer-overview:tagRenderings/questions.json:"+key) + validator.convertStrict(config, "generate-layer-overview:tagRenderings/questions.json:" + key) dict.set(key, config) } for (const key in icons["default"]) { @@ -105,9 +150,9 @@ class LayerOverviewUtils { continue } icons[key].id = key; - const config = icons[key] - validator.convertStrict(config, "generate-layer-overview:tagRenderings/icons.json:"+key) - dict.set(key,config) + const config = icons[key] + validator.convertStrict(config, "generate-layer-overview:tagRenderings/icons.json:" + key) + dict.set(key, config) } dict.forEach((value, key) => { @@ -150,16 +195,18 @@ class LayerOverviewUtils { } } + main(args: string[]) { - main(_: string[]) { + const forceReload = args.some(a => a == "--force") const licensePaths = new Set() for (const i in licenses) { licensePaths.add(licenses[i].path) } const doesImageExist = new DoesImageExist(licensePaths, existsSync) - const sharedLayers = this.buildLayerIndex(doesImageExist); - const sharedThemes = this.buildThemeIndex(doesImageExist, sharedLayers) + const sharedLayers = this.buildLayerIndex(doesImageExist, forceReload); + const recompiledThemes: string[] = [] + const sharedThemes = this.buildThemeIndex(doesImageExist, sharedLayers, recompiledThemes, forceReload) writeFileSync("./assets/generated/known_layers_and_themes.json", JSON.stringify({ "layers": Array.from(sharedLayers.values()), @@ -169,7 +216,7 @@ class LayerOverviewUtils { writeFileSync("./assets/generated/known_layers.json", JSON.stringify({layers: Array.from(sharedLayers.values())})) - { + if (recompiledThemes.length > 0) { // mapcomplete-changes shows an icon for each corresponding mapcomplete-theme const iconsPerTheme = Array.from(sharedThemes.values()).map(th => ({ @@ -189,28 +236,46 @@ class LayerOverviewUtils { console.log(green("All done!")) } - private buildLayerIndex(doesImageExist: DoesImageExist): Map { + private buildLayerIndex(doesImageExist: DoesImageExist, forceReload: boolean): Map { // First, we expand and validate all builtin layers. These are written to assets/generated/layers // At the same time, an index of available layers is built. console.log(" ---------- VALIDATING BUILTIN LAYERS ---------") const sharedTagRenderings = this.getSharedTagRenderings(doesImageExist); - const layerFiles = ScriptUtils.getLayerFiles(); const sharedLayers = new Map() const state: DesugaringContext = { tagRenderings: sharedTagRenderings, sharedLayers } const prepLayer = new PrepareLayer(state); - for (const sharedLayerJson of layerFiles) { - const context = "While building builtin layer " + sharedLayerJson.path - const fixed = prepLayer.convertStrict(sharedLayerJson.parsed, context) - - if(fixed.source.osmTags["and"] === undefined){ + const skippedLayers: string[] = [] + const recompiledLayers: string[] = [] + for (const sharedLayerPath of ScriptUtils.getLayerPaths()) { + + { + const targetPath = LayerOverviewUtils.layerPath + sharedLayerPath.substring(sharedLayerPath.lastIndexOf("/")) + if (!forceReload && !this.shouldBeUpdated(sharedLayerPath, targetPath)) { + const sharedLayer = JSON.parse(readFileSync(targetPath, "utf8")) + sharedLayers.set(sharedLayer.id, sharedLayer) + skippedLayers.push(sharedLayer.id) + continue; + } + + } + let parsed; + try { + parsed = JSON.parse(readFileSync(sharedLayerPath, "utf8")) + } catch (e) { + throw ("Could not parse or read file " + sharedLayerPath) + } + const context = "While building builtin layer " + sharedLayerPath + const fixed = prepLayer.convertStrict(parsed, context) + + if (fixed.source.osmTags["and"] === undefined) { fixed.source.osmTags = {"and": [fixed.source.osmTags]} } - - const validator = new ValidateLayer(sharedLayerJson.path, true, doesImageExist); + + const validator = new ValidateLayer(sharedLayerPath, true, doesImageExist); validator.convertStrict(fixed, context) if (sharedLayers.has(fixed.id)) { @@ -218,39 +283,19 @@ class LayerOverviewUtils { } sharedLayers.set(fixed.id, fixed) + recompiledLayers.push(fixed.id) this.writeLayer(fixed) + } + + console.log("Recompiled layers " + recompiledLayers.join(", ") + " and skipped " + skippedLayers.length + " layers") + return sharedLayers; } - private static publicLayerIdsFrom(themefiles: LayoutConfigJson[]): Set { - const publicLayers = [].concat(...themefiles - .filter(th => !th.hideFromOverview) - .map(th => th.layers)) - - const publicLayerIds = new Set() - for (const publicLayer of publicLayers) { - if (typeof publicLayer === "string") { - publicLayerIds.add(publicLayer) - continue - } - if (publicLayer["builtin"] !== undefined) { - const bi = publicLayer["builtin"] - if (typeof bi === "string") { - publicLayerIds.add(bi) - continue - } - bi.forEach(id => publicLayerIds.add(id)) - continue - } - publicLayerIds.add(publicLayer.id) - } - return publicLayerIds - } - - private buildThemeIndex(doesImageExist: DoesImageExist, sharedLayers: Map): Map { + private buildThemeIndex(doesImageExist: DoesImageExist, sharedLayers: Map, recompiledThemes: string[], forceReload: boolean): Map { console.log(" ---------- VALIDATING BUILTIN THEMES ---------") const themeFiles = ScriptUtils.getThemeFiles(); const fixed = new Map(); @@ -262,9 +307,23 @@ class LayerOverviewUtils { tagRenderings: this.getSharedTagRenderings(doesImageExist), publicLayers } + const skippedThemes: string[] = [] for (const themeInfo of themeFiles) { + + const themePath = themeInfo.path; let themeFile = themeInfo.parsed - const themePath = themeInfo.path + + { + const targetPath = LayerOverviewUtils.themePath + "/" + themePath.substring(themePath.lastIndexOf("/")) + const usedLayers = Array.from(LayerOverviewUtils.extractLayerIdsFrom(themeFile, false)) + .map(id => LayerOverviewUtils.layerPath + id + ".json") + if (!forceReload && !this.shouldBeUpdated([themePath, ...usedLayers], targetPath)) { + fixed.set(themeFile.id, JSON.parse(readFileSync(LayerOverviewUtils.themePath + themeFile.id + ".json", 'utf8'))) + skippedThemes.push(themeFile.id) + continue; + } + recompiledThemes.push(themeFile.id) + } new PrevalidateTheme().convertStrict(themeFile, themePath) try { @@ -290,6 +349,9 @@ class LayerOverviewUtils { mustHaveLanguage: t.mustHaveLanguage?.length > 0, } })); + + console.log("Recompiled themes " + recompiledThemes.join(", ") + " and skipped " + skippedThemes.length + " themes") + return fixed; } diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index ccbcdb7b6..cc0387e7b 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -248,7 +248,7 @@ class TranslationPart { if (lang === "en" || usedByLanguage === "en") { errors.push({ - error: `The translation for ${key} does not have the required subpart ${part}. + error: `The translation for ${key} does not have the required subpart ${part} (in ${usedByLanguage}). \tThe full translation is ${value} \t${fixLink}`, path: path diff --git a/test.ts b/test.ts index 885ca13c3..e25a2ad54 100644 --- a/test.ts +++ b/test.ts @@ -1,51 +1,52 @@ -import {UIEventSource} from "./Logic/UIEventSource"; -import TagRenderingQuestion from "./UI/Popup/TagRenderingQuestion"; -import TagRenderingConfig from "./Models/ThemeConfig/TagRenderingConfig"; -import {RadioButton} from "./UI/Input/RadioButton"; -import {FixedInputElement} from "./UI/Input/FixedInputElement"; +import * as shops from "./assets/generated/layers/shops.json" +import Combine from "./UI/Base/Combine"; +import Img from "./UI/Base/Img"; +import BaseUIElement from "./UI/BaseUIElement"; import {VariableUiElement} from "./UI/Base/VariableUIElement"; -import ValidatedTextField from "./UI/Input/ValidatedTextField"; -import VariableInputElement from "./UI/Input/VariableInputElement"; +import LanguagePicker from "./UI/LanguagePicker"; +import TagRenderingConfig, {Mapping} from "./Models/ThemeConfig/TagRenderingConfig"; +import {MappingConfigJson} from "./Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson"; +import {FixedUiElement} from "./UI/Base/FixedUiElement"; +import {TagsFilter} from "./Logic/Tags/TagsFilter"; +import {SearchablePillsSelector} from "./UI/Input/SearchableMappingsSelector"; +import {UIEventSource} from "./Logic/UIEventSource"; -const config = new TagRenderingConfig({ - question: "What is the name?", - render: "The name is {name}", - freeform: { - key: 'name', - inline:true - }, - mappings:[ - { - if:"noname=yes", - then: "This feature has no name" - } - ] -}) +const mappingsRaw: MappingConfigJson[] = shops.tagRenderings.find(tr => tr.id == "shop_types").mappings +const mappings = mappingsRaw.map((m, i) => TagRenderingConfig.ExtractMapping(m, i, "test", "test")) -const tags = new UIEventSource({ - name: "current feature name" -}) +function fromMapping(m: Mapping): { show: BaseUIElement, value: TagsFilter, mainTerm: Record, searchTerms?: Record } { + const el: BaseUIElement = m.then + let icon: BaseUIElement + if (m.icon !== undefined) { + icon = new Img(m.icon).SetClass("h-8 w-8 pr-2") + } else { + icon = new FixedUiElement("").SetClass("h-8 w-1") + } + const show = new Combine([ + icon, + el.SetClass("block-ruby") + ]).SetClass("flex items-center") -/*new TagRenderingQuestion( - tags, config, undefined).AttachTo("maindiv")*/ -const options = new UIEventSource([]) -const rb = - new VariableInputElement( - options.map(options => { - console.trace("Construction an input element for", options) - return new RadioButton( - [ - ...options.map(o => new FixedInputElement(o,o)), - new FixedInputElement("abc", "abc"), - ValidatedTextField.ForType().ConstructInputElement() - ]) - } - - ) - + return {show, mainTerm: m.then.translations, searchTerms: m.searchTerms, value: m.if}; + +} +const search = new UIEventSource("") +const sp = new SearchablePillsSelector( + mappings.map(m => fromMapping(m)), + { + noMatchFound: new VariableUiElement(search.map(s => "Mark this a `"+s+"`")), + onNoSearch: new FixedUiElement("Search in "+mappingsRaw.length+" categories"), + selectIfSingle: true, + searchValue: search + } ) -rb.AttachTo("maindiv") -rb.GetValue().addCallbackAndRun(v => console.log("Current value is",v)) -new VariableUiElement(rb.GetValue()).AttachTo("extradiv") -window.setTimeout(() => {options.setData(["xyz","foo","bar"])},10000) \ No newline at end of file +sp.AttachTo("maindiv") + +const lp = new LanguagePicker(["en", "nl"], "") + +new Combine([ + new VariableUiElement(sp.GetValue().map(tf => new FixedUiElement("Selected tags: " + tf.map(tf => tf.asHumanString(false, false, {})).join(", ")))), + lp +]).SetClass("flex flex-col") + .AttachTo("extradiv") \ No newline at end of file diff --git a/test/scripts/GenerateCache.spec.ts b/test/scripts/GenerateCache.spec.ts index 0031079b3..a57e598b9 100644 --- a/test/scripts/GenerateCache.spec.ts +++ b/test/scripts/GenerateCache.spec.ts @@ -29,26 +29,27 @@ describe("GenerateCache", () => { it("should generate a cached file for the Natuurpunt-theme", async () => { // We use /var/tmp instead of /tmp, as more OS's (such as MAC) have this - if(!existsSync("/var/tmp")){ + const dir = "/var/tmp/" + if(!existsSync(dir)){ console.log("Not executing caching test: no temp directory found") } - if (existsSync("/var/tmp/np-cache")) { - ScriptUtils.readDirRecSync("/var/tmp/np-cache").forEach(p => unlinkSync(p)) - rmdirSync("/var/tmp/np-cache") + if (existsSync(dir+"/np-cache")) { + ScriptUtils.readDirRecSync(dir+"np-cache").forEach(p => unlinkSync(p)) + rmdirSync(dir+"np-cache") } - mkdirSync("/var/tmp/np-cache") + mkdirSync(dir+"np-cache") initDownloads( "(nwr%5B%22amenity%22%3D%22toilets%22%5D%3Bnwr%5B%22amenity%22%3D%22parking%22%5D%3Bnwr%5B%22amenity%22%3D%22bench%22%5D%3Bnwr%5B%22id%22%3D%22location_track%22%5D%3Bnwr%5B%22id%22%3D%22gps%22%5D%3Bnwr%5B%22information%22%3D%22board%22%5D%3Bnwr%5B%22leisure%22%3D%22picnic_table%22%5D%3Bnwr%5B%22man_made%22%3D%22watermill%22%5D%3Bnwr%5B%22user%3Ahome%22%3D%22yes%22%5D%3Bnwr%5B%22user%3Alocation%22%3D%22yes%22%5D%3Bnwr%5B%22leisure%22%3D%22nature_reserve%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22boundary%22%3D%22protected_area%22%5D%5B%22protect_class%22!%3D%2298%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22information%22%3D%22visitor_centre%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22information%22%3D%22office%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22route%22~%22%5E.*foot.*%24%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22route%22~%22%5E.*hiking.*%24%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22route%22~%22%5E.*bycicle.*%24%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22route%22~%22%5E.*horse.*%24%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22leisure%22%3D%22bird_hide%22%5D%5B%22operator%22~%22%5E.*%5BnN%5Datuurpunt.*%24%22%5D%3Bnwr%5B%22amenity%22%3D%22drinking_water%22%5D%5B%22access%22!%3D%22permissive%22%5D%5B%22access%22!%3D%22private%22%5D%3B)%3Bout%20body%3Bout%20meta%3B%3E%3Bout%20skel%20qt%3B" ); await main([ "natuurpunt", "12", - "/var/tmp/np-cache", + dir+"np-cache", "51.15423567022531", "3.250579833984375", "51.162821593316934", "3.262810707092285", "--generate-point-overview", "nature_reserve,visitor_information_centre" ]) await ScriptUtils.sleep(500) - const birdhides = JSON.parse(readFileSync("/var/tmp/np-cache/natuurpunt_birdhide_12_2085_1368.geojson", "UTF8")) + const birdhides = JSON.parse(readFileSync(dir+"np-cache/natuurpunt_birdhide_12_2085_1368.geojson", "UTF8")) expect(birdhides.features.length).deep.equal(5) expect(birdhides.features.some(f => f.properties.id === "node/5158056232"), "Didn't find birdhide node/5158056232 ").true diff --git a/theme.html b/theme.html index acbfb7cdf..e9a6b6e7c 100644 --- a/theme.html +++ b/theme.html @@ -48,7 +48,7 @@
-
+