Merge master

This commit is contained in:
Pieter Vander Vennet 2023-10-06 02:27:49 +02:00
commit c3041af5f7
50 changed files with 2313 additions and 1152 deletions

View file

@ -21,6 +21,7 @@
+ [description](#description) + [description](#description)
+ [payment-options](#payment-options) + [payment-options](#payment-options)
+ [payment-options-advanced](#payment-options-advanced) + [payment-options-advanced](#payment-options-advanced)
+ [payment-options-split](#payment-options-split)
+ [opening_hours_24_7](#opening_hours_24_7) + [opening_hours_24_7](#opening_hours_24_7)
+ [level](#level) + [level](#level)
+ [bicycle_rental.*bicycle_rental](#bicycle_rental*bicycle_rental) + [bicycle_rental.*bicycle_rental](#bicycle_rental*bicycle_rental)
@ -46,7 +47,6 @@
+ [opening_hours_by_appointment](#opening_hours_by_appointment) + [opening_hours_by_appointment](#opening_hours_by_appointment)
+ [multilevels](#multilevels) + [multilevels](#multilevels)
+ [induction-loop](#induction-loop) + [induction-loop](#induction-loop)
+ [payment-options-split](#payment-options-split)
+ [denominations-coins](#denominations-coins) + [denominations-coins](#denominations-coins)
+ [check_date](#check_date) + [check_date](#check_date)
+ [all_tags](#all_tags) + [all_tags](#all_tags)
@ -56,6 +56,7 @@
+ [mastodon](#mastodon) + [mastodon](#mastodon)
+ [contact](#contact) + [contact](#contact)
+ [etymology.wikipedia-etymology](#etymologywikipedia-etymology) + [etymology.wikipedia-etymology](#etymologywikipedia-etymology)
+ [toilet.relevant-questions](#toiletrelevant-questions)
+ [denominations-notes](#denominations-notes) + [denominations-notes](#denominations-notes)
+ [single_level](#single_level) + [single_level](#single_level)
+ [survey_date](#survey_date) + [survey_date](#survey_date)
@ -410,6 +411,23 @@
### payment-options-split
- bicycle_tube_vending_machine
- elongated_coin
- parking_ticket_machine
- shower
- ticket_machine
- toilet
- vending_machine
### opening_hours_24_7 ### opening_hours_24_7
@ -753,22 +771,6 @@
### payment-options-split
- elongated_coin
- parking_ticket_machine
- shower
- ticket_machine
- toilet
- vending_machine
### denominations-coins ### denominations-coins
@ -866,6 +868,17 @@
- indoors
### toilet.relevant-questions
- indoors - indoors

View file

@ -47,7 +47,7 @@ this quick overview is incomplete
attribute | type | values which are supported by this layer attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------ ----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | [string](../SpecialInputElements.md#string) | [drinks](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddrinks) [sweets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dsweets) [food](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dfood) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcigarettes) [condoms](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcondoms) [coffee](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcoffee) [water](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dwater) [newspapers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dnewspapers) [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [milk](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmilk) [bread](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbread) [eggs](https://wiki.openstreetmap.org/wiki/Tag:vending%3Deggs) [cheese](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcheese) [honey](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dhoney) [potatoes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpotatoes) [flowers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dflowers) [parking_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dparking_tickets) [elongated_coin](https://wiki.openstreetmap.org/wiki/Tag:vending%3Delongated_coin) [public_transport_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpublic_transport_tickets) [meat](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmeat) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | [string](../SpecialInputElements.md#string) | [drinks](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddrinks) [sweets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dsweets) [food](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dfood) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcigarettes) [condoms](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcondoms) [coffee](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcoffee) [water](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dwater) [newspapers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dnewspapers) [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [milk](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmilk) [bread](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbread) [eggs](https://wiki.openstreetmap.org/wiki/Tag:vending%3Deggs) [cheese](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcheese) [honey](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dhoney) [potatoes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpotatoes) [meat](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmeat) [flowers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dflowers) [parking_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dparking_tickets) [elongated_coin](https://wiki.openstreetmap.org/wiki/Tag:vending%3Delongated_coin) [public_transport_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpublic_transport_tickets) [bicycle_light](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_light) [gloves](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dgloves) [bicycle_repair_kit](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_repair_kit) [bicycle_pump](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_pump) [bicycle_lock](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_lock)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR) [0.05 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 CHF) [0.10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 CHF) [0.20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 CHF) [0.50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 CHF) [1 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 CHF) [2 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 CHF) [5 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D5 CHF) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR) [0.05 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 CHF) [0.10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 CHF) [0.20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 CHF) [0.50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 CHF) [1 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 CHF) [2 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 CHF) [5 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D5 CHF)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR) [10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 CHF) [20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 CHF) [50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 CHF) [100 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 CHF) [200 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 CHF) [1000 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D1000 CHF) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR) [10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 CHF) [20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 CHF) [50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 CHF) [100 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 CHF) [200 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 CHF) [1000 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D1000 CHF)
@ -119,11 +119,16 @@ This is rendered with `This vending machine sells {vending}`
- *Cheese is sold* corresponds with `vending=cheese` - *Cheese is sold* corresponds with `vending=cheese`
- *Honey is sold* corresponds with `vending=honey` - *Honey is sold* corresponds with `vending=honey`
- *Potatoes are sold* corresponds with `vending=potatoes` - *Potatoes are sold* corresponds with `vending=potatoes`
- *Meat is sold* corresponds with `vending=meat`
- *Flowers are sold* corresponds with `vending=flowers` - *Flowers are sold* corresponds with `vending=flowers`
- *Parking tickets are sold* corresponds with `vending=parking_tickets` - *Parking tickets are sold* corresponds with `vending=parking_tickets`
- *Pressed pennies are sold* corresponds with `vending=elongated_coin` - *Pressed pennies are sold* corresponds with `vending=elongated_coin`
- *Public transport tickets are sold* corresponds with `vending=public_transport_tickets` - *Public transport tickets are sold* corresponds with `vending=public_transport_tickets`
- *Meat products are being sold* corresponds with `vending=meat` - *Bicycle lights are sold* corresponds with `vending=bicycle_light`
- *Gloves are sold* corresponds with `vending=gloves`
- *Bicycle repair kits are sold* corresponds with `vending=bicycle_repair_kit`
- *Bicycle pumps are sold* corresponds with `vending=bicycle_pump`
- *Bicycle locks are sold* corresponds with `vending=bicycle_lock`
@ -429,11 +434,16 @@ vending.12 | Sale of eggs | vending~^(.*eggs.*)$
vending.13 | Sale of cheese | vending~^(.*cheese.*)$ vending.13 | Sale of cheese | vending~^(.*cheese.*)$
vending.14 | Sale of honey | vending~^(.*honey.*)$ vending.14 | Sale of honey | vending~^(.*honey.*)$
vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$ vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$
vending.16 | Sale of flowers | vending~^(.*flowers.*)$ vending.16 | Sale of meat | vending~^(.*meat.*)$
vending.17 | Sale of parking | vending~^(.*parking_tickets.*)$ vending.17 | Sale of flowers | vending~^(.*flowers.*)$
vending.18 | Sale of pressed pennies | vending=elongated_coin vending.18 | Sale of parking tickets | vending~^(.*parking_tickets.*)$
vending.19 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$ vending.19 | Sale of pressed pennies | vending=elongated_coin
vending.20 | Sale of meat products | vending=meat vending.20 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$
vending.21 | Sale of bicycle lights | vending=bicycle_light
vending.22 | Sale of gloves | vending=gloves
vending.23 | Sale of bicycle repair kits | vending=bicycle_repair_kit
vending.24 | Sale of bicycle pumps | vending=bicycle_pump
vending.25 | Sale of bicycle locks | vending=bicycle_lock
This document is autogenerated from [assets/themes/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/vending_machine/vending_machine.json) This document is autogenerated from [assets/themes/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/vending_machine/vending_machine.json)

View file

@ -51,6 +51,7 @@ attribute | type | values which are supported by this layer
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/brand#values) [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | [Continental](https://wiki.openstreetmap.org/wiki/Tag:brand%3DContinental) [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:brand%3DSchwalbe) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/brand#values) [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | [Continental](https://wiki.openstreetmap.org/wiki/Tag:brand%3DContinental) [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:brand%3DSchwalbe)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:operator%3DSchwalbe) [Continental](https://wiki.openstreetmap.org/wiki/Tag:operator%3DContinental) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:operator%3DSchwalbe) [Continental](https://wiki.openstreetmap.org/wiki/Tag:operator%3DContinental)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | Multiple choice | [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [bicycle_light](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_light) [gloves](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dgloves) [bicycle_repair_kit](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_repair_kit) [bicycle_pump](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_pump) [bicycle_lock](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_lock)
@ -121,22 +122,32 @@ This is rendered with `A bicycle tube costs {charge}`
### vending-machine-payment-methods ### payment-options-split
The question is *How can one pay at this tube vending machine?* The question is *Which methods of payment are accepted here?*
- *Payment with coins is possible* corresponds with `payment:coins=yes` - *Cash is accepted here* corresponds with `payment:cash=yes`
- This option cannot be chosen as answer
- Unselecting this answer will add
- *Payment cards are accepted here* corresponds with `payment:cards=yes`
- This option cannot be chosen as answer
- Unselecting this answer will add
- *Payment by QR-code is possible here* corresponds with `payment:qr_code=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:qr_code' target='_blank'>payment:qr_code</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:qr_code%3Dno' target='_blank'>no</a>
- *Coins are accepted here* corresponds with `payment:coins=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:coins' target='_blank'>payment:coins</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:coins%3Dno' target='_blank'>no</a> - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:coins' target='_blank'>payment:coins</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:coins%3Dno' target='_blank'>no</a>
- *Payment with notes is possible* corresponds with `payment:notes=yes` - *Bank notes are accepted here* corresponds with `payment:notes=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:notes' target='_blank'>payment:notes</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:notes%3Dno' target='_blank'>no</a> - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:notes' target='_blank'>payment:notes</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:notes%3Dno' target='_blank'>no</a>
- *Payment with cards is possible* corresponds with `payment:cards=yes` - *Debit cards are accepted here* corresponds with `payment:debit_cards=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:cards' target='_blank'>payment:cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:cards%3Dno' target='_blank'>no</a> - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:debit_cards' target='_blank'>payment:debit_cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:debit_cards%3Dno' target='_blank'>no</a>
- *Credit cards are accepted here* corresponds with `payment:credit_cards=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:credit_cards' target='_blank'>payment:credit_cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:credit_cards%3Dno' target='_blank'>no</a>
@ -181,26 +192,22 @@ This is rendered with `This vending machine is maintained by {operator}`
### bicycle_tube_vending_maching-other-items ### other-items-vending
The question is *Are other bicycle bicycle accessories sold here?* The question is *Are other biycle accessories sold here?*
- *Bicycle lights are sold here* corresponds with `vending:bicycle_light=yes` - *Bicycle inner tubes are sold here* corresponds with `vending=bicycle_tube`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:bicycle_light' target='_blank'>vending:bicycle_light</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:bicycle_light%3Dno' target='_blank'>no</a> - *Bicycle lights are sold here* corresponds with `vending=bicycle_light`
- *Gloves are sold here* corresponds with `vending:gloves=yes` - *Gloves are sold here* corresponds with `vending=gloves`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:gloves' target='_blank'>vending:gloves</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:gloves%3Dno' target='_blank'>no</a> - *Bicycle repair kits are sold here* corresponds with `vending=bicycle_repair_kit`
- *Bicycle repair kits are sold here* corresponds with `vending:bicycle_repair_kit=yes` - *Bicycle pumps are sold here* corresponds with `vending=bicycle_pump`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:bicycle_repair_kit' target='_blank'>vending:bicycle_repair_kit</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:bicycle_repair_kit%3Dno' target='_blank'>no</a> - *Bicycle locks are sold here* corresponds with `vending=bicycle_lock`
- *Bicycle pumps are sold here* corresponds with `vending:bicycle_pump=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:bicycle_pump' target='_blank'>vending:bicycle_pump</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:bicycle_pump%3Dno' target='_blank'>no</a>
- *Bicycle locks are sold here* corresponds with `vending:bicycle_lock=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:bicycle_lock' target='_blank'>vending:bicycle_lock</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:bicycle_lock%3Dno' target='_blank'>no</a>

View file

@ -55,6 +55,17 @@ attribute | type | values which are supported by this layer
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/room#values) [room](https://wiki.openstreetmap.org/wiki/Key:room) | Multiple choice | [administration](https://wiki.openstreetmap.org/wiki/Tag:room%3Dadministration) [auditorium](https://wiki.openstreetmap.org/wiki/Tag:room%3Dauditorium) [bedroom](https://wiki.openstreetmap.org/wiki/Tag:room%3Dbedroom) [chapel](https://wiki.openstreetmap.org/wiki/Tag:room%3Dchapel) [class](https://wiki.openstreetmap.org/wiki/Tag:room%3Dclass) [computer](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcomputer) [conference](https://wiki.openstreetmap.org/wiki/Tag:room%3Dconference) [crypt](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcrypt) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:room%3Dkitchen) [laboratory](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlaboratory) [library](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlibrary) [locker](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlocker) [nursery](https://wiki.openstreetmap.org/wiki/Tag:room%3Dnursery) [office](https://wiki.openstreetmap.org/wiki/Tag:room%3Doffice) [prison_cell](https://wiki.openstreetmap.org/wiki/Tag:room%3Dprison_cell) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:room%3Drestaurant) [security_check](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsecurity_check) [sport](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsport) [storage](https://wiki.openstreetmap.org/wiki/Tag:room%3Dstorage) [technical](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtechnical) [toilets](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtoilets) [waiting](https://wiki.openstreetmap.org/wiki/Tag:room%3Dwaiting) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/room#values) [room](https://wiki.openstreetmap.org/wiki/Key:room) | Multiple choice | [administration](https://wiki.openstreetmap.org/wiki/Tag:room%3Dadministration) [auditorium](https://wiki.openstreetmap.org/wiki/Tag:room%3Dauditorium) [bedroom](https://wiki.openstreetmap.org/wiki/Tag:room%3Dbedroom) [chapel](https://wiki.openstreetmap.org/wiki/Tag:room%3Dchapel) [class](https://wiki.openstreetmap.org/wiki/Tag:room%3Dclass) [computer](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcomputer) [conference](https://wiki.openstreetmap.org/wiki/Tag:room%3Dconference) [crypt](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcrypt) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:room%3Dkitchen) [laboratory](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlaboratory) [library](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlibrary) [locker](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlocker) [nursery](https://wiki.openstreetmap.org/wiki/Tag:room%3Dnursery) [office](https://wiki.openstreetmap.org/wiki/Tag:room%3Doffice) [prison_cell](https://wiki.openstreetmap.org/wiki/Tag:room%3Dprison_cell) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:room%3Drestaurant) [security_check](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsecurity_check) [sport](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsport) [storage](https://wiki.openstreetmap.org/wiki/Tag:room%3Dstorage) [technical](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtechnical) [toilets](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtoilets) [waiting](https://wiki.openstreetmap.org/wiki/Tag:room%3Dwaiting)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name:etymology:wikidata#values) [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name:etymology:wikidata#values) [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) |
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | [string](../SpecialInputElements.md#string) | [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) [no](https://wiki.openstreetmap.org/wiki/Tag:access%3Dno) [key](https://wiki.openstreetmap.org/wiki/Tag:access%3Dkey)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/fee#values) [fee](https://wiki.openstreetmap.org/wiki/Key:fee) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dno)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/door:width#values) [door:width](https://wiki.openstreetmap.org/wiki/Key:door:width) | [pfloat](../SpecialInputElements.md#pfloat) |
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/toilets:position#values) [toilets:position](https://wiki.openstreetmap.org/wiki/Key:toilets:position) | Multiple choice | [seated](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dseated) [urinal](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Durinal) [squat](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dsquat) [seated;urinal](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dseated;urinal)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/changing_table#values) [changing_table](https://wiki.openstreetmap.org/wiki/Key:changing_table) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:changing_table%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:changing_table%3Dno)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/changing_table:location#values) [changing_table:location](https://wiki.openstreetmap.org/wiki/Key:changing_table:location) | [string](../SpecialInputElements.md#string) | [female_toilet](https://wiki.openstreetmap.org/wiki/Tag:changing_table:location%3Dfemale_toilet) [male_toilet](https://wiki.openstreetmap.org/wiki/Tag:changing_table:location%3Dmale_toilet) [wheelchair_toilet](https://wiki.openstreetmap.org/wiki/Tag:changing_table:location%3Dwheelchair_toilet) [dedicated_room](https://wiki.openstreetmap.org/wiki/Tag:changing_table:location%3Ddedicated_room)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/toilets:handwashing#values) [toilets:handwashing](https://wiki.openstreetmap.org/wiki/Key:toilets:handwashing) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:toilets:handwashing%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:toilets:handwashing%3Dno)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/toilets:paper_supplied#values) [toilets:paper_supplied](https://wiki.openstreetmap.org/wiki/Key:toilets:paper_supplied) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:toilets:paper_supplied%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:toilets:paper_supplied%3Dno)
@ -231,6 +242,276 @@ This is rendered with `<h3>Wikipedia article of the name giver</h3>{wikipedia(n
### toilet-access
The question is *Are these toilets publicly accessible?*
This rendering asks information about the property [access](https://wiki.openstreetmap.org/wiki/Key:access)
This is rendered with `Access is {access}`
- *Public access* corresponds with `access=yes`
- *Only access to customers* corresponds with `access=customers`
- *Not accessible* corresponds with `access=no`
- *Accessible, but one has to ask a key to enter* corresponds with `access=key`
- *Public access* corresponds with `access=public`
- This option cannot be chosen as answer
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets`
This tagrendering has labels `relevant-questions`
### toilets-fee
The question is *Are these toilets free to use?*
- *These are paid toilets* corresponds with `fee=yes`
- *Free to use* corresponds with `fee=no`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&access!=no`
This tagrendering has labels `relevant-questions`
### toilet-charge
The question is *How much does one have to pay for these toilets?*
This rendering asks information about the property [charge](https://wiki.openstreetmap.org/wiki/Key:charge)
This is rendered with `The fee is {charge}`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&fee=yes`
This tagrendering has labels `relevant-questions`
### payment-options-split
The question is *Which methods of payment are accepted here?*
- *Cash is accepted here* corresponds with `payment:cash=yes`
- This option cannot be chosen as answer
- Unselecting this answer will add
- *Payment cards are accepted here* corresponds with `payment:cards=yes`
- This option cannot be chosen as answer
- Unselecting this answer will add
- *Payment by QR-code is possible here* corresponds with `payment:qr_code=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:qr_code' target='_blank'>payment:qr_code</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:qr_code%3Dno' target='_blank'>no</a>
- *Coins are accepted here* corresponds with `payment:coins=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:coins' target='_blank'>payment:coins</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:coins%3Dno' target='_blank'>no</a>
- *Bank notes are accepted here* corresponds with `payment:notes=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:notes' target='_blank'>payment:notes</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:notes%3Dno' target='_blank'>no</a>
- *Debit cards are accepted here* corresponds with `payment:debit_cards=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:debit_cards' target='_blank'>payment:debit_cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:debit_cards%3Dno' target='_blank'>no</a>
- *Credit cards are accepted here* corresponds with `payment:credit_cards=yes`
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:credit_cards' target='_blank'>payment:credit_cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:credit_cards%3Dno' target='_blank'>no</a>
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&fee=yes`
This tagrendering has labels `relevant-questions`
### opening_hours_24_7
The question is *When are these toilets opened?*
This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours)
This is rendered with `<h3>Opening hours</h3>{opening_hours_table(opening_hours)}`
- *24/7 opened (including holidays)* corresponds with `opening_hours=24/7`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&access!=no`
This tagrendering has labels `relevant-questions`
### toilets-wheelchair
The question is *Is there a dedicated toilet for wheelchair users?*
- *There is a dedicated toilet for wheelchair users* corresponds with `wheelchair=yes`
- *No wheelchair access* corresponds with `wheelchair=no`
- *There is only a dedicated toilet for wheelchair users* corresponds with `wheelchair=designated`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets`
This tagrendering has labels `relevant-questions`
### wheelchair-door-width
The question is *What is the width of the door to the wheelchair accessible toilet?*
This rendering asks information about the property [door:width](https://wiki.openstreetmap.org/wiki/Key:door:width)
This is rendered with `The door to the wheelchair-accessible toilet is {canonical(door:width)} wide`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&wheelchair=yes|wheelchair=designated`
This tagrendering has labels `relevant-questions`
### toilets-type
The question is *Which kind of toilets are this?*
- *There are only seated toilets* corresponds with `toilets:position=seated`
- *There are only urinals here* corresponds with `toilets:position=urinal`
- *There are only squat toilets here* corresponds with `toilets:position=squat`
- *Both seated toilets and urinals are available here* corresponds with `toilets:position=seated;urinal`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets`
This tagrendering has labels `relevant-questions`
### toilets-changing-table
The question is *Is a changing table (to change diapers) available?*
- *A changing table is available* corresponds with `changing_table=yes`
- *No changing table is available* corresponds with `changing_table=no`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets`
This tagrendering has labels `relevant-questions`
### toilet-changing_table:location
The question is *Where is the changing table located?*
This rendering asks information about the property [changing_table:location](https://wiki.openstreetmap.org/wiki/Key:changing_table:location)
This is rendered with `The changing table is located at {changing_table:location}`
- *The changing table is in the toilet for women. * corresponds with `changing_table:location=female_toilet`
- *The changing table is in the toilet for men. * corresponds with `changing_table:location=male_toilet`
- *The changing table is in the toilet for wheelchair users. * corresponds with `changing_table:location=wheelchair_toilet`
- *The changing table is in a dedicated room. * corresponds with `changing_table:location=dedicated_room`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&changing_table=yes`
This tagrendering has labels `relevant-questions`
### toilet-handwashing
The question is *Do these toilets have a sink to wash your hands?*
- *This toilets have a sink to wash your hands* corresponds with `toilets:handwashing=yes`
- *This toilets <b>don't</b> have a sink to wash your hands* corresponds with `toilets:handwashing=no`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets`
This tagrendering has labels `relevant-questions`
### toilet-has-paper
The question is *Does one have to bring their own toilet paper to this toilet?*
- *This toilet is equipped with toilet paper* corresponds with `toilets:paper_supplied=yes`
- *You have to bring your own toilet paper to this toilet* corresponds with `toilets:paper_supplied=no`
This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&toilets:position!=urinal`
This tagrendering has labels `relevant-questions`
### leftover-questions ### leftover-questions

View file

@ -161,6 +161,8 @@ This is rendered with `Access is {access}`
- This option cannot be chosen as answer - This option cannot be chosen as answer
This tagrendering has labels `relevant-questions`
### toilets-fee ### toilets-fee
@ -177,6 +179,8 @@ The question is *Are these toilets free to use?*
- *Free to use* corresponds with `fee=no` - *Free to use* corresponds with `fee=no`
This tagrendering has labels `relevant-questions`
### toilet-charge ### toilet-charge
@ -193,6 +197,8 @@ This is rendered with `The fee is {charge}`
This tagrendering is only visible in the popup if the following condition is met: `fee=yes` This tagrendering is only visible in the popup if the following condition is met: `fee=yes`
This tagrendering has labels `relevant-questions`
### payment-options-split ### payment-options-split
@ -225,6 +231,8 @@ The question is *Which methods of payment are accepted here?*
This tagrendering is only visible in the popup if the following condition is met: `fee=yes` This tagrendering is only visible in the popup if the following condition is met: `fee=yes`
This tagrendering has labels `relevant-questions`
### opening_hours_24_7 ### opening_hours_24_7
@ -244,6 +252,8 @@ This is rendered with `<h3>Opening hours</h3>{opening_hours_table(opening_hours
- *24/7 opened (including holidays)* corresponds with `opening_hours=24/7` - *24/7 opened (including holidays)* corresponds with `opening_hours=24/7`
This tagrendering has labels `relevant-questions`
### toilets-wheelchair ### toilets-wheelchair
@ -261,6 +271,8 @@ The question is *Is there a dedicated toilet for wheelchair users?*
- *There is only a dedicated toilet for wheelchair users* corresponds with `wheelchair=designated` - *There is only a dedicated toilet for wheelchair users* corresponds with `wheelchair=designated`
This tagrendering has labels `relevant-questions`
### wheelchair-door-width ### wheelchair-door-width
@ -277,6 +289,8 @@ This is rendered with `The door to the wheelchair-accessible toilet is {canonic
This tagrendering is only visible in the popup if the following condition is met: `wheelchair=yes|wheelchair=designated` This tagrendering is only visible in the popup if the following condition is met: `wheelchair=yes|wheelchair=designated`
This tagrendering has labels `relevant-questions`
### toilets-type ### toilets-type
@ -295,6 +309,8 @@ The question is *Which kind of toilets are this?*
- *Both seated toilets and urinals are available here* corresponds with `toilets:position=seated;urinal` - *Both seated toilets and urinals are available here* corresponds with `toilets:position=seated;urinal`
This tagrendering has labels `relevant-questions`
### toilets-changing-table ### toilets-changing-table
@ -311,6 +327,8 @@ The question is *Is a changing table (to change diapers) available?*
- *No changing table is available* corresponds with `changing_table=no` - *No changing table is available* corresponds with `changing_table=no`
This tagrendering has labels `relevant-questions`
### toilet-changing_table:location ### toilet-changing_table:location
@ -335,6 +353,8 @@ This is rendered with `The changing table is located at {changing_table:locatio
This tagrendering is only visible in the popup if the following condition is met: `changing_table=yes` This tagrendering is only visible in the popup if the following condition is met: `changing_table=yes`
This tagrendering has labels `relevant-questions`
### toilet-handwashing ### toilet-handwashing
@ -351,6 +371,8 @@ The question is *Do these toilets have a sink to wash your hands?*
- *This toilets <b>don't</b> have a sink to wash your hands* corresponds with `toilets:handwashing=no` - *This toilets <b>don't</b> have a sink to wash your hands* corresponds with `toilets:handwashing=no`
This tagrendering has labels `relevant-questions`
### toilet-has-paper ### toilet-has-paper
@ -367,6 +389,8 @@ The question is *Does one have to bring their own toilet paper to this toilet?*
- *You have to bring your own toilet paper to this toilet* corresponds with `toilets:paper_supplied=no` - *You have to bring your own toilet paper to this toilet* corresponds with `toilets:paper_supplied=no`
This tagrendering has labels `relevant-questions`
### description ### description

View file

@ -255,6 +255,8 @@ The question is *Which kind of toilets are this?*
- *Both seated toilets and urinals are available here* corresponds with `toilets:position=seated;urinal` - *Both seated toilets and urinals are available here* corresponds with `toilets:position=seated;urinal`
This tagrendering has labels `relevant-questions`
### toilets-changing-table ### toilets-changing-table
@ -271,6 +273,8 @@ The question is *Is a changing table (to change diapers) available?*
- *No changing table is available* corresponds with `changing_table=no` - *No changing table is available* corresponds with `changing_table=no`
This tagrendering has labels `relevant-questions`
### toilet-changing_table:location ### toilet-changing_table:location
@ -295,6 +299,8 @@ This is rendered with `The changing table is located at {changing_table:locatio
This tagrendering is only visible in the popup if the following condition is met: `changing_table=yes` This tagrendering is only visible in the popup if the following condition is met: `changing_table=yes`
This tagrendering has labels `relevant-questions`
### toilet-handwashing ### toilet-handwashing
@ -311,6 +317,8 @@ The question is *Do these toilets have a sink to wash your hands?*
- *This toilets <b>don't</b> have a sink to wash your hands* corresponds with `toilets:handwashing=no` - *This toilets <b>don't</b> have a sink to wash your hands* corresponds with `toilets:handwashing=no`
This tagrendering has labels `relevant-questions`
### toilet-has-paper ### toilet-has-paper
@ -327,6 +335,8 @@ The question is *Does one have to bring their own toilet paper to this toilet?*
- *You have to bring your own toilet paper to this toilet* corresponds with `toilets:paper_supplied=no` - *You have to bring your own toilet paper to this toilet* corresponds with `toilets:paper_supplied=no`
This tagrendering has labels `relevant-questions`
### description ### description

View file

@ -47,7 +47,7 @@ this quick overview is incomplete
attribute | type | values which are supported by this layer attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------ ----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | [string](../SpecialInputElements.md#string) | [drinks](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddrinks) [sweets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dsweets) [food](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dfood) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcigarettes) [condoms](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcondoms) [coffee](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcoffee) [water](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dwater) [newspapers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dnewspapers) [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [milk](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmilk) [bread](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbread) [eggs](https://wiki.openstreetmap.org/wiki/Tag:vending%3Deggs) [cheese](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcheese) [honey](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dhoney) [potatoes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpotatoes) [flowers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dflowers) [parking_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dparking_tickets) [elongated_coin](https://wiki.openstreetmap.org/wiki/Tag:vending%3Delongated_coin) [public_transport_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpublic_transport_tickets) [meat](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmeat) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | [string](../SpecialInputElements.md#string) | [drinks](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddrinks) [sweets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dsweets) [food](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dfood) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcigarettes) [condoms](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcondoms) [coffee](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcoffee) [water](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dwater) [newspapers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dnewspapers) [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [milk](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmilk) [bread](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbread) [eggs](https://wiki.openstreetmap.org/wiki/Tag:vending%3Deggs) [cheese](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcheese) [honey](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dhoney) [potatoes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpotatoes) [meat](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmeat) [flowers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dflowers) [parking_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dparking_tickets) [elongated_coin](https://wiki.openstreetmap.org/wiki/Tag:vending%3Delongated_coin) [public_transport_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpublic_transport_tickets) [bicycle_light](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_light) [gloves](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dgloves) [bicycle_repair_kit](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_repair_kit) [bicycle_pump](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_pump) [bicycle_lock](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_lock)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR) [0.05 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 CHF) [0.10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 CHF) [0.20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 CHF) [0.50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 CHF) [1 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 CHF) [2 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 CHF) [5 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D5 CHF) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR) [0.05 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 CHF) [0.10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 CHF) [0.20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 CHF) [0.50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 CHF) [1 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 CHF) [2 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 CHF) [5 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D5 CHF)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR) [10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 CHF) [20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 CHF) [50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 CHF) [100 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 CHF) [200 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 CHF) [1000 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D1000 CHF) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR) [10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 CHF) [20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 CHF) [50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 CHF) [100 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 CHF) [200 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 CHF) [1000 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D1000 CHF)
@ -119,11 +119,16 @@ This is rendered with `This vending machine sells {vending}`
- *Cheese is sold* corresponds with `vending=cheese` - *Cheese is sold* corresponds with `vending=cheese`
- *Honey is sold* corresponds with `vending=honey` - *Honey is sold* corresponds with `vending=honey`
- *Potatoes are sold* corresponds with `vending=potatoes` - *Potatoes are sold* corresponds with `vending=potatoes`
- *Meat is sold* corresponds with `vending=meat`
- *Flowers are sold* corresponds with `vending=flowers` - *Flowers are sold* corresponds with `vending=flowers`
- *Parking tickets are sold* corresponds with `vending=parking_tickets` - *Parking tickets are sold* corresponds with `vending=parking_tickets`
- *Pressed pennies are sold* corresponds with `vending=elongated_coin` - *Pressed pennies are sold* corresponds with `vending=elongated_coin`
- *Public transport tickets are sold* corresponds with `vending=public_transport_tickets` - *Public transport tickets are sold* corresponds with `vending=public_transport_tickets`
- *Meat products are being sold* corresponds with `vending=meat` - *Bicycle lights are sold* corresponds with `vending=bicycle_light`
- *Gloves are sold* corresponds with `vending=gloves`
- *Bicycle repair kits are sold* corresponds with `vending=bicycle_repair_kit`
- *Bicycle pumps are sold* corresponds with `vending=bicycle_pump`
- *Bicycle locks are sold* corresponds with `vending=bicycle_lock`
@ -429,11 +434,16 @@ vending.12 | Sale of eggs | vending~^(.*eggs.*)$
vending.13 | Sale of cheese | vending~^(.*cheese.*)$ vending.13 | Sale of cheese | vending~^(.*cheese.*)$
vending.14 | Sale of honey | vending~^(.*honey.*)$ vending.14 | Sale of honey | vending~^(.*honey.*)$
vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$ vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$
vending.16 | Sale of flowers | vending~^(.*flowers.*)$ vending.16 | Sale of meat | vending~^(.*meat.*)$
vending.17 | Sale of parking | vending~^(.*parking_tickets.*)$ vending.17 | Sale of flowers | vending~^(.*flowers.*)$
vending.18 | Sale of pressed pennies | vending=elongated_coin vending.18 | Sale of parking tickets | vending~^(.*parking_tickets.*)$
vending.19 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$ vending.19 | Sale of pressed pennies | vending=elongated_coin
vending.20 | Sale of meat products | vending=meat vending.20 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$
vending.21 | Sale of bicycle lights | vending=bicycle_light
vending.22 | Sale of gloves | vending=gloves
vending.23 | Sale of bicycle repair kits | vending=bicycle_repair_kit
vending.24 | Sale of bicycle pumps | vending=bicycle_pump
vending.25 | Sale of bicycle locks | vending=bicycle_lock
This document is autogenerated from [assets/layers/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/vending_machine/vending_machine.json) This document is autogenerated from [assets/layers/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/vending_machine/vending_machine.json)

View file

@ -49,7 +49,7 @@ this quick overview is incomplete
attribute | type | values which are supported by this layer attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------ ----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/waste#values) [waste](https://wiki.openstreetmap.org/wiki/Key:waste) | Multiple choice | [trash](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dtrash) [dog_excrement](https://wiki.openstreetmap.org/wiki/Tag:waste%3Ddog_excrement) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dcigarettes) [drugs](https://wiki.openstreetmap.org/wiki/Tag:waste%3Ddrugs) [sharps](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dsharps) [plastic](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dplastic) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/waste#values) [waste](https://wiki.openstreetmap.org/wiki/Key:waste) | Multiple choice | [trash](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dtrash) [dog_excrement](https://wiki.openstreetmap.org/wiki/Tag:waste%3Ddog_excrement) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dcigarettes) [drugs](https://wiki.openstreetmap.org/wiki/Tag:waste%3Ddrugs) [sharps](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dsharps) [plastic](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dplastic) [paper](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dpaper)
[<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | Multiple choice | [dog_excrement_bag](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddog_excrement_bag) [](https://wiki.openstreetmap.org/wiki/Tag:vending%3D) [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | Multiple choice | [dog_excrement_bag](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddog_excrement_bag) [](https://wiki.openstreetmap.org/wiki/Tag:vending%3D)
@ -104,6 +104,7 @@ The question is *What kind of waste basket is this?*
- *A waste basket for drugs* corresponds with `waste=drugs` - *A waste basket for drugs* corresponds with `waste=drugs`
- *A waste basket for needles and other sharp objects* corresponds with `waste=sharps` - *A waste basket for needles and other sharp objects* corresponds with `waste=sharps`
- *A waste basket for plastic* corresponds with `waste=plastic` - *A waste basket for plastic* corresponds with `waste=plastic`
- *A waste basket for paper* corresponds with `waste=paper`

View file

@ -988,18 +988,38 @@
"description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" "description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')"
}, },
{ {
"key": "payment:coins", "key": "payment:cash",
"description": "Layer 'Bicycle tube vending machine' shows payment:coins=yes with a fixed text, namely 'Payment with coins is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "description": "Layer 'Bicycle tube vending machine' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes"
},
{
"key": "payment:notes",
"description": "Layer 'Bicycle tube vending machine' shows payment:notes=yes with a fixed text, namely 'Payment with notes is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes" "value": "yes"
}, },
{ {
"key": "payment:cards", "key": "payment:cards",
"description": "Layer 'Bicycle tube vending machine' shows payment:cards=yes with a fixed text, namely 'Payment with cards is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "description": "Layer 'Bicycle tube vending machine' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes"
},
{
"key": "payment:qr_code",
"description": "Layer 'Bicycle tube vending machine' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes"
},
{
"key": "payment:coins",
"description": "Layer 'Bicycle tube vending machine' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes"
},
{
"key": "payment:notes",
"description": "Layer 'Bicycle tube vending machine' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes"
},
{
"key": "payment:debit_cards",
"description": "Layer 'Bicycle tube vending machine' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes"
},
{
"key": "payment:credit_cards",
"description": "Layer 'Bicycle tube vending machine' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes" "value": "yes"
}, },
{ {
@ -1031,29 +1051,34 @@
"value": "Continental" "value": "Continental"
}, },
{ {
"key": "vending:bicycle_light", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_light=yes with a fixed text, namely 'Bicycle lights are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_tube with a fixed text, namely 'Bicycle inner tubes are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes" "value": "bicycle_tube"
}, },
{ {
"key": "vending:gloves", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:gloves=yes with a fixed text, namely 'Gloves are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_light with a fixed text, namely 'Bicycle lights are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes" "value": "bicycle_light"
}, },
{ {
"key": "vending:bicycle_repair_kit", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_repair_kit=yes with a fixed text, namely 'Bicycle repair kits are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "description": "Layer 'Bicycle tube vending machine' shows vending=gloves with a fixed text, namely 'Gloves are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes" "value": "gloves"
}, },
{ {
"key": "vending:bicycle_pump", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_pump=yes with a fixed text, namely 'Bicycle pumps are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_repair_kit with a fixed text, namely 'Bicycle repair kits are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes" "value": "bicycle_repair_kit"
}, },
{ {
"key": "vending:bicycle_lock", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_lock=yes with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_pump with a fixed text, namely 'Bicycle pumps are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "yes" "value": "bicycle_pump"
},
{
"key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_lock with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')",
"value": "bicycle_lock"
}, },
{ {
"key": "amenity", "key": "amenity",

View file

@ -215,6 +215,186 @@
"key": "name:etymology:wikidata", "key": "name:etymology:wikidata",
"description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Indoors') (This is only shown if name:etymology!=unknown)" "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Indoors') (This is only shown if name:etymology!=unknown)"
}, },
{
"key": "access",
"description": "Layer 'Indoors' shows and asks freeform values for key 'access' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=yes with a fixed text, namely 'Public access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "yes"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=customers with a fixed text, namely 'Only access to customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "customers"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "no"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=key with a fixed text, namely 'Accessible, but one has to ask a key to enter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "key"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=public with a fixed text, namely 'Public access' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "public"
},
{
"key": "fee",
"description": "Layer 'Indoors' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)",
"value": "yes"
},
{
"key": "fee",
"description": "Layer 'Indoors' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)",
"value": "no"
},
{
"key": "charge",
"description": "Layer 'Indoors' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)"
},
{
"key": "payment:cash",
"description": "Layer 'Indoors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:cards",
"description": "Layer 'Indoors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:qr_code",
"description": "Layer 'Indoors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:coins",
"description": "Layer 'Indoors' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:notes",
"description": "Layer 'Indoors' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:debit_cards",
"description": "Layer 'Indoors' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:credit_cards",
"description": "Layer 'Indoors' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "opening_hours",
"description": "Layer 'Indoors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)"
},
{
"key": "opening_hours",
"description": "Layer 'Indoors' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)",
"value": "24/7"
},
{
"key": "wheelchair",
"description": "Layer 'Indoors' shows wheelchair=yes with a fixed text, namely 'There is a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "yes"
},
{
"key": "wheelchair",
"description": "Layer 'Indoors' shows wheelchair=no with a fixed text, namely 'No wheelchair access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "no"
},
{
"key": "wheelchair",
"description": "Layer 'Indoors' shows wheelchair=designated with a fixed text, namely 'There is only a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "designated"
},
{
"key": "door:width",
"description": "Layer 'Indoors' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&wheelchair=yes|wheelchair=designated)"
},
{
"key": "toilets:position",
"description": "Layer 'Indoors' shows toilets:position=seated with a fixed text, namely 'There are only seated toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "seated"
},
{
"key": "toilets:position",
"description": "Layer 'Indoors' shows toilets:position=urinal with a fixed text, namely 'There are only urinals here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "urinal"
},
{
"key": "toilets:position",
"description": "Layer 'Indoors' shows toilets:position=squat with a fixed text, namely 'There are only squat toilets here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "squat"
},
{
"key": "toilets:position",
"description": "Layer 'Indoors' shows toilets:position=seated;urinal with a fixed text, namely 'Both seated toilets and urinals are available here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "seated;urinal"
},
{
"key": "changing_table",
"description": "Layer 'Indoors' shows changing_table=yes with a fixed text, namely 'A changing table is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "yes"
},
{
"key": "changing_table",
"description": "Layer 'Indoors' shows changing_table=no with a fixed text, namely 'No changing table is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "no"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows and asks freeform values for key 'changing_table:location' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)",
"value": "female_toilet"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)",
"value": "male_toilet"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)",
"value": "wheelchair_toilet"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)",
"value": "dedicated_room"
},
{
"key": "toilets:handwashing",
"description": "Layer 'Indoors' shows toilets:handwashing=yes with a fixed text, namely 'This toilets have a sink to wash your hands' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "yes"
},
{
"key": "toilets:handwashing",
"description": "Layer 'Indoors' shows toilets:handwashing=no with a fixed text, namely 'This toilets <b>don't</b> have a sink to wash your hands' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)",
"value": "no"
},
{
"key": "toilets:paper_supplied",
"description": "Layer 'Indoors' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&toilets:position!=urinal)",
"value": "yes"
},
{
"key": "toilets:paper_supplied",
"description": "Layer 'Indoors' shows toilets:paper_supplied=no with a fixed text, namely 'You have to bring your own toilet paper to this toilet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&toilets:position!=urinal)",
"value": "no"
},
{ {
"key": "highway", "key": "highway",
"description": "The MapComplete theme Indoors has a layer Pedestrian paths showing features with this tag", "description": "The MapComplete theme Indoors has a layer Pedestrian paths showing features with this tag",

View file

@ -1514,18 +1514,38 @@
"description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme')" "description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme')"
}, },
{ {
"key": "payment:coins", "key": "payment:cash",
"description": "Layer 'Bicycle tube vending machine' shows payment:coins=yes with a fixed text, namely 'Payment with coins is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Bicycle tube vending machine' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme')",
"value": "yes"
},
{
"key": "payment:notes",
"description": "Layer 'Bicycle tube vending machine' shows payment:notes=yes with a fixed text, namely 'Payment with notes is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes" "value": "yes"
}, },
{ {
"key": "payment:cards", "key": "payment:cards",
"description": "Layer 'Bicycle tube vending machine' shows payment:cards=yes with a fixed text, namely 'Payment with cards is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Bicycle tube vending machine' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme')",
"value": "yes"
},
{
"key": "payment:qr_code",
"description": "Layer 'Bicycle tube vending machine' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes"
},
{
"key": "payment:coins",
"description": "Layer 'Bicycle tube vending machine' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes"
},
{
"key": "payment:notes",
"description": "Layer 'Bicycle tube vending machine' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes"
},
{
"key": "payment:debit_cards",
"description": "Layer 'Bicycle tube vending machine' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes"
},
{
"key": "payment:credit_cards",
"description": "Layer 'Bicycle tube vending machine' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes" "value": "yes"
}, },
{ {
@ -1557,29 +1577,34 @@
"value": "Continental" "value": "Continental"
}, },
{ {
"key": "vending:bicycle_light", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_light=yes with a fixed text, namely 'Bicycle lights are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_tube with a fixed text, namely 'Bicycle inner tubes are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes" "value": "bicycle_tube"
}, },
{ {
"key": "vending:gloves", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:gloves=yes with a fixed text, namely 'Gloves are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_light with a fixed text, namely 'Bicycle lights are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes" "value": "bicycle_light"
}, },
{ {
"key": "vending:bicycle_repair_kit", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_repair_kit=yes with a fixed text, namely 'Bicycle repair kits are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Bicycle tube vending machine' shows vending=gloves with a fixed text, namely 'Gloves are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes" "value": "gloves"
}, },
{ {
"key": "vending:bicycle_pump", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_pump=yes with a fixed text, namely 'Bicycle pumps are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_repair_kit with a fixed text, namely 'Bicycle repair kits are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes" "value": "bicycle_repair_kit"
}, },
{ {
"key": "vending:bicycle_lock", "key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_lock=yes with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_pump with a fixed text, namely 'Bicycle pumps are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "yes" "value": "bicycle_pump"
},
{
"key": "vending",
"description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_lock with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "bicycle_lock"
}, },
{ {
"key": "amenity", "key": "amenity",
@ -8548,6 +8573,186 @@
"key": "name:etymology:wikidata", "key": "name:etymology:wikidata",
"description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology!=unknown)" "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology!=unknown)"
}, },
{
"key": "access",
"description": "Layer 'Indoors' shows and asks freeform values for key 'access' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=yes with a fixed text, namely 'Public access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "yes"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=customers with a fixed text, namely 'Only access to customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "customers"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "no"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=key with a fixed text, namely 'Accessible, but one has to ask a key to enter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "key"
},
{
"key": "access",
"description": "Layer 'Indoors' shows access=public with a fixed text, namely 'Public access' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "public"
},
{
"key": "fee",
"description": "Layer 'Indoors' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)",
"value": "yes"
},
{
"key": "fee",
"description": "Layer 'Indoors' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)",
"value": "no"
},
{
"key": "charge",
"description": "Layer 'Indoors' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)"
},
{
"key": "payment:cash",
"description": "Layer 'Indoors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:cards",
"description": "Layer 'Indoors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:qr_code",
"description": "Layer 'Indoors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:coins",
"description": "Layer 'Indoors' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:notes",
"description": "Layer 'Indoors' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:debit_cards",
"description": "Layer 'Indoors' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "payment:credit_cards",
"description": "Layer 'Indoors' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)",
"value": "yes"
},
{
"key": "opening_hours",
"description": "Layer 'Indoors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)"
},
{
"key": "opening_hours",
"description": "Layer 'Indoors' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)",
"value": "24/7"
},
{
"key": "wheelchair",
"description": "Layer 'Indoors' shows wheelchair=yes with a fixed text, namely 'There is a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "yes"
},
{
"key": "wheelchair",
"description": "Layer 'Indoors' shows wheelchair=no with a fixed text, namely 'No wheelchair access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "no"
},
{
"key": "wheelchair",
"description": "Layer 'Indoors' shows wheelchair=designated with a fixed text, namely 'There is only a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "designated"
},
{
"key": "door:width",
"description": "Layer 'Indoors' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&wheelchair=yes|wheelchair=designated)"
},
{
"key": "toilets:position",
"description": "Layer 'Indoors' shows toilets:position=seated with a fixed text, namely 'There are only seated toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "seated"
},
{
"key": "toilets:position",
"description": "Layer 'Indoors' shows toilets:position=urinal with a fixed text, namely 'There are only urinals here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "urinal"
},
{
"key": "toilets:position",
"description": "Layer 'Indoors' shows toilets:position=squat with a fixed text, namely 'There are only squat toilets here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "squat"
},
{
"key": "toilets:position",
"description": "Layer 'Indoors' shows toilets:position=seated;urinal with a fixed text, namely 'Both seated toilets and urinals are available here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "seated;urinal"
},
{
"key": "changing_table",
"description": "Layer 'Indoors' shows changing_table=yes with a fixed text, namely 'A changing table is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "yes"
},
{
"key": "changing_table",
"description": "Layer 'Indoors' shows changing_table=no with a fixed text, namely 'No changing table is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "no"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows and asks freeform values for key 'changing_table:location' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)",
"value": "female_toilet"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)",
"value": "male_toilet"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)",
"value": "wheelchair_toilet"
},
{
"key": "changing_table:location",
"description": "Layer 'Indoors' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)",
"value": "dedicated_room"
},
{
"key": "toilets:handwashing",
"description": "Layer 'Indoors' shows toilets:handwashing=yes with a fixed text, namely 'This toilets have a sink to wash your hands' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "yes"
},
{
"key": "toilets:handwashing",
"description": "Layer 'Indoors' shows toilets:handwashing=no with a fixed text, namely 'This toilets <b>don't</b> have a sink to wash your hands' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)",
"value": "no"
},
{
"key": "toilets:paper_supplied",
"description": "Layer 'Indoors' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&toilets:position!=urinal)",
"value": "yes"
},
{
"key": "toilets:paper_supplied",
"description": "Layer 'Indoors' shows toilets:paper_supplied=no with a fixed text, namely 'You have to bring your own toilet paper to this toilet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&toilets:position!=urinal)",
"value": "no"
},
{ {
"key": "information", "key": "information",
"description": "The MapComplete theme Personal theme has a layer Information boards showing features with this tag", "description": "The MapComplete theme Personal theme has a layer Information boards showing features with this tag",
@ -14229,6 +14434,11 @@
"description": "Layer 'Vending Machines' shows vending=potatoes with a fixed text, namely 'Potatoes are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Vending Machines' shows vending=potatoes with a fixed text, namely 'Potatoes are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "potatoes" "value": "potatoes"
}, },
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=meat with a fixed text, namely 'Meat is sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "meat"
},
{ {
"key": "vending", "key": "vending",
"description": "Layer 'Vending Machines' shows vending=flowers with a fixed text, namely 'Flowers are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Vending Machines' shows vending=flowers with a fixed text, namely 'Flowers are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
@ -14251,8 +14461,28 @@
}, },
{ {
"key": "vending", "key": "vending",
"description": "Layer 'Vending Machines' shows vending=meat with a fixed text, namely 'Meat products are being sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Vending Machines' shows vending=bicycle_light with a fixed text, namely 'Bicycle lights are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "meat" "value": "bicycle_light"
},
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=gloves with a fixed text, namely 'Gloves are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "gloves"
},
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=bicycle_repair_kit with a fixed text, namely 'Bicycle repair kits are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "bicycle_repair_kit"
},
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=bicycle_pump with a fixed text, namely 'Bicycle pumps are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "bicycle_pump"
},
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=bicycle_lock with a fixed text, namely 'Bicycle locks are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "bicycle_lock"
}, },
{ {
"key": "opening_hours", "key": "opening_hours",
@ -14587,6 +14817,11 @@
"description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "plastic" "value": "plastic"
}, },
{
"key": "waste",
"description": "Layer 'Waste Basket' shows waste=paper with a fixed text, namely 'A waste basket for paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')",
"value": "paper"
},
{ {
"key": "vending", "key": "vending",
"description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if waste=dog_excrement|waste=trash|)", "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if waste=dog_excrement|waste=trash|)",

View file

@ -114,6 +114,11 @@
"description": "Layer 'Vending Machines' shows vending=potatoes with a fixed text, namely 'Potatoes are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", "description": "Layer 'Vending Machines' shows vending=potatoes with a fixed text, namely 'Potatoes are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')",
"value": "potatoes" "value": "potatoes"
}, },
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=meat with a fixed text, namely 'Meat is sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')",
"value": "meat"
},
{ {
"key": "vending", "key": "vending",
"description": "Layer 'Vending Machines' shows vending=flowers with a fixed text, namely 'Flowers are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", "description": "Layer 'Vending Machines' shows vending=flowers with a fixed text, namely 'Flowers are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')",
@ -136,8 +141,28 @@
}, },
{ {
"key": "vending", "key": "vending",
"description": "Layer 'Vending Machines' shows vending=meat with a fixed text, namely 'Meat products are being sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", "description": "Layer 'Vending Machines' shows vending=bicycle_light with a fixed text, namely 'Bicycle lights are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')",
"value": "meat" "value": "bicycle_light"
},
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=gloves with a fixed text, namely 'Gloves are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')",
"value": "gloves"
},
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=bicycle_repair_kit with a fixed text, namely 'Bicycle repair kits are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')",
"value": "bicycle_repair_kit"
},
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=bicycle_pump with a fixed text, namely 'Bicycle pumps are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')",
"value": "bicycle_pump"
},
{
"key": "vending",
"description": "Layer 'Vending Machines' shows vending=bicycle_lock with a fixed text, namely 'Bicycle locks are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')",
"value": "bicycle_lock"
}, },
{ {
"key": "opening_hours", "key": "opening_hours",

View file

@ -70,6 +70,11 @@
"description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste')", "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste')",
"value": "plastic" "value": "plastic"
}, },
{
"key": "waste",
"description": "Layer 'Waste Basket' shows waste=paper with a fixed text, namely 'A waste basket for paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste')",
"value": "paper"
},
{ {
"key": "vending", "key": "vending",
"description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') (This is only shown if waste=dog_excrement|waste=trash|)", "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') (This is only shown if waste=dog_excrement|waste=trash|)",

View file

@ -70,6 +70,11 @@
"description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket')", "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket')",
"value": "plastic" "value": "plastic"
}, },
{
"key": "waste",
"description": "Layer 'Waste Basket' shows waste=paper with a fixed text, namely 'A waste basket for paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket')",
"value": "paper"
},
{ {
"key": "vending", "key": "vending",
"description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') (This is only shown if waste=dog_excrement|waste=trash|)", "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') (This is only shown if waste=dog_excrement|waste=trash|)",

View file

@ -293,10 +293,13 @@
"internet-ssid", "internet-ssid",
"reviews" "reviews"
], ],
"minzoom": 12,
"filter": [ "filter": [
"open_now", "open_now",
"accepts_cash", "accepts_cash",
"accepts_cards" "accepts_cards",
"has_internet",
"has_electricity"
], ],
"deletion": { "deletion": {
"softDeletionTags": { "softDeletionTags": {

View file

@ -147,7 +147,8 @@
"fr": "<h3>Contient {_contained_climbing_routes_count} voies</h3> <ul>{_contained_climbing_routes}</ul>", "fr": "<h3>Contient {_contained_climbing_routes_count} voies</h3> <ul>{_contained_climbing_routes}</ul>",
"it": "<h3>Contiene {_contained_climbing_routes_count} vie</h3> <ul>{_contained_climbing_routes}</ul>", "it": "<h3>Contiene {_contained_climbing_routes_count} vie</h3> <ul>{_contained_climbing_routes}</ul>",
"de": "<h3> Enthält {_contained_climbing_routes_count} Routen</h3> <ul>{_contained_climbing_routes}</ul>", "de": "<h3> Enthält {_contained_climbing_routes_count} Routen</h3> <ul>{_contained_climbing_routes}</ul>",
"nl": "<h3>Bevat {_contained_climbing_routes_count} routes</h3> <ul>{_contained_climbing_routes}</ul>" "nl": "<h3>Bevat {_contained_climbing_routes_count} routes</h3> <ul>{_contained_climbing_routes}</ul>",
"ca": "<h3>Conté {_contained_climbing_routes_count} rutes</h3> <ul>{_contained_climbing_routes}</ul>"
}, },
"condition": "_contained_climbing_routes~*", "condition": "_contained_climbing_routes~*",
"id": "Contained_climbing_routes" "id": "Contained_climbing_routes"
@ -206,7 +207,8 @@
"fr": "Rocher descalade, rocher avec une ou peu de voie permettant descalader sans corde", "fr": "Rocher descalade, rocher avec une ou peu de voie permettant descalader sans corde",
"de": "Ein Kletterfelsen - ein einzelner Felsen oder eine Klippe mit einer oder wenigen Kletterrouten, die ohne Seil sicher bestiegen werden können", "de": "Ein Kletterfelsen - ein einzelner Felsen oder eine Klippe mit einer oder wenigen Kletterrouten, die ohne Seil sicher bestiegen werden können",
"it": "Un masso per arrampicata (una singola roccia o falesia con una o poche vie di arrampicata che possono essere scalate in sicurezza senza una corda)", "it": "Un masso per arrampicata (una singola roccia o falesia con una o poche vie di arrampicata che possono essere scalate in sicurezza senza una corda)",
"nl": "Een klimboulder - een enkele rots of klif met één of enkele klimroutes die veilig zonder touw kunnen worden beklommen" "nl": "Een klimboulder - een enkele rots of klif met één of enkele klimroutes die veilig zonder touw kunnen worden beklommen",
"ca": "Una roca d'escalada: una única roca o penya-segat amb una o unes quantes vies d'escalada que es poden escalar amb seguretat sense corda"
} }
}, },
{ {
@ -256,7 +258,8 @@
"de": "Kalkstein", "de": "Kalkstein",
"it": "Calcare", "it": "Calcare",
"pa_PK": "چونہ پتھر", "pa_PK": "چونہ پتھر",
"eu": "Kareharria" "eu": "Kareharria",
"ca": "Calcària"
} }
} }
], ],

View file

@ -272,6 +272,33 @@
"osmTags": "dog=no" "osmTags": "dog=no"
} }
] ]
},
{
"id": "has_internet",
"options": [
{
"question": {
"en": "Offers internet"
},
"osmTags": {
"or": [
"internet_access=wlan",
"internet_access=yes",
"internet_access=wired"
]
}
}
]
},
{"id": "has_electricity",
"options": [
{
"question": {
"en": "Offers electricity"
},
"osmTags": "service:electricity=yes"
}
]
} }
] ]
} }

View file

@ -250,7 +250,8 @@
"it": "Piazzata in data {start_date}", "it": "Piazzata in data {start_date}",
"fr": "Placé le {start_date}", "fr": "Placé le {start_date}",
"ru": "Установлен {start_date}", "ru": "Установлен {start_date}",
"de": "Aufgestellt am {start_date}" "de": "Aufgestellt am {start_date}",
"ca": "Col·locat el {start_date}"
}, },
"freeform": { "freeform": {
"key": "start_date", "key": "start_date",

View file

@ -342,7 +342,9 @@
"en": "These are toilets" "en": "These are toilets"
}, },
"icon": "./assets/layers/indoors/room_toilets.svg", "icon": "./assets/layers/indoors/room_toilets.svg",
"addExtraTags": ["amenity=toilets"] "addExtraTags": [
"amenity=toilets"
]
}, },
{ {
"if": "room=waiting", "if": "room=waiting",
@ -384,7 +386,9 @@
"builtin": "toilet.relevant-questions", "builtin": "toilet.relevant-questions",
"override": { "override": {
"condition": { "condition": {
"+and": ["amenity=toilets"] "+and": [
"amenity=toilets"
]
} }
} }
} }

View file

@ -47,6 +47,7 @@
"minzoom": 13, "minzoom": 13,
"tagRenderings": [ "tagRenderings": [
"images", "images",
"reviews",
{ {
"id": "name", "id": "name",
"freeform": { "freeform": {

View file

@ -51,7 +51,8 @@
"en": "{sport} is played here", "en": "{sport} is played here",
"it": "Qui si gioca a {sport}", "it": "Qui si gioca a {sport}",
"de": "Hier wird {sport} gespielt", "de": "Hier wird {sport} gespielt",
"es": "Aquí se juega al {sport}" "es": "Aquí se juega al {sport}",
"ca": "{sport} es juga aquí"
}, },
"freeform": { "freeform": {
"key": "sport" "key": "sport"
@ -62,7 +63,8 @@
"en": "Which sport can be played here?", "en": "Which sport can be played here?",
"it": "Quale sport si gioca qui?", "it": "Quale sport si gioca qui?",
"de": "Welche Sportarten können hier gespielt werden?", "de": "Welche Sportarten können hier gespielt werden?",
"es": "¿Qué deporte se practica aquí?" "es": "¿Qué deporte se puede practicar aquí?",
"ca": "Quin esport es pot practicar aquí?"
}, },
"multiAnswer": true, "multiAnswer": true,
"mappings": [ "mappings": [
@ -172,7 +174,8 @@
"then": { "then": {
"en": "This is a skatepark", "en": "This is a skatepark",
"nl": "Dit is een skatepark", "nl": "Dit is een skatepark",
"de": "Dies ist ein Skatepark" "de": "Dies ist ein Skatepark",
"ca": "Açò és un skatepark"
} }
} }
], ],
@ -235,7 +238,8 @@
"ru": "Поверхность - <b>{surface}</b>", "ru": "Поверхность - <b>{surface}</b>",
"it": "La superficie è <b>{surface}</b>", "it": "La superficie è <b>{surface}</b>",
"de": "Der Belag ist <b>{surface}</b>", "de": "Der Belag ist <b>{surface}</b>",
"es": "La superficie es <b>{surface}</b>" "es": "La superficie es <b>{surface}</b>",
"ca": "La superfícies és <b>{surface}</b>"
}, },
"freeform": { "freeform": {
"key": "surface" "key": "surface"

View file

@ -2,11 +2,13 @@
"id": "sports_centre", "id": "sports_centre",
"name": { "name": {
"en": "Sports centres", "en": "Sports centres",
"de": "Sportzentren" "de": "Sportzentren",
"ca": "Centres esportius"
}, },
"description": { "description": {
"en": "Indoor and outdoor sports centres can be found on this layer", "en": "Indoor and outdoor sports centres can be found on this layer",
"de": "Hallen- und Freiluftsportzentren sind auf dieser Ebene zu finden" "de": "Hallen- und Freiluftsportzentren sind auf dieser Ebene zu finden",
"ca": "En aquesta capa es poden trobar centres esportius interiors i exteriors"
}, },
"minzoom": 12, "minzoom": 12,
"source": { "source": {
@ -15,7 +17,8 @@
"title": { "title": {
"render": { "render": {
"en": "Sports centre", "en": "Sports centre",
"de": "Sportzentrum" "de": "Sportzentrum",
"ca": "Centre esportiu"
}, },
"mappings": [ "mappings": [
{ {
@ -36,7 +39,8 @@
{ {
"title": { "title": {
"en": "a sports centre", "en": "a sports centre",
"de": "ein Sportzentrum" "de": "ein Sportzentrum",
"ca": "un centre esportiu"
}, },
"tags": [ "tags": [
"leisure=sports_centre" "leisure=sports_centre"

View file

@ -9,7 +9,8 @@
"description": { "description": {
"en": "Layer showing stairs and escalators", "en": "Layer showing stairs and escalators",
"de": "Ebene mit Treppen und Rolltreppen", "de": "Ebene mit Treppen und Rolltreppen",
"nl": "Laag met trappen en roltrappen" "nl": "Laag met trappen en roltrappen",
"ca": "Capa que mostra escales i escales mecàniques"
}, },
"title": { "title": {
"render": { "render": {

View file

@ -349,7 +349,8 @@
"fr": "À quel niveau se trouve cette caméra ?", "fr": "À quel niveau se trouve cette caméra ?",
"it": "A che piano si trova questa videocamera?", "it": "A che piano si trova questa videocamera?",
"de": "Auf welcher Ebene befindet sich diese Kamera?", "de": "Auf welcher Ebene befindet sich diese Kamera?",
"es": "¿A qué nivel está colocada esta cámara?" "es": "¿A qué nivel está colocada esta cámara?",
"ca": "A quina planta es troba aquesta càmera?"
}, },
"render": { "render": {
"en": "Located on level {level}", "en": "Located on level {level}",

View file

@ -5,7 +5,8 @@
"nl": "Universiteiten en hogescholen", "nl": "Universiteiten en hogescholen",
"de": "Hochschulen und Universitäten", "de": "Hochschulen und Universitäten",
"fr": "Collèges et universités", "fr": "Collèges et universités",
"da": "Gymnasier og universiteter" "da": "Gymnasier og universiteter",
"ca": "Instituts superiors i universitats"
}, },
"description": "Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8)", "description": "Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8)",
"source": { "source": {
@ -42,7 +43,8 @@
"nl": "Hogeschool", "nl": "Hogeschool",
"de": "(Fach)hochschule", "de": "(Fach)hochschule",
"fr": "Établissement d'enseignement supérieur non universitaire", "fr": "Établissement d'enseignement supérieur non universitaire",
"pa_PK": "کالج" "pa_PK": "کالج",
"ca": "Institut superior"
} }
}, },
{ {
@ -64,7 +66,8 @@
"nl": "Onderwijsinstelling die tertiair onderwijs geeft", "nl": "Onderwijsinstelling die tertiair onderwijs geeft",
"de": "Schule mit tertiärem Bildungsangebot", "de": "Schule mit tertiärem Bildungsangebot",
"fr": "École dispensant un enseignement supérieur", "fr": "École dispensant un enseignement supérieur",
"da": "Skole, der udbyder videregående uddannelser" "da": "Skole, der udbyder videregående uddannelser",
"ca": "Escola que imparteix educació terciària"
} }
} }
] ]
@ -88,7 +91,8 @@
"nl": "Dit is een onderwijsinstelling waar post-secundair, niet-tertiair onderwijs wordt gegeven. Om dit onderwijs te volgen, moet je je secundair onderwijs afgewerkt hebben maar de opleiding behaalt niet het niveau van van een bachelor.", "nl": "Dit is een onderwijsinstelling waar post-secundair, niet-tertiair onderwijs wordt gegeven. Om dit onderwijs te volgen, moet je je secundair onderwijs afgewerkt hebben maar de opleiding behaalt niet het niveau van van een bachelor.",
"de": "Es handelt sich um eine postsekundäre, nicht-tertiäre Bildungseinrichtung. Man muss die Sekundarstufe abgeschlossen haben, um sich hier einzuschreiben, aber es werden keine Bachelor-Abschlüsse (oder höhere Abschlüsse) verliehen", "de": "Es handelt sich um eine postsekundäre, nicht-tertiäre Bildungseinrichtung. Man muss die Sekundarstufe abgeschlossen haben, um sich hier einzuschreiben, aber es werden keine Bachelor-Abschlüsse (oder höhere Abschlüsse) verliehen",
"fr": "C'est un établissement d'enseignement post-secondaire, non tertiaire. Il faut avoir terminé l'enseignement secondaire pour s'inscrire ici, mais aucun baccalauréat (ou diplôme supérieur) n'est délivré ici", "fr": "C'est un établissement d'enseignement post-secondaire, non tertiaire. Il faut avoir terminé l'enseignement secondaire pour s'inscrire ici, mais aucun baccalauréat (ou diplôme supérieur) n'est délivré ici",
"da": "Dette er en institution for post-gymnasial, ikke-tertiær uddannelse. Man skal have gennemført en ungdomsuddannelse for at tilmelde sig her, men her uddeles ingen bachelor (eller højere) grader" "da": "Dette er en institution for post-gymnasial, ikke-tertiær uddannelse. Man skal have gennemført en ungdomsuddannelse for at tilmelde sig her, men her uddeles ingen bachelor (eller højere) grader",
"ca": "Aquesta és una institució d'educació postsecundària i no terciària. S'ha d'haver completat l'educació secundària per matricular-se aquí, però aquí no s'obtenen títols de batxillerat (o superiors)"
} }
}, },
{ {
@ -202,7 +206,8 @@
"en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.", "en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.",
"nl": "Een onderwijsinstelling waar tertiair onderwijs wordt gegeven - dit is onderwijs waarvan het niveau overeenkomt met een bachelor of hoger is. Eén enkel punt per campus is genoeg - gebouwen en faculteiten worden hier niet op aangeduid.", "nl": "Een onderwijsinstelling waar tertiair onderwijs wordt gegeven - dit is onderwijs waarvan het niveau overeenkomt met een bachelor of hoger is. Eén enkel punt per campus is genoeg - gebouwen en faculteiten worden hier niet op aangeduid.",
"de": "Eine Einrichtung, an der tertiäre Bildung vermittelt wird (auf dem Niveau eines Bachelor-Abschlusses oder höher). Ein einziger Punkt pro Campus ist ausreichend - Gebäude und Fakultäten sollten nicht mit Universitätspunkten gekennzeichnet werden.", "de": "Eine Einrichtung, an der tertiäre Bildung vermittelt wird (auf dem Niveau eines Bachelor-Abschlusses oder höher). Ein einziger Punkt pro Campus ist ausreichend - Gebäude und Fakultäten sollten nicht mit Universitätspunkten gekennzeichnet werden.",
"fr": "Un institut où l'on dispense un enseignement supérieur (au niveau équivalent à un bachelor ou plus). Un simple point par campus est suffisant - les bâtiments et les facultés ne doivent pas être cartographiés avec différents points d'université." "fr": "Un institut où l'on dispense un enseignement supérieur (au niveau équivalent à un bachelor ou plus). Un simple point par campus est suffisant - les bâtiments et les facultés ne doivent pas être cartographiés avec différents points d'université.",
"ca": "Un institut on s'imparteix ensenyament terciari (al nivell equivalent de batxillerat o superior). N'hi ha prou amb un únic punt per campus: els edificis i les facultats no s'han de cartografiar amb diferents punts universitaris."
}, },
"tags": [ "tags": [
"amenity=university", "amenity=university",

View file

@ -530,7 +530,9 @@
"ca": "El cambiador està a {changing_table:location}" "ca": "El cambiador està a {changing_table:location}"
}, },
"condition": { "condition": {
"and":["changing_table=yes"] "and": [
"changing_table=yes"
]
}, },
"freeform": { "freeform": {
"key": "changing_table:location", "key": "changing_table:location",

View file

@ -14,7 +14,8 @@
"render": { "render": {
"en": "Toilet at amenity", "en": "Toilet at amenity",
"de": "Toilette in Einrichtung", "de": "Toilette in Einrichtung",
"nl": "Toilet in een voorziening" "nl": "Toilet in een voorziening",
"ca": "Lavabo a la instal·lació"
}, },
"mappings": [ "mappings": [
{ {
@ -22,7 +23,8 @@
"then": { "then": {
"en": "Toilet at {name}", "en": "Toilet at {name}",
"de": "Toilette in {name}", "de": "Toilette in {name}",
"nl": "Toilet bij {name}" "nl": "Toilet bij {name}",
"ca": "Bany a {name}"
} }
} }
] ]
@ -197,7 +199,8 @@
"condition": "toilets:access!=no", "condition": "toilets:access!=no",
"question": { "question": {
"en": "When is the amenity where these toilets are located open?", "en": "When is the amenity where these toilets are located open?",
"de": "Wann ist der Ort, an dem sich diese Toiletten befinden, geöffnet?" "de": "Wann ist der Ort, an dem sich diese Toiletten befinden, geöffnet?",
"ca": "Quan està oberta la instal·lació on es troben aquests lavabos?"
} }
} }
}, },
@ -273,7 +276,8 @@
"nl": "De deur naar de rolstoeltoegankelijke toilet is {canonical(toilets:door:width)} wide", "nl": "De deur naar de rolstoeltoegankelijke toilet is {canonical(toilets:door:width)} wide",
"fr": "La porte des toilettes accessibles aux fauteuils roulants a une large de {canonical(toilets:door:width)}", "fr": "La porte des toilettes accessibles aux fauteuils roulants a une large de {canonical(toilets:door:width)}",
"de": "Die Tür zur rollstuhlgerechten Toilette ist {canonical(toilets:door:width)} breit", "de": "Die Tür zur rollstuhlgerechten Toilette ist {canonical(toilets:door:width)} breit",
"da": "Døren til det kørestolsvenlige toilet er {canonical(toilets:door:width)} bred" "da": "Døren til det kørestolsvenlige toilet er {canonical(toilets:door:width)} bred",
"ca": "La porta del vàter accessible amb cadira de rodes és {canonical(toilets:door:width)} d'ample"
}, },
"freeform": { "freeform": {
"key": "toilets:door:width", "key": "toilets:door:width",
@ -329,7 +333,8 @@
"nl": "Gratis toegankelijk", "nl": "Gratis toegankelijk",
"de": "Nutzung kostenlos", "de": "Nutzung kostenlos",
"fr": "Utilisation gratuite", "fr": "Utilisation gratuite",
"da": "Gratis at bruge" "da": "Gratis at bruge",
"ca": "Ús gratuït"
}, },
"osmTags": { "osmTags": {
"or": [ "or": [

View file

@ -10,7 +10,8 @@
"description": { "description": {
"en": "Layer showing different types of transit stops.", "en": "Layer showing different types of transit stops.",
"de": "Ebene mit verschiedenen Arten von Haltestellen.", "de": "Ebene mit verschiedenen Arten von Haltestellen.",
"da": "Lag, der viser forskellige typer transitstop." "da": "Lag, der viser forskellige typer transitstop.",
"ca": "Capa que mostra diferents tipus de parades de transport públic"
}, },
"source": { "source": {
"osmTags": { "osmTags": {
@ -25,7 +26,8 @@
"en": "Transit Stop", "en": "Transit Stop",
"de": "Haltestelle", "de": "Haltestelle",
"da": "Transit Stop", "da": "Transit Stop",
"nl": "Bushalte" "nl": "Bushalte",
"ca": "Parada de transport públic"
}, },
"mappings": [ "mappings": [
{ {
@ -53,13 +55,6 @@
"label": "<div style=\"background: white; display: block\">{name}</div>" "label": "<div style=\"background: white; display: block\">{name}</div>"
} }
], ],
"calculatedTags": [
"_routes=feat.memberships()",
"_contained_routes_properties=feat.memberships().map(p => {return {id: p.relation.id, name: p.relation.properties.name} }).filter((v,i,a)=>a.findIndex(t=>(JSON.stringify(t) === JSON.stringify(v)))===i)",
"_contained_route_ids=JSON.parse(feat.properties._contained_routes_properties ?? '[]').map(p => p.id)",
"_contained_routes=JSON.parse(feat.properties._contained_routes_properties ?? '[]').map(p => `<li><a href='#relation/${p.id}'>${p.name ?? 'bus route'}</a></li>`).join('')",
"_contained_routes_count=JSON.parse(feat.properties._contained_routes_properties ?? '[]').length"
],
"tagRenderings": [ "tagRenderings": [
{ {
"id": "stop_name", "id": "stop_name",

View file

@ -915,7 +915,7 @@
"nl": "Verkoop van bloemen", "nl": "Verkoop van bloemen",
"de": "Verkauf von Blumen", "de": "Verkauf von Blumen",
"fr": "Vente de fleurs", "fr": "Vente de fleurs",
"ca": "Venda de flors" "ca": "Venda d'aparcament"
}, },
"osmTags": "vending~i~.*flowers.*" "osmTags": "vending~i~.*flowers.*"
}, },
@ -923,21 +923,21 @@
"osmTags": "vending~i~.*parking_tickets.*", "osmTags": "vending~i~.*parking_tickets.*",
"question": { "question": {
"en": "Sale of parking tickets", "en": "Sale of parking tickets",
"ca": "Venda d'aparcament" "ca": "Venda de monedes premsades"
} }
}, },
{ {
"osmTags": "vending=elongated_coin", "osmTags": "vending=elongated_coin",
"question": { "question": {
"en": "Sale of pressed pennies", "en": "Sale of pressed pennies",
"ca": "Venda de monedes premsades" "ca": "Venda de bitllets de transport públic"
} }
}, },
{ {
"osmTags": "vending~i~.*public_transport_tickets.*", "osmTags": "vending~i~.*public_transport_tickets.*",
"question": { "question": {
"en": "Sale of public transport tickets", "en": "Sale of public transport tickets",
"ca": "Venda de bitllets de transport públic" "ca": "Venda de productes carnis"
} }
}, },
{ {

View file

@ -461,8 +461,12 @@
] ]
} }
}, },
"drinking_water", {
"toilet" "builtin": ["toilet","drinking_water"],
"override": {
"minzoom": 15
}
}
], ],
"credits": "Christian Neumann <christian@utopicode.de>" "credits": "Christian Neumann <christian@utopicode.de>"
} }

View file

@ -197,6 +197,7 @@
"example": "Exemple", "example": "Exemple",
"examples": "Exemples", "examples": "Exemples",
"fewChangesBefore": "Contesta unes quantes preguntes sobre elements existents abans d'afegir-ne un de nou.", "fewChangesBefore": "Contesta unes quantes preguntes sobre elements existents abans d'afegir-ne un de nou.",
"geopermissionDenied": "Es va denegar l'ús de la geolocalització",
"getStartedLogin": "Entra a OpenStreetMap per començar", "getStartedLogin": "Entra a OpenStreetMap per començar",
"getStartedNewAccount": " o <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">crea un nou compte</a>", "getStartedNewAccount": " o <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">crea un nou compte</a>",
"goToInbox": "Obrir missatges", "goToInbox": "Obrir missatges",
@ -556,11 +557,16 @@
"reviews": { "reviews": {
"affiliated_reviewer_warning": "(Ressenya afiliada)", "affiliated_reviewer_warning": "(Ressenya afiliada)",
"attribution": "Les ressenyes funcionen gràcies a <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> i estan disponibles sota <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a>.", "attribution": "Les ressenyes funcionen gràcies a <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> i estan disponibles sota <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a>.",
"i_am_affiliated": "<span>Tinc alguna filiació amb aquest objecte</span><br/><span class='subtle'>Marca-ho si n'ets cap, creador, treballador, …</span>", "i_am_affiliated": "Tinc alguna filiació amb aquest objecte",
"i_am_affiliated_explanation": "Marqueu si sou propietari, creador, empleat,…",
"name_required": "És requerit un nom per mostrar i crear revisions", "name_required": "És requerit un nom per mostrar i crear revisions",
"no_reviews_yet": "No hi ha revisions encara. Sigues el primer a escriure'n una i ajuda al negoci i a les dades lliures!", "no_reviews_yet": "No hi ha revisions encara. Sigues el primer a escriure'n una i ajuda al negoci i a les dades lliures!",
"question": "Com valoraries {title()}?",
"question_opinion": "Com va ser la vostra experiència?",
"reviewing_as": "Ressenyant com a {nickname}",
"reviewing_as_anonymous": "Ressenyant com a anònim",
"save": "Desar", "save": "Desar",
"saved": "<span class=\"thanks\">Revisió compartida. Gràcies per compartir!</span>", "saved": "Ressenya compartida. Gràcies per compartir!",
"saving_review": "Desant…", "saving_review": "Desant…",
"title": "{count} revisions", "title": "{count} revisions",
"title_singular": "Una revisió", "title_singular": "Una revisió",

View file

@ -1,4 +1,7 @@
{ {
"advanced": {
"title": "Pokročilé funkce"
},
"centerMessage": { "centerMessage": {
"loadingData": "Načítání dat…", "loadingData": "Načítání dat…",
"ready": "Hotovo!", "ready": "Hotovo!",

View file

@ -197,6 +197,7 @@
"example": "Beispiel", "example": "Beispiel",
"examples": "Beispiele", "examples": "Beispiele",
"fewChangesBefore": "Bitte beantworten Sie einige Fragen zu bestehenden Objekten, bevor Sie ein neues Objekt hinzufügen.", "fewChangesBefore": "Bitte beantworten Sie einige Fragen zu bestehenden Objekten, bevor Sie ein neues Objekt hinzufügen.",
"geopermissionDenied": "Die Verwendung der Standortbestimmung wurde verweigert",
"getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen", "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen",
"getStartedNewAccount": " oder <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">ein neues Konto anlegen</a>", "getStartedNewAccount": " oder <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">ein neues Konto anlegen</a>",
"goToInbox": "Posteingang öffnen", "goToInbox": "Posteingang öffnen",
@ -417,7 +418,20 @@
"respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.", "respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.",
"toBig": "Ihr Bild ist mit {actual_size} zu groß. Die maximale Bildgröße ist {max_size}", "toBig": "Ihr Bild ist mit {actual_size} zu groß. Die maximale Bildgröße ist {max_size}",
"upload": { "upload": {
"failReasons": "Keine Internetverbindung" "failReasons": "Keine Internetverbindung",
"failReasonsAdvanced": "Alternativ dazu können Sie einstellen, dass Ihr Browser und Ihre Erweiterungen die APIs von Drittanbietern nicht blockieren.",
"multiple": {
"done": "{count} Bilder erfolgreich hochgeladen. Vielen Dank!",
"partiallyDone": "{count} Bilder werden hochgeladen, {done} Bilder erledigt…",
"someFailed": "Entschuldigung, {count} Bilder konnten nicht hochgeladen werden",
"uploading": "{count} Bilder werden hochgeladen…"
},
"one": {
"done": "Bild erfolgreich hochgeladen. Vielen Dank!",
"failed": "Entschuldigung, das Bild konnte nicht hochgeladen werden",
"retrying": "Das Bild wird wiederholt hochgeladen…",
"uploading": "Das Bild wird hochgeladen…"
}
}, },
"uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!",
"uploadFailed": "Das Bild konnte nicht hochladen werden. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", "uploadFailed": "Das Bild konnte nicht hochladen werden. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.",
@ -504,7 +518,9 @@
}, },
"plantDetection": { "plantDetection": {
"back": "Zurück zur Artenübersicht", "back": "Zurück zur Artenübersicht",
"button": "Automatische Erkennung der Pflanzenart durch die KI von Plantnet.org",
"confirm": "Arten auswählen", "confirm": "Arten auswählen",
"done": "Die Art wurde übernommen",
"error": "Bei der Erkennung der Baumart ist ein Fehler aufgetreten: {error}", "error": "Bei der Erkennung der Baumart ist ein Fehler aufgetreten: {error}",
"howTo": { "howTo": {
"intro": "Für optimale Ergebnisse,", "intro": "Für optimale Ergebnisse,",
@ -521,7 +537,8 @@
"poweredByPlantnet": "Bereitgestellt von <a href='https://plantnet.org' target='_blank'>plantnet.org</a>", "poweredByPlantnet": "Bereitgestellt von <a href='https://plantnet.org' target='_blank'>plantnet.org</a>",
"querying": "Abfrage bei plantnet.org mit {length} Fotos", "querying": "Abfrage bei plantnet.org mit {length} Fotos",
"seeInfo": "Weitere Informationen über diese Art", "seeInfo": "Weitere Informationen über diese Art",
"takeImages": "Machen Sie Fotos vom Baum, um die Baumart automatisch zu erkennen" "takeImages": "Machen Sie Fotos vom Baum, um die Baumart automatisch zu erkennen",
"tryAgain": "Wähle eine andere Art"
}, },
"privacy": { "privacy": {
"editing": "Ihre Änderungen werden auf OpenStreetMap gespeichert und sind öffentlich zugänglich. Ein mit MapComplete erstellter Änderungssatz enthält folgende Daten: <ul><li>Ihre Änderungen</li><li>Ihren Benutzernamen</li><li>Den Zeitpunkt Ihrer Änderungen</li><li>Das bei Ihren Änderungen verwendete MapComplete-Thema</li><li>Die Sprache Ihrer Benutzeroberfläche</li><li>Ihre Entfernung zu den geänderten Objekten. Dadurch kann festgestellt werden, ob die Änderungen vor Ort gespeichert wurden</li></ul> Ausführliche Informationen finden Sie in <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\" target=\"_blank\">den Datenschutzbestimmungen auf OpenStreetMap.org</a>. Wir möchten Sie daran erinnern, dass Sie zur Anmeldung einen fiktiven Namen verwenden können.", "editing": "Ihre Änderungen werden auf OpenStreetMap gespeichert und sind öffentlich zugänglich. Ein mit MapComplete erstellter Änderungssatz enthält folgende Daten: <ul><li>Ihre Änderungen</li><li>Ihren Benutzernamen</li><li>Den Zeitpunkt Ihrer Änderungen</li><li>Das bei Ihren Änderungen verwendete MapComplete-Thema</li><li>Die Sprache Ihrer Benutzeroberfläche</li><li>Ihre Entfernung zu den geänderten Objekten. Dadurch kann festgestellt werden, ob die Änderungen vor Ort gespeichert wurden</li></ul> Ausführliche Informationen finden Sie in <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\" target=\"_blank\">den Datenschutzbestimmungen auf OpenStreetMap.org</a>. Wir möchten Sie daran erinnern, dass Sie zur Anmeldung einen fiktiven Namen verwenden können.",
@ -540,11 +557,16 @@
"reviews": { "reviews": {
"affiliated_reviewer_warning": "(Partner-Rezension)", "affiliated_reviewer_warning": "(Partner-Rezension)",
"attribution": "Rezensionen von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar.", "attribution": "Rezensionen von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar.",
"i_am_affiliated": "<span>Ich bin an diesem Objekt beteiligt</span><br/><span class='subtle'>Auswählen, wenn Sie Eigentümer, Ersteller, Angestellter … sind</span>", "i_am_affiliated": "Ich bin mit diesem Objekt vertraut",
"i_am_affiliated_explanation": "Prüfung, ob Sie der Eigentümer, Ersteller, Angestellter, … sind",
"name_required": "Der Name des Objekts ist erforderlich, um Bewertungen zu erstellen und anzuzeigen", "name_required": "Der Name des Objekts ist erforderlich, um Bewertungen zu erstellen und anzuzeigen",
"no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!",
"question": "Wie bewerten Sie {title()}?",
"question_opinion": "Wie war Ihre Erfahrung?",
"reviewing_as": "Als {nickname} bewerten",
"reviewing_as_anonymous": "Anonym bewerten",
"save": "Speichern", "save": "Speichern",
"saved": "<span class=\"thanks\">Bewertung gespeichert. Danke fürs Teilen!</span>", "saved": "Bewertung gespeichert. Danke fürs Teilen!",
"saving_review": "Speichern…", "saving_review": "Speichern…",
"title": "{count} Rezensionen", "title": "{count} Rezensionen",
"title_singular": "Eine Rezension", "title_singular": "Eine Rezension",

View file

@ -2396,10 +2396,25 @@
} }
}, },
"tagRenderings": { "tagRenderings": {
"Contained_climbing_routes": {
"render": "<h3>Conté {_contained_climbing_routes_count} rutes</h3> <ul>{_contained_climbing_routes}</ul>"
},
"Rock type (crag/rock/cliff only)": { "Rock type (crag/rock/cliff only)": {
"mappings": {
"0": {
"then": "Calcària"
}
},
"question": "Quin és el tipus de roca aquí?", "question": "Quin és el tipus de roca aquí?",
"render": "El tipus de roca és {rock}" "render": "El tipus de roca és {rock}"
}, },
"Type": {
"mappings": {
"0": {
"then": "Una roca d'escalada: una única roca o penya-segat amb una o unes quantes vies d'escalada que es poden escalar amb seguretat sense corda"
}
}
},
"name": { "name": {
"render": "<strong>{name}</strong>" "render": "<strong>{name}</strong>"
} }
@ -4424,7 +4439,8 @@
} }
}, },
"ghost_bike-start_date": { "ghost_bike-start_date": {
"question": "Quan es va instal·lar aquesta bicicleta Ghost?" "question": "Quan es va instal·lar aquesta bicicleta Ghost?",
"render": "Col·locat el {start_date}"
} }
}, },
"title": { "title": {
@ -7451,8 +7467,13 @@
}, },
"4": { "4": {
"then": "Aquí es juga al corfbol" "then": "Aquí es juga al corfbol"
},
"6": {
"then": "Açò és un skatepark"
} }
} },
"question": "Quin esport es pot practicar aquí?",
"render": "{sport} es juga aquí"
}, },
"sport_pitch-surface": { "sport_pitch-surface": {
"mappings": { "mappings": {
@ -7472,14 +7493,28 @@
"then": "La superfície és <b>formigó</b>" "then": "La superfície és <b>formigó</b>"
} }
}, },
"question": "Quina és la superfície d'aquest camp esportiu?" "question": "Quina és la superfície d'aquest camp esportiu?",
"render": "La superfícies és <b>{surface}</b>"
} }
}, },
"title": { "title": {
"render": "Camp d'esports" "render": "Camp d'esports"
} }
}, },
"sports_centre": {
"description": "En aquesta capa es poden trobar centres esportius interiors i exteriors",
"name": "Centres esportius",
"presets": {
"0": {
"title": "un centre esportiu"
}
},
"title": {
"render": "Centre esportiu"
}
},
"stairs": { "stairs": {
"description": "Capa que mostra escales i escales mecàniques",
"name": "Escales", "name": "Escales",
"tagRenderings": { "tagRenderings": {
"conveying": { "conveying": {
@ -7746,6 +7781,7 @@
"question": "Quin tipus de càmera és aquesta?" "question": "Quin tipus de càmera és aquesta?"
}, },
"Level": { "Level": {
"question": "A quina planta es troba aquesta càmera?",
"render": "Ubicat a la planta {level}" "render": "Ubicat a la planta {level}"
}, },
"Operator": { "Operator": {
@ -7852,14 +7888,19 @@
} }
}, },
"tertiary_education": { "tertiary_education": {
"name": "Instituts superiors i universitats",
"presets": { "presets": {
"0": { "0": {
"description": "Un institut on s'imparteix ensenyament terciari (al nivell equivalent de batxillerat o superior). N'hi ha prou amb un únic punt per campus: els edificis i les facultats no s'han de cartografiar amb diferents punts universitaris.",
"title": "una universitat" "title": "una universitat"
} }
}, },
"tagRenderings": { "tagRenderings": {
"institution-kind": { "institution-kind": {
"mappings": { "mappings": {
"0": {
"then": "Aquesta és una institució d'educació postsecundària i no terciària. S'ha d'haver completat l'educació secundària per matricular-se aquí, però aquí no s'obtenen títols de batxillerat (o superiors)"
},
"1": { "1": {
"then": "Açò és una universitat, una institució d'educació terciaria on s'imparteixen carreres universitàries o superior." "then": "Açò és una universitat, una institució d'educació terciaria on s'imparteixen carreres universitàries o superior."
} }
@ -7883,8 +7924,14 @@
}, },
"title": { "title": {
"mappings": { "mappings": {
"1": {
"then": "Institut superior"
},
"2": { "2": {
"then": "Universitat" "then": "Universitat"
},
"3": {
"then": "Escola que imparteix educació terciària"
} }
} }
} }
@ -8147,10 +8194,22 @@
"question": "Accessible amb cadira de rodes" "question": "Accessible amb cadira de rodes"
} }
} }
},
"2": {
"options": {
"0": {
"question": "Ús gratuït"
}
}
} }
}, },
"name": "Lavabos a altres instal·lacions", "name": "Lavabos a altres instal·lacions",
"tagRenderings": { "tagRenderings": {
"opening_hours": {
"override": {
"question": "Quan està oberta la instal·lació on es troben aquests lavabos?"
}
},
"toilet-access": { "toilet-access": {
"mappings": { "mappings": {
"0": { "0": {
@ -8202,9 +8261,18 @@
"question": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?" "question": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?"
}, },
"wheelchair-door-width": { "wheelchair-door-width": {
"question": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?" "question": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?",
"render": "La porta del vàter accessible amb cadira de rodes és {canonical(toilets:door:width)} d'ample"
} }
}, },
"title": {
"mappings": {
"0": {
"then": "Bany a {name}"
}
},
"render": "Lavabo a la instal·lació"
},
"units": { "units": {
"0": { "0": {
"applicableUnits": { "applicableUnits": {
@ -8290,6 +8358,7 @@
} }
}, },
"transit_stops": { "transit_stops": {
"description": "Capa que mostra diferents tipus de parades de transport públic",
"filter": { "filter": {
"0": { "0": {
"options": { "options": {
@ -8422,7 +8491,8 @@
"0": { "0": {
"then": "Parada {name}" "then": "Parada {name}"
} }
} },
"render": "Parada de transport públic"
} }
}, },
"tree_node": { "tree_node": {
@ -8812,6 +8882,12 @@
"16": { "16": {
"question": "Venda de productes carnis" "question": "Venda de productes carnis"
}, },
"17": {
"question": "Venda d'aparcament"
},
"18": {
"question": "Venda de monedes premsades"
},
"19": { "19": {
"question": "Venda de flors" "question": "Venda de flors"
}, },
@ -9261,4 +9337,4 @@
} }
} }
} }
} }

View file

@ -3170,6 +3170,9 @@
}, },
"6": { "6": {
"then": "En affaldskurv til plast" "then": "En affaldskurv til plast"
},
"7": {
"then": "En affaldskurv til papir"
} }
}, },
"question": "Hvad er det for en affaldskurv?" "question": "Hvad er det for en affaldskurv?"

View file

@ -35,6 +35,16 @@
"1": { "1": {
"title": "eine freistehende Posterbox" "title": "eine freistehende Posterbox"
}, },
"10": {
"description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder",
"title": "ein Schild"
},
"11": {
"title": "eine Skulptur"
},
"12": {
"title": "eine Wandmalerei"
},
"2": { "2": {
"title": "eine wandmontierte Posterbox" "title": "eine wandmontierte Posterbox"
}, },
@ -61,16 +71,6 @@
}, },
"9": { "9": {
"title": "ein Totem" "title": "ein Totem"
},
"10": {
"description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder",
"title": "ein Schild"
},
"11": {
"title": "eine Skulptur"
},
"12": {
"title": "eine Wandmalerei"
} }
}, },
"tagRenderings": { "tagRenderings": {
@ -165,6 +165,9 @@
"1": { "1": {
"then": "Dies ist ein Brett" "then": "Dies ist ein Brett"
}, },
"10": {
"then": "Dies ist eine Wandmalerei"
},
"2": { "2": {
"then": "Dies ist eine Litfaßsäule" "then": "Dies ist eine Litfaßsäule"
}, },
@ -188,9 +191,6 @@
}, },
"9": { "9": {
"then": "Dies ist ein Totem" "then": "Dies ist ein Totem"
},
"10": {
"then": "Dies ist eine Wandmalerei"
} }
}, },
"question": "Welche Art von Werbung ist das?", "question": "Welche Art von Werbung ist das?",
@ -205,6 +205,9 @@
"1": { "1": {
"then": "Brett" "then": "Brett"
}, },
"10": {
"then": "Wandmalerei"
},
"2": { "2": {
"then": "Posterbox" "then": "Posterbox"
}, },
@ -228,9 +231,6 @@
}, },
"9": { "9": {
"then": "Totem" "then": "Totem"
},
"10": {
"then": "Wandmalerei"
} }
} }
} }
@ -312,6 +312,15 @@
"1": { "1": {
"then": "Wandbild" "then": "Wandbild"
}, },
"10": {
"then": "Azulejo (spanische dekorative Fliesenarbeit)"
},
"11": {
"then": "Fliesenarbeit"
},
"12": {
"then": "Holzschnitzerei"
},
"2": { "2": {
"then": "Malerei" "then": "Malerei"
}, },
@ -335,15 +344,6 @@
}, },
"9": { "9": {
"then": "Relief" "then": "Relief"
},
"10": {
"then": "Azulejo (spanische dekorative Fliesenarbeit)"
},
"11": {
"then": "Fliesenarbeit"
},
"12": {
"then": "Holzschnitzerei"
} }
}, },
"question": "Um welche Art Kunstwerk handelt es sich?", "question": "Um welche Art Kunstwerk handelt es sich?",
@ -1837,6 +1837,27 @@
"1": { "1": {
"question": "Verfügt über einen <div style='display: inline-block'><b><b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/CEE7_4F.svg'/></div>" "question": "Verfügt über einen <div style='display: inline-block'><b><b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/CEE7_4F.svg'/></div>"
}, },
"10": {
"question": "Hat einen <div style='display: inline-block'><b><b>Typ 2</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> Anschluss mit Kabel"
},
"11": {
"question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (Typ 2 CSS vonTesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss"
},
"12": {
"question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> Anschluss"
},
"13": {
"question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (Typ 2 von Tesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> Anschluss mit Kabel"
},
"14": {
"question": "Hat einen <div style='display: inline-block'><b><b>USB</b>-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/usb_port.svg'/></div>"
},
"15": {
"question": "Hat einen <div style='display: inline-block'><b><b>Bosch Active Connect Anschluss mit 3 Pins</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-3pin.svg'/></div> und Kabel"
},
"16": {
"question": "Hat einen <div style='display: inline-block'><b><b>Bosch Active Connect Anschluss mit 5 Pins</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div> und Kabel"
},
"2": { "2": {
"question": "Verfügt über einen <div style='display: inline-block'><b><b>europäischen Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/TypeE.svg'/></div> Anschluss" "question": "Verfügt über einen <div style='display: inline-block'><b><b>europäischen Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/TypeE.svg'/></div> Anschluss"
}, },
@ -1860,27 +1881,6 @@
}, },
"9": { "9": {
"question": "Hat einen <div style='display: inline-block'><b><b>Typ 2 CCS</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss" "question": "Hat einen <div style='display: inline-block'><b><b>Typ 2 CCS</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss"
},
"10": {
"question": "Hat einen <div style='display: inline-block'><b><b>Typ 2</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> Anschluss mit Kabel"
},
"11": {
"question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (Typ 2 CSS vonTesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss"
},
"12": {
"question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> Anschluss"
},
"13": {
"question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (Typ 2 von Tesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> Anschluss mit Kabel"
},
"14": {
"question": "Hat einen <div style='display: inline-block'><b><b>USB</b>-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/usb_port.svg'/></div>"
},
"15": {
"question": "Hat einen <div style='display: inline-block'><b><b>Bosch Active Connect Anschluss mit 3 Pins</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-3pin.svg'/></div> und Kabel"
},
"16": {
"question": "Hat einen <div style='display: inline-block'><b><b>Bosch Active Connect Anschluss mit 5 Pins</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div> und Kabel"
} }
} }
} }
@ -1936,30 +1936,6 @@
"1": { "1": {
"then": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)" "then": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)"
}, },
"2": {
"then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)"
},
"3": {
"then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)"
},
"4": {
"then": "<b>Chademo-Anschluss</b>"
},
"5": {
"then": "<b>Chademo-Anschluss</b>"
},
"6": {
"then": "<b>Typ 1 mit Kabel</b> (J1772)"
},
"7": {
"then": "<b>Typ 1 mit Kabel</b> (J1772)"
},
"8": {
"then": "<b>Typ 1 <i>ohne</i> Kabel</b> (J1772)"
},
"9": {
"then": "<b> Typ 1 <i>ohne </i> Kabel</b> (J1772)"
},
"10": { "10": {
"then": "<b>Typ 1 CCS</b> (Typ 1 Combo)" "then": "<b>Typ 1 CCS</b> (Typ 1 Combo)"
}, },
@ -1990,6 +1966,9 @@
"19": { "19": {
"then": "<b>Typ 2 mit Kabel</b> (mennekes)" "then": "<b>Typ 2 mit Kabel</b> (mennekes)"
}, },
"2": {
"then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)"
},
"20": { "20": {
"then": "<b>Tesla Supercharger CCS</b> (Typ 2 CSS von Tesla)" "then": "<b>Tesla Supercharger CCS</b> (Typ 2 CSS von Tesla)"
}, },
@ -2020,11 +1999,32 @@
"29": { "29": {
"then": "<b> Bosch Active Connect mit 3 Pins </b> und Kabel" "then": "<b> Bosch Active Connect mit 3 Pins </b> und Kabel"
}, },
"3": {
"then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)"
},
"30": { "30": {
"then": "<b>Bosch Active Connect mit 5 Pins</b> und Kabel" "then": "<b>Bosch Active Connect mit 5 Pins</b> und Kabel"
}, },
"31": { "31": {
"then": "<b> Bosch Active Connect mit 5 Pins </b> und Kabel" "then": "<b> Bosch Active Connect mit 5 Pins </b> und Kabel"
},
"4": {
"then": "<b>Chademo-Anschluss</b>"
},
"5": {
"then": "<b>Chademo-Anschluss</b>"
},
"6": {
"then": "<b>Typ 1 mit Kabel</b> (J1772)"
},
"7": {
"then": "<b>Typ 1 mit Kabel</b> (J1772)"
},
"8": {
"then": "<b>Typ 1 <i>ohne</i> Kabel</b> (J1772)"
},
"9": {
"then": "<b> Typ 1 <i>ohne </i> Kabel</b> (J1772)"
} }
}, },
"question": "Welche Ladeanschlüsse gibt es hier?" "question": "Welche Ladeanschlüsse gibt es hier?"
@ -3562,6 +3562,15 @@
"1": { "1": {
"then": "Dieser Radweg hat einen festen Belag" "then": "Dieser Radweg hat einen festen Belag"
}, },
"10": {
"then": "Dieser Radweg besteht aus feinem Schotter"
},
"11": {
"then": "Der Radweg ist aus Kies"
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
},
"2": { "2": {
"then": "Der Radweg ist aus Asphalt" "then": "Der Radweg ist aus Asphalt"
}, },
@ -3585,15 +3594,6 @@
}, },
"9": { "9": {
"then": "Der Radweg ist aus Schotter" "then": "Der Radweg ist aus Schotter"
},
"10": {
"then": "Dieser Radweg besteht aus feinem Schotter"
},
"11": {
"then": "Der Radweg ist aus Kies"
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
} }
}, },
"question": "Was ist der Belag dieses Radwegs?", "question": "Was ist der Belag dieses Radwegs?",
@ -3642,6 +3642,15 @@
"1": { "1": {
"then": "Dieser Radweg hat einen festen Belag" "then": "Dieser Radweg hat einen festen Belag"
}, },
"10": {
"then": "Dieser Radweg besteht aus feinem Schotter"
},
"11": {
"then": "Der Radweg ist aus Kies"
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
},
"2": { "2": {
"then": "Der Radweg ist aus Asphalt" "then": "Der Radweg ist aus Asphalt"
}, },
@ -3665,15 +3674,6 @@
}, },
"9": { "9": {
"then": "Der Radweg ist aus Schotter" "then": "Der Radweg ist aus Schotter"
},
"10": {
"then": "Dieser Radweg besteht aus feinem Schotter"
},
"11": {
"then": "Der Radweg ist aus Kies"
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
} }
}, },
"question": "Was ist der Belag dieser Straße?", "question": "Was ist der Belag dieser Straße?",
@ -4217,6 +4217,17 @@
"question": "Verfügt der Aufzug über eine Sprachausgabe?", "question": "Verfügt der Aufzug über eine Sprachausgabe?",
"questionHint": "Z.B. werden Stockwerke angesagt" "questionHint": "Z.B. werden Stockwerke angesagt"
}, },
"tactile_writing_available": {
"mappings": {
"0": {
"then": "Dieser Aufzug hat eine taktile Schrift in Brailleschrift"
},
"1": {
"then": "Dieser Aufzug hat keine taktile Schrift"
}
},
"question": "Hat dieser Aufzug taktile Schrift?"
},
"tactile_writing_language": { "tactile_writing_language": {
"render": { "render": {
"special": { "special": {
@ -4561,6 +4572,19 @@
} }
} }
}, },
"10": {
"options": {
"0": {
"question": "Keine Bevorzugung von Hunden"
},
"1": {
"question": "Hunde erlaubt"
},
"2": {
"question": "Keine Hunde erlaubt"
}
}
},
"2": { "2": {
"options": { "options": {
"0": { "0": {
@ -4750,30 +4774,6 @@
"1": { "1": {
"then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung." "then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung."
}, },
"2": {
"then": "Die Fitness-Station hat eine Einrichtung für Sit-ups."
},
"3": {
"then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen."
},
"4": {
"then": "Die Fitness-Station hat Stangen zum Dehnen."
},
"5": {
"then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)."
},
"6": {
"then": "Die Fitness-Station hat Ringe für Gymnastikübungen."
},
"7": {
"then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)."
},
"8": {
"then": "Die Fitness-Station hat eine Sprossenwand zum Klettern."
},
"9": {
"then": "Die Fitness-Station hat Pfosten für Slalomübungen."
},
"10": { "10": {
"then": "Die Fitness-Station hat Trittsteine." "then": "Die Fitness-Station hat Trittsteine."
}, },
@ -4804,6 +4804,9 @@
"19": { "19": {
"then": "Die Fitness-Station hat Kampfseile (battle ropes)." "then": "Die Fitness-Station hat Kampfseile (battle ropes)."
}, },
"2": {
"then": "Die Fitness-Station hat eine Einrichtung für Sit-ups."
},
"20": { "20": {
"then": "Die Fitness-Station hat ein Fahrradergometer." "then": "Die Fitness-Station hat ein Fahrradergometer."
}, },
@ -4818,6 +4821,27 @@
}, },
"24": { "24": {
"then": "Die Fitness-Station hat eine Slackline." "then": "Die Fitness-Station hat eine Slackline."
},
"3": {
"then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen."
},
"4": {
"then": "Die Fitness-Station hat Stangen zum Dehnen."
},
"5": {
"then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)."
},
"6": {
"then": "Die Fitness-Station hat Ringe für Gymnastikübungen."
},
"7": {
"then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)."
},
"8": {
"then": "Die Fitness-Station hat eine Sprossenwand zum Klettern."
},
"9": {
"then": "Die Fitness-Station hat Pfosten für Slalomübungen."
} }
}, },
"question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?" "question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?"
@ -4880,6 +4904,9 @@
}, },
"2": { "2": {
"options": { "options": {
"0": {
"question": "Restaurants und Schnellimbissbetriebe"
},
"1": { "1": {
"question": "Nur Fastfood-Geschäfte" "question": "Nur Fastfood-Geschäfte"
}, },
@ -4888,6 +4915,13 @@
} }
} }
}, },
"3": {
"options": {
"0": {
"question": "Hat ein vegetarisches Menü"
}
}
},
"4": { "4": {
"options": { "options": {
"0": { "0": {
@ -4927,6 +4961,21 @@
"1": { "1": {
"then": "Dies ist eine Pommesbude" "then": "Dies ist eine Pommesbude"
}, },
"10": {
"then": "Hier werden chinesische Gerichte serviert"
},
"11": {
"then": "Hier werden griechische Gerichte serviert"
},
"12": {
"then": "Hier werden indische Gerichte serviert"
},
"13": {
"then": "Hier werden türkische Gerichte serviert"
},
"14": {
"then": "Hier werden thailändische Gerichte serviert"
},
"2": { "2": {
"then": "Bietet vorwiegend Pastagerichte an" "then": "Bietet vorwiegend Pastagerichte an"
}, },
@ -4950,21 +4999,6 @@
}, },
"9": { "9": {
"then": "Hier werden französische Gerichte serviert" "then": "Hier werden französische Gerichte serviert"
},
"10": {
"then": "Hier werden chinesische Gerichte serviert"
},
"11": {
"then": "Hier werden griechische Gerichte serviert"
},
"12": {
"then": "Hier werden indische Gerichte serviert"
},
"13": {
"then": "Hier werden türkische Gerichte serviert"
},
"14": {
"then": "Hier werden thailändische Gerichte serviert"
} }
}, },
"question": "Was für Essen gibt es hier?", "question": "Was für Essen gibt es hier?",
@ -5532,6 +5566,61 @@
}, },
"question": "Wie lautet die Nummer dieses Raums?", "question": "Wie lautet die Nummer dieses Raums?",
"render": "Dieser Raum hat die Raumnummer {ref}" "render": "Dieser Raum hat die Raumnummer {ref}"
},
"room-capacity": {
"question": "Wie viele Personen passen höchstens in diesen Raum?"
},
"room-type": {
"mappings": {
"0": {
"then": "Dies ist ein Verwaltungsraum"
},
"1": {
"then": "Dies ist ein Auditorium"
},
"10": {
"then": "Dies ist ein Labor"
},
"11": {
"then": "Dies ist eine Bibliothek"
},
"12": {
"then": "Dies ist ein Umkleideraum"
},
"14": {
"then": "Dies ist ein Büro"
},
"15": {
"then": "Dies ist eine Gefängniszelle"
},
"16": {
"then": "Dies ist ein Restaurant"
},
"2": {
"then": "Dies ist ein Schlafzimmer"
},
"3": {
"then": "Dies ist eine Kapelle"
},
"4": {
"then": "Dies ist ein Klassenzimmer"
},
"5": {
"then": "Dies ist ein Klassenzimmer"
},
"6": {
"then": "Dies ist ein Computerraum"
},
"7": {
"then": "Dies ist ein Konferenzraum"
},
"8": {
"then": "Dies ist eine Krypta"
},
"9": {
"then": "Dies ist eine Küche"
}
}
} }
}, },
"title": { "title": {
@ -6183,6 +6272,19 @@
} }
} }
}, },
"10": {
"options": {
"0": {
"question": "Alle Notizen"
},
"1": {
"question": "Importnotizen ausblenden"
},
"2": {
"question": "Nur Importnotizen anzeigen"
}
}
},
"2": { "2": {
"options": { "options": {
"0": { "0": {
@ -6238,19 +6340,6 @@
"question": "Nur offene Notizen anzeigen" "question": "Nur offene Notizen anzeigen"
} }
} }
},
"10": {
"options": {
"0": {
"question": "Alle Notizen"
},
"1": {
"question": "Importnotizen ausblenden"
},
"2": {
"question": "Nur Importnotizen anzeigen"
}
}
} }
}, },
"name": "OpenStreetMap-Hinweise", "name": "OpenStreetMap-Hinweise",
@ -6579,6 +6668,21 @@
"1": { "1": {
"then": "Dies ist ein normaler Stellplatz." "then": "Dies ist ein normaler Stellplatz."
}, },
"10": {
"then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist."
},
"11": {
"then": "Dies ist ein Stellplatz, der für das Personal reserviert ist."
},
"12": {
"then": "Dies ist ein Stellplatz, der für Taxis reserviert ist."
},
"13": {
"then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist."
},
"14": {
"then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist."
},
"2": { "2": {
"then": "Dies ist ein Behindertenstellplatz." "then": "Dies ist ein Behindertenstellplatz."
}, },
@ -6602,21 +6706,6 @@
}, },
"9": { "9": {
"then": "Dies ist ein Stellplatz, der für Motorräder reserviert ist." "then": "Dies ist ein Stellplatz, der für Motorräder reserviert ist."
},
"10": {
"then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist."
},
"11": {
"then": "Dies ist ein Stellplatz, der für das Personal reserviert ist."
},
"12": {
"then": "Dies ist ein Stellplatz, der für Taxis reserviert ist."
},
"13": {
"then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist."
},
"14": {
"then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist."
} }
}, },
"question": "Welche Art von Stellplatz ist dies?" "question": "Welche Art von Stellplatz ist dies?"
@ -7629,30 +7718,6 @@
"1": { "1": {
"question": "Recycling von Batterien" "question": "Recycling von Batterien"
}, },
"2": {
"question": "Recycling von Getränkekartons"
},
"3": {
"question": "Recycling von Dosen"
},
"4": {
"question": "Recycling von Kleidung"
},
"5": {
"question": "Recycling von Speiseöl"
},
"6": {
"question": "Recycling von Motoröl"
},
"7": {
"question": "Recycling von Leuchtstoffröhren"
},
"8": {
"question": "Recycling von Grünabfällen"
},
"9": {
"question": "Recycling von Glasflaschen"
},
"10": { "10": {
"question": "Recycling von Glas" "question": "Recycling von Glas"
}, },
@ -7683,11 +7748,35 @@
"19": { "19": {
"question": "Recycling von Restabfällen" "question": "Recycling von Restabfällen"
}, },
"2": {
"question": "Recycling von Getränkekartons"
},
"20": { "20": {
"question": "Recycling von Druckerpatronen" "question": "Recycling von Druckerpatronen"
}, },
"21": { "21": {
"question": "Recycling von Fahrrädern" "question": "Recycling von Fahrrädern"
},
"3": {
"question": "Recycling von Dosen"
},
"4": {
"question": "Recycling von Kleidung"
},
"5": {
"question": "Recycling von Speiseöl"
},
"6": {
"question": "Recycling von Motoröl"
},
"7": {
"question": "Recycling von Leuchtstoffröhren"
},
"8": {
"question": "Recycling von Grünabfällen"
},
"9": {
"question": "Recycling von Glasflaschen"
} }
} }
}, },
@ -7755,30 +7844,6 @@
"1": { "1": {
"then": "Getränkekartons können hier recycelt werden" "then": "Getränkekartons können hier recycelt werden"
}, },
"2": {
"then": "Dosen können hier recycelt werden"
},
"3": {
"then": "Kleidung kann hier recycelt werden"
},
"4": {
"then": "Speiseöl kann hier recycelt werden"
},
"5": {
"then": "Motoröl kann hier recycelt werden"
},
"6": {
"then": "Hier können Leuchtstoffröhren recycelt werden"
},
"7": {
"then": "Grünabfälle können hier recycelt werden"
},
"8": {
"then": "Bio-Abfall kann hier recycelt werden"
},
"9": {
"then": "Glasflaschen können hier recycelt werden"
},
"10": { "10": {
"then": "Glas kann hier recycelt werden" "then": "Glas kann hier recycelt werden"
}, },
@ -7809,6 +7874,9 @@
"19": { "19": {
"then": "Schuhe können hier recycelt werden" "then": "Schuhe können hier recycelt werden"
}, },
"2": {
"then": "Dosen können hier recycelt werden"
},
"20": { "20": {
"then": "Elektrokleingeräte können hier recycelt werden" "then": "Elektrokleingeräte können hier recycelt werden"
}, },
@ -7823,6 +7891,27 @@
}, },
"24": { "24": {
"then": "Fahrräder können hier recycelt werden" "then": "Fahrräder können hier recycelt werden"
},
"3": {
"then": "Kleidung kann hier recycelt werden"
},
"4": {
"then": "Speiseöl kann hier recycelt werden"
},
"5": {
"then": "Motoröl kann hier recycelt werden"
},
"6": {
"then": "Hier können Leuchtstoffröhren recycelt werden"
},
"7": {
"then": "Grünabfälle können hier recycelt werden"
},
"8": {
"then": "Bio-Abfall kann hier recycelt werden"
},
"9": {
"then": "Glasflaschen können hier recycelt werden"
} }
}, },
"question": "Was kann hier recycelt werden?" "question": "Was kann hier recycelt werden?"
@ -8626,6 +8715,12 @@
"1": { "1": {
"then": "Diese Straßenlaterne verwendet LEDs" "then": "Diese Straßenlaterne verwendet LEDs"
}, },
"10": {
"then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)"
},
"11": {
"then": "Diese Straßenlaterne wird mit Gas beleuchtet"
},
"2": { "2": {
"then": "Diese Straßenlaterne verwendet Glühlampenlicht" "then": "Diese Straßenlaterne verwendet Glühlampenlicht"
}, },
@ -8649,12 +8744,6 @@
}, },
"9": { "9": {
"then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)"
},
"10": {
"then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)"
},
"11": {
"then": "Diese Straßenlaterne wird mit Gas beleuchtet"
} }
}, },
"question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?"
@ -9748,6 +9837,27 @@
"1": { "1": {
"question": "Verkauf von Getränken" "question": "Verkauf von Getränken"
}, },
"10": {
"question": "Verkauf von Milch"
},
"11": {
"question": "Verkauf von Brot"
},
"12": {
"question": "Verkauf von Eiern"
},
"13": {
"question": "Verkauf von Käse"
},
"14": {
"question": "Verkauf von Honig"
},
"15": {
"question": "Verkauf von Kartoffeln"
},
"16": {
"question": "Verkauf von Blumen"
},
"2": { "2": {
"question": "Verkauf von Süßigkeiten" "question": "Verkauf von Süßigkeiten"
}, },
@ -9835,30 +9945,6 @@
"1": { "1": {
"then": "Süßigkeiten werden verkauft" "then": "Süßigkeiten werden verkauft"
}, },
"2": {
"then": "Lebensmittel werden verkauft"
},
"3": {
"then": "Zigaretten werden verkauft"
},
"4": {
"then": "Kondome werden verkauft"
},
"5": {
"then": "Kaffee wird verkauft"
},
"6": {
"then": "Trinkwasser wird verkauft"
},
"7": {
"then": "Zeitungen werden verkauft"
},
"8": {
"then": "Fahrradschläuche werden verkauft"
},
"9": {
"then": "Milch wird verkauft"
},
"10": { "10": {
"then": "Brot wird verkauft" "then": "Brot wird verkauft"
}, },
@ -9882,6 +9968,30 @@
}, },
"21": { "21": {
"then": "Fahrscheine werden verkauft" "then": "Fahrscheine werden verkauft"
},
"2": {
"then": "Lebensmittel werden verkauft"
},
"3": {
"then": "Zigaretten werden verkauft"
},
"4": {
"then": "Kondome werden verkauft"
},
"5": {
"then": "Kaffee wird verkauft"
},
"6": {
"then": "Trinkwasser wird verkauft"
},
"7": {
"then": "Zeitungen werden verkauft"
},
"8": {
"then": "Fahrradschläuche werden verkauft"
},
"9": {
"then": "Milch wird verkauft"
} }
}, },
"question": "Was wird in diesem Automaten verkauft?", "question": "Was wird in diesem Automaten verkauft?",

View file

@ -4193,7 +4193,7 @@
"then": "Aquí se juega al baloncesto" "then": "Aquí se juega al baloncesto"
} }
}, },
"question": "¿Qué deporte se practica aquí?", "question": "¿Qué deporte se puede practicar aquí?",
"render": "Aquí se juega al {sport}" "render": "Aquí se juega al {sport}"
}, },
"sport_pitch-surface": { "sport_pitch-surface": {

View file

@ -775,6 +775,9 @@
}, },
"6": { "6": {
"then": "Keranjang sampah untuk plastik" "then": "Keranjang sampah untuk plastik"
},
"7": {
"then": "Keranjang sampah untuk kertas"
} }
}, },
"question": "Keranjang sampah macam apa ini?" "question": "Keranjang sampah macam apa ini?"

View file

@ -2731,6 +2731,9 @@
}, },
"6": { "6": {
"then": "Un cestino rifiuti per la plastica" "then": "Un cestino rifiuti per la plastica"
},
"7": {
"then": "Un cestino rifiuti per la carta"
} }
}, },
"question": "Che tipo di cestino dei rifiuti è questo?" "question": "Che tipo di cestino dei rifiuti è questo?"

View file

@ -55,10 +55,14 @@ export class NewGeometryFromChangesFeatureSource implements WritableFeatureSourc
* @private * @private
*/ */
private handleChange(change: ChangeDescription): boolean { private handleChange(change: ChangeDescription): boolean {
const backend = this._backend if (change.changes === undefined) {
const allElementStorage = this._allElementStorage // The geometry is not described - not a new point or geometry change, but probably a tagchange to a newly created point
// Not something that should be handled here
return false
}
console.log("Handling pending change") const allElementStorage = this._allElementStorage
console.log("Handling pending change", change)
if (change.id > 0) { if (change.id > 0) {
// This is an already existing object // This is an already existing object
// In _most_ of the cases, this means that this _isn't_ a new object // In _most_ of the cases, this means that this _isn't_ a new object
@ -86,10 +90,6 @@ export class NewGeometryFromChangesFeatureSource implements WritableFeatureSourc
this._featureProperties.trackFeature(feature) this._featureProperties.trackFeature(feature)
this.addNewFeature(feature) this.addNewFeature(feature)
return true return true
} else if (change.changes === undefined) {
// The geometry is not described - not a new point or geometry change, but probably a tagchange to a newly created point
// Not something that should be handled here
return false
} }
try { try {
@ -151,7 +151,7 @@ export class NewGeometryFromChangesFeatureSource implements WritableFeatureSourc
continue continue
} }
somethingChanged ||= this.handleChange(change) somethingChanged = this.handleChange(change) || somethingChanged // important: _first_ evaluate the method, to avoid shortcutting
} }
if (somethingChanged) { if (somethingChanged) {
this.features.ping() this.features.ping()

View file

@ -525,11 +525,14 @@ export class Changes {
pending = pending.map((ch) => ChangeDescriptionTools.rewriteIds(ch, remappings)) pending = pending.map((ch) => ChangeDescriptionTools.rewriteIds(ch, remappings))
console.log("Result is", pending) console.log("Result is", pending)
} }
const changes: { const changes: {
newObjects: OsmObject[] newObjects: OsmObject[]
modifiedObjects: OsmObject[] modifiedObjects: OsmObject[]
deletedObjects: OsmObject[] deletedObjects: OsmObject[]
} = self.CreateChangesetObjects(pending, objects) } = self.CreateChangesetObjects(pending, objects)
return Changes.createChangesetFor("" + csId, changes) return Changes.createChangesetFor("" + csId, changes)
}, },
metatags, metatags,
@ -558,19 +561,8 @@ export class Changes {
const successes = await Promise.all( const successes = await Promise.all(
Array.from(pendingPerTheme, async ([theme, pendingChanges]) => { Array.from(pendingPerTheme, async ([theme, pendingChanges]) => {
try { try {
const openChangeset = this.state.osmConnection const openChangeset = UIEventSource.asInt(this.state.osmConnection
.GetPreference("current-open-changeset-" + theme) .GetPreference("current-open-changeset-" + theme))
.sync(
(str) => {
const n = Number(str)
if (isNaN(n)) {
return undefined
}
return n
},
[],
(n) => "" + n
)
console.log( console.log(
"Using current-open-changeset-" + "Using current-open-changeset-" +
theme + theme +

View file

@ -1,9 +1,14 @@
import { UIEventSource } from "../UIEventSource" import { UIEventSource } from "../UIEventSource"
import UserDetails, { OsmConnection } from "./OsmConnection" import UserDetails, { OsmConnection } from "./OsmConnection"
import { Utils } from "../../Utils" import { Utils } from "../../Utils"
import { LocalStorageSource } from "../Web/LocalStorageSource";
export class OsmPreferences { export class OsmPreferences {
public preferences = new UIEventSource<Record<string, string>>({}, "all-osm-preferences") /**
* A dictionary containing all the preferences. The 'preferenceSources' will be initialized from this
* We keep a local copy of them, to init mapcomplete with the previous choices and to be able to get the open changesets right away
*/
public preferences = LocalStorageSource.GetParsed<Record<string, string>>( "all-osm-preferences", {})
private readonly preferenceSources = new Map<string, UIEventSource<string>>() private readonly preferenceSources = new Map<string, UIEventSource<string>>()
private auth: any private auth: any
private userDetails: UIEventSource<UserDetails> private userDetails: UIEventSource<UserDetails>

View file

@ -165,7 +165,7 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
(urls) => urls?.join(",") (urls) => urls?.join(",")
) )
this.overpassTimeout = UIEventSource.asFloat( this.overpassTimeout = UIEventSource.asInt(
QueryParameters.GetQueryParameter( QueryParameters.GetQueryParameter(
"overpassTimeout", "overpassTimeout",
"" + layoutToUse?.overpassTimeout, "" + layoutToUse?.overpassTimeout,
@ -181,7 +181,7 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
) )
) )
this.osmApiTileSize = UIEventSource.asFloat( this.osmApiTileSize = UIEventSource.asInt(
QueryParameters.GetQueryParameter( QueryParameters.GetQueryParameter(
"osmApiTileSize", "osmApiTileSize",
"" + layoutToUse?.osmApiTileSize, "" + layoutToUse?.osmApiTileSize,

View file

@ -1,28 +1,28 @@
import { Utils } from "../Utils" import { Utils } from "../Utils";
import { Readable, Subscriber, Unsubscriber, Updater, Writable } from "svelte/store" import { Readable, Subscriber, Unsubscriber, Updater, Writable } from "svelte/store";
/** /**
* Various static utils * Various static utils
*/ */
export class Stores { export class Stores {
public static Chronic(millis: number, asLong: () => boolean = undefined): Store<Date> { public static Chronic(millis: number, asLong: () => boolean = undefined): Store<Date> {
const source = new UIEventSource<Date>(undefined) const source = new UIEventSource<Date>(undefined);
function run() { function run() {
source.setData(new Date()) source.setData(new Date());
if (asLong === undefined || asLong()) { if (asLong === undefined || asLong()) {
window.setTimeout(run, millis) window.setTimeout(run, millis);
} }
} }
run() run();
return source return source;
} }
public static FromPromiseWithErr<T>( public static FromPromiseWithErr<T>(
promise: Promise<T> promise: Promise<T>
): Store<{ success: T } | { error: any }> { ): Store<{ success: T } | { error: any }> {
return UIEventSource.FromPromiseWithErr(promise) return UIEventSource.FromPromiseWithErr(promise);
} }
/** /**
@ -32,14 +32,14 @@ export class Stores {
* @constructor * @constructor
*/ */
public static FromPromise<T>(promise: Promise<T>): Store<T> { public static FromPromise<T>(promise: Promise<T>): Store<T> {
const src = new UIEventSource<T>(undefined) const src = new UIEventSource<T>(undefined);
promise?.then((d) => src.setData(d)) promise?.then((d) => src.setData(d));
promise?.catch((err) => console.warn("Promise failed:", err)) promise?.catch((err) => console.warn("Promise failed:", err));
return src return src;
} }
public static flatten<X>(source: Store<Store<X>>, possibleSources?: Store<any>[]): Store<X> { public static flatten<X>(source: Store<Store<X>>, possibleSources?: Store<any>[]): Store<X> {
return UIEventSource.flatten(source, possibleSources) return UIEventSource.flatten(source, possibleSources);
} }
/** /**
@ -57,39 +57,39 @@ export class Stores {
* @constructor * @constructor
*/ */
public static ListStabilized<T>(src: Store<T[]>): Store<T[]> { public static ListStabilized<T>(src: Store<T[]>): Store<T[]> {
const stable = new UIEventSource<T[]>(undefined) const stable = new UIEventSource<T[]>(undefined);
src.addCallbackAndRun((list) => { src.addCallbackAndRun((list) => {
if (list === undefined) { if (list === undefined) {
stable.setData(undefined) stable.setData(undefined);
return return;
} }
if (Utils.sameList(stable.data, list)) { if (Utils.sameList(stable.data, list)) {
return return;
} }
stable.setData(list) stable.setData(list);
}) });
return stable return stable;
} }
} }
export abstract class Store<T> implements Readable<T> { export abstract class Store<T> implements Readable<T> {
abstract readonly data: T abstract readonly data: T;
/** /**
* Optional value giving a title to the UIEventSource, mainly used for debugging * Optional value giving a title to the UIEventSource, mainly used for debugging
*/ */
public readonly tag: string | undefined public readonly tag: string | undefined;
constructor(tag: string = undefined) { constructor(tag: string = undefined) {
this.tag = tag this.tag = tag;
if (tag === undefined || tag === "") { if (tag === undefined || tag === "") {
let createStack = Utils.runningFromConsole let createStack = Utils.runningFromConsole;
if (!Utils.runningFromConsole) { if (!Utils.runningFromConsole) {
createStack = window.location.hostname === "127.0.0.1" createStack = window.location.hostname === "127.0.0.1";
} }
if (createStack) { if (createStack) {
const callstack = new Error().stack.split("\n") const callstack = new Error().stack.split("\n");
this.tag = callstack[1] this.tag = callstack[1];
} }
} }
} }
@ -100,13 +100,13 @@ export abstract class Store<T> implements Readable<T> {
public mapD<J>(f: (t: T) => J, extraStoresToWatch?: Store<any>[]): Store<J> { public mapD<J>(f: (t: T) => J, extraStoresToWatch?: Store<any>[]): Store<J> {
return this.map((t) => { return this.map((t) => {
if (t === undefined) { if (t === undefined) {
return undefined return undefined;
} }
if (t === null) { if (t === null) {
return null return null;
} }
return f(t) return f(t);
}, extraStoresToWatch) }, extraStoresToWatch);
} }
/** /**
@ -135,17 +135,17 @@ export abstract class Store<T> implements Readable<T> {
public withEqualityStabilized( public withEqualityStabilized(
comparator: (t: T | undefined, t1: T | undefined) => boolean comparator: (t: T | undefined, t1: T | undefined) => boolean
): Store<T> { ): Store<T> {
let oldValue = undefined let oldValue = undefined;
return this.map((v) => { return this.map((v) => {
if (v == oldValue) { if (v == oldValue) {
return oldValue return oldValue;
} }
if (comparator(oldValue, v)) { if (comparator(oldValue, v)) {
return oldValue return oldValue;
} }
oldValue = v oldValue = v;
return v return v;
}) });
} }
/** /**
@ -195,49 +195,49 @@ export abstract class Store<T> implements Readable<T> {
* lastValue // => "def" * lastValue // => "def"
*/ */
public bind<X>(f: (t: T) => Store<X>): Store<X> { public bind<X>(f: (t: T) => Store<X>): Store<X> {
const mapped = this.map(f) const mapped = this.map(f);
const sink = new UIEventSource<X>(undefined) const sink = new UIEventSource<X>(undefined);
const seenEventSources = new Set<Store<X>>() const seenEventSources = new Set<Store<X>>();
mapped.addCallbackAndRun((newEventSource) => { mapped.addCallbackAndRun((newEventSource) => {
if (newEventSource === null) { if (newEventSource === null) {
sink.setData(null) sink.setData(null);
} else if (newEventSource === undefined) { } else if (newEventSource === undefined) {
sink.setData(undefined) sink.setData(undefined);
} else if (!seenEventSources.has(newEventSource)) { } else if (!seenEventSources.has(newEventSource)) {
seenEventSources.add(newEventSource) seenEventSources.add(newEventSource);
newEventSource.addCallbackAndRun((resultData) => { newEventSource.addCallbackAndRun((resultData) => {
if (mapped.data === newEventSource) { if (mapped.data === newEventSource) {
sink.setData(resultData) sink.setData(resultData);
} }
}) });
} else { } else {
// Already seen, so we don't have to add a callback, just update the value // Already seen, so we don't have to add a callback, just update the value
sink.setData(newEventSource.data) sink.setData(newEventSource.data);
} }
}) });
return sink return sink;
} }
public stabilized(millisToStabilize): Store<T> { public stabilized(millisToStabilize): Store<T> {
if (Utils.runningFromConsole) { if (Utils.runningFromConsole) {
return this return this;
} }
const newSource = new UIEventSource<T>(this.data) const newSource = new UIEventSource<T>(this.data);
const self = this const self = this;
this.addCallback((latestData) => { this.addCallback((latestData) => {
window.setTimeout(() => { window.setTimeout(() => {
if (self.data == latestData) { if (self.data == latestData) {
// compare by reference. // compare by reference.
// Note that 'latestData' and 'self.data' are both from the same UIEVentSource, but both are dereferenced at a different time // Note that 'latestData' and 'self.data' are both from the same UIEVentSource, but both are dereferenced at a different time
newSource.setData(latestData) newSource.setData(latestData);
} }
}, millisToStabilize) }, millisToStabilize);
}) });
return newSource return newSource;
} }
/** /**
@ -247,23 +247,23 @@ export abstract class Store<T> implements Readable<T> {
* @constructor * @constructor
*/ */
public AsPromise(condition?: (t: T) => boolean): Promise<T> { public AsPromise(condition?: (t: T) => boolean): Promise<T> {
const self = this const self = this;
condition = condition ?? ((t) => t !== undefined) condition = condition ?? ((t) => t !== undefined);
return new Promise((resolve) => { return new Promise((resolve) => {
const data = self.data const data = self.data;
if (condition(data)) { if (condition(data)) {
resolve(data) resolve(data);
} else { } else {
self.addCallbackD((data) => { self.addCallbackD((data) => {
if (condition(data)) { if (condition(data)) {
resolve(data) resolve(data);
return true // return true to unregister as we only need to be called once return true; // return true to unregister as we only need to be called once
} else { } else {
return false // We didn't resolve yet, wait for the next ping return false; // We didn't resolve yet, wait for the next ping
} }
}) });
} }
}) });
} }
/** /**
@ -275,50 +275,51 @@ export abstract class Store<T> implements Readable<T> {
// Note: run is wrapped in an anonymous function. 'Run' returns the value. If this value happens to be true, it would unsubscribe // Note: run is wrapped in an anonymous function. 'Run' returns the value. If this value happens to be true, it would unsubscribe
return this.addCallbackAndRun((v) => { return this.addCallbackAndRun((v) => {
run(v) run(v);
}) });
} }
} }
export class ImmutableStore<T> extends Store<T> { export class ImmutableStore<T> extends Store<T> {
public readonly data: T public readonly data: T;
constructor(data: T) { constructor(data: T) {
super() super();
this.data = data this.data = data;
} }
private static readonly pass: () => void = () => {} private static readonly pass: () => void = () => {
};
addCallback(_: (data: T) => void): () => void { addCallback(_: (data: T) => void): () => void {
// pass: data will never change // pass: data will never change
return ImmutableStore.pass return ImmutableStore.pass;
} }
addCallbackAndRun(callback: (data: T) => void): () => void { addCallbackAndRun(callback: (data: T) => void): () => void {
callback(this.data) callback(this.data);
// no callback registry: data will never change // no callback registry: data will never change
return ImmutableStore.pass return ImmutableStore.pass;
} }
addCallbackAndRunD(callback: (data: T) => void): () => void { addCallbackAndRunD(callback: (data: T) => void): () => void {
if (this.data !== undefined) { if (this.data !== undefined) {
callback(this.data) callback(this.data);
} }
// no callback registry: data will never change // no callback registry: data will never change
return ImmutableStore.pass return ImmutableStore.pass;
} }
addCallbackD(_: (data: T) => void): () => void { addCallbackD(_: (data: T) => void): () => void {
// pass: data will never change // pass: data will never change
return ImmutableStore.pass return ImmutableStore.pass;
} }
map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): ImmutableStore<J> { map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): ImmutableStore<J> {
if (extraStores?.length > 0) { if (extraStores?.length > 0) {
return new MappedStore(this, f, extraStores, undefined, f(this.data)) return new MappedStore(this, f, extraStores, undefined, f(this.data));
} }
return new ImmutableStore<J>(f(this.data)) return new ImmutableStore<J>(f(this.data));
} }
} }
@ -326,8 +327,8 @@ export class ImmutableStore<T> extends Store<T> {
* Keeps track of the callback functions * Keeps track of the callback functions
*/ */
class ListenerTracker<T> { class ListenerTracker<T> {
public pingCount = 0 public pingCount = 0;
private readonly _callbacks: ((t: T) => boolean | void | any)[] = [] private readonly _callbacks: ((t: T) => boolean | void | any)[] = [];
/** /**
* Adds a callback which can be called; a function to unregister is returned * Adds a callback which can be called; a function to unregister is returned
@ -335,17 +336,17 @@ class ListenerTracker<T> {
public addCallback(callback: (t: T) => boolean | void | any): () => void { public addCallback(callback: (t: T) => boolean | void | any): () => void {
if (callback === console.log) { if (callback === console.log) {
// This ^^^ actually works! // This ^^^ actually works!
throw "Don't add console.log directly as a callback - you'll won't be able to find it afterwards. Wrap it in a lambda instead." throw "Don't add console.log directly as a callback - you'll won't be able to find it afterwards. Wrap it in a lambda instead.";
} }
this._callbacks.push(callback) this._callbacks.push(callback);
// Give back an unregister-function! // Give back an unregister-function!
return () => { return () => {
const index = this._callbacks.indexOf(callback) const index = this._callbacks.indexOf(callback);
if (index >= 0) { if (index >= 0) {
this._callbacks.splice(index, 1) this._callbacks.splice(index, 1);
} }
} };
} }
/** /**
@ -353,40 +354,40 @@ class ListenerTracker<T> {
* Returns the number of registered callbacks * Returns the number of registered callbacks
*/ */
public ping(data: T): number { public ping(data: T): number {
this.pingCount++ this.pingCount++;
let toDelete = undefined let toDelete = undefined;
let startTime = new Date().getTime() / 1000 let startTime = new Date().getTime() / 1000;
for (const callback of this._callbacks) { for (const callback of this._callbacks) {
try { try {
if (callback(data) === true) { if (callback(data) === true) {
// This callback wants to be deleted // This callback wants to be deleted
// Note: it has to return precisely true in order to avoid accidental deletions // Note: it has to return precisely true in order to avoid accidental deletions
if (toDelete === undefined) { if (toDelete === undefined) {
toDelete = [callback] toDelete = [callback];
} else { } else {
toDelete.push(callback) toDelete.push(callback);
} }
} }
} catch (e) { } catch (e) {
console.error("Got an error while running a callback:", e) console.error("Got an error while running a callback:", e);
} }
} }
let endTime = new Date().getTime() / 1000 let endTime = new Date().getTime() / 1000;
if (endTime - startTime > 500) { if (endTime - startTime > 500) {
console.trace( console.trace(
"Warning: a ping took more then 500ms; this is probably a performance issue" "Warning: a ping took more then 500ms; this is probably a performance issue"
) );
} }
if (toDelete !== undefined) { if (toDelete !== undefined) {
for (const toDeleteElement of toDelete) { for (const toDeleteElement of toDelete) {
this._callbacks.splice(this._callbacks.indexOf(toDeleteElement), 1) this._callbacks.splice(this._callbacks.indexOf(toDeleteElement), 1);
} }
} }
return this._callbacks.length return this._callbacks.length;
} }
length() { length() {
return this._callbacks.length return this._callbacks.length;
} }
} }
@ -394,16 +395,16 @@ class ListenerTracker<T> {
* The mapped store is a helper type which does the mapping of a function. * The mapped store is a helper type which does the mapping of a function.
*/ */
class MappedStore<TIn, T> extends Store<T> { class MappedStore<TIn, T> extends Store<T> {
private static readonly pass: () => {} private static readonly pass: () => {};
private readonly _upstream: Store<TIn> private readonly _upstream: Store<TIn>;
private readonly _upstreamCallbackHandler: ListenerTracker<TIn> | undefined private readonly _upstreamCallbackHandler: ListenerTracker<TIn> | undefined;
private _upstreamPingCount: number = -1 private _upstreamPingCount: number = -1;
private _unregisterFromUpstream: () => void private _unregisterFromUpstream: () => void;
private readonly _f: (t: TIn) => T private readonly _f: (t: TIn) => T;
private readonly _extraStores: Store<any>[] | undefined private readonly _extraStores: Store<any>[] | undefined;
private _unregisterFromExtraStores: (() => void)[] | undefined private _unregisterFromExtraStores: (() => void)[] | undefined;
private _callbacks: ListenerTracker<T> = new ListenerTracker<T>() private _callbacks: ListenerTracker<T> = new ListenerTracker<T>();
private _callbacksAreRegistered = false private _callbacksAreRegistered = false;
constructor( constructor(
upstream: Store<TIn>, upstream: Store<TIn>,
@ -413,20 +414,20 @@ class MappedStore<TIn, T> extends Store<T> {
initialState: T, initialState: T,
onDestroy?: (f: () => void) => void onDestroy?: (f: () => void) => void
) { ) {
super() super();
this._upstream = upstream this._upstream = upstream;
this._upstreamCallbackHandler = upstreamListenerHandler this._upstreamCallbackHandler = upstreamListenerHandler;
this._f = f this._f = f;
this._data = initialState this._data = initialState;
this._upstreamPingCount = upstreamListenerHandler?.pingCount this._upstreamPingCount = upstreamListenerHandler?.pingCount;
this._extraStores = extraStores this._extraStores = extraStores;
this.registerCallbacksToUpstream() this.registerCallbacksToUpstream();
if (onDestroy !== undefined) { if (onDestroy !== undefined) {
onDestroy(() => this.unregisterFromUpstream()) onDestroy(() => this.unregisterFromUpstream());
} }
} }
private _data: T private _data: T;
/** /**
* Gets the current data from the store * Gets the current data from the store
@ -442,27 +443,27 @@ class MappedStore<TIn, T> extends Store<T> {
// Callbacks are not registered, so we haven't been listening for updates from the upstream which might have changed // Callbacks are not registered, so we haven't been listening for updates from the upstream which might have changed
if (this._upstreamCallbackHandler?.pingCount != this._upstreamPingCount) { if (this._upstreamCallbackHandler?.pingCount != this._upstreamPingCount) {
// Upstream has pinged - let's update our data first // Upstream has pinged - let's update our data first
this._data = this._f(this._upstream.data) this._data = this._f(this._upstream.data);
} }
return this._data return this._data;
} }
return this._data return this._data;
} }
map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): Store<J> { map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): Store<J> {
let stores: Store<any>[] = undefined let stores: Store<any>[] = undefined;
if (extraStores?.length > 0 || this._extraStores?.length > 0) { if (extraStores?.length > 0 || this._extraStores?.length > 0) {
stores = [] stores = [];
} }
if (extraStores?.length > 0) { if (extraStores?.length > 0) {
stores.push(...extraStores) stores.push(...extraStores);
} }
if (this._extraStores?.length > 0) { if (this._extraStores?.length > 0) {
this._extraStores?.forEach((store) => { this._extraStores?.forEach((store) => {
if (stores.indexOf(store) < 0) { if (stores.indexOf(store) < 0) {
stores.push(store) stores.push(store);
} }
}) });
} }
return new MappedStore( return new MappedStore(
this, this,
@ -470,111 +471,111 @@ class MappedStore<TIn, T> extends Store<T> {
stores, stores,
this._callbacks, this._callbacks,
f(this.data) f(this.data)
) );
} }
addCallback(callback: (data: T) => any | boolean | void): () => void { addCallback(callback: (data: T) => any | boolean | void): () => void {
if (!this._callbacksAreRegistered) { if (!this._callbacksAreRegistered) {
// This is the first callback that is added // This is the first callback that is added
// We register this 'map' to the upstream object and all the streams // We register this 'map' to the upstream object and all the streams
this.registerCallbacksToUpstream() this.registerCallbacksToUpstream();
} }
const unregister = this._callbacks.addCallback(callback) const unregister = this._callbacks.addCallback(callback);
return () => { return () => {
unregister() unregister();
if (this._callbacks.length() == 0) { if (this._callbacks.length() == 0) {
this.unregisterFromUpstream() this.unregisterFromUpstream();
} }
} };
} }
addCallbackAndRun(callback: (data: T) => any | boolean | void): () => void { addCallbackAndRun(callback: (data: T) => any | boolean | void): () => void {
const unregister = this.addCallback(callback) const unregister = this.addCallback(callback);
const doRemove = callback(this.data) const doRemove = callback(this.data);
if (doRemove === true) { if (doRemove === true) {
unregister() unregister();
return MappedStore.pass return MappedStore.pass;
} }
return unregister return unregister;
} }
addCallbackAndRunD(callback: (data: T) => any | boolean | void): () => void { addCallbackAndRunD(callback: (data: T) => any | boolean | void): () => void {
return this.addCallbackAndRun((data) => { return this.addCallbackAndRun((data) => {
if (data !== undefined) { if (data !== undefined) {
return callback(data) return callback(data);
} }
}) });
} }
addCallbackD(callback: (data: T) => any | boolean | void): () => void { addCallbackD(callback: (data: T) => any | boolean | void): () => void {
return this.addCallback((data) => { return this.addCallback((data) => {
if (data !== undefined) { if (data !== undefined) {
return callback(data) return callback(data);
} }
}) });
} }
private unregisterFromUpstream() { private unregisterFromUpstream() {
console.debug("Unregistering callbacks for", this.tag) console.debug("Unregistering callbacks for", this.tag);
this._callbacksAreRegistered = false this._callbacksAreRegistered = false;
this._unregisterFromUpstream() this._unregisterFromUpstream();
this._unregisterFromExtraStores?.forEach((unr) => unr()) this._unregisterFromExtraStores?.forEach((unr) => unr());
} }
private registerCallbacksToUpstream() { private registerCallbacksToUpstream() {
const self = this const self = this;
this._unregisterFromUpstream = this._upstream.addCallback((_) => self.update()) this._unregisterFromUpstream = this._upstream.addCallback((_) => self.update());
this._unregisterFromExtraStores = this._extraStores?.map((store) => this._unregisterFromExtraStores = this._extraStores?.map((store) =>
store?.addCallback((_) => self.update()) store?.addCallback((_) => self.update())
) );
this._callbacksAreRegistered = true this._callbacksAreRegistered = true;
} }
private update(): void { private update(): void {
const newData = this._f(this._upstream.data) const newData = this._f(this._upstream.data);
this._upstreamPingCount = this._upstreamCallbackHandler?.pingCount this._upstreamPingCount = this._upstreamCallbackHandler?.pingCount;
if (this._data == newData) { if (this._data == newData) {
return return;
} }
this._data = newData this._data = newData;
this._callbacks.ping(this._data) this._callbacks.ping(this._data);
} }
} }
export class UIEventSource<T> extends Store<T> implements Writable<T> { export class UIEventSource<T> extends Store<T> implements Writable<T> {
private static readonly pass: () => {} private static readonly pass: () => {};
public data: T public data: T;
_callbacks: ListenerTracker<T> = new ListenerTracker<T>() _callbacks: ListenerTracker<T> = new ListenerTracker<T>();
constructor(data: T, tag: string = "") { constructor(data: T, tag: string = "") {
super(tag) super(tag);
this.data = data this.data = data;
} }
public static flatten<X>( public static flatten<X>(
source: Store<Store<X>>, source: Store<Store<X>>,
possibleSources?: Store<any>[] possibleSources?: Store<any>[]
): UIEventSource<X> { ): UIEventSource<X> {
const sink = new UIEventSource<X>(source.data?.data) const sink = new UIEventSource<X>(source.data?.data);
source.addCallback((latestData) => { source.addCallback((latestData) => {
sink.setData(latestData?.data) sink.setData(latestData?.data);
latestData.addCallback((data) => { latestData.addCallback((data) => {
if (source.data !== latestData) { if (source.data !== latestData) {
return true return true;
} }
sink.setData(data) sink.setData(data);
}) });
}) });
for (const possibleSource of possibleSources ?? []) { for (const possibleSource of possibleSources ?? []) {
possibleSource?.addCallback(() => { possibleSource?.addCallback(() => {
sink.setData(source.data?.data) sink.setData(source.data?.data);
}) });
} }
return sink return sink;
} }
/** /**
@ -585,16 +586,16 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> {
promise: Promise<T>, promise: Promise<T>,
onError: (e: any) => void = undefined onError: (e: any) => void = undefined
): UIEventSource<T> { ): UIEventSource<T> {
const src = new UIEventSource<T>(undefined) const src = new UIEventSource<T>(undefined);
promise?.then((d) => src.setData(d)) promise?.then((d) => src.setData(d));
promise?.catch((err) => { promise?.catch((err) => {
if (onError !== undefined) { if (onError !== undefined) {
onError(err) onError(err);
} else { } else {
console.warn("Promise failed:", err) console.warn("Promise failed:", err);
} }
}) });
return src return src;
} }
/** /**
@ -606,26 +607,68 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> {
public static FromPromiseWithErr<T>( public static FromPromiseWithErr<T>(
promise: Promise<T> promise: Promise<T>
): UIEventSource<{ success: T } | { error: any }> { ): UIEventSource<{ success: T } | { error: any }> {
const src = new UIEventSource<{ success: T } | { error: any }>(undefined) const src = new UIEventSource<{ success: T } | { error: any }>(undefined);
promise?.then((d) => src.setData({ success: d })) promise?.then((d) => src.setData({ success: d }));
promise?.catch((err) => src.setData({ error: err })) promise?.catch((err) => src.setData({ error: err }));
return src return src;
} }
public static asFloat(source: UIEventSource<string>): UIEventSource<number> { /**
*
* @param source
* UIEventSource.asInt(new UIEventSource("123")).data // => 123
* UIEventSource.asInt(new UIEventSource("123456789")).data // => 123456789
*
* const srcStr = new UIEventSource("123456789"))
* const srcInt = UIEventSource.asInt(srcStr)
* srcInt.setData(987654321)
* srcStr.data // => "987654321"
*/
public static asInt(source: UIEventSource<string>): UIEventSource<number> {
return source.sync( return source.sync(
(str) => { (str) => {
let parsed = parseFloat(str) let parsed = parseInt(str);
return isNaN(parsed) ? undefined : parsed return isNaN(parsed) ? undefined : parsed;
}, },
[], [],
(fl) => { (fl) => {
if (fl === undefined || isNaN(fl)) { if (fl === undefined || isNaN(fl)) {
return undefined return undefined;
} }
return ("" + fl).substr(0, 8) return ("" + fl);
} }
) );
}
/**
* UIEventSource.asFloat(new UIEventSource("123")).data // => 123
* UIEventSource.asFloat(new UIEventSource("123456789")).data // => 123456789
* UIEventSource.asFloat(new UIEventSource("0.5")).data // => 0.5
* UIEventSource.asFloat(new UIEventSource("0.125")).data // => 0.125
* UIEventSource.asFloat(new UIEventSource("0.0000000001")).data // => 0.0000000001
*
*
* const srcStr = new UIEventSource("123456789"))
* const srcInt = UIEventSource.asFloat(srcStr)
* srcInt.setData(987654321)
* srcStr.data // => "987654321"
* @param source
*/
public static asFloat(source: UIEventSource<string>): UIEventSource<number> {
return source.sync(
(str) => {
let parsed = parseFloat(str);
return isNaN(parsed) ? undefined : parsed;
},
[],
(fl) => {
if (fl === undefined || isNaN(fl)) {
return undefined;
}
return ("" + fl);
}
);
} }
static asBoolean(stringUIEventSource: UIEventSource<string>) { static asBoolean(stringUIEventSource: UIEventSource<string>) {
@ -633,7 +676,7 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> {
(str) => str === "true", (str) => str === "true",
[], [],
(b) => "" + b (b) => "" + b
) );
} }
/** /**
@ -641,9 +684,9 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> {
* However, this value can be overriden without affecting source * However, this value can be overriden without affecting source
*/ */
static feedFrom<T>(store: Store<T>): UIEventSource<T> { static feedFrom<T>(store: Store<T>): UIEventSource<T> {
const src = new UIEventSource(store.data) const src = new UIEventSource(store.data);
store.addCallback((t) => src.setData(t)) store.addCallback((t) => src.setData(t));
return src return src;
} }
/** /**
@ -653,46 +696,46 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> {
* @param callback * @param callback
*/ */
public addCallback(callback: (latestData: T) => boolean | void | any): () => void { public addCallback(callback: (latestData: T) => boolean | void | any): () => void {
return this._callbacks.addCallback(callback) return this._callbacks.addCallback(callback);
} }
public addCallbackAndRun(callback: (latestData: T) => boolean | void | any): () => void { public addCallbackAndRun(callback: (latestData: T) => boolean | void | any): () => void {
const doDeleteCallback = callback(this.data) const doDeleteCallback = callback(this.data);
if (doDeleteCallback !== true) { if (doDeleteCallback !== true) {
return this.addCallback(callback) return this.addCallback(callback);
} else { } else {
return UIEventSource.pass return UIEventSource.pass;
} }
} }
public addCallbackAndRunD(callback: (data: T) => void): () => void { public addCallbackAndRunD(callback: (data: T) => void): () => void {
return this.addCallbackAndRun((data) => { return this.addCallbackAndRun((data) => {
if (data !== undefined && data !== null) { if (data !== undefined && data !== null) {
return callback(data) return callback(data);
} }
}) });
} }
public addCallbackD(callback: (data: T) => void): () => void { public addCallbackD(callback: (data: T) => void): () => void {
return this.addCallback((data) => { return this.addCallback((data) => {
if (data !== undefined && data !== null) { if (data !== undefined && data !== null) {
return callback(data) return callback(data);
} }
}) });
} }
public setData(t: T): UIEventSource<T> { public setData(t: T): UIEventSource<T> {
if (this.data == t) { if (this.data == t) {
// MUST COMPARE BY REFERENCE! // MUST COMPARE BY REFERENCE!
return return;
} }
this.data = t this.data = t;
this._callbacks.ping(t) this._callbacks.ping(t);
return this return this;
} }
public ping(): void { public ping(): void {
this._callbacks.ping(this.data) this._callbacks.ping(this.data);
} }
/** /**
@ -724,7 +767,7 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> {
extraSources: Store<any>[] = [], extraSources: Store<any>[] = [],
onDestroy?: (f: () => void) => void onDestroy?: (f: () => void) => void
): Store<J> { ): Store<J> {
return new MappedStore(this, f, extraSources, this._callbacks, f(this.data), onDestroy) return new MappedStore(this, f, extraSources, this._callbacks, f(this.data), onDestroy);
} }
/** /**
@ -736,14 +779,14 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> {
this, this,
(t) => { (t) => {
if (t === undefined) { if (t === undefined) {
return undefined return undefined;
} }
return f(t) return f(t);
}, },
extraSources, extraSources,
this._callbacks, this._callbacks,
this.data === undefined ? undefined : f(this.data) this.data === undefined ? undefined : f(this.data)
) );
} }
/** /**
@ -760,53 +803,53 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> {
g: (j: J, t: T) => T, g: (j: J, t: T) => T,
allowUnregister = false allowUnregister = false
): UIEventSource<J> { ): UIEventSource<J> {
const self = this const self = this;
const stack = new Error().stack.split("\n") const stack = new Error().stack.split("\n");
const callee = stack[1] const callee = stack[1];
const newSource = new UIEventSource<J>(f(this.data), "map(" + this.tag + ")@" + callee) const newSource = new UIEventSource<J>(f(this.data), "map(" + this.tag + ")@" + callee);
const update = function () { const update = function() {
newSource.setData(f(self.data)) newSource.setData(f(self.data));
return allowUnregister && newSource._callbacks.length() === 0 return allowUnregister && newSource._callbacks.length() === 0;
} };
this.addCallback(update) this.addCallback(update);
for (const extraSource of extraSources) { for (const extraSource of extraSources) {
extraSource?.addCallback(update) extraSource?.addCallback(update);
} }
if (g !== undefined) { if (g !== undefined) {
newSource.addCallback((latest) => { newSource.addCallback((latest) => {
self.setData(g(latest, self.data)) self.setData(g(latest, self.data));
}) });
} }
return newSource return newSource;
} }
public syncWith(otherSource: UIEventSource<T>, reverseOverride = false): UIEventSource<T> { public syncWith(otherSource: UIEventSource<T>, reverseOverride = false): UIEventSource<T> {
this.addCallback((latest) => otherSource.setData(latest)) this.addCallback((latest) => otherSource.setData(latest));
const self = this const self = this;
otherSource.addCallback((latest) => self.setData(latest)) otherSource.addCallback((latest) => self.setData(latest));
if (reverseOverride) { if (reverseOverride) {
if (otherSource.data !== undefined) { if (otherSource.data !== undefined) {
this.setData(otherSource.data) this.setData(otherSource.data);
} }
} else if (this.data === undefined) { } else if (this.data === undefined) {
this.setData(otherSource.data) this.setData(otherSource.data);
} else { } else {
otherSource.setData(this.data) otherSource.setData(this.data);
} }
return this return this;
} }
set(value: T): void { set(value: T): void {
this.setData(value) this.setData(value);
} }
update(f: Updater<T> & ((value: T) => T)): void { update(f: Updater<T> & ((value: T) => T)): void {
this.setData(f(this.data)) this.setData(f(this.data));
} }
} }

View file

@ -1,21 +1,21 @@
import { ImmutableStore, Store, UIEventSource } from "../../Logic/UIEventSource"; import { ImmutableStore, Store, UIEventSource } from "../../Logic/UIEventSource"
import type { Map as MlMap } from "maplibre-gl"; import type { Map as MlMap } from "maplibre-gl"
import { GeoJSONSource, Marker } from "maplibre-gl"; import { GeoJSONSource, Marker } from "maplibre-gl"
import { ShowDataLayerOptions } from "./ShowDataLayerOptions"; import { ShowDataLayerOptions } from "./ShowDataLayerOptions"
import { GeoOperations } from "../../Logic/GeoOperations"; import { GeoOperations } from "../../Logic/GeoOperations"
import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
import PointRenderingConfig from "../../Models/ThemeConfig/PointRenderingConfig"; import PointRenderingConfig from "../../Models/ThemeConfig/PointRenderingConfig"
import { OsmTags } from "../../Models/OsmFeature"; import { OsmTags } from "../../Models/OsmFeature"
import { FeatureSource, FeatureSourceForLayer } from "../../Logic/FeatureSource/FeatureSource"; import { FeatureSource, FeatureSourceForLayer } from "../../Logic/FeatureSource/FeatureSource"
import { BBox } from "../../Logic/BBox"; import { BBox } from "../../Logic/BBox"
import { Feature, Point } from "geojson"; import { Feature, Point } from "geojson"
import LineRenderingConfig from "../../Models/ThemeConfig/LineRenderingConfig"; import LineRenderingConfig from "../../Models/ThemeConfig/LineRenderingConfig"
import { Utils } from "../../Utils"; import { Utils } from "../../Utils"
import * as range_layer from "../../../assets/layers/range/range.json"; import * as range_layer from "../../../assets/layers/range/range.json"
import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson"; import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson"
import PerLayerFeatureSourceSplitter from "../../Logic/FeatureSource/PerLayerFeatureSourceSplitter"; import PerLayerFeatureSourceSplitter from "../../Logic/FeatureSource/PerLayerFeatureSourceSplitter"
import FilteredLayer from "../../Models/FilteredLayer"; import FilteredLayer from "../../Models/FilteredLayer"
import SimpleFeatureSource from "../../Logic/FeatureSource/Sources/SimpleFeatureSource"; import SimpleFeatureSource from "../../Logic/FeatureSource/Sources/SimpleFeatureSource"
class PointRenderingLayer { class PointRenderingLayer {
private readonly _config: PointRenderingConfig private readonly _config: PointRenderingConfig
@ -289,16 +289,16 @@ class LineRenderingLayer {
{ {
// Add source to the map or update the feature source // Add source to the map or update the feature source
if (src === undefined) { if (src === undefined) {
this.currentSourceData = features; this.currentSourceData = features
map.addSource(this._layername, { map.addSource(this._layername, {
type: "geojson", type: "geojson",
data: { data: {
type: "FeatureCollection", type: "FeatureCollection",
features features,
}, },
promoteId: "id" promoteId: "id",
}); })
const linelayer = this._layername + "_line"; const linelayer = this._layername + "_line"
map.addLayer({ map.addLayer({
source: this._layername, source: this._layername,
id: linelayer, id: linelayer,
@ -307,12 +307,12 @@ class LineRenderingLayer {
"line-color": ["feature-state", "color"], "line-color": ["feature-state", "color"],
"line-opacity": ["feature-state", "color-opacity"], "line-opacity": ["feature-state", "color-opacity"],
"line-width": ["feature-state", "width"], "line-width": ["feature-state", "width"],
"line-offset": ["feature-state", "offset"] "line-offset": ["feature-state", "offset"],
}, },
layout: { layout: {
"line-cap": "round" "line-cap": "round",
} },
}); })
for (const feature of features) { for (const feature of features) {
if(!feature.properties.id){ if(!feature.properties.id){
@ -327,10 +327,10 @@ class LineRenderingLayer {
map.on("click", linelayer, (e) => { map.on("click", linelayer, (e) => {
// line-layer-listener // line-layer-listener
e.originalEvent["consumed"] = true; e.originalEvent["consumed"] = true
this._onClick(e.features[0]); this._onClick(e.features[0])
}); })
const polylayer = this._layername + "_polygon"; const polylayer = this._layername + "_polygon"
map.addLayer({ map.addLayer({
source: this._layername, source: this._layername,
@ -340,40 +340,40 @@ class LineRenderingLayer {
layout: {}, layout: {},
paint: { paint: {
"fill-color": ["feature-state", "fillColor"], "fill-color": ["feature-state", "fillColor"],
"fill-opacity": ["feature-state", "fillColor-opacity"] "fill-opacity": ["feature-state", "fillColor-opacity"],
} },
}); })
if (this._onClick) { if (this._onClick) {
map.on("click", polylayer, (e) => { map.on("click", polylayer, (e) => {
// polygon-layer-listener // polygon-layer-listener
if (e.originalEvent["consumed"]) { if (e.originalEvent["consumed"]) {
// This is a polygon beneath a marker, we can ignore it // This is a polygon beneath a marker, we can ignore it
return; return
} }
e.originalEvent["consumed"] = true; e.originalEvent["consumed"] = true
this._onClick(e.features[0]); this._onClick(e.features[0])
}); })
} }
this._visibility?.addCallbackAndRunD((visible) => { this._visibility?.addCallbackAndRunD((visible) => {
try { try {
map.setLayoutProperty(linelayer, "visibility", visible ? "visible" : "none"); map.setLayoutProperty(linelayer, "visibility", visible ? "visible" : "none")
map.setLayoutProperty(polylayer, "visibility", visible ? "visible" : "none"); map.setLayoutProperty(polylayer, "visibility", visible ? "visible" : "none")
} catch (e) { } catch (e) {
console.warn( console.warn(
"Error while setting visibility of layers ", "Error while setting visibility of layers ",
linelayer, linelayer,
polylayer, polylayer,
e e
); )
} }
}); })
} else { } else {
this.currentSourceData = features; this.currentSourceData = features
src.setData({ src.setData({
type: "FeatureCollection", type: "FeatureCollection",
features: this.currentSourceData features: this.currentSourceData,
}); })
} }
} }
for (let i = 0; i < features.length; i++) { for (let i = 0; i < features.length; i++) {
@ -407,7 +407,7 @@ class LineRenderingLayer {
this.calculatePropsFor(feature.properties) this.calculatePropsFor(feature.properties)
) )
tags.addCallbackD((properties) => { tags.addCallbackD((properties) => {
if(!map.getLayer(this._layername)){ if (!map.getLayer(this._layername)) {
return return
} }
map.setFeatureState( map.setFeatureState(

View file

@ -50,6 +50,9 @@
$: isHardDelete = changedProperties[DeleteConfig.deleteReasonKey] !== undefined $: isHardDelete = changedProperties[DeleteConfig.deleteReasonKey] !== undefined
async function onDelete() { async function onDelete() {
if(selectedTags === undefined){
return
}
currentState = "applying" currentState = "applying"
let actionToTake: OsmChangeAction let actionToTake: OsmChangeAction
const changedProperties = TagUtils.changeAsProperties(selectedTags.asChange(tags?.data ?? {})) const changedProperties = TagUtils.changeAsProperties(selectedTags.asChange(tags?.data ?? {}))

File diff suppressed because it is too large Load diff

View file

@ -1,11 +1,11 @@
{ {
"contributors": [ "contributors": [
{ {
"commits": 6039, "commits": 6055,
"contributor": "Pieter Vander Vennet" "contributor": "Pieter Vander Vennet"
}, },
{ {
"commits": 408, "commits": 414,
"contributor": "Robin van der Linde" "contributor": "Robin van der Linde"
}, },
{ {
@ -52,6 +52,10 @@
"commits": 24, "commits": 24,
"contributor": "Ward" "contributor": "Ward"
}, },
{
"commits": 21,
"contributor": "dependabot[bot]"
},
{ {
"commits": 21, "commits": 21,
"contributor": "wjtje" "contributor": "wjtje"
@ -60,10 +64,6 @@
"commits": 21, "commits": 21,
"contributor": "AlexanderRebai" "contributor": "AlexanderRebai"
}, },
{
"commits": 20,
"contributor": "dependabot[bot]"
},
{ {
"commits": 19, "commits": 19,
"contributor": "Niels Elgaard Larsen" "contributor": "Niels Elgaard Larsen"
@ -106,11 +106,11 @@
}, },
{ {
"commits": 11, "commits": 11,
"contributor": "RobJN" "contributor": "Thibault Molleman"
}, },
{ {
"commits": 10, "commits": 11,
"contributor": "Thibault Molleman" "contributor": "RobJN"
}, },
{ {
"commits": 10, "commits": 10,

View file

@ -1,7 +1,7 @@
{ {
"contributors": [ "contributors": [
{ {
"commits": 306, "commits": 308,
"contributor": "kjon" "contributor": "kjon"
}, },
{ {
@ -9,7 +9,7 @@
"contributor": "Pieter Vander Vennet" "contributor": "Pieter Vander Vennet"
}, },
{ {
"commits": 171, "commits": 176,
"contributor": "paunofu" "contributor": "paunofu"
}, },
{ {

View file

@ -1,15 +1,8 @@
import LayoutConfig from "./Models/ThemeConfig/LayoutConfig" import LayoutConfig from "./Models/ThemeConfig/LayoutConfig";
import * as theme from "./assets/generated/themes/bookcases.json" import * as theme from "./assets/generated/themes/bookcases.json";
import ThemeViewState from "./Models/ThemeViewState" import ThemeViewState from "./Models/ThemeViewState";
import Combine from "./UI/Base/Combine" import Combine from "./UI/Base/Combine";
import SpecialVisualizations from "./UI/SpecialVisualizations" import SpecialVisualizations from "./UI/SpecialVisualizations";
import ValidatedInput from "./UI/InputElement/ValidatedInput.svelte"
import SvelteUIElement from "./UI/Base/SvelteUIElement"
import { UIEventSource } from "./Logic/UIEventSource"
import { Unit } from "./Models/Unit"
import { Denomination } from "./Models/Denomination"
import { VariableUiElement } from "./UI/Base/VariableUIElement"
import { FixedUiElement } from "./UI/Base/FixedUiElement"
function testspecial() { function testspecial() {
const layout = new LayoutConfig(<any>theme, true) // qp.data === "" ? : new AllKnownLayoutsLazy().get(qp.data) const layout = new LayoutConfig(<any>theme, true) // qp.data === "" ? : new AllKnownLayoutsLazy().get(qp.data)