Merge branch 'develop' into feature/maproulette

This commit is contained in:
Robin van der Linde 2022-07-19 09:38:12 +02:00
commit 330f1f53f3
Signed by untrusted user who does not match committer: Robin-van-der-Linde
GPG key ID: 53956B3252478F0D
72 changed files with 29673 additions and 611 deletions

View file

@ -26,6 +26,7 @@ Bicycle rental stations
- [bicycle_rental](https://mapcomplete.osm.be/bicycle_rental)
- [cyclofix](https://mapcomplete.osm.be/cyclofix)
- [personal](https://mapcomplete.osm.be/personal)

View file

@ -0,0 +1,401 @@
bicycle_rental_non_docking
============================
<img src='https://mapcomplete.osm.be/pin:#ba2792;./assets/themes/cyclofix/key.svg' height="100px">
Bicycle rental stations
- This layer is shown at zoomlevel **14** and higher
#### Themes using this layer
- [cyclofix](https://mapcomplete.osm.be/cyclofix)
Basic tags for this layer
---------------------------
Elements must have the all of following tags to be shown on this layer:
- <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dbicycle_rental' target='_blank'>bicycle_rental</a>|bicycle_rental~^..*$|<a href='https://wiki.openstreetmap.org/wiki/Key:service:bicycle:rental' target='_blank'>service:bicycle:rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:rental%3Dyes' target='_blank'>yes</a>|rental~^.*bicycle.*$
- bicycle_rental!=docking_station
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22amenity%22%3D%22bicycle_rental%22%5D%5B%22bicycle_rental%22!%3D%22docking_station%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22service%3Abicycle%3Arental%22%3D%22yes%22%5D%5B%22bicycle_rental%22!%3D%22docking_station%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22bicycle_rental%22%5D%5B%22bicycle_rental%22!%3D%22docking_station%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22rental%22~%22%5E.*bicycle.*%24%22%5D%5B%22bicycle_rental%22!%3D%22docking_station%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/rental#values) [rental](https://wiki.openstreetmap.org/wiki/Key:rental) | [string](../SpecialInputElements.md#string) | [city_bike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dcity_bike) [ebike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Debike) [bmx](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dbmx) [mtb](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dmtb) [kid_bike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dkid_bike) [tandem](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dtandem) [racebike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dracebike) [bike_helmet](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dbike_helmet)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity:city_bike#values) [capacity:city_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:city_bike) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity:ebike#values) [capacity:ebike](https://wiki.openstreetmap.org/wiki/Key:capacity:ebike) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity:kid_bike#values) [capacity:kid_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:kid_bike) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity:bmx#values) [capacity:bmx](https://wiki.openstreetmap.org/wiki/Key:capacity:bmx) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity:mtb#values) [capacity:mtb](https://wiki.openstreetmap.org/wiki/Key:capacity:mtb) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity:bicycle_pannier#values) [capacity:bicycle_pannier](https://wiki.openstreetmap.org/wiki/Key:capacity:bicycle_pannier) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity:tandem_bicycle#values) [capacity:tandem_bicycle](https://wiki.openstreetmap.org/wiki/Key:capacity:tandem_bicycle) | [pnat](../SpecialInputElements.md#pnat) |
### images
This tagrendering has no question and is thus read-only
### bicycle_rental_type
The question is What kind of bicycle rental is this?
- This is a shop whose main focus is bicycle rental corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shop' target='_blank'>shop</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental' target='_blank'>rental</a>&<a href='https://wiki.openstreetmap.org/wiki/Key:bicycle_rental' target='_blank'>bicycle_rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bicycle_rental%3Dshop' target='_blank'>shop</a>
- This is a rental buisiness which rents out various objects and/or vehicles. It rents out bicycles too, but this is not the main focus corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:shop' target='_blank'>shop</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental' target='_blank'>rental</a>
- This is a shop which sells or repairs bicycles, but also rents out bicycles corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:service:bicycle:rental' target='_blank'>service:bicycle:rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:rental%3Dyes' target='_blank'>yes</a>&<a href='https://wiki.openstreetmap.org/wiki/Key:shop' target='_blank'>shop</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle' target='_blank'>bicycle</a>
- This is an automated docking station, where a bicycle is mechanically locked into a structure corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bicycle_rental' target='_blank'>bicycle_rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bicycle_rental%3Ddocking_station' target='_blank'>docking_station</a>
- A machine is present which dispenses and accepts keys, eventually after authentication and/or payment. The bicycles are parked nearby corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bicycle_rental' target='_blank'>bicycle_rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bicycle_rental%3Dkey_dispensing_machine' target='_blank'>key_dispensing_machine</a>
- This is a dropoff point, e.g. a reserved parking to place the bicycles which clearly marked as being for the rental service only corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:bicycle_rental' target='_blank'>bicycle_rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:bicycle_rental%3Ddropoff_point' target='_blank'>dropoff_point</a>
Only visible if `amenity=bicycle_rental` is shown
### website
The question is What is the website of {title()}?
This rendering asks information about the property [website](https://wiki.openstreetmap.org/wiki/Key:website)
This is rendered with <a href='{website}' target='_blank'>{website}</a>
- <a href='{contact:website}' target='_blank'>{contact:website}</a> corresponds with contact:website~^..*$
- This option cannot be chosen as answer
### email
The question is What is the email address of {title()}?
This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email)
This is rendered with <a href='mailto:{email}' target='_blank'>{email}</a>
- <a href='mailto:{contact:email}' target='_blank'>{contact:email}</a> corresponds with contact:email~^..*$
- This option cannot be chosen as answer
### phone
The question is What is the phone number of {title()}?
This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone)
This is rendered with <a href='tel:{phone}'>{phone}</a>
- <a href='tel:{contact:phone}'>{contact:phone}</a> corresponds with contact:phone~^..*$
- This option cannot be chosen as answer
### opening_hours
The question is What are the opening hours of {title()}?
This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours)
This is rendered with <h3>Opening hours</h3>{opening_hours_table(opening_hours)}
Only visible if `shop~^..*$|opening_hours~^..*$` is shown
### payment-options
The question is Which methods of payment are accepted here?
- Cash is accepted here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:payment:cash' target='_blank'>payment:cash</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:cash%3Dyes' target='_blank'>yes</a>
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:cash' target='_blank'>payment:cash</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:cash%3Dno' target='_blank'>no</a>
- Payment cards are accepted here corresponds with <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%3Dyes' target='_blank'>yes</a>
- 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>
Only visible if `shop~^..*$` is shown
### payment-options-advanced
The question is Which methods of payment are accepted here?
- Cash is accepted here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:payment:cash' target='_blank'>payment:cash</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:cash%3Dyes' target='_blank'>yes</a>
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:cash' target='_blank'>payment:cash</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:cash%3Dno' target='_blank'>no</a>
- Payment cards are accepted here corresponds with <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%3Dyes' target='_blank'>yes</a>
- 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>
- Payment is done using a dedicated app corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:payment:app' target='_blank'>payment:app</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:app%3Dyes' target='_blank'>yes</a>
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:app' target='_blank'>payment:app</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:app%3Dno' target='_blank'>no</a>
- Payment is done using a membership card corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:payment:membership_card' target='_blank'>payment:membership_card</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:membership_card%3Dyes' target='_blank'>yes</a>
- Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:membership_card' target='_blank'>payment:membership_card</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:membership_card%3Dno' target='_blank'>no</a>
### bicycle-types
The question is What kind of bicycles and accessories are rented here?
This rendering asks information about the property [rental](https://wiki.openstreetmap.org/wiki/Key:rental)
This is rendered with {rental} is rented here
- Normal city bikes can be rented here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:rental' target='_blank'>rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:rental%3Dcity_bike' target='_blank'>city_bike</a>
- Electrical bikes can be rented here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:rental' target='_blank'>rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:rental%3Debike' target='_blank'>ebike</a>
- BMX bikes can be rented here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:rental' target='_blank'>rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:rental%3Dbmx' target='_blank'>bmx</a>
- Mountainbikes can be rented here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:rental' target='_blank'>rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:rental%3Dmtb' target='_blank'>mtb</a>
- Bikes for children can be rented here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:rental' target='_blank'>rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:rental%3Dkid_bike' target='_blank'>kid_bike</a>
- Tandem bicycles can be rented here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:rental' target='_blank'>rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:rental%3Dtandem' target='_blank'>tandem</a>
- Race bicycles can be rented here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:rental' target='_blank'>rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:rental%3Dracebike' target='_blank'>racebike</a>
- Bike helmets can be rented here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:rental' target='_blank'>rental</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:rental%3Dbike_helmet' target='_blank'>bike_helmet</a>
This tagrendering has labels `bicycle_rental`
### rental-capacity-city_bike
The question is How much city bikes can be rented here?
This rendering asks information about the property [capacity:city_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:city_bike)
This is rendered with {capacity:city_bike} city bikes can be rented here
Only visible if `rental~^.*city_bike.*$` is shown
This tagrendering has labels `bicycle_rental`
### rental-capacity-ebike
The question is How much electrical bikes can be rented here?
This rendering asks information about the property [capacity:ebike](https://wiki.openstreetmap.org/wiki/Key:capacity:ebike)
This is rendered with {capacity:ebike} electrical bikes can be rented here
Only visible if `rental~^.*ebike.*$` is shown
This tagrendering has labels `bicycle_rental`
### rental-capacity-kid_bike
The question is How much bikes for children can be rented here?
This rendering asks information about the property [capacity:kid_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:kid_bike)
This is rendered with {capacity:kid_bike} bikes for children can be rented here
Only visible if `rental~^.*kid_bike.*$` is shown
This tagrendering has labels `bicycle_rental`
### rental-capacity-bmx
The question is How much BMX bikes can be rented here?
This rendering asks information about the property [capacity:bmx](https://wiki.openstreetmap.org/wiki/Key:capacity:bmx)
This is rendered with {capacity:bmx} BMX bikes can be rented here
Only visible if `rental~^.*bmx.*$` is shown
This tagrendering has labels `bicycle_rental`
### rental-capacity-mtb
The question is How much mountainbike can be rented here?
This rendering asks information about the property [capacity:mtb](https://wiki.openstreetmap.org/wiki/Key:capacity:mtb)
This is rendered with {capacity:mtb} mountainbike can be rented here
Only visible if `rental~^.*mtb.*$` is shown
This tagrendering has labels `bicycle_rental`
### rental-capacity-bicycle_pannier
The question is How much bicycle panniers can be rented here?
This rendering asks information about the property [capacity:bicycle_pannier](https://wiki.openstreetmap.org/wiki/Key:capacity:bicycle_pannier)
This is rendered with {capacity:bicycle_pannier} bicycle panniers can be rented here
Only visible if `rental~^.*bicycle_pannier.*$` is shown
This tagrendering has labels `bicycle_rental`
### rental-capacity-tandem_bicycle
The question is How much tandem can be rented here?
This rendering asks information about the property [capacity:tandem_bicycle](https://wiki.openstreetmap.org/wiki/Key:capacity:tandem_bicycle)
This is rendered with {capacity:tandem_bicycle} tandem can be rented here
Only visible if `rental~^.*tandem_bicycle.*$` is shown
This tagrendering has labels `bicycle_rental`
### questions
This tagrendering has no question and is thus read-only
### minimap
This tagrendering has no question and is thus read-only
This document is autogenerated from [assets/themes/cyclofix/cyclofix.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/cyclofix/cyclofix.json)

View file

@ -26,7 +26,6 @@ A layer showing bicycle pumps and bicycle repair tool stands
- [cyclofix](https://mapcomplete.osm.be/cyclofix)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)

View file

@ -26,7 +26,6 @@ A shop specifically selling bicycles or related items
- [cyclofix](https://mapcomplete.osm.be/cyclofix)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)

View file

@ -26,7 +26,6 @@ A layer showing cafés and pubs where one can gather around a drink. The layer a
- [cafes_and_pubs](https://mapcomplete.osm.be/cafes_and_pubs)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)

View file

@ -31,7 +31,6 @@ All infrastructure that someone can cycle over, accompanied with questions about
- [cycle_infra](https://mapcomplete.osm.be/cycle_infra)
- [kerbs_and_crossings](https://mapcomplete.osm.be/kerbs_and_crossings)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)
- [rainbow_crossings](https://mapcomplete.osm.be/rainbow_crossings)

View file

@ -26,7 +26,6 @@ This layer shows doctor offices, dentists and other healthcare facilities
- [healthcare](https://mapcomplete.osm.be/healthcare)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)

View file

@ -17,6 +17,7 @@ A layer showing entrances and offering capabilities to survey some advanced data
- This layer is shown at zoomlevel **14** and higher
- This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on it: a preset snaps to this layer (presets[0])
- This layer will automatically load [pedestrian_path](./pedestrian_path.md) into the layout as it depends on it: a preset snaps to this layer (presets[0])
- This layer is needed as dependency for layer [walls_and_buildings](#walls_and_buildings)
@ -28,8 +29,8 @@ A layer showing entrances and offering capabilities to survey some advanced data
- [entrances](https://mapcomplete.osm.be/entrances)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)
- [walls_and_buildings](https://mapcomplete.osm.be/walls_and_buildings)

View file

@ -27,7 +27,6 @@ A layer showing restaurants and fast-food amenities (with a special rendering fo
- [food](https://mapcomplete.osm.be/food)
- [fritures](https://mapcomplete.osm.be/fritures)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)
- [pets](https://mapcomplete.osm.be/pets)

View file

@ -29,7 +29,6 @@ A layer showing kerbs.
- [kerbs_and_crossings](https://mapcomplete.osm.be/kerbs_and_crossings)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)

View file

@ -19,6 +19,18 @@ Shows kindergartens and preschools. Both are grouped in one layer, as they are r
#### Themes using this layer
- [education](https://mapcomplete.osm.be/education)
- [personal](https://mapcomplete.osm.be/personal)
Basic tags for this layer
---------------------------

View file

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

View file

@ -27,8 +27,8 @@ Pedestrian footpaths, especially used for indoor navigation and snapping entranc
- [entrances](https://mapcomplete.osm.be/entrances)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)
- [walls_and_buildings](https://mapcomplete.osm.be/walls_and_buildings)

View file

@ -27,7 +27,6 @@ The layer showing picnic tables
- [benches](https://mapcomplete.osm.be/benches)
- [nature](https://mapcomplete.osm.be/nature)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)

File diff suppressed because one or more lines are too long

View file

@ -25,7 +25,6 @@ A shop
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)
- [pets](https://mapcomplete.osm.be/pets)
- [shops](https://mapcomplete.osm.be/shops)

View file

@ -19,6 +19,18 @@ Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8)
#### Themes using this layer
- [education](https://mapcomplete.osm.be/education)
- [personal](https://mapcomplete.osm.be/personal)
Basic tags for this layer
---------------------------

View file

@ -26,7 +26,6 @@ A layer showing (public) toilets
- [nature](https://mapcomplete.osm.be/nature)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)
- [toilets](https://mapcomplete.osm.be/toilets)

View file

@ -19,18 +19,6 @@ A nice viewpoint or nice view. Ideal to add an image if no other category fits
#### Themes using this layer
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)
Basic tags for this layer
---------------------------

View file

@ -18,6 +18,7 @@ Special builtin layer providing all walls and buildings. This layer is useful in
- This layer is not visible by default and must be enabled in the filter by the user.
- Not visible in the layer selection by default. If you want to make this layer toggable, override `name`
- Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings`
- This layer will automatically load [entrance](./entrance.md) into the layout as it depends on it: a calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _entrance_properties)
- This layer is needed as dependency for layer [defibrillator](#defibrillator)
- This layer is needed as dependency for layer [entrance](#entrance)
- This layer is needed as dependency for layer [surveillance_camera](#surveillance_camera)
@ -33,9 +34,9 @@ Special builtin layer providing all walls and buildings. This layer is useful in
- [aed](https://mapcomplete.osm.be/aed)
- [entrances](https://mapcomplete.osm.be/entrances)
- [onwheels](https://mapcomplete.osm.be/onwheels)
- [personal](https://mapcomplete.osm.be/personal)
- [surveillance](https://mapcomplete.osm.be/surveillance)
- [walls_and_buildings](https://mapcomplete.osm.be/walls_and_buildings)
@ -59,6 +60,36 @@ Elements must have the all of following tags to be shown on this layer:
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/_entrance:width#values) [_entrance:width](https://wiki.openstreetmap.org/wiki/Key:_entrance:width) | [string](../SpecialInputElements.md#string) | [](https://wiki.openstreetmap.org/wiki/Tag:_entrance:width%3D)
### _entrance:width
This tagrendering has no question and is thus read-only
This rendering asks information about the property [_entrance:width](https://wiki.openstreetmap.org/wiki/Key:_entrance:width)
This is rendered with <a href ='#{_entrance:id} '>This door has a width of {canonical(_entrance:width)} meters </a>
- This entrance has no width information corresponds with
This document is autogenerated from [assets/layers/walls_and_buildings/walls_and_buildings.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/walls_and_buildings/walls_and_buildings.json)

View file

@ -106,8 +106,20 @@
"type": "boolean"
},
"isShown": {
"description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"$ref": "#/definitions/TagRenderingConfigJson"
"description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
},
"forceLoad": {
"description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled",
@ -303,7 +315,9 @@
}
]
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
@ -311,7 +325,7 @@
]
},
{
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>"
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>"
},
{
"type": "string"
@ -1027,7 +1041,100 @@
},
"additionalProperties": false
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>": {
"Partial<QuestionableTagRenderingConfigJson>": {
"type": "object",
"properties": {
"question": {
"description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only"
},
"freeform": {
"description": "Allow freeform text input from the user",
"type": "object",
"properties": {
"key": {
"type": "string"
},
"type": {
"description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values",
"type": "string"
},
"placeholder": {
"description": "A (translated) text that is shown (as gray text) within the textfield"
},
"helperArgs": {
"description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'",
"type": "array",
"items": {}
},
"addExtraTags": {
"description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'",
"type": "array",
"items": {
"type": "string"
}
},
"inline": {
"description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.",
"type": "boolean"
},
"default": {
"description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)",
"type": "string"
}
},
"required": [
"key"
]
},
"multiAnswer": {
"description": "If true, use checkboxes instead of radio buttons when asking the question",
"type": "boolean"
},
"mappings": {
"description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes",
"type": "array",
"items": {
"$ref": "#/definitions/MappingConfigJson"
}
},
"id": {
"description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)",
"type": "string"
},
"group": {
"description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.",
"type": "string"
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away",
"type": "array",
"items": {
"type": "string"
}
},
"render": {
"description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered"
},
"condition": {
"description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
}
},
"additionalProperties": false
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>": {
"description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}. \nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]",
"type": "object",
"properties": {
@ -1066,7 +1173,9 @@
"builtin": {
"type": "string"
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",

View file

@ -106,8 +106,20 @@ export default {
"type": "boolean"
},
"isShown": {
"description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"$ref": "#/definitions/TagRenderingConfigJson"
"description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
},
"forceLoad": {
"description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled",
@ -303,7 +315,9 @@ export default {
}
]
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
@ -311,7 +325,7 @@ export default {
]
},
{
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>"
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>"
},
{
"type": "string"
@ -1016,7 +1030,99 @@ export default {
}
}
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>": {
"Partial<QuestionableTagRenderingConfigJson>": {
"type": "object",
"properties": {
"question": {
"description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only"
},
"freeform": {
"description": "Allow freeform text input from the user",
"type": "object",
"properties": {
"key": {
"type": "string"
},
"type": {
"description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values",
"type": "string"
},
"placeholder": {
"description": "A (translated) text that is shown (as gray text) within the textfield"
},
"helperArgs": {
"description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'",
"type": "array",
"items": {}
},
"addExtraTags": {
"description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'",
"type": "array",
"items": {
"type": "string"
}
},
"inline": {
"description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.",
"type": "boolean"
},
"default": {
"description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)",
"type": "string"
}
},
"required": [
"key"
]
},
"multiAnswer": {
"description": "If true, use checkboxes instead of radio buttons when asking the question",
"type": "boolean"
},
"mappings": {
"description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes",
"type": "array",
"items": {
"$ref": "#/definitions/MappingConfigJson"
}
},
"id": {
"description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)",
"type": "string"
},
"group": {
"description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.",
"type": "string"
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away",
"type": "array",
"items": {
"type": "string"
}
},
"render": {
"description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered"
},
"condition": {
"description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
}
}
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>": {
"description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}. \nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]",
"type": "object",
"properties": {
@ -1055,7 +1161,9 @@ export default {
"builtin": {
"type": "string"
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",

View file

@ -68,7 +68,8 @@
"type": "number"
},
"overrideAll": {
"description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer"
"description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer",
"$ref": "#/definitions/Partial<LayerConfigJson>"
},
"defaultBackgroundId": {
"description": "The id of the default background. BY default: vanilla OSM",
@ -924,7 +925,100 @@
},
"additionalProperties": false
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>": {
"Partial<QuestionableTagRenderingConfigJson>": {
"type": "object",
"properties": {
"question": {
"description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only"
},
"freeform": {
"description": "Allow freeform text input from the user",
"type": "object",
"properties": {
"key": {
"type": "string"
},
"type": {
"description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values",
"type": "string"
},
"placeholder": {
"description": "A (translated) text that is shown (as gray text) within the textfield"
},
"helperArgs": {
"description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'",
"type": "array",
"items": {}
},
"addExtraTags": {
"description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'",
"type": "array",
"items": {
"type": "string"
}
},
"inline": {
"description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.",
"type": "boolean"
},
"default": {
"description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)",
"type": "string"
}
},
"required": [
"key"
]
},
"multiAnswer": {
"description": "If true, use checkboxes instead of radio buttons when asking the question",
"type": "boolean"
},
"mappings": {
"description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes",
"type": "array",
"items": {
"$ref": "#/definitions/MappingConfigJson"
}
},
"id": {
"description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)",
"type": "string"
},
"group": {
"description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.",
"type": "string"
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away",
"type": "array",
"items": {
"type": "string"
}
},
"render": {
"description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered"
},
"condition": {
"description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
}
},
"additionalProperties": false
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>": {
"description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}. \nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]",
"type": "object",
"properties": {
@ -963,7 +1057,9 @@
"builtin": {
"type": "string"
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
@ -1155,47 +1251,7 @@
],
"additionalProperties": false
},
"default_6": {
"description": "Configuration for a tilesource config",
"type": "object",
"properties": {
"id": {
"description": "Id of this overlay, used in the URL-parameters to set the state",
"type": "string"
},
"source": {
"description": "The path, where {x}, {y} and {z} will be substituted",
"type": "string"
},
"isOverlay": {
"description": "Wether or not this is an overlay. Default: true",
"type": "boolean"
},
"name": {
"description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled"
},
"minZoom": {
"description": "Only visible at this or a higher zoom level",
"type": "number"
},
"maxZoom": {
"description": "Only visible at this or a lower zoom level",
"type": "number"
},
"defaultState": {
"description": "The default state, set to false to hide by default",
"type": "boolean"
}
},
"required": [
"defaultState",
"id",
"source"
],
"additionalProperties": false
},
"LayerConfigJson": {
"description": "Configuration for a single layer",
"Partial<LayerConfigJson>": {
"type": "object",
"properties": {
"id": {
@ -1302,8 +1358,20 @@
"type": "boolean"
},
"isShown": {
"description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"$ref": "#/definitions/TagRenderingConfigJson"
"description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
},
"forceLoad": {
"description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled",
@ -1499,7 +1567,9 @@
}
]
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
@ -1507,7 +1577,449 @@
]
},
{
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>"
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>"
},
{
"type": "string"
}
]
}
},
"filter": {
"description": "All the extra questions for filtering",
"anyOf": [
{
"type": "array",
"items": {
"$ref": "#/definitions/default_1"
}
},
{
"type": "object",
"properties": {
"sameAs": {
"type": "string"
}
},
"required": [
"sameAs"
]
}
]
},
"deletion": {
"description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.",
"anyOf": [
{
"$ref": "#/definitions/DeleteConfigJson"
},
{
"type": "boolean"
}
]
},
"allowMove": {
"description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.",
"anyOf": [
{
"$ref": "#/definitions/default_3"
},
{
"type": "boolean"
}
]
},
"allowSplit": {
"description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well",
"type": "boolean"
},
"units": {
"description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given",
"type": "array",
"items": {
"$ref": "#/definitions/default_2"
}
},
"syncSelection": {
"description": "If set, synchronizes whether or not this layer is enabled.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes",
"enum": [
"global",
"local",
"no",
"theme-only"
],
"type": "string"
}
},
"additionalProperties": false
},
"default_6": {
"description": "Configuration for a tilesource config",
"type": "object",
"properties": {
"id": {
"description": "Id of this overlay, used in the URL-parameters to set the state",
"type": "string"
},
"source": {
"description": "The path, where {x}, {y} and {z} will be substituted",
"type": "string"
},
"isOverlay": {
"description": "Wether or not this is an overlay. Default: true",
"type": "boolean"
},
"name": {
"description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled"
},
"minZoom": {
"description": "Only visible at this or a higher zoom level",
"type": "number"
},
"maxZoom": {
"description": "Only visible at this or a lower zoom level",
"type": "number"
},
"defaultState": {
"description": "The default state, set to false to hide by default",
"type": "boolean"
}
},
"required": [
"defaultState",
"id",
"source"
],
"additionalProperties": false
},
"LayerConfigJson": {
"description": "Configuration for a single layer",
"type": "object",
"properties": {
"id": {
"description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.",
"type": "string"
},
"name": {
"description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control"
},
"description": {
"description": "A description for this layer.\nShown in the layer selections and in the personel theme"
},
"source": {
"description": "This determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.",
"anyOf": [
{
"allOf": [
{
"type": "object",
"properties": {
"osmTags": {
"$ref": "#/definitions/TagConfigJson",
"description": "Every source must set which tags have to be present in order to load the given layer."
},
"maxCacheAge": {
"description": "The maximum amount of seconds that a tile is allowed to linger in the cache",
"type": "number"
}
},
"required": [
"osmTags"
]
},
{
"type": "object",
"properties": {
"overpassScript": {
"description": "If set, this custom overpass-script will be used instead of building one by using the OSM-tags.\nSpecifying OSM-tags is still obligatory and will still hide non-matching items and they will be used for the rest of the pipeline.\n_This should be really rare_.\n\nFor example, when you want to fetch all grass-areas in parks and which are marked as publicly accessible: \n```\n\"source\": {\n \"overpassScript\": \n \"way[\\\"leisure\\\"=\\\"park\\\"];node(w);is_in;area._[\\\"leisure\\\"=\\\"park\\\"];(way(area)[\\\"landuse\\\"=\\\"grass\\\"]; node(w); );\",\n \"osmTags\": \"access=yes\"\n}\n```",
"type": "string"
}
}
}
]
},
{
"allOf": [
{
"type": "object",
"properties": {
"osmTags": {
"$ref": "#/definitions/TagConfigJson",
"description": "Every source must set which tags have to be present in order to load the given layer."
},
"maxCacheAge": {
"description": "The maximum amount of seconds that a tile is allowed to linger in the cache",
"type": "number"
}
},
"required": [
"osmTags"
]
},
{
"type": "object",
"properties": {
"geoJson": {
"description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}",
"type": "string"
},
"geoJsonZoomLevel": {
"description": "To load a tiled geojson layer, set the zoomlevel of the tiles",
"type": "number"
},
"isOsmCache": {
"description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache",
"type": "boolean"
},
"mercatorCrs": {
"description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this",
"type": "boolean"
},
"idKey": {
"description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'",
"type": "string"
}
},
"required": [
"geoJson"
]
}
]
}
]
},
"calculatedTags": {
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]",
"type": "array",
"items": {
"type": "string"
}
},
"doNotDownload": {
"description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration",
"type": "boolean"
},
"isShown": {
"description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
},
"forceLoad": {
"description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled",
"type": "boolean"
},
"minzoom": {
"description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0",
"type": "number"
},
"shownByDefault": {
"description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)",
"type": "boolean"
},
"minzoomVisible": {
"description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible",
"type": "number"
},
"title": {
"description": "The title shown in a popup for elements of this layer.",
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "string"
}
]
},
"titleIcons": {
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "string"
}
]
}
},
{
"type": "array",
"items": [
{
"type": "string",
"enum": [
"defaults"
]
}
],
"minItems": 1,
"maxItems": 1
}
]
},
"mapRendering": {
"description": "Visualisation of the items on the map",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/default_4"
},
{
"$ref": "#/definitions/default_5"
},
{
"$ref": "#/definitions/default<default|default|default[]|default[]>"
}
]
}
},
{
"type": "null"
}
]
},
"passAllFeatures": {
"description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras",
"type": "boolean"
},
"presets": {
"description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all",
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!"
},
"tags": {
"description": "The tags to add. It determines the icon too",
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)"
},
"exampleImages": {
"description": "Example images, which show real-life pictures of what such a feature might look like\n\nType: image",
"type": "array",
"items": {
"type": "string"
}
},
"preciseInput": {
"description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.",
"anyOf": [
{
"type": "object",
"properties": {
"preferredBackground": {
"description": "The type of background picture",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
]
},
"snapToLayer": {
"description": "If specified, these layers will be shown to and the new point will be snapped towards it",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
]
},
"maxSnapDistance": {
"description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10",
"type": "number"
}
},
"required": [
"preferredBackground"
]
},
{
"enum": [
true
],
"type": "boolean"
}
]
}
},
"required": [
"tags",
"title"
]
}
},
"tagRenderings": {
"description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together",
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
]
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>"
},
{
"type": "string"

View file

@ -68,7 +68,8 @@ export default {
"type": "number"
},
"overrideAll": {
"description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer"
"description": "An override applied on all layers of the theme.\n\nE.g.: if there are two layers defined:\n```\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ...}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ...}}\n]\n```\n\nand overrideAll is specified:\n```\n\"overrideAll\": {\n \"osmSource\":{\"geoJsonSource\":\"xyz\"}\n}\nthen the result will be that all the layers will have these properties applied and result in:\n\"layers\":[\n {\"title\": ..., \"tagRenderings\": [...], \"osmSource\":{\"tags\": ..., \"geoJsonSource\":\"xyz\"}},\n {\"title\", ..., \"tagRenderings\", [...], \"osmSource\":{\"tags\" ..., \"geoJsonSource\":\"xyz\"}}\n]\n```\n\nIf the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list), for example\n\n\"overrideAll\": {\n \"+tagRenderings\": [ { ... some tagrendering ... }]\n}\n\nIn the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer",
"$ref": "#/definitions/Partial<LayerConfigJson>"
},
"defaultBackgroundId": {
"description": "The id of the default background. BY default: vanilla OSM",
@ -913,7 +914,99 @@ export default {
}
}
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>": {
"Partial<QuestionableTagRenderingConfigJson>": {
"type": "object",
"properties": {
"question": {
"description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only"
},
"freeform": {
"description": "Allow freeform text input from the user",
"type": "object",
"properties": {
"key": {
"type": "string"
},
"type": {
"description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values",
"type": "string"
},
"placeholder": {
"description": "A (translated) text that is shown (as gray text) within the textfield"
},
"helperArgs": {
"description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'",
"type": "array",
"items": {}
},
"addExtraTags": {
"description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'",
"type": "array",
"items": {
"type": "string"
}
},
"inline": {
"description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.",
"type": "boolean"
},
"default": {
"description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)",
"type": "string"
}
},
"required": [
"key"
]
},
"multiAnswer": {
"description": "If true, use checkboxes instead of radio buttons when asking the question",
"type": "boolean"
},
"mappings": {
"description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes",
"type": "array",
"items": {
"$ref": "#/definitions/MappingConfigJson"
}
},
"id": {
"description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)",
"type": "string"
},
"group": {
"description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.",
"type": "string"
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away",
"type": "array",
"items": {
"type": "string"
}
},
"render": {
"description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered"
},
"condition": {
"description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
}
}
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>": {
"description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}. \nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]",
"type": "object",
"properties": {
@ -952,7 +1045,9 @@ export default {
"builtin": {
"type": "string"
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
@ -1139,46 +1234,7 @@ export default {
"appliesToKey"
]
},
"default_6": {
"description": "Configuration for a tilesource config",
"type": "object",
"properties": {
"id": {
"description": "Id of this overlay, used in the URL-parameters to set the state",
"type": "string"
},
"source": {
"description": "The path, where {x}, {y} and {z} will be substituted",
"type": "string"
},
"isOverlay": {
"description": "Wether or not this is an overlay. Default: true",
"type": "boolean"
},
"name": {
"description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled"
},
"minZoom": {
"description": "Only visible at this or a higher zoom level",
"type": "number"
},
"maxZoom": {
"description": "Only visible at this or a lower zoom level",
"type": "number"
},
"defaultState": {
"description": "The default state, set to false to hide by default",
"type": "boolean"
}
},
"required": [
"defaultState",
"id",
"source"
]
},
"LayerConfigJson": {
"description": "Configuration for a single layer",
"Partial<LayerConfigJson>": {
"type": "object",
"properties": {
"id": {
@ -1285,8 +1341,20 @@ export default {
"type": "boolean"
},
"isShown": {
"description": "This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"$ref": "#/definitions/TagRenderingConfigJson"
"description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
},
"forceLoad": {
"description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled",
@ -1482,7 +1550,9 @@ export default {
}
]
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
@ -1490,7 +1560,447 @@ export default {
]
},
{
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>"
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>"
},
{
"type": "string"
}
]
}
},
"filter": {
"description": "All the extra questions for filtering",
"anyOf": [
{
"type": "array",
"items": {
"$ref": "#/definitions/default_1"
}
},
{
"type": "object",
"properties": {
"sameAs": {
"type": "string"
}
},
"required": [
"sameAs"
]
}
]
},
"deletion": {
"description": "This block defines under what circumstances the delete dialog is shown for objects of this layer.\nIf set, a dialog is shown to the user to (soft) delete the point.\nThe dialog is built to be user friendly and to prevent mistakes.\nIf deletion is not possible, the dialog will hide itself and show the reason of non-deletability instead.\n\nTo configure, the following values are possible:\n\n- false: never ever show the delete button\n- true: show the default delete button\n- undefined: use the mapcomplete default to show deletion or not. Currently, this is the same as 'false' but this will change in the future\n- or: a hash with options (see below)\n\n The delete dialog\n =================\n\n\n\n#### Hard deletion if enough experience\n\nA feature can only be deleted from OpenStreetMap by mapcomplete if:\n\n- It is a node\n- No ways or relations use the node\n- The logged-in user has enough experience OR the user is the only one to have edited the point previously\n- The logged-in user has no unread messages (or has a ton of experience)\n- The user did not select one of the 'non-delete-options' (see below)\n\nIn all other cases, a 'soft deletion' is used.\n\n#### Soft deletion\n\nA 'soft deletion' is when the point isn't deleted from OSM but retagged so that it'll won't how up in the mapcomplete theme anymore.\nThis makes it look like it was deleted, without doing damage. A fixme will be added to the point.\n\nNote that a soft deletion is _only_ possible if these tags are provided by the theme creator, as they'll be different for every theme\n\n#### No-delete options\n\nIn some cases, the contributor might want to delete something for the wrong reason (e.g. someone who wants to have a path removed \"because the path is on their private property\").\nHowever, the path exists in reality and should thus be on OSM - otherwise the next contributor will pass by and notice \"hey, there is a path missing here! Let me redraw it in OSM!)\n\nThe correct approach is to retag the feature in such a way that it is semantically correct *and* that it doesn't show up on the theme anymore.\nA no-delete option is offered as 'reason to delete it', but secretly retags.",
"anyOf": [
{
"$ref": "#/definitions/DeleteConfigJson"
},
{
"type": "boolean"
}
]
},
"allowMove": {
"description": "Indicates if a point can be moved and configures the modalities.\n\nA feature can be moved by MapComplete if:\n\n- It is a point\n- The point is _not_ part of a way or a a relation.\n\nOff by default. Can be enabled by setting this flag or by configuring.",
"anyOf": [
{
"$ref": "#/definitions/default_3"
},
{
"type": "boolean"
}
]
},
"allowSplit": {
"description": "If set, a 'split this way' button is shown on objects rendered as LineStrings, e.g. highways.\n\nIf the way is part of a relation, MapComplete will attempt to update this relation as well",
"type": "boolean"
},
"units": {
"description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given",
"type": "array",
"items": {
"$ref": "#/definitions/default_2"
}
},
"syncSelection": {
"description": "If set, synchronizes whether or not this layer is enabled.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes",
"enum": [
"global",
"local",
"no",
"theme-only"
],
"type": "string"
}
}
},
"default_6": {
"description": "Configuration for a tilesource config",
"type": "object",
"properties": {
"id": {
"description": "Id of this overlay, used in the URL-parameters to set the state",
"type": "string"
},
"source": {
"description": "The path, where {x}, {y} and {z} will be substituted",
"type": "string"
},
"isOverlay": {
"description": "Wether or not this is an overlay. Default: true",
"type": "boolean"
},
"name": {
"description": "How this will be shown in the selection menu.\nMake undefined if this may not be toggled"
},
"minZoom": {
"description": "Only visible at this or a higher zoom level",
"type": "number"
},
"maxZoom": {
"description": "Only visible at this or a lower zoom level",
"type": "number"
},
"defaultState": {
"description": "The default state, set to false to hide by default",
"type": "boolean"
}
},
"required": [
"defaultState",
"id",
"source"
]
},
"LayerConfigJson": {
"description": "Configuration for a single layer",
"type": "object",
"properties": {
"id": {
"description": "The id of this layer.\nThis should be a simple, lowercase, human readable string that is used to identify the layer.",
"type": "string"
},
"name": {
"description": "The name of this layer\nUsed in the layer control panel and the 'Personal theme'.\n\nIf not given, will be hidden (and thus not toggable) in the layer control"
},
"description": {
"description": "A description for this layer.\nShown in the layer selections and in the personel theme"
},
"source": {
"description": "This determines where the data for the layer is fetched: from OSM or from an external geojson dataset.\n\nIf no 'geojson' is defined, data will be fetched from overpass and the OSM-API.\n\nEvery source _must_ define which tags _must_ be present in order to be picked up.",
"anyOf": [
{
"allOf": [
{
"type": "object",
"properties": {
"osmTags": {
"$ref": "#/definitions/TagConfigJson",
"description": "Every source must set which tags have to be present in order to load the given layer."
},
"maxCacheAge": {
"description": "The maximum amount of seconds that a tile is allowed to linger in the cache",
"type": "number"
}
},
"required": [
"osmTags"
]
},
{
"type": "object",
"properties": {
"overpassScript": {
"description": "If set, this custom overpass-script will be used instead of building one by using the OSM-tags.\nSpecifying OSM-tags is still obligatory and will still hide non-matching items and they will be used for the rest of the pipeline.\n_This should be really rare_.\n\nFor example, when you want to fetch all grass-areas in parks and which are marked as publicly accessible: \n```\n\"source\": {\n \"overpassScript\": \n \"way[\\\"leisure\\\"=\\\"park\\\"];node(w);is_in;area._[\\\"leisure\\\"=\\\"park\\\"];(way(area)[\\\"landuse\\\"=\\\"grass\\\"]; node(w); );\",\n \"osmTags\": \"access=yes\"\n}\n```",
"type": "string"
}
}
}
]
},
{
"allOf": [
{
"type": "object",
"properties": {
"osmTags": {
"$ref": "#/definitions/TagConfigJson",
"description": "Every source must set which tags have to be present in order to load the given layer."
},
"maxCacheAge": {
"description": "The maximum amount of seconds that a tile is allowed to linger in the cache",
"type": "number"
}
},
"required": [
"osmTags"
]
},
{
"type": "object",
"properties": {
"geoJson": {
"description": "The actual source of the data to load, if loaded via geojson.\n\n# A single geojson-file\nsource: {geoJson: \"https://my.source.net/some-geo-data.geojson\"}\n fetches a geojson from a third party source\n\n# A tiled geojson source\nsource: {geoJson: \"https://my.source.net/some-tile-geojson-{layer}-{z}-{x}-{y}.geojson\", geoJsonZoomLevel: 14}\n to use a tiled geojson source. The web server must offer multiple geojsons. {z}, {x} and {y} are substituted by the location; {layer} is substituted with the id of the loaded layer\n\nSome API's use a BBOX instead of a tile, this can be used by specifying {y_min}, {y_max}, {x_min} and {x_max}",
"type": "string"
},
"geoJsonZoomLevel": {
"description": "To load a tiled geojson layer, set the zoomlevel of the tiles",
"type": "number"
},
"isOsmCache": {
"description": "Indicates that the upstream geojson data is OSM-derived.\nUseful for e.g. merging or for scripts generating this cache",
"type": "boolean"
},
"mercatorCrs": {
"description": "Some API's use a mercator-projection (EPSG:900913) instead of WGS84. Set the flag `mercatorCrs: true` in the source for this",
"type": "boolean"
},
"idKey": {
"description": "Some API's have an id-field, but give it a different name.\nSetting this key will rename this field into 'id'",
"type": "string"
}
},
"required": [
"geoJson"
]
}
]
}
]
},
"calculatedTags": {
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]",
"type": "array",
"items": {
"type": "string"
}
},
"doNotDownload": {
"description": "If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers.\nWorks well together with 'passAllFeatures', to add decoration",
"type": "boolean"
},
"isShown": {
"description": "If set, only features matching this extra tag will be shown.\nThis is useful to hide certain features from view.\n\nImportant: hiding features does not work dynamically, but is only calculated when the data is first renders.\nThis implies that it is not possible to hide a feature after a tagging change\n\nThe default value is 'yes'",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
},
"forceLoad": {
"description": "Advanced option - might be set by the theme compiler\n\nIf true, this data will _always_ be loaded, even if the theme is disabled",
"type": "boolean"
},
"minzoom": {
"description": "The minimum needed zoomlevel required before loading of the data start\nDefault: 0",
"type": "number"
},
"shownByDefault": {
"description": "Indicates if this layer is shown by default;\ncan be used to hide a layer from start, or to load the layer but only to show it where appropriate (e.g. for snapping to it)",
"type": "boolean"
},
"minzoomVisible": {
"description": "The zoom level at which point the data is hidden again\nDefault: 100 (thus: always visible",
"type": "number"
},
"title": {
"description": "The title shown in a popup for elements of this layer.",
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "string"
}
]
},
"titleIcons": {
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "string"
}
]
}
},
{
"type": "array",
"items": [
{
"type": "string",
"enum": [
"defaults"
]
}
],
"minItems": 1,
"maxItems": 1
}
]
},
"mapRendering": {
"description": "Visualisation of the items on the map",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/default_4"
},
{
"$ref": "#/definitions/default_5"
},
{
"$ref": "#/definitions/default<default|default|default[]|default[]>"
}
]
}
},
{
"type": "null"
}
]
},
"passAllFeatures": {
"description": "If set, this layer will pass all the features it receives onto the next layer.\nThis is ideal for decoration, e.g. directionss on cameras",
"type": "boolean"
},
"presets": {
"description": "Presets for this layer.\nA preset shows up when clicking the map on a without data (or when right-clicking/long-pressing);\nit will prompt the user to add a new point.\n\nThe most important aspect are the tags, which define which tags the new point will have;\nThe title is shown in the dialog, along with the first sentence of the description.\n\nUpon confirmation, the full description is shown beneath the buttons - perfect to add pictures and examples.\n\nNote: the icon of the preset is determined automatically based on the tags and the icon above. Don't worry about that!\nNB: if no presets are defined, the popup to add new points doesn't show up at all",
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"description": "The title - shown on the 'add-new'-button.\n\nThis should include the article of the noun, e.g. 'a hydrant', 'a bicycle pump'.\nThis text will be inserted into `Add {category} here`, becoming `Add a hydrant here`.\n\nDo _not_ indicate 'new': 'add a new shop here' is incorrect, as the shop might have existed forever, it could just be unmapped!"
},
"tags": {
"description": "The tags to add. It determines the icon too",
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"description": "The _first sentence_ of the description is shown on the button of the `add` menu.\nThe full description is shown in the confirmation dialog.\n\n(The first sentence is until the first '.'-character in the description)"
},
"exampleImages": {
"description": "Example images, which show real-life pictures of what such a feature might look like\n\nType: image",
"type": "array",
"items": {
"type": "string"
}
},
"preciseInput": {
"description": "If set, the user will prompted to confirm the location before actually adding the data.\nThis will be with a 'drag crosshair'-method.\n\nIf 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.",
"anyOf": [
{
"type": "object",
"properties": {
"preferredBackground": {
"description": "The type of background picture",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
]
},
"snapToLayer": {
"description": "If specified, these layers will be shown to and the new point will be snapped towards it",
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
]
},
"maxSnapDistance": {
"description": "If specified, a new point will only be snapped if it is within this range.\nDistance in meter\n\nDefault: 10",
"type": "number"
}
},
"required": [
"preferredBackground"
]
},
{
"enum": [
true
],
"type": "boolean"
}
]
}
},
"required": [
"tags",
"title"
]
}
},
"tagRenderings": {
"description": "All the tag renderings.\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together",
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
]
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"$ref": "#/definitions/default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>"
},
{
"type": "string"

View file

@ -672,7 +672,100 @@
},
"additionalProperties": false
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>": {
"Partial<QuestionableTagRenderingConfigJson>": {
"type": "object",
"properties": {
"question": {
"description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only"
},
"freeform": {
"description": "Allow freeform text input from the user",
"type": "object",
"properties": {
"key": {
"type": "string"
},
"type": {
"description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values",
"type": "string"
},
"placeholder": {
"description": "A (translated) text that is shown (as gray text) within the textfield"
},
"helperArgs": {
"description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'",
"type": "array",
"items": {}
},
"addExtraTags": {
"description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'",
"type": "array",
"items": {
"type": "string"
}
},
"inline": {
"description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.",
"type": "boolean"
},
"default": {
"description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)",
"type": "string"
}
},
"required": [
"key"
]
},
"multiAnswer": {
"description": "If true, use checkboxes instead of radio buttons when asking the question",
"type": "boolean"
},
"mappings": {
"description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes",
"type": "array",
"items": {
"$ref": "#/definitions/MappingConfigJson"
}
},
"id": {
"description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)",
"type": "string"
},
"group": {
"description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.",
"type": "string"
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away",
"type": "array",
"items": {
"type": "string"
}
},
"render": {
"description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered"
},
"condition": {
"description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
}
},
"additionalProperties": false
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>": {
"description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}. \nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]",
"type": "object",
"properties": {
@ -711,7 +804,9 @@
"builtin": {
"type": "string"
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",

View file

@ -661,7 +661,99 @@ export default {
}
}
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:any;})[]>": {
"Partial<QuestionableTagRenderingConfigJson>": {
"type": "object",
"properties": {
"question": {
"description": "If it turns out that this tagRendering doesn't match _any_ value, then we show this question.\nIf undefined, the question is never asked and this tagrendering is read-only"
},
"freeform": {
"description": "Allow freeform text input from the user",
"type": "object",
"properties": {
"key": {
"type": "string"
},
"type": {
"description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values",
"type": "string"
},
"placeholder": {
"description": "A (translated) text that is shown (as gray text) within the textfield"
},
"helperArgs": {
"description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'",
"type": "array",
"items": {}
},
"addExtraTags": {
"description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'",
"type": "array",
"items": {
"type": "string"
}
},
"inline": {
"description": "When set, influences the way a question is asked.\nInstead of showing a full-widht text field, the text field will be shown within the rendering of the question.\n\nThis combines badly with special input elements, as it'll distort the layout.",
"type": "boolean"
},
"default": {
"description": "default value to enter if no previous tagging is present.\nNormally undefined (aka do not enter anything)",
"type": "string"
}
},
"required": [
"key"
]
},
"multiAnswer": {
"description": "If true, use checkboxes instead of radio buttons when asking the question",
"type": "boolean"
},
"mappings": {
"description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes",
"type": "array",
"items": {
"$ref": "#/definitions/MappingConfigJson"
}
},
"id": {
"description": "The id of the tagrendering, should be an unique string.\nUsed to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise.\n\nUse 'questions' to trigger the question box of this group (if a group is defined)",
"type": "string"
},
"group": {
"description": "If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well.\nThe first tagRendering of a group will always be a sticky element.",
"type": "string"
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to filter them away",
"type": "array",
"items": {
"type": "string"
}
},
"render": {
"description": "Renders this value. Note that \"{key}\"-parts are substituted by the corresponding values of the element.\nIf neither 'textFieldQuestion' nor 'mappings' are defined, this text is simply shown as default value.\n\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`\ntype: rendered"
},
"condition": {
"description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [
{
"$ref": "#/definitions/AndTagConfigJson",
"description": "Chain many tags, to match, a single of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"$ref": "#/definitions/OrTagConfigJson",
"description": "Chain many tags, to match, all of these should be true\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation"
},
{
"type": "string"
}
]
}
}
},
"default<(string|QuestionableTagRenderingConfigJson|{builtin:string;override:Partial<QuestionableTagRenderingConfigJson>;})[]>": {
"description": "Rewrites and multiplies the given renderings of type T.\n\nThis can be used for introducing many similar questions automatically,\nwhich also makes translations easier.\n\n(Note that the key does _not_ need to be wrapped in {}. \nHowever, we recommend to use them if the key is used in a translation, as missing keys will be picked up and warned for by the translation scripts)\n\nFor example:\n\n```\n{\n rewrite: {\n sourceString: [\"key\", \"a|b|c\"],\n into: [\n [\"X\", 0]\n [\"Y\", 1],\n [\"Z\", 2]\n ],\n renderings: [{\n \"key\":\"a|b|c\"\n }]\n }\n}\n```\nwill result in _three_ copies (as the values to rewrite into have three values, namely:\n\n[\n {\n # The first pair: key --> X, a|b|c --> 0\n \"X\": 0\n },\n {\n \"Y\": 1\n },\n {\n \"Z\": 2\n }\n\n]",
"type": "object",
"properties": {
@ -700,7 +792,9 @@ export default {
"builtin": {
"type": "string"
},
"override": {}
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",

View file

@ -116,6 +116,210 @@
"key": "opening_hours",
"description": "Layer 'Bike cafe' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "amenity",
"description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bicycle rental showing features with this tag",
"value": "bicycle_rental"
},
{
"key": "bicycle_rental",
"description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bicycle rental showing features with this tag"
},
{
"key": "service:bicycle:rental",
"description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bicycle rental showing features with this tag",
"value": "yes"
},
{
"key": "rental",
"description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bicycle rental showing features with this tag"
},
{
"key": "image",
"description": "The layer 'Bicycle rental allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "mapillary",
"description": "The layer 'Bicycle rental allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikidata",
"description": "The layer 'Bicycle rental allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikipedia",
"description": "The layer 'Bicycle rental allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "shop",
"description": "Layer 'Bicycle rental' shows shop=rental&bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "rental"
},
{
"key": "bicycle_rental",
"description": "Layer 'Bicycle rental' shows shop=rental&bicycle_rental=shop with a fixed text, namely 'This is a shop whose main focus is bicycle rental' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "shop"
},
{
"key": "shop",
"description": "Layer 'Bicycle rental' shows shop=rental with a fixed text, namely 'This is a rental buisiness which rents out various objects and/or vehicles. It rents out bicycles too, but this is not the main focus' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "rental"
},
{
"key": "service:bicycle:rental",
"description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes&shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "yes"
},
{
"key": "shop",
"description": "Layer 'Bicycle rental' shows service:bicycle:rental=yes&shop=bicycle with a fixed text, namely 'This is a shop which sells or repairs bicycles, but also rents out bicycles' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "bicycle"
},
{
"key": "bicycle_rental",
"description": "Layer 'Bicycle rental' shows bicycle_rental=docking_station with a fixed text, namely 'This is an automated docking station, where a bicycle is mechanically locked into a structure' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "docking_station"
},
{
"key": "bicycle_rental",
"description": "Layer 'Bicycle rental' shows bicycle_rental=key_dispensing_machine with a fixed text, namely 'A machine is present which dispenses and accepts keys, eventually after authentication and/or payment. The bicycles are parked nearby' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "key_dispensing_machine"
},
{
"key": "bicycle_rental",
"description": "Layer 'Bicycle rental' shows bicycle_rental=dropoff_point with a fixed text, namely 'This is a dropoff point, e.g. a reserved parking to place the bicycles which clearly marked as being for the rental service only' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "dropoff_point"
},
{
"key": "website",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "contact:website",
"description": "Layer 'Bicycle rental' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "email",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "contact:email",
"description": "Layer 'Bicycle rental' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "phone",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "contact:phone",
"description": "Layer 'Bicycle rental' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "opening_hours",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "payment:cash",
"description": "Layer 'Bicycle rental' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "yes"
},
{
"key": "payment:cards",
"description": "Layer 'Bicycle rental' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "yes"
},
{
"key": "payment:cash",
"description": "Layer 'Bicycle rental' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "yes"
},
{
"key": "payment:cards",
"description": "Layer 'Bicycle rental' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "yes"
},
{
"key": "payment:app",
"description": "Layer 'Bicycle rental' shows payment:app=yes with a fixed text, namely 'Payment is done using a dedicated app' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "yes"
},
{
"key": "payment:membership_card",
"description": "Layer 'Bicycle rental' shows payment:membership_card=yes with a fixed text, namely 'Payment is done using a membership card' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "yes"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'rental' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows rental=city_bike with a fixed text, namely 'Normal city bikes can be rented here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "city_bike"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows rental=ebike with a fixed text, namely 'Electrical bikes can be rented here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "ebike"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows rental=bmx with a fixed text, namely 'BMX bikes can be rented here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "bmx"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows rental=mtb with a fixed text, namely 'Mountainbikes can be rented here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "mtb"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows rental=kid_bike with a fixed text, namely 'Bikes for children can be rented here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "kid_bike"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows rental=tandem with a fixed text, namely 'Tandem bicycles can be rented here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "tandem"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows rental=racebike with a fixed text, namely 'Race bicycles can be rented here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "racebike"
},
{
"key": "rental",
"description": "Layer 'Bicycle rental' shows rental=bike_helmet with a fixed text, namely 'Bike helmets can be rented here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "bike_helmet"
},
{
"key": "capacity:city_bike",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'capacity:city_bike' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "capacity:ebike",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'capacity:ebike' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "capacity:kid_bike",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'capacity:kid_bike' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "capacity:bmx",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'capacity:bmx' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "capacity:mtb",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'capacity:mtb' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "capacity:bicycle_pannier",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'capacity:bicycle_pannier' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "capacity:tandem_bicycle",
"description": "Layer 'Bicycle rental' shows and asks freeform values for key 'capacity:tandem_bicycle' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "shop",
"description": "The MapComplete theme Cyclofix - an open map for cyclists has a layer Bike repair/shop showing features with this tag",

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,223 @@
{
"data_format": 1,
"project": {
"name": "MapComplete Walls and buildings",
"description": "Special builtin layer providing all walls and buildings",
"project_url": "https://mapcomplete.osm.be/walls_and_buildings",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/layers/walls_and_buildings/walls_and_buildings.png",
"contact_name": "Pieter Vander Vennet, MapComplete",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "highway",
"description": "The MapComplete theme Walls and buildings has a layer Pedestrian paths showing features with this tag",
"value": "footway"
},
{
"key": "highway",
"description": "The MapComplete theme Walls and buildings has a layer Pedestrian paths showing features with this tag",
"value": "path"
},
{
"key": "highway",
"description": "The MapComplete theme Walls and buildings has a layer Pedestrian paths showing features with this tag",
"value": "corridor"
},
{
"key": "highway",
"description": "The MapComplete theme Walls and buildings has a layer Pedestrian paths showing features with this tag",
"value": "steps"
},
{
"key": "entrance",
"description": "The MapComplete theme Walls and buildings has a layer Entrance showing features with this tag"
},
{
"key": "indoor",
"description": "The MapComplete theme Walls and buildings has a layer Entrance showing features with this tag",
"value": "door"
},
{
"key": "image",
"description": "The layer 'Entrance allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "mapillary",
"description": "The layer 'Entrance allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikidata",
"description": "The layer 'Entrance allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikipedia",
"description": "The layer 'Entrance allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows entrance=yes with a fixed text, namely 'No specific entrance type is known' (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "yes"
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows indoor=door with a fixed text, namely 'This is an indoor door, separating a room or a corridor within a single building' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings') Picking this answer will delete the key entrance.",
"value": ""
},
{
"key": "indoor",
"description": "Layer 'Entrance' shows indoor=door with a fixed text, namely 'This is an indoor door, separating a room or a corridor within a single building' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "door"
},
{
"key": "indoor",
"description": "Layer 'Entrance' shows entrance=main with a fixed text, namely 'This is the main entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings') Picking this answer will delete the key indoor.",
"value": ""
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows entrance=main with a fixed text, namely 'This is the main entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "main"
},
{
"key": "indoor",
"description": "Layer 'Entrance' shows entrance=secondary with a fixed text, namely 'This is a secondary entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings') Picking this answer will delete the key indoor.",
"value": ""
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows entrance=secondary with a fixed text, namely 'This is a secondary entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "secondary"
},
{
"key": "indoor",
"description": "Layer 'Entrance' shows entrance=service with a fixed text, namely 'This is a service entrance - normally only used for employees, delivery, …' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings') Picking this answer will delete the key indoor.",
"value": ""
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows entrance=service with a fixed text, namely 'This is a service entrance - normally only used for employees, delivery, …' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "service"
},
{
"key": "indoor",
"description": "Layer 'Entrance' shows entrance=exit with a fixed text, namely 'This is an exit where one can not enter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings') Picking this answer will delete the key indoor.",
"value": ""
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows entrance=exit with a fixed text, namely 'This is an exit where one can not enter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "exit"
},
{
"key": "indoor",
"description": "Layer 'Entrance' shows entrance=entrance with a fixed text, namely 'This is an entrance where one can only enter (but not exit)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings') Picking this answer will delete the key indoor.",
"value": ""
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows entrance=entrance with a fixed text, namely 'This is an entrance where one can only enter (but not exit)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "entrance"
},
{
"key": "indoor",
"description": "Layer 'Entrance' shows entrance=emergency with a fixed text, namely 'This is emergency exit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings') Picking this answer will delete the key indoor.",
"value": ""
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows entrance=emergency with a fixed text, namely 'This is emergency exit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "emergency"
},
{
"key": "indoor",
"description": "Layer 'Entrance' shows entrance=home with a fixed text, namely 'This is the entrance to a private home' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings') Picking this answer will delete the key indoor.",
"value": ""
},
{
"key": "entrance",
"description": "Layer 'Entrance' shows entrance=home with a fixed text, namely 'This is the entrance to a private home' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "home"
},
{
"key": "door",
"description": "Layer 'Entrance' shows door=yes with a fixed text, namely 'The door type is not known' (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "yes"
},
{
"key": "door",
"description": "Layer 'Entrance' shows door=hinged with a fixed text, namely 'A classical, hinged door supported by joints' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "hinged"
},
{
"key": "door",
"description": "Layer 'Entrance' shows door=revolving with a fixed text, namely 'A revolving door which hangs on a central shaft, rotating within a cylindrical enclosure' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "revolving"
},
{
"key": "door",
"description": "Layer 'Entrance' shows door=sliding with a fixed text, namely 'A sliding door where the door slides sidewards, typically parallel with a wall' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "sliding"
},
{
"key": "door",
"description": "Layer 'Entrance' shows door=overhead with a fixed text, namely 'A door which rolls from overhead, typically seen for garages' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "overhead"
},
{
"key": "door",
"description": "Layer 'Entrance' shows door=no with a fixed text, namely 'This is an entrance without a physical door' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "no"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=yes with a fixed text, namely 'This is an automatic door' (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "yes"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=no with a fixed text, namely 'This door is <b>not</b> automated' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "no"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=motion with a fixed text, namely 'This door will open automatically when <b>motion</b> is detected' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "motion"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=floor with a fixed text, namely 'This door will open automatically when a <b>sensor in the floor</b> is triggered' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "floor"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=button with a fixed text, namely 'This door will open automatically when a <b>button is pressed</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "button"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=slowdown_button with a fixed text, namely 'This door revolves automatically all the time, but has a <b>button to slow it down</b>, e.g. for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "slowdown_button"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=continuous with a fixed text, namely 'This door revolves automatically all the time' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "continuous"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=serviced_on_button_press with a fixed text, namely 'This door will be opened by staff when requested by <b>pressing a button</b>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "serviced_on_button_press"
},
{
"key": "automatic_door",
"description": "Layer 'Entrance' shows automatic_door=serviced_on_request with a fixed text, namely 'This door will be opened by staff when requested' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Walls and buildings')",
"value": "serviced_on_request"
},
{
"key": "width",
"description": "Layer 'Entrance' shows and asks freeform values for key 'width' (in the MapComplete.osm.be theme 'Walls and buildings')"
}
]
}

View file

@ -336,7 +336,7 @@ export class TagUtils {
if (json["or"] !== undefined) {
return new Or(json["or"].map(t => TagUtils.Tag(t, context)));
}
throw "At " + context + ": unrecognized tag"
throw `At ${context}: unrecognized tag: ${JSON.stringify(json)}`
}

View file

@ -2,7 +2,7 @@ import {Utils} from "../Utils";
export default class Constants {
public static vNumber = "0.22.1";
public static vNumber = "0.23.0";
public static ImgurApiKey = '7070e7167f0a25a'
public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"

View file

@ -287,9 +287,9 @@ export interface LayerConfigJson {
*/
tagRenderings?:
(string
| { builtin: string | string[], override: any }
| { builtin: string | string[], override: Partial<QuestionableTagRenderingConfigJson> }
| QuestionableTagRenderingConfigJson
| RewritableConfigJson<(string | { builtin: string, override: any } | QuestionableTagRenderingConfigJson)[]>
| RewritableConfigJson<(string | { builtin: string, override: Partial<QuestionableTagRenderingConfigJson> } | QuestionableTagRenderingConfigJson)[]>
) [],

View file

@ -150,7 +150,7 @@ export interface LayoutConfigJson {
*
* In the above scenario, `sometagrendering` will be added at the beginning of the tagrenderings of every layer
*/
overrideAll?: any;
overrideAll?: Partial<any | LayerConfigJson>;
/**
* The id of the default background. BY default: vanilla OSM

View file

@ -42,7 +42,7 @@ export default class ShareScreen extends Combine {
} else {
return null;
}
}, [currentLocation]));
@ -94,7 +94,7 @@ export default class ShareScreen extends Combine {
for (const swtch of switches) {
const checkbox =new CheckBox(Translations.W(swtch.human), !swtch.reverse)
const checkbox = new CheckBox(Translations.W(swtch.human), !swtch.reverse)
optionCheckboxes.push(checkbox);
optionParts.push(checkbox.GetValue().map((isEn) => {
if (isEn) {
@ -113,8 +113,8 @@ export default class ShareScreen extends Combine {
}
if(layout.definitionRaw !== undefined){
optionParts.push(new UIEventSource("userlayout="+(layout.definedAtUrl ?? layout.id)))
if (layout.definitionRaw !== undefined) {
optionParts.push(new UIEventSource("userlayout=" + (layout.definedAtUrl ?? layout.id)))
}
const options = new Combine(optionCheckboxes).SetClass("flex flex-col")
@ -124,14 +124,14 @@ export default class ShareScreen extends Combine {
let path = window.location.pathname;
path = path.substr(0, path.lastIndexOf("/"));
let id = layout.id.toLowerCase()
if(layout.definitionRaw !== undefined){
id="theme.html"
if (layout.definitionRaw !== undefined) {
id = "theme.html"
}
let literalText = `https://${host}${path}/${id}`
let hash = ""
if(layout.definedAtUrl === undefined && layout.definitionRaw !== undefined){
hash = "#"+ LZString.compressToBase64( Utils.MinifyJSON(layout.definitionRaw))
if (layout.definedAtUrl === undefined && layout.definitionRaw !== undefined) {
hash = "#" + LZString.compressToBase64(Utils.MinifyJSON(layout.definitionRaw))
}
const parts = Utils.NoEmpty(Utils.NoNull(optionParts.map((eventSource) => eventSource.data)));
if (parts.length === 0) {
@ -189,18 +189,30 @@ export default class ShareScreen extends Combine {
});
let downloadThemeConfig: BaseUIElement = undefined;
if(layout.definitionRaw !== undefined){
downloadThemeConfig = new SubtleButton(Svg.download_svg(), new Combine([
if (layout.definitionRaw !== undefined) {
const downloadThemeConfigAsJson = new SubtleButton(Svg.download_svg(), new Combine([
tr.downloadCustomTheme,
tr.downloadCustomThemeHelp.SetClass("subtle")
]).onClick(() => {
Utils.offerContentsAsDownloadableFile(layout.definitionRaw, layout.id+".mapcomplete-theme-definition.json", {
mimetype:"application/json"
Utils.offerContentsAsDownloadableFile(layout.definitionRaw, layout.id + ".mapcomplete-theme-definition.json", {
mimetype: "application/json"
})
})
.SetClass("flex flex-col"))
let editThemeConfig: BaseUIElement = undefined
if (layout.definedAtUrl === undefined) {
const patchedDefinition = JSON.parse(layout.definitionRaw)
patchedDefinition["language"] = Object.keys(patchedDefinition.title)
editThemeConfig = new SubtleButton(Svg.pencil_svg(), "Edit this theme on the custom theme generator",
{
url: `https://pietervdvn.github.io/mc/legacy/070/customGenerator.html#${btoa(JSON.stringify(patchedDefinition))}`
}
)
}
downloadThemeConfig = new Combine([downloadThemeConfigAsJson, editThemeConfig]).SetClass("flex flex-col")
}
super([

View file

@ -1,11 +1,11 @@
{
"contributors": [
{
"commits": 4109,
"commits": 4165,
"contributor": "Pieter Vander Vennet"
},
{
"commits": 112,
"commits": 119,
"contributor": "Robin van der Linde"
},
{
@ -64,6 +64,10 @@
"commits": 17,
"contributor": "pgm-chardelv1"
},
{
"commits": 15,
"contributor": "Andrews Leruth"
},
{
"commits": 15,
"contributor": "ToastHawaii"
@ -81,13 +85,17 @@
"contributor": "Bavo Vanderghote"
},
{
"commits": 10,
"commits": 11,
"contributor": "dependabot[bot]"
},
{
"commits": 10,
"contributor": "LiamSimons"
},
{
"commits": 9,
"contributor": "AlexanderRebai"
},
{
"commits": 9,
"contributor": "RobJN"
@ -124,10 +132,6 @@
"commits": 5,
"contributor": "David Haberthür"
},
{
"commits": 4,
"contributor": "AlexanderRebai"
},
{
"commits": 4,
"contributor": "OliNau"
@ -152,10 +156,6 @@
"commits": 3,
"contributor": "Léo Villeveygoux"
},
{
"commits": 2,
"contributor": "Andrews Leruth"
},
{
"commits": 2,
"contributor": "pdassori"
@ -196,6 +196,10 @@
"commits": 2,
"contributor": "Stanislas Gueniffey"
},
{
"commits": 1,
"contributor": "bxl-forever"
},
{
"commits": 1,
"contributor": "loviuz"

View file

@ -323,5 +323,6 @@
"render": "1"
}
}
]
],
"deletion": true
}

View file

@ -0,0 +1,81 @@
{
"id": "indoors",
"name": {
"en": "indoors"
},
"source": {
"osmTags": {
"or": [
"indoor=room",
"indoor=area",
"indoor=wall",
"indoor=door",
"indoor=level"
]
}
},
"title": {
"render": {
"en": "Indoor area {name}"
},
"mappings": [
{
"if": "indoor=room",
"then": "Indoor Room {name}"
},
{
"if": "indoor=area",
"then": "Indoor Area {name}"
},
{
"if": "indoor=wall",
"then": "Indoor Wall {name}"
},
{
"if": "indoor=corridor",
"then": "Indoor Corridor {name}"
},
{
"if": "indoor=door",
"then": "Indoor Door {name}"
},
{
"if": "indoor=level",
"then": "Indoor Level {name}"
}
]
},
"minzoom": 13,
"tagRenderings": [
"images"
],
"mapRendering": [
{
"color": {
"render": "#bb004488"
},
"width": {
"render": "8"
},
"offset": {
"render": "-4"
},
"fill": "no"
},
{
"color": "red",
"fill": "no",
"width": "2"
},
{
"label": {
"render": "<div style='margin-top: -20px; color:#013220; background:white' class='rounded-full p-1 font-bold'>{name}</div>",
"condition": "name~*"
},
"location": [
"point",
"centroid"
]
}
]
}

View file

@ -6,7 +6,15 @@
"title": {
"render": {
"en": "{name}"
}
},
"mappings": [
{
"if": "name=",
"then": {
"en": "Pharmacy"
}
}
]
},
"source": {
"osmTags": {
@ -60,5 +68,29 @@
"centroid"
]
}
]
],
"filter": [
{
"id": "drive-through",
"options": [
{
"question": {
"en": "Has drive through"
},
"osmTags": "drive_through=yes"
}
]
},
{
"id": "dispensing",
"options": [
{
"question": {
"en": "Pharmacy able to provide prescription drugs"
},
"osmTags": "dispensing=yes"
}
]
}
]
}

View file

@ -0,0 +1,12 @@
[
{
"path": "walls_and_buildings.png",
"license": "CC0",
"authors": [
"OSM"
],
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Barrier_fence_mapnik.png#file"
]
}
]

View file

@ -43,5 +43,32 @@
"render": "2"
}
}
],
"calculatedTags": [
"_entrance_properties=feat.overlapWith('entrance')?.map(e => e.feat.properties).filter(p => p !== undefined).filter(p => p.width !== undefined)",
"_entrance:id=feat.get('_entrance_properties')?.map(e => e.id)?.at(0)",
"_entrance:width=feat.get('_entrance_properties')?.map(e => e.width)"
],
"tagRenderings": [
{
"id": "_entrance:width",
"render": {
"en": "<a href ='#{_entrance:id} '>This door has a width of {canonical(_entrance:width)} meters </a>",
"nl": "<a href ='#{_entrance:id} '>Deze deur heeft een breedte van {canonical(_entrance:width)} meter </a>",
"de": "<a href ='#{_entrance:id} '>Diese Tür hat eine Durchgangsbreite von {canonical(_entrance:width)} Meter </a>",
"es": "<a href ='#{_entrance:id} '>Esta puerta tiene una ancho de {canonical(_entrance:width)} metros </a>"
},
"freeform": {
"key": "_entrance:width"
},
"mappings": [
{
"if": "_entrance:width=",
"then": {
"en": "This entrance has no width information"
}
}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,5 @@
{
"#dont-translate": "*",
"id": "buurtnatuur",
"title": {
"nl": "Breng jouw buurtnatuur in kaart"

View file

@ -39,6 +39,54 @@
"socialImage": "./assets/themes/cyclofix/logo.svg",
"layers": [
"bike_cafe",
{
"builtin": [
"bicycle_rental"
],
"override": {
"id": "bicycle_rental_non_docking",
"minzoom": 14,
"=presets": [],
"=mapRendering": [
{
"icon": "pin:#ba2792;./assets/themes/cyclofix/key.svg",
"iconSize": "40,40,bottom",
"location": [
"point",
"centroid"
]
}
],
"source": {
"osmTags": {
"and+": [
"bicycle_rental!=docking_station"
]
}
}
}
},
{
"#": "All bicycle rental at a high zoom level, to avoid duplicates",
"builtin": "bicycle_rental",
"override": {
"name": null,
"filter": {
"sameAs": "bicycle_rental_non_docking"
},
"minzoom": 18,
"=mapRendering": [
{
"icon": "pin:#ba2792;./assets/themes/cyclofix/key.svg",
"iconSize": "40,40,bottom",
"location": [
"point",
"centroid"
]
}
]
}
},
"bike_shop",
{
"builtin": "bicycle_library",

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
id="svg4"
sodipodi:docname="key.svg"
width="700"
height="700"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
inkscape:zoom="0.71100982"
inkscape:cx="377.63192"
inkscape:cy="257.38041"
inkscape:window-width="1920"
inkscape:window-height="1007"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
path-name="at"
unicode="@"
horiz-adv-x="781"
d="m 624.87034,232.70553 c 7.07188,7.07269 6.85147,12.10694 0.66125,18.2939 -6.18861,6.18861 -53.87293,54.13999 -53.87293,54.13999 l -31.15861,-31.96703 -32.48592,31.96703 -31.59866,-33.29361 -33.14723,33.29361 -31.82148,-31.96703 -44.19549,40.36627 -50.59645,0.012 c -21.88498,45.06826 -66.91541,71.13715 -115.58239,71.13715 -72.49023,0 -131.257572,-58.76718 -131.257572,-131.25758 0,-72.48941 58.767172,-131.25758 131.257572,-131.25758 47.23711,0 88.65144,24.95312 111.76923,62.40487 h 263.90236 c 0,0 41.0541,41.05567 48.12675,48.12759 z m -483.9061,56.97898 c 20.01942,0 36.25237,-16.23296 36.25237,-36.25237 0,-20.02189 -16.23295,-36.25154 -36.25237,-36.25154 -20.01942,0 -36.25236,16.22965 -36.25236,36.25154 0,20.02106 16.23294,36.25237 36.25236,36.25237 z"
id="path2"
style="fill:#ffffff;fill-opacity:1;stroke-width:0.823753" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -19,6 +19,16 @@
"https://fietsambassade.gent.be"
]
},
{
"path": "key.svg",
"license": "CC-BY-SA",
"authors": [
"Stijn Wens"
],
"sources": [
"https://wens.be/free-antwerpenize-bicycle-font"
]
},
{
"path": "logo.svg",
"license": "CC-BY-SA",

View file

@ -25,6 +25,5 @@
"tertiary_education",
"school",
"kindergarten_childcare"
],
"hideFromOverview": true
]
}

View file

@ -0,0 +1,11 @@
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M397 200C397 308.8 308.8 397 200 397C91.1999 397 3 308.8 3 200C3 91.1999 91.1999 3 200 3C308.8 3 397 91.1999 397 200Z" fill="#22CA60" stroke="#E62222" stroke-width="6"/>
<path d="M242.105 240.241L137.282 291.429L155.338 312.97L167.374 327.329L185.428 348.868L254.141 254.6L242.105 240.241Z" fill="#ECF0F1"/>
<path d="M138.93 283.603L122.535 283.627L190.077 364.206L192.964 348.067L138.93 283.603Z" fill="#FE5757"/>
<path d="M242.105 240.241L224.633 248.772L242.689 270.312L254.141 254.6L242.105 240.241ZM201.309 260.11L177.983 271.447L212.214 312.285L227.45 291.296L201.309 260.11ZM154.752 282.898L137.282 291.429L155.338 312.97L167.374 327.329L185.428 348.868L196.88 333.157L154.754 282.9L154.752 282.898Z" fill="#E62222"/>
<path d="M122.535 283.627L190.077 364.206L185.257 368.246L117.714 287.667L122.535 283.627Z" fill="#E62222"/>
<path d="M243.871 187.187C241.2 193.219 236.746 198.533 230.685 202.228C214.87 211.87 194.229 206.866 184.586 191.05C180.892 184.991 179.363 178.227 179.755 171.642L162.087 167.358C160.538 178.79 162.721 190.803 169.195 201.422C184.17 225.982 216.219 233.753 240.777 218.78C251.396 212.306 258.87 202.636 262.73 191.761L243.871 187.187Z" fill="#FCFCFF"/>
<path d="M220.03 69.1601C228.136 64.2175 230.701 53.639 225.759 45.5323C220.816 37.4256 210.237 34.8606 202.131 39.8032C194.024 44.7458 191.459 55.3243 196.402 63.431C201.344 71.5377 211.923 74.1027 220.03 69.1601Z" fill="#FCFCFF"/>
<path d="M250.824 98.9454L218.518 118.642L225.708 88.9832C225.995 88.2028 226.192 87.3988 226.294 86.5735L226.353 86.3324L226.329 86.3268C226.556 84.0714 226.115 81.7309 224.844 79.6478C222.814 76.3168 219.268 74.5145 215.635 74.5114L215.635 74.5081L159.854 75.8435L159.857 75.9264C158.38 76.1088 156.92 76.5767 155.568 77.4013C153.203 78.8428 151.63 81.0604 150.891 83.5185L150.871 83.5137L150.823 83.7119C150.755 83.956 150.696 84.1972 150.645 84.4453L143.544 113.732L143.57 113.739C143.012 116.342 143.389 119.153 144.885 121.608C147.987 126.696 154.623 128.303 159.709 125.202C162.164 123.706 163.786 121.379 164.482 118.809L164.509 118.816L164.574 118.548L164.58 118.522L169.753 97.19L185.053 96.8249L174.632 139.811C170.442 144.547 167.246 149.967 165.048 155.739L182.58 159.99C185.251 153.959 189.705 148.644 195.764 144.951C211.581 135.307 232.221 140.313 241.863 156.128C245.557 162.187 247.086 168.952 246.694 175.536L265.414 180.077C266.655 169.003 264.383 157.449 258.132 147.197C253.744 140 247.883 134.257 241.182 130.094L252.845 122.983L275.833 160.687C278.935 165.775 285.572 167.384 290.66 164.282C295.748 161.18 297.356 154.541 294.255 149.455L265.65 102.538C262.549 97.4527 255.91 95.8446 250.824 98.9454Z" fill="#FCFCFF"/>
<path d="M104.007 155.511C105.121 154.899 105.528 153.5 104.917 152.386C104.305 151.272 102.905 150.865 101.791 151.476L95.7395 154.8C91.283 157.248 89.6546 162.845 92.1022 167.301C94.5498 171.758 100.147 173.386 104.603 170.938L130.828 156.535C131.942 155.923 132.349 154.524 131.737 153.41C131.125 152.296 129.726 151.889 128.612 152.501L102.387 166.904C100.159 168.128 97.3605 167.313 96.1367 165.085C94.9129 162.857 95.7272 160.059 97.9554 158.835L104.007 155.511ZM79.7999 168.806C80.914 168.194 81.3211 166.795 80.7092 165.681C80.0973 164.567 78.6981 164.16 77.584 164.772L73.5495 166.988C65.7507 171.271 62.9009 181.066 67.1842 188.864C71.4675 196.663 81.262 199.513 89.0608 195.23L145.544 164.207C146.659 163.595 147.066 162.196 146.454 161.082C145.842 159.968 144.443 159.56 143.329 160.172L86.8449 191.195C81.2743 194.255 74.2783 192.219 71.2187 186.648C68.1592 181.078 70.1948 174.082 75.7654 171.022L79.7999 168.806ZM136.054 185.174C137.168 184.562 137.575 183.163 136.963 182.049C136.351 180.935 134.952 180.528 133.838 181.14L103.579 197.759C99.1225 200.207 97.494 205.803 99.9417 210.26C102.389 214.716 107.986 216.345 112.443 213.897L118.494 210.573C119.608 209.961 120.016 208.562 119.404 207.448C118.792 206.334 117.393 205.927 116.278 206.539L110.227 209.863C107.998 211.086 105.2 210.272 103.976 208.044C102.752 205.816 103.567 203.017 105.795 201.793L136.054 185.174Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -0,0 +1,20 @@
{
"id": "indoors",
"title": {
"en": "Indoors"
},
"description": {
"en": "On this map, publicly accessible indoor places are shown"
},
"maintainer": "MapComplete",
"icon": "./assets/themes/onwheels/crest.svg",
"version": "0",
"startLat": 51.17181,
"defaultBackgroundId": "CartoDB.Voyager",
"startLon": 4.144383,
"startZoom": 14,
"widenFactor": 2,
"layers": [
"indoors"
]
}

View file

@ -0,0 +1,10 @@
[
{
"path": "crest.svg",
"license": "CC0",
"authors": [
"Free Wheelies"
],
"sources": []
}
]

View file

@ -230,6 +230,10 @@
"if": "theme=healthcare",
"then": "./assets/layers/doctors/doctors.svg"
},
{
"if": "theme=indoors",
"then": "./assets/themes/onwheels/crest.svg"
},
{
"if": "theme=kerbs_and_crossings",
"then": "./assets/layers/kerbs/KerbIcon.svg"
@ -354,6 +358,10 @@
"if": "theme=uk_addresses",
"then": "./assets/themes/uk_addresses/housenumber_unknown.svg"
},
{
"if": "theme=walls_and_buildings",
"then": "./assets/layers/walls_and_buildings/walls_and_buildings.png"
},
{
"if": "theme=waste",
"then": "./assets/layers/recycling/recycling-14.svg"

View file

@ -14,6 +14,7 @@
"startLon": 4.351697,
"startZoom": 16,
"widenFactor": 2,
"hideFromOverview": true,
"layers": [
"bike_repair_station",
"bike_shop",
@ -53,9 +54,38 @@
}
]
}
}
},
"walls_and_buildings"
],
"overrideAll": {
"+calculatedTags": [
"_poi_walls_and_buildings_entrance_properties=feat.closestn('walls_and_buildings', 1, undefined, 1000).map(w => ({id: w.feat.properties.id, width: w.feat.properties['_entrance:width']}))[0]",
"_poi_entrance:width=JSON.parse(feat.properties._poi_walls_and_buildings_entrance_properties)?.width"
],
"+tagRenderings": [
{
"id": "_poi_entrance:width",
"condition": "entrance=",
"render": {
"en": "This door has a width of {canonical(_poi_entrance:width)} meter",
"nl": "Deze deur heeft een breedte van {canonical(_poi_entrance:width)} meter",
"de": "Diese Tür hat eine Durchgangsbreite von {canonical(_poi_entrance:width)} Meter",
"es": "Esta puerta tiene una ancho de {canonical(_poi_entrance:width)} metros"
},
"freeform": {
"key": "_poi_entrance:width",
"type": "distance"
},
"mappings": [
{
"if": "_poi_entrance:width=",
"then": {
"en": "This entrance has no width information"
}
}
]
}
],
"minzoom": "15",
"mapRendering": [
{

View file

@ -208,7 +208,7 @@
"bicycle_rental"
],
"override": {
"id": "charging_station_non_docking",
"id": "bicycle_rental_non_docking",
"minzoom": 14,
"source": {
"osmTags": {
@ -225,7 +225,7 @@
"override": {
"name": null,
"filter": {
"sameAs": "charging_station_non_docking"
"sameAs": "bicycle_rental_non_docking"
},
"minzoom": 18,
"=presets": []

View file

@ -0,0 +1,21 @@
{
"id": "walls_and_buildings",
"title": {
"en": "Walls and buildings"
},
"description": {
"en": "Special builtin layer providing all walls and buildings. This layer is useful in presets for objects which can be placed against walls (e.g. AEDs, postboxes, entrances, addresses, surveillance cameras, …). This layer is invisible by default and not toggleable by the user."
},
"maintainer": "MapComplete",
"icon": "./assets/layers/walls_and_buildings/walls_and_buildings.png",
"version": "0",
"startLat": 50.8465573,
"defaultBackgroundId": "CartoDB.Voyager",
"startLon": 4.351697,
"startZoom": 16,
"widenFactor": 2,
"layers": [
"walls_and_buildings",
"entrance"
]
}

View file

@ -1,11 +1,11 @@
{
"contributors": [
{
"commits": 175,
"commits": 177,
"contributor": "Pieter Vander Vennet"
},
{
"commits": 138,
"commits": 139,
"contributor": "kjon"
},
{
@ -17,12 +17,12 @@
"contributor": "Allan Nordhøy"
},
{
"commits": 30,
"contributor": "Babos Gábor"
"commits": 31,
"contributor": "Iago"
},
{
"commits": 30,
"contributor": "Iago"
"contributor": "Babos Gábor"
},
{
"commits": 29,
@ -288,6 +288,10 @@
"commits": 2,
"contributor": "Leo Alcaraz"
},
{
"commits": 1,
"contributor": "Hungarian_user"
},
{
"commits": 1,
"contributor": "Stéphane De Greef"

View file

@ -1,5 +1,5 @@
{
"name": "index",
"name": "MapComplete",
"short_name": "MapComplete",
"start_url": "index.html",
"lang": "en",

View file

@ -254,7 +254,10 @@
},
"welcomeBack": "Sie sind angemeldet, willkommen zurück!",
"welcomeExplanation": {
"addNew": "Tippen oden klicken Sie auf die Karte, um einen neuen POI hinzuzufügen."
"addNew": "Tippen oden klicken Sie auf die Karte, um einen neuen POI hinzuzufügen.",
"browseMoreMaps": "Weitere Karten entdecken",
"browseOtherThemesIntro": "Auf MapComplete gibt es verschiedene thematische Karten",
"general": "Auf dieser Karte können Sie <i>Interessante Orte</i> sehen, bearbeiten und hinzufügen. Verschieben Sie den Kartenausschnitt, um die Orte zu entdecken, tippen Sie auf einen, um weitere Informationen zu sehen oder zu bearbeiten. Alle Daten stammen von OpenStreetMap und sind dort gespeichert, so dass sie frei weiterverwendet werden können."
},
"wikipedia": {
"createNewWikidata": "Einen neues Wikidata Element erstellen",
@ -268,6 +271,7 @@
"born": "Geboren am: {value}",
"died": "Gestorben am: {value}"
},
"searchToShort": "Ihre Suchanfrage ist zu kurz, geben Sie einen längeren Text ein",
"searchWikidata": "Wikidata durchsuchen",
"wikipediaboxTitle": "Wikipedia"
}
@ -571,6 +575,7 @@
"arglayerid": "Der Name einer Ebene ODER ein einzelner Suchbegriff",
"argsearch": "Der Suchbegriff",
"argverb": "Entweder in einem geografischen Gebiet (z. B. einer Stadt) oder in der Nähe eines POI suchen",
"docs": "Sucht Interessante Orte in oder in der Nähe eines Standorts",
"noMatchingLayer": "Ich habe keine passende Ebene gefunden",
"noNearOrIn": "Entschuldigung, ich habe Ihren Befehl nicht verstanden, da ich kein <code>in der Nähe</code> oder <code>in</code> in Ihrer Suchanfrage gefunden habe.\n Versuchen Sie etwas wie <code>Suche Trinkwasser in London</code>, <code>Suche Friture in Brüssel</code>\n Alternativ versuchen Sie <code>info {cmd}</code>, um Informationen über ein einzelnes Objekt zu erhalten.",
"nothingFound": "Entschuldigung, ich konnte nichts für <code>{search}</code> finden, also kann ich nicht nach {layerTitle} suchen",

View file

@ -10,7 +10,7 @@
"cannotBeDeleted": "Ez az objektum nem törölhető",
"delete": "Törlés",
"explanations": {
"hardDelete": "Ez a pont törlődik az OpenStreetMapről. Csak egy tapasztalt szerkesztő tudja majd visszaállítani",
"hardDelete": "Ez az elem törlődik az OpenStreetMapről. Csak tapasztalt szerkesztő tudja visszaállítani",
"selectReason": "Kérjük, jelöld meg, miért kellene ezt a pontot törölni",
"softDelete": "Ez az objektum frissülni fog és ebben az alkalmazásban nem fog látszani. <span class=\"subtle\">{reason}</span>"
},
@ -80,6 +80,9 @@
"donate": "A MapComplete pénzügyi támogatása",
"editId": "Az OpenStreetMap online szerkesztőjének megnyitása itt",
"editJosm": "Szerkesztés itt JOSM-mal",
"followBridge": "A Mastodon- és Twitter-fiókok összekapcsolódnak",
"followOnMastodon": "Kövesse a MapComplete-et a Mastodonon",
"followOnTwitter": "Kövesse a MapComplete-et a Twitteren",
"iconAttribution": {
"title": "Felhasznált ikonok"
},
@ -101,6 +104,7 @@
"download": {
"downloadAsPdf": "A jelenlegi térkép letöltése PDF-ként",
"downloadAsPdfHelper": "Eszményi a jelenlegi térkép kinyomtatásához",
"downloadAsSvg": "Az aktuális térkép letöltése SVG formátumban",
"downloadCSV": "Látható adatok letöltése CSV-ként",
"downloadCSVHelper": "Kompatibilis a LibreOffice Calc-kal, az Excellel…",
"downloadFeatureAsGeojson": "Letöltés GeoJSON-fájlként",
@ -116,6 +120,7 @@
"title": "A látható adatok letöltése",
"uploadGpx": "Töltsd fel a nyomvonalaidat az OpenStreetMapre"
},
"error": "Valami rosszul sült el",
"example": "Példa",
"examples": "Példák",
"fewChangesBefore": "Kérjük, válaszolj néhány meglévő pontokra vonatkozó kérdésre, mielőtt új pontot adnál hozzá.",
@ -131,6 +136,7 @@
},
"loading": "Betöltés…",
"loadingTheme": "{theme} betöltése…",
"loginFailed": "Az OpenStreetMap-be való bejelentkezés nem sikerült",
"loginOnlyNeededToEdit": "ha szerkeszteni szeretnéd a térképet",
"loginToStart": "A kérdés megválaszolásához be kell jelentkezni",
"loginWithOpenStreetMap": "Bejelentkezés OpenStreetMap-fiókkal",
@ -139,6 +145,8 @@
"createYourOwnTheme": "Készítsd el saját MapComplete témád a semmiből",
"hiddenExplanation": "Ezeket a témákat csak az érheti el, akik ismeri a linket. {total_hidden} rejtett téma közül {hidden_discovered} témát ismersz.",
"intro": "<h3>Kíváncsi vagy más tematikus térképekre is?</h3>Szeretsz földrajzi adatokat gyűjteni? <br>További témák is elérhetők.",
"noMatchingThemes": "Nincs olyan téma, amely megfelelt volna a keresési feltételeknek",
"noSearch": "Minden téma megjelenítése",
"previouslyHiddenTitle": "Korábban megnézett rejtett témák",
"requestATheme": "Ha egyedi témát szeretnél, kérd a problémakövetőben (issue tracker)",
"streetcomplete": "Egy másik, hasonló alkalmazás a <a class=\"underline hover:text-blue-800\" href=\"https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete\" target=\"_blank\">StreetComplete</a>."

View file

@ -6120,6 +6120,11 @@
},
"walls_and_buildings": {
"description": "Spezielle eingebaute Ebene, die alle Wände und Gebäude bereitstellt. Diese Ebene ist in Voreinstellungen für Objekte nützlich, die an Wänden platziert werden können (z. B. AEDs, Briefkästen, Eingänge, Adressen, Überwachungskameras, …). Diese Ebene ist standardmäßig unsichtbar und kann vom Benutzer nicht eingeschaltet werden.",
"tagRenderings": {
"_entrance:width": {
"render": "<a href ='#{_entrance:id} '>Diese Tür hat eine Durchgangsbreite von {canonical(_entrance:width)} Meter </a>"
}
},
"title": {
"render": "Wand oder Gebäude"
}

View file

@ -4955,6 +4955,11 @@
}
},
"title": {
"mappings": {
"0": {
"then": "Pharmacy"
}
},
"render": "{name}"
}
},
@ -6707,6 +6712,16 @@
},
"walls_and_buildings": {
"description": "Special builtin layer providing all walls and buildings. This layer is useful in presets for objects which can be placed against walls (e.g. AEDs, postboxes, entrances, addresses, surveillance cameras, …). This layer is invisible by default and not toggleable by the user.",
"tagRenderings": {
"_entrance:width": {
"mappings": {
"0": {
"then": "This entrance has no width information"
}
},
"render": "<a href ='#{_entrance:id} '>This door has a width of {canonical(_entrance:width)} meters </a>"
}
},
"title": {
"render": "Wall or building"
}

View file

@ -3985,6 +3985,11 @@
}
},
"walls_and_buildings": {
"tagRenderings": {
"_entrance:width": {
"render": "<a href ='#{_entrance:id} '>Esta puerta tiene una ancho de {canonical(_entrance:width)} metros </a>"
}
},
"title": {
"render": "Pared o edificio"
}

View file

@ -6240,6 +6240,11 @@
},
"walls_and_buildings": {
"description": "Speciale laag met alle muren en gebouwen. Deze laag is nuttig om objecten toe te voegen die met een muur verbonden zijn (zoals AEDs, brievenbussen, adressen, bewakingscamera's,…). Deze laag is standaard onzichtbaar en kan niet aangezet worden door de gebruiker.",
"tagRenderings": {
"_entrance:width": {
"render": "<a href ='#{_entrance:id} '>Deze deur heeft een breedte van {canonical(_entrance:width)} meter </a>"
}
},
"title": {
"render": "Muur of gebouw"
}

View file

@ -254,7 +254,10 @@
},
"welcomeBack": "Je bent aangemeld. Welkom terug!",
"welcomeExplanation": {
"addNew": "Klik op de kaart om een nieuw punt toe te voegen."
"addNew": "Klik op de kaart om een nieuw punt toe te voegen.",
"browseMoreMaps": "Ontdek meer kaarten",
"browseOtherThemesIntro": "Er zijn diverse thematische kaarten op MapComplete",
"general": "Op deze kaart kan je <i>interessepunten</i> bekijken, bewerken en toevoegen. Zoom in om de interessepunten te zien, duid eentje aan om alle informatie te zien en te bewerken. Alle informatie komt van OpenStreetMap die gratis hergebruikt mag worden."
},
"wikipedia": {
"createNewWikidata": "Maak een nieuw Wikidata-item",
@ -503,7 +506,7 @@
},
"dream": {
"docs": "Stuurt een dromerige, computer-gegenereerde tekst",
"generatedBy": "Deze text is gemaakt door {bot} die Machine-Learning gebruikt om op Reddit te posten."
"generatedBy": "Deze tekst is gegenereerd door {bot} die Machine-Learning gebruikt om op Reddit te posten."
},
"help": {
"argcmd": "Het commando waarvoor je meer informatie wilt",
@ -523,8 +526,8 @@
"couldNotDownload": "Ik kon <code>{id}</code> niet downloaden",
"docs": "Haal informatie op over een OSM-object. Dit kan met het ID of via een zoekterm. De objecten worden geinterpreteerd en getoond.",
"editWith": "Bewerk dit element op {title}",
"fetchingInfoAbout": "Data over {id} aan het ophalen...",
"foundResults": "Ik vond {total} resultaten voor <code>{search}</code>, ik ben informatie erover aan het ophalen...",
"fetchingInfoAbout": "Data over {id} aan het ophalen",
"foundResults": "Ik vond {total} resultaten voor <code>{search}</code>, ik ben informatie erover aan het ophalen",
"noEditPossible": "Geen enkel MapComplete-thema bevat dit soort objecten...",
"noInfo": "Nog geen relevante informatie",
"noOpeningHours": "Geen openingsuren gekend",
@ -575,7 +578,7 @@
"noNearOrIn": "Sorry, Ik begreep je opdracht niet omdat ik geen <code>dichtbij</code> of <code>in</code> in je zoekopdracht.\nProbeer iets als <code>Zoek drinkwater in Londen</code>, <code>Zoek frituur in Brussel</code><p></p>\n <p>Daarnaast kan je ook <code>info {cmd}</code> proberen, om info te krijgen over een enkel object.</p>",
"nothingFound": "Sorry, ik kon niets vinden voor <code>{search}</code>, dus kan ik {layerTitle} niet zoeken",
"overview": "Ik heb {length} overeenkomende items gevonden.",
"searching": "Aan het zoeken naar {layerTitle} {mode} <code>{search}</code>..."
"searching": "Aan het zoeken naar {layerTitle} {mode} <code>{search}</code>"
},
"shutdown": {
"argmode": "Geeft aan op welke manier ik moet afsluiten. Dit moet één van de volgende woorden zijn: {verbs}",
@ -586,7 +589,7 @@
"verbupdate": "Probeert om de MapComplete-codebasis up te daten, sluit erna af"
},
"tags": {
"announceSearch": "<code>{id}</code> is geen OpenStreetMap-ID - ik ben wereldwijd aan het zoeken naar {search}...",
"announceSearch": "<code>{id}</code> is geen OpenStreetMap-ID - ik ben wereldwijd aan het zoeken naar {search}",
"argsearch": "De ID van het OSM-object of een zoekopdracht",
"docs": "Toont de attributen van een OSM-object. Geef een ID of een zoekstring.",
"noSearchGiven": "Geleive een zoekterm of een ID mee te geven om dit commando te gebruiken",

View file

@ -1 +0,0 @@
{}

View file

@ -737,6 +737,15 @@
"shortDescription": "Öffentlich zugängliche Türme zum Genießen der Aussicht",
"title": "Aussichtstürme"
},
"onwheels": {
"overrideAll": {
"+tagRenderings": {
"0": {
"render": "Diese Tür hat eine Durchgangsbreite von {canonical(_poi_entrance:width)} Meter"
}
}
}
},
"openwindpowermap": {
"description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen.",
"title": "Freie Windenergie-Karte"

View file

@ -747,6 +747,18 @@
},
"onwheels": {
"description": "On this map, publicly weelchair accessible places are shown and can be easily added",
"overrideAll": {
"+tagRenderings": {
"0": {
"mappings": {
"0": {
"then": "This entrance has no width information"
}
},
"render": "This door has a width of {canonical(_poi_entrance:width)} meter"
}
}
},
"title": "OnWheels"
},
"openwindpowermap": {
@ -978,6 +990,10 @@
"shortDescription": "Map all the trees",
"title": "Trees"
},
"walls_and_buildings": {
"description": "Special builtin layer providing all walls and buildings. This layer is useful in presets for objects which can be placed against walls (e.g. AEDs, postboxes, entrances, addresses, surveillance cameras, …). This layer is invisible by default and not toggleable by the user.",
"title": "Walls and buildings"
},
"waste": {
"description": "Map showing waste baskets and recycling facilities.",
"title": "Waste"

View file

@ -517,6 +517,15 @@
"shortDescription": "Torres accesibles públicamente para disfrutar de la vista",
"title": "Torres de observación"
},
"onwheels": {
"overrideAll": {
"+tagRenderings": {
"0": {
"render": "Esta puerta tiene una ancho de {canonical(_poi_entrance:width)} metros"
}
}
}
},
"openwindpowermap": {
"description": "Un para mostrar y editar turbinas de viento"
},

View file

@ -34,142 +34,6 @@
"description": "Een boekenruilkast is een kastje waar iedereen een boek kan nemen of achterlaten. Op deze kaart kan je deze boekenruilkasten terugvinden en met een gratis OpenStreetMap-account, ook boekenruilkasten toevoegen of informatie verbeteren",
"title": "Open boekenruilkasten-kaart"
},
"buurtnatuur": {
"description": "<img style='float:right;margin: 1em;width: 10em;height: auto;' src='./assets/themes/buurtnatuur/groen_logo.svg' alt='logo-groen' class='logo/> <br /><b>Natuur maakt gelukkig.</b> Aan de hand van deze website willen we de natuur dicht bij ons beter inventariseren. Met als doel meer mensen te laten genieten van toegankelijke natuur én te strijden voor meer natuur in onze buurten.<ul><li>In welke natuurgebieden kan jij terecht? Hoe toegankelijk zijn ze?</li><li>In welke bossen kan een gezin in jouw gemeente opnieuw op adem komen?</li><li>Op welke onbekende plekjes is het zalig spelen?</li></ul><p>Samen kleuren we heel Vlaanderen en Brussel groen.Blijf op de hoogte van de resultaten van buurtnatuur.be: <a href='https://www.groen.be/buurtnatuur' target='_blank'>meld je aan voor e-mailupdates</a>.",
"descriptionTail": "<h4>Tips</h4><ul><li>Over groen ingekleurde gebieden weten we alles wat we willen weten.</li><li>Bij rood ingekleurde gebieden ontbreekt nog heel wat info: klik een gebied aan en beantwoord de vragen.</li><li>Je kan altijd een vraag overslaan als je het antwoord niet weet of niet zeker bent</li><li>Je kan altijd een foto toevoegen</li><li>Je kan ook zelf een gebied toevoegen door op de kaart te klikken</li><li>Open buurtnatuur.be <b>op je smartphone</b> om al wandelend foto's te maken en vragen te beantwoorden</li></ul><small><p>De oorspronkelijke data komt van <b>OpenStreetMap</b> en je antwoorden worden daar bewaard.<br/> Omdat iedereen vrij kan meewerken aan dit project, kunnen we niet garanderen dat er geen fouten opduiken.Kan je hier niet aanpassen wat je wilt, dan kan je dat zelf via OpenStreetMap.org doen. Groen kan <b>geen enkele verantwoordelijkheid</b> nemen over de kaart.</p>Je privacy is belangrijk. We tellen wel hoeveel gebruikers deze website bezoeken. We plaatsen een cookie waar geen persoonlijke informatie in bewaard wordt. Als je inlogt, komt er een tweede cookie bij met je inloggegevens.</small>",
"layers": {
"0": {
"description": "Een natuurgebied is een gebied waar actief ruimte gemaakt word voor de natuur. Typisch zijn deze in beheer van Natuurpunt of het Agentschap Natuur en Bos of zijn deze erkend door de overheid.",
"name": "Natuurgebied",
"presets": {
"0": {
"description": "Voeg een ontbrekend, erkend natuurreservaat toe, bv. een gebied dat beheerd wordt door het ANB of natuurpunt",
"title": "een natuurreservaat"
}
},
"title": {
"mappings": {
"0": {
"then": "{name:nl}"
},
"1": {
"then": "{name}"
}
},
"render": "Natuurgebied"
}
},
"1": {
"description": "Een park is een publiek toegankelijke, groene ruimte binnen de stad. Ze is typisch ingericht voor recreatief gebruik, met (verharde) wandelpaden, zitbanken, vuilnisbakken, een gezellig vijvertje, ...",
"name": "Park",
"presets": {
"0": {
"description": "Voeg een ontbrekend park toe",
"title": "een park"
}
},
"title": {
"mappings": {
"0": {
"then": "{name:nl}"
},
"1": {
"then": "{name}"
}
},
"render": "Park"
}
},
"2": {
"description": "Een bos is een verzameling bomen, al dan niet als productiehout.",
"name": "Bos",
"presets": {
"0": {
"description": "Voeg een ontbrekend bos toe aan de kaart",
"title": "een bos"
}
},
"title": {
"mappings": {
"0": {
"then": "{name:nl}"
},
"1": {
"then": "{name}"
}
},
"render": "Bos"
}
}
},
"overrideAll": {
"tagRenderings+": {
"0": {
"mappings": {
"0": {
"then": "Dit gebied is vrij toegankelijk"
},
"1": {
"then": "Vrij toegankelijk"
},
"2": {
"then": "Niet toegankelijk"
},
"3": {
"then": "Niet toegankelijk, want privégebied"
},
"4": {
"then": "Toegankelijk, ondanks dat het privegebied is"
},
"5": {
"then": "Enkel toegankelijk met een gids of tijdens een activiteit"
},
"6": {
"then": "Toegankelijk mits betaling"
}
},
"question": "Is dit gebied toegankelijk?",
"render": "De toegankelijkheid van dit gebied is: {access:description}"
},
"1": {
"mappings": {
"1": {
"then": "Dit gebied wordt beheerd door Natuurpunt"
},
"2": {
"then": "Dit gebied wordt beheerd door {operator}"
},
"3": {
"then": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos"
}
},
"question": "Wie beheert dit gebied?",
"render": "Beheer door {operator}"
},
"2": {
"render": "Extra info: <i>{description}</i>"
},
"3": {
"render": "Extra info via buurtnatuur.be: <i>{description:0}</i>"
},
"4": {
"question": "Wat is de Nederlandstalige naam van dit gebied?",
"render": "Dit gebied heet {name:nl}"
},
"5": {
"mappings": {
"0": {
"then": "Dit gebied heeft geen naam"
}
},
"question": "Wat is de naam van dit gebied?",
"render": "Dit gebied heet {name}"
}
}
},
"shortDescription": "Met deze tool kan je natuur in je buurt in kaart brengen en meer informatie geven over je favoriete plekje",
"title": "Breng jouw buurtnatuur in kaart"
},
"cafes_and_pubs": {
"description": "Cafés, kroegen en drinkgelegenheden",
"title": "Cafés"
@ -1011,6 +875,15 @@
"shortDescription": "Publieke uitkijktorens om van het panorama te genieten",
"title": "Uitkijktorens"
},
"onwheels": {
"overrideAll": {
"+tagRenderings": {
"0": {
"render": "Deze deur heeft een breedte van {canonical(_poi_entrance:width)} meter"
}
}
}
},
"openwindpowermap": {
"description": "Een kaart om windturbines te tonen en te bewerken.",
"title": "Windmolens"

View file

@ -38,7 +38,7 @@
"optimize-images": "cd assets/generated/ && find -name '*.png' -exec optipng '{}' \\; && echo 'PNGs are optimized'",
"generate:graphs": "ts-node Docs/Tools/GenerateSeries.ts",
"reset:layeroverview": "echo {\\\"layers\\\":[], \\\"themes\\\":[]} > ./assets/generated/known_layers_and_themes.json && echo {\\\"layers\\\": []} > ./assets/generated/known_layers.json && rm -f ./assets/generated/layers/*.json && rm -f ./assets/generated/themes/*.json && npm run generate:layeroverview && ts-node scripts/generateLayerOverview.ts --force",
"generate": "mkdir -p ./assets/generated; npm run reset:layeroverview; npm run generate:images; npm run generate:charging-stations; npm run generate:translations; npm run generate:licenses; npm run generate:layeroverview; npm run generate:service-worker",
"generate": "mkdir -p ./assets/generated; npm run generate:licenses; npm run generate:images; npm run generate:charging-stations; npm run generate:translations; npm run reset:layeroverview; npm run generate:service-worker",
"generate:charging-stations": "cd ./assets/layers/charging_station && ts-node csvToJson.ts && cd -",
"prepare-deploy": "npm run generate:service-worker && ./scripts/build.sh",
"gittag": "ts-node scripts/printVersion.ts | bash",

View file

@ -11,9 +11,8 @@ mkdir dist/assets 2> /dev/null
# This script ends every line with '&&' to chain everything. A failure will thus stop the build
npm run generate:editor-layer-index &&
npm run reset:layeroverview
npm run generate &&
npm run generate:layeroverview --force && # generate:layeroverview has to be run twice: the personal theme won't pick up all the layers otherwise; first time happens in 'npm run generate'
npm run generate:translations &&
npm run test &&
npm run generate:layouts

View file

@ -1,5 +1,5 @@
import * as fs from "fs";
import {readFileSync, writeFileSync} from "fs";
import {existsSync, mkdirSync, readFileSync, writeFileSync} from "fs";
import {Utils} from "../Utils";
import ScriptUtils from "./ScriptUtils";
@ -55,7 +55,7 @@ class TranslationPart {
}
const v = translations[translationsKey]
if (typeof (v) != "string") {
console.error(`Non-string object at ${context} in translation while trying to add more translations to '` + translationsKey + "': ", v)
console.error(`Non-string object at ${context} in translation while trying to add more translations to '` + translationsKey + "'. The offending object which _should_ be a translation is: ", v,"\n\nThe current object is:", this.toJson("en"))
throw "Error in an object depicting a translation: a non-string object was found. (" + context + ")\n You probably put some other section accidentally in the translation"
}
this.contents.set(translationsKey, v)
@ -101,7 +101,7 @@ class TranslationPart {
continue
}
if (v["id"] !== undefined && context.endsWith("tagRenderings")) {
if (v["id"] !== undefined && context.endsWith(".tagRenderings")) {
// We use the embedded id as key instead of the index as this is more stable
// Note: indonesian is shortened as 'id' as well!
if (v["en"] !== undefined || v["nl"] !== undefined) {
@ -591,7 +591,9 @@ function mergeThemeTranslations() {
}
}
if(!existsSync("./langs/themes")){
mkdirSync("./langs/themes")
}
const themeOverwritesWeblate = process.argv[2] === "--ignore-weblate"
const questionsPath = "assets/tagRenderings/questions.json"
const questionsParsed = JSON.parse(readFileSync(questionsPath, 'utf8'))