Merge master

This commit is contained in:
pietervdvn 2022-06-22 20:06:41 +02:00
commit 98c6113cbe
87 changed files with 3860 additions and 412 deletions

View file

@ -39,6 +39,8 @@
+ [export_as_geojson](#export_as_geojson) + [export_as_geojson](#export_as_geojson)
+ [minimap](#minimap) + [minimap](#minimap)
+ [wikipedia](#wikipedia) + [wikipedia](#wikipedia)
+ [school.capacity](#schoolcapacity)
+ [school.gender](#schoolgender)
@ -128,10 +130,13 @@
- climbing_gym - climbing_gym
- food - food
- hackerspace - hackerspace
- kindergarten_childcare
- nature_reserve - nature_reserve
- observation_tower - observation_tower
- playground - playground
- recycling - recycling
- school
- tertiary_education
- veterinary - veterinary
@ -151,7 +156,10 @@
- climbing_gym - climbing_gym
- food - food
- hackerspace - hackerspace
- kindergarten_childcare
- recycling - recycling
- school
- tertiary_education
- veterinary - veterinary
@ -171,7 +179,10 @@
- climbing_gym - climbing_gym
- food - food
- hackerspace - hackerspace
- kindergarten_childcare
- recycling - recycling
- school
- tertiary_education
@ -190,6 +201,7 @@
- climbing_club - climbing_club
- climbing_gym - climbing_gym
- food - food
- kindergarten_childcare
- veterinary - veterinary
@ -494,6 +506,28 @@
- nature_reserve - nature_reserve
- observation_tower - observation_tower
### school.capacity
- tertiary_education
### school.gender
- tertiary_education
This document is autogenerated from [assets/layers/*.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/*.json) This document is autogenerated from [assets/layers/*.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/*.json)

View file

@ -817,6 +817,7 @@ The following layers are included in MapComplete:
- [hydrant](./Layers/hydrant.md) - [hydrant](./Layers/hydrant.md)
- [import_candidate](./Layers/import_candidate.md) - [import_candidate](./Layers/import_candidate.md)
- [information_board](./Layers/information_board.md) - [information_board](./Layers/information_board.md)
- [kindergarten_childcare](./Layers/kindergarten_childcare.md)
- [left_right_style](./Layers/left_right_style.md) - [left_right_style](./Layers/left_right_style.md)
- [map](./Layers/map.md) - [map](./Layers/map.md)
- [matchpoint](./Layers/matchpoint.md) - [matchpoint](./Layers/matchpoint.md)
@ -831,12 +832,14 @@ The following layers are included in MapComplete:
- [playground](./Layers/playground.md) - [playground](./Layers/playground.md)
- [public_bookcase](./Layers/public_bookcase.md) - [public_bookcase](./Layers/public_bookcase.md)
- [recycling](./Layers/recycling.md) - [recycling](./Layers/recycling.md)
- [school](./Layers/school.md)
- [shops](./Layers/shops.md) - [shops](./Layers/shops.md)
- [slow_roads](./Layers/slow_roads.md) - [slow_roads](./Layers/slow_roads.md)
- [split_point](./Layers/split_point.md) - [split_point](./Layers/split_point.md)
- [sport_pitch](./Layers/sport_pitch.md) - [sport_pitch](./Layers/sport_pitch.md)
- [street_lamps](./Layers/street_lamps.md) - [street_lamps](./Layers/street_lamps.md)
- [surveillance_camera](./Layers/surveillance_camera.md) - [surveillance_camera](./Layers/surveillance_camera.md)
- [tertiary_education](./Layers/tertiary_education.md)
- [toilet](./Layers/toilet.md) - [toilet](./Layers/toilet.md)
- [trail](./Layers/trail.md) - [trail](./Layers/trail.md)
- [tree_node](./Layers/tree_node.md) - [tree_node](./Layers/tree_node.md)

View file

@ -23,6 +23,7 @@
+ [_geometry:type](#_geometrytype) + [_geometry:type](#_geometrytype)
+ [distanceTo](#distanceto) + [distanceTo](#distanceto)
+ [overlapWith](#overlapwith) + [overlapWith](#overlapwith)
+ [enclosingFeatures](#enclosingfeatures)
+ [intersectionsWith](#intersectionswith) + [intersectionsWith](#intersectionswith)
+ [closest](#closest) + [closest](#closest)
+ [closestn](#closestn) + [closestn](#closestn)
@ -33,7 +34,7 @@
Metatags are extra tags available, in order to display more data or to give better questions. Metatags are extra tags available, in order to display more data or to give better questions.
The are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an overview of the available metatags. They are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an overview of the available metatags.
**Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a box in the popup for features which shows all the properties of the object **Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a box in the popup for features which shows all the properties of the object
@ -218,6 +219,7 @@ Some advanced functions are available on **feat** as well:
- [distanceTo](#distanceTo) - [distanceTo](#distanceTo)
- [overlapWith](#overlapWith) - [overlapWith](#overlapWith)
- [enclosingFeatures](#enclosingFeatures)
- [intersectionsWith](#intersectionsWith) - [intersectionsWith](#intersectionsWith)
- [closest](#closest) - [closest](#closest)
- [closestn](#closestn) - [closestn](#closestn)
@ -235,12 +237,25 @@ Some advanced functions are available on **feat** as well:
### overlapWith ### overlapWith
Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well.If the current feature is a point, all features that this point is embeded in are given. Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well.
If the current feature is a point, all features that this point is embeded in are given.
The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point. The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point.
The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list.
For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')` For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`
Also see [enclosingFeatures](#enclosingFeatures) which can be used to get all objects which fully contain this feature
0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)
### enclosingFeatures
Gives a list of all features in the specified layers which fully contain this object. Returned features will always be (multi)polygons. (LineStrings and Points from the other layers are ignored)
The result is a list of features: `{feat: Polygon}[]`
This function will never return the feature itself.
0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap) 0. ...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)

View file

@ -66,10 +66,10 @@ 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/barrier#values) [barrier](https://wiki.openstreetmap.org/wiki/Key:barrier) | Multiple choice | [bollard](https://wiki.openstreetmap.org/wiki/Tag:barrier%3Dbollard) [cycle_barrier](https://wiki.openstreetmap.org/wiki/Tag:barrier%3Dcycle_barrier) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/barrier#values) [barrier](https://wiki.openstreetmap.org/wiki/Key:barrier) | Multiple choice | [bollard](https://wiki.openstreetmap.org/wiki/Tag:barrier%3Dbollard) [cycle_barrier](https://wiki.openstreetmap.org/wiki/Tag:barrier%3Dcycle_barrier)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/bollard#values) [bollard](https://wiki.openstreetmap.org/wiki/Key:bollard) | Multiple choice | [removable](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dremovable) [fixed](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dfixed) [foldable](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dfoldable) [flexible](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dflexible) [rising](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Drising) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/bollard#values) [bollard](https://wiki.openstreetmap.org/wiki/Key:bollard) | Multiple choice | [removable](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dremovable) [fixed](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dfixed) [foldable](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dfoldable) [flexible](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Dflexible) [rising](https://wiki.openstreetmap.org/wiki/Tag:bollard%3Drising)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycle_barrier#values) [cycle_barrier](https://wiki.openstreetmap.org/wiki/Key:cycle_barrier) | Multiple choice | [single](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dsingle) [double](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Ddouble) [triple](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dtriple) [squeeze](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dsqueeze) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycle_barrier#values) [cycle_barrier](https://wiki.openstreetmap.org/wiki/Key:cycle_barrier) | Multiple choice | [single](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dsingle) [double](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Ddouble) [triple](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dtriple) [squeeze](https://wiki.openstreetmap.org/wiki/Tag:cycle_barrier%3Dsqueeze)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/maxwidth:physical#values) [maxwidth:physical](https://wiki.openstreetmap.org/wiki/Key:maxwidth:physical) | [length](../SpecialInputElements.md#length) | [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/maxwidth:physical#values) [maxwidth:physical](https://wiki.openstreetmap.org/wiki/Key:maxwidth:physical) | [distance](../SpecialInputElements.md#distance) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/width:separation#values) [width:separation](https://wiki.openstreetmap.org/wiki/Key:width:separation) | [length](../SpecialInputElements.md#length) | [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/width:separation#values) [width:separation](https://wiki.openstreetmap.org/wiki/Key:width:separation) | [distance](../SpecialInputElements.md#distance) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/width:opening#values) [width:opening](https://wiki.openstreetmap.org/wiki/Key:width:opening) | [length](../SpecialInputElements.md#length) | [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/width:opening#values) [width:opening](https://wiki.openstreetmap.org/wiki/Key:width:opening) | [distance](../SpecialInputElements.md#distance) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/overlap#values) [overlap](https://wiki.openstreetmap.org/wiki/Key:overlap) | [length](../SpecialInputElements.md#length) | [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/overlap#values) [overlap](https://wiki.openstreetmap.org/wiki/Key:overlap) | [distance](../SpecialInputElements.md#distance) |

View file

@ -70,10 +70,10 @@ 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/cycleway:smoothness#values) [cycleway:smoothness](https://wiki.openstreetmap.org/wiki/Key:cycleway:smoothness) | Multiple choice | [excellent](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dexcellent) [good](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dgood) [intermediate](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dintermediate) [bad](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dbad) [very_bad](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dvery_bad) [horrible](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dhorrible) [very_horrible](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dvery_horrible) [impassable](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dimpassable) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycleway:smoothness#values) [cycleway:smoothness](https://wiki.openstreetmap.org/wiki/Key:cycleway:smoothness) | Multiple choice | [excellent](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dexcellent) [good](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dgood) [intermediate](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dintermediate) [bad](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dbad) [very_bad](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dvery_bad) [horrible](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dhorrible) [very_horrible](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dvery_horrible) [impassable](https://wiki.openstreetmap.org/wiki/Tag:cycleway:smoothness%3Dimpassable)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/surface#values) [surface](https://wiki.openstreetmap.org/wiki/Key:surface) | [string](../SpecialInputElements.md#string) | [asphalt](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dasphalt) [paving_stones](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpaving_stones) [concrete](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dconcrete) [unhewn_cobblestone](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dunhewn_cobblestone) [sett](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dsett) [wood](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dwood) [gravel](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dgravel) [fine_gravel](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dfine_gravel) [pebblestone](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpebblestone) [ground](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dground) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/surface#values) [surface](https://wiki.openstreetmap.org/wiki/Key:surface) | [string](../SpecialInputElements.md#string) | [asphalt](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dasphalt) [paving_stones](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpaving_stones) [concrete](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dconcrete) [unhewn_cobblestone](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dunhewn_cobblestone) [sett](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dsett) [wood](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dwood) [gravel](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dgravel) [fine_gravel](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dfine_gravel) [pebblestone](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dpebblestone) [ground](https://wiki.openstreetmap.org/wiki/Tag:surface%3Dground)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/smoothness#values) [smoothness](https://wiki.openstreetmap.org/wiki/Key:smoothness) | Multiple choice | [excellent](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dexcellent) [good](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dgood) [intermediate](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dintermediate) [bad](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dbad) [very_bad](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dvery_bad) [horrible](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dhorrible) [very_horrible](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dvery_horrible) [impassable](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dimpassable) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/smoothness#values) [smoothness](https://wiki.openstreetmap.org/wiki/Key:smoothness) | Multiple choice | [excellent](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dexcellent) [good](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dgood) [intermediate](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dintermediate) [bad](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dbad) [very_bad](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dvery_bad) [horrible](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dhorrible) [very_horrible](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dvery_horrible) [impassable](https://wiki.openstreetmap.org/wiki/Tag:smoothness%3Dimpassable)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/width:carriageway#values) [width:carriageway](https://wiki.openstreetmap.org/wiki/Key:width:carriageway) | [length](../SpecialInputElements.md#length) | [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/width:carriageway#values) [width:carriageway](https://wiki.openstreetmap.org/wiki/Key:width:carriageway) | [distance](../SpecialInputElements.md#distance) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycleway:traffic_sign#values) [cycleway:traffic_sign](https://wiki.openstreetmap.org/wiki/Key:cycleway:traffic_sign) | Multiple choice | [BE:D7](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D7) [BE:D9](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D9) [BE:D10](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D10) [none](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3Dnone) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycleway:traffic_sign#values) [cycleway:traffic_sign](https://wiki.openstreetmap.org/wiki/Key:cycleway:traffic_sign) | Multiple choice | [BE:D7](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D7) [BE:D9](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D9) [BE:D10](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3DBE:D10) [none](https://wiki.openstreetmap.org/wiki/Tag:cycleway:traffic_sign%3Dnone)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/traffic_sign#values) [traffic_sign](https://wiki.openstreetmap.org/wiki/Key:traffic_sign) | Multiple choice | [BE:D7](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D7) [BE:D9](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D9) [BE:D10](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D10) [NL:G11](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DNL:G11) [NL:G12a](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DNL:G12a) [NL:G13](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DNL:G13) [none](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3Dnone) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/traffic_sign#values) [traffic_sign](https://wiki.openstreetmap.org/wiki/Key:traffic_sign) | Multiple choice | [BE:D7](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D7) [BE:D9](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D9) [BE:D10](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DBE:D10) [NL:G11](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DNL:G11) [NL:G12a](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DNL:G12a) [NL:G13](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3DNL:G13) [none](https://wiki.openstreetmap.org/wiki/Tag:traffic_sign%3Dnone)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycleway:buffer#values) [cycleway:buffer](https://wiki.openstreetmap.org/wiki/Key:cycleway:buffer) | [length](../SpecialInputElements.md#length) | [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycleway:buffer#values) [cycleway:buffer](https://wiki.openstreetmap.org/wiki/Key:cycleway:buffer) | [distance](../SpecialInputElements.md#distance) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycleway:separation#values) [cycleway:separation](https://wiki.openstreetmap.org/wiki/Key:cycleway:separation) | Multiple choice | [dashed_line](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Ddashed_line) [solid_line](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dsolid_line) [parking_lane](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dparking_lane) [kerb](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dkerb) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/cycleway:separation#values) [cycleway:separation](https://wiki.openstreetmap.org/wiki/Key:cycleway:separation) | Multiple choice | [dashed_line](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Ddashed_line) [solid_line](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dsolid_line) [parking_lane](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dparking_lane) [kerb](https://wiki.openstreetmap.org/wiki/Tag:cycleway:separation%3Dkerb)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/separation#values) [separation](https://wiki.openstreetmap.org/wiki/Key:separation) | Multiple choice | [dashed_line](https://wiki.openstreetmap.org/wiki/Tag:separation%3Ddashed_line) [solid_line](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dsolid_line) [parking_lane](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dparking_lane) [kerb](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dkerb) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/separation#values) [separation](https://wiki.openstreetmap.org/wiki/Key:separation) | Multiple choice | [dashed_line](https://wiki.openstreetmap.org/wiki/Tag:separation%3Ddashed_line) [solid_line](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dsolid_line) [parking_lane](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dparking_lane) [kerb](https://wiki.openstreetmap.org/wiki/Tag:separation%3Dkerb)

View file

@ -65,7 +65,7 @@ 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#values) [entrance](https://wiki.openstreetmap.org/wiki/Key:entrance) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:entrance%3D) [main](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dmain) [secondary](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dsecondary) [service](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dservice) [exit](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dexit) [entrance](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dentrance) [emergency](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Demergency) [home](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dhome) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/entrance#values) [entrance](https://wiki.openstreetmap.org/wiki/Key:entrance) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:entrance%3D) [main](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dmain) [secondary](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dsecondary) [service](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dservice) [exit](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dexit) [entrance](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dentrance) [emergency](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Demergency) [home](https://wiki.openstreetmap.org/wiki/Tag:entrance%3Dhome)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/door#values) [door](https://wiki.openstreetmap.org/wiki/Key:door) | Multiple choice | [hinged](https://wiki.openstreetmap.org/wiki/Tag:door%3Dhinged) [revolving](https://wiki.openstreetmap.org/wiki/Tag:door%3Drevolving) [sliding](https://wiki.openstreetmap.org/wiki/Tag:door%3Dsliding) [overhead](https://wiki.openstreetmap.org/wiki/Tag:door%3Doverhead) [no](https://wiki.openstreetmap.org/wiki/Tag:door%3Dno) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/door#values) [door](https://wiki.openstreetmap.org/wiki/Key:door) | Multiple choice | [hinged](https://wiki.openstreetmap.org/wiki/Tag:door%3Dhinged) [revolving](https://wiki.openstreetmap.org/wiki/Tag:door%3Drevolving) [sliding](https://wiki.openstreetmap.org/wiki/Tag:door%3Dsliding) [overhead](https://wiki.openstreetmap.org/wiki/Tag:door%3Doverhead) [no](https://wiki.openstreetmap.org/wiki/Tag:door%3Dno)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/automatic_door#values) [automatic_door](https://wiki.openstreetmap.org/wiki/Key:automatic_door) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dno) [motion](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dmotion) [floor](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dfloor) [button](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dbutton) [slowdown_button](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dslowdown_button) [continuous](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dcontinuous) [serviced_on_button_press](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dserviced_on_button_press) [serviced_on_request](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dserviced_on_request) [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/automatic_door#values) [automatic_door](https://wiki.openstreetmap.org/wiki/Key:automatic_door) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dno) [motion](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dmotion) [floor](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dfloor) [button](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dbutton) [slowdown_button](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dslowdown_button) [continuous](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dcontinuous) [serviced_on_button_press](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dserviced_on_button_press) [serviced_on_request](https://wiki.openstreetmap.org/wiki/Tag:automatic_door%3Dserviced_on_request)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/width#values) [width](https://wiki.openstreetmap.org/wiki/Key:width) | [length](../SpecialInputElements.md#length) | [<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/width#values) [width](https://wiki.openstreetmap.org/wiki/Key:width) | [distance](../SpecialInputElements.md#distance) |

View file

@ -0,0 +1,180 @@
kindergarten_childcare
========================
Shows kindergartens and preschools. Both are grouped in one layer, as they are regularly confused with each other
- This layer is shown at zoomlevel **12** and higher
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%3Dchildcare' target='_blank'>childcare</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dkindergarten' target='_blank'>kindergarten</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:isced:level:2011' target='_blank'>isced:level:2011</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:isced:level:2011%3Dearly_childhood' target='_blank'>early_childhood</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22amenity%22%3D%22childcare%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22kindergarten%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22isced%3Alevel%3A2011%22%3D%22early_childhood%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/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [kindergarten](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dkindergarten) [childcare](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dchildcare)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/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/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) |
### childcare-type
The question is What type of facility is this?
- This is a kindergarten (also known as <i>preschool</i>) where small kids receive early education. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dkindergarten' target='_blank'>kindergarten</a>
- This is a childcare facility, such as a nursery or daycare where small kids are looked after. They do not offer an education and are ofter run as private businesses corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dchildcare' target='_blank'>childcare</a>
### name
The question is What is the name of this facility?
This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name)
This is rendered with This facility is named <b>{name}</b>
### 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 When is this childcare opened?
This rendering asks information about the property [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours)
This is rendered with <h3>Opening hours</h3>{opening_hours_table(opening_hours)}
Only visible if `amenity=childcare` is shown
### capacity
The question is How much kids (at most) can be enrolled here?
This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity)
This is rendered with This facility has room for {capacity} kids
This document is autogenerated from [assets/layers/kindergarten_childcare/kindergarten_childcare.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/kindergarten_childcare/kindergarten_childcare.json)

243
Docs/Layers/school.md Normal file
View file

@ -0,0 +1,243 @@
school
========
<img src='https://mapcomplete.osm.be/circle:white;./assets/layers/school/school.svg' height="100px">
Schools giving primary and secondary education and post-secondary, non-tertiary education. Note that this level of education does not imply an age of the pupiles
- This layer is shown at zoomlevel **12** and higher
- This layer will automatically load [school](./school.md) into the layout as it depends on it: a calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _enclosing)
- This layer is needed as dependency for layer [school](#school)
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%3Dschool' target='_blank'>school</a>
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22amenity%22%3D%22school%22%5D(%7B%7Bbbox%7D%7D)%3B%0A)%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B)
Supported attributes
----------------------
Warning:
this quick overview is incomplete
attribute | type | values which are supported by this layer
----------- | ------ | ------------------------------------------
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/school#values) [school](https://wiki.openstreetmap.org/wiki/Key:school) | Multiple choice | [kindergarten](https://wiki.openstreetmap.org/wiki/Tag:school%3Dkindergarten) [primary](https://wiki.openstreetmap.org/wiki/Tag:school%3Dprimary) [secondary](https://wiki.openstreetmap.org/wiki/Tag:school%3Dsecondary) [lower_secondary](https://wiki.openstreetmap.org/wiki/Tag:school%3Dlower_secondary) [middle_secondary](https://wiki.openstreetmap.org/wiki/Tag:school%3Dmiddle_secondary) [upper_secondary](https://wiki.openstreetmap.org/wiki/Tag:school%3Dupper_secondary) [post_secondary](https://wiki.openstreetmap.org/wiki/Tag:school%3Dpost_secondary)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/school:gender#values) [school:gender](https://wiki.openstreetmap.org/wiki/Key:school:gender) | Multiple choice | [mixed](https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dmixed) [separated](https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dseparated) [male](https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dmale) [female](https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dfemale)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/school:for#values) [school:for](https://wiki.openstreetmap.org/wiki/Key:school:for) | [string](../SpecialInputElements.md#string) | [mainstream](https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dmainstream) [adults](https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dadults) [autism](https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dautism) [learning_disabilities](https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dlearning_disabilities) [blind](https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dblind) [deaf](https://wiki.openstreetmap.org/wiki/Tag:school:for%3Ddeaf) [disabilities](https://wiki.openstreetmap.org/wiki/Tag:school:for%3Ddisabilities) [special_needs](https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dspecial_needs)
[<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/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/school:language#values) [school:language](https://wiki.openstreetmap.org/wiki/Key:school:language) | [string](../SpecialInputElements.md#string) |
### school-name
The question is What is the name of this school?
This rendering asks information about the property [name](https://wiki.openstreetmap.org/wiki/Key:name)
This is rendered with This school is named {name}
### capacity
The question is How much students can at most enroll in this school?
This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity)
This is rendered with This school can enroll at most {capacity} students
### education-level-belgium
The question is What level of education is given on this school?
- This is a school with a kindergarten section where young kids receive some education which prepares reading and writing. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school' target='_blank'>school</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school%3Dkindergarten' target='_blank'>kindergarten</a>
- This is a school where one learns primary skills such as basic literacy and numerical skills. <div class='subtle'>Pupils typically enroll from 6 years old till 12 years old</div> corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school' target='_blank'>school</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school%3Dprimary' target='_blank'>primary</a>
- This is a secondary school which offers all grades corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school' target='_blank'>school</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school%3Dsecondary' target='_blank'>secondary</a>
- This is a secondary school which does <b>not</b> have all grades, but offers <b>first and second</b> grade corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school' target='_blank'>school</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school%3Dlower_secondary' target='_blank'>lower_secondary</a>
- This is a secondary school which does <b>not</b> have all grades, but offers <b>third and fourth</b> grade corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school' target='_blank'>school</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school%3Dmiddle_secondary' target='_blank'>middle_secondary</a>
- This is a secondary school which does <b>not</b> have all grades, but offers <b>fifth and sixth</b> grade corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school' target='_blank'>school</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school%3Dupper_secondary' target='_blank'>upper_secondary</a>
- This schools offers post-secondary education (e.g. a seventh or eight specialisation year) corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school' target='_blank'>school</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school%3Dpost_secondary' target='_blank'>post_secondary</a>
Only visible if `_country=be` is shown
### gender
The question is Which genders can enroll at this school?
- Both boys and girls can enroll here and have classes together corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:gender' target='_blank'>school:gender</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dmixed' target='_blank'>mixed</a>
- Both boys and girls can enroll here but they are separated (e.g. they have lessons in different classrooms or at different times) corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:gender' target='_blank'>school:gender</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dseparated' target='_blank'>separated</a>
- This is a boys only-school corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:gender' target='_blank'>school:gender</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dmale' target='_blank'>male</a>
- This is a girls-only school corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:gender' target='_blank'>school:gender</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dfemale' target='_blank'>female</a>
### target-audience
The question is Does this school target students with a special need? Which structural facilities does this school have?<div class='subtle'>Ad-hoc
This rendering asks information about the property [school:for](https://wiki.openstreetmap.org/wiki/Key:school:for)
This is rendered with This school has facilities for students with {school:for}
- This is a school where students study skills at their age-adequate level. <div>There are little or no special facilities to cater for students with special needs or facilities are ad-hoc</div> corresponds with
- This option cannot be chosen as answer
- This is a school for students without special needs<div class='subtle'>This includes students who can follow the courses with small, ad hoc measurements</div> corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:for' target='_blank'>school:for</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dmainstream' target='_blank'>mainstream</a>
- This is a school where adults are taught skills on the level as specified. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:for' target='_blank'>school:for</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dadults' target='_blank'>adults</a>
- This is a school for students with autism corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:for' target='_blank'>school:for</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dautism' target='_blank'>autism</a>
- This is a school for students with learning disabilities corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:for' target='_blank'>school:for</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dlearning_disabilities' target='_blank'>learning_disabilities</a>
- This is a school for blind students or students with sight impairments corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:for' target='_blank'>school:for</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dblind' target='_blank'>blind</a>
- This is a school for deaf students or students with hearing impairments corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:for' target='_blank'>school:for</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:for%3Ddeaf' target='_blank'>deaf</a>
- This is a school for students with disabilities corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:for' target='_blank'>school:for</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:for%3Ddisabilities' target='_blank'>disabilities</a>
- This is a school for students with special needs corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:for' target='_blank'>school:for</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:for%3Dspecial_needs' target='_blank'>special_needs</a>
Only visible if `school:for~^..*$` 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
### phone
The question is What is the phone number of {title()}?
This rendering asks information about the property [phone](https://wiki.openstreetmap.org/wiki/Key:phone)
This is rendered with <a href='tel:{phone}'>{phone}</a>
- <a href='tel:{contact:phone}'>{contact:phone}</a> corresponds with contact:phone~^..*$
- This option cannot be chosen as answer
### email
The question is What is the email address of {title()}?
This rendering asks information about the property [email](https://wiki.openstreetmap.org/wiki/Key:email)
This is rendered with <a href='mailto:{email}' target='_blank'>{email}</a>
- <a href='mailto:{contact:email}' target='_blank'>{contact:email}</a> corresponds with contact:email~^..*$
- This option cannot be chosen as answer
### language
The question is What is the main language of this school?<div class='subtle'>What language is spoken with the students in non-language related courses and with the administration?</div>
This rendering asks information about the property [school:language](https://wiki.openstreetmap.org/wiki/Key:school:language)
This is rendered with {school:language} is the main language of {title()}
- The main language of this school is unknown corresponds with
- This option cannot be chosen as answer
This document is autogenerated from [assets/layers/school/school.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/school/school.json)

View file

@ -0,0 +1,187 @@
tertiary_education
====================
<img src='https://mapcomplete.osm.be/circle:white;./assets/layers/school/college.svg' height="100px">
Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8)
- This layer is shown at zoomlevel **0** and higher
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%3Dcollege' target='_blank'>college</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Duniversity' target='_blank'>university</a>|<a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dschool' target='_blank'>school</a>&isced:2011:level~^.*bachelor.*$|isced:2011:level~^.*master.*$
[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B(%20%20%20%20nwr%5B%22amenity%22%3D%22college%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22university%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22school%22%5D%5B%22isced%3A2011%3Alevel%22~%22%5E.*bachelor.*%24%22%5D(%7B%7Bbbox%7D%7D)%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22school%22%5D%5B%22isced%3A2011%3Alevel%22~%22%5E.*master.*%24%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/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [college](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dcollege) [university](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Duniversity)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/isced:2011:level#values) [isced:2011:level](https://wiki.openstreetmap.org/wiki/Key:isced:2011:level) | Multiple choice | [bachelor](https://wiki.openstreetmap.org/wiki/Tag:isced:2011:level%3Dbachelor) [master](https://wiki.openstreetmap.org/wiki/Tag:isced:2011:level%3Dmaster) [doctorate](https://wiki.openstreetmap.org/wiki/Tag:isced:2011:level%3Ddoctorate)
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) |
[<img src='https://mapcomplete.osm.be/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/school:gender#values) [school:gender](https://wiki.openstreetmap.org/wiki/Key:school:gender) | Multiple choice | [mixed](https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dmixed) [separated](https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dseparated) [male](https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dmale) [female](https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dfemale)
[<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) |
### institution-kind
The question is What kind of institution is this?
- This is an institution of post-secondary, non-tertiary education. One has to have completed secondary education to enroll here, but no bachelor (or higher) degrees are awarded here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dcollege' target='_blank'>college</a>
- This is a university, an institution of tertiary education where bachelor degrees or higher are awarded. corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:amenity' target='_blank'>amenity</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:amenity%3Duniversity' target='_blank'>university</a>
### isced
The question is What level of education is given here?
- Bachelor degrees are awarded here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:isced:2011:level' target='_blank'>isced:2011:level</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:isced:2011:level%3Dbachelor' target='_blank'>bachelor</a>
- Master degrees are awarded here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:isced:2011:level' target='_blank'>isced:2011:level</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:isced:2011:level%3Dmaster' target='_blank'>master</a>
- Doctorate degrees are awarded here corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:isced:2011:level' target='_blank'>isced:2011:level</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:isced:2011:level%3Ddoctorate' target='_blank'>doctorate</a>
Only visible if `amenity=university` is shown
### capacity
The question is How much students can at most enroll in this school?
This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity)
This is rendered with This school can enroll at most {capacity} students
### gender
The question is Which genders can enroll at this school?
- Both boys and girls can enroll here and have classes together corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:gender' target='_blank'>school:gender</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dmixed' target='_blank'>mixed</a>
- Both boys and girls can enroll here but they are separated (e.g. they have lessons in different classrooms or at different times) corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:gender' target='_blank'>school:gender</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dseparated' target='_blank'>separated</a>
- This is a boys only-school corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:gender' target='_blank'>school:gender</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dmale' target='_blank'>male</a>
- This is a girls-only school corresponds with <a href='https://wiki.openstreetmap.org/wiki/Key:school:gender' target='_blank'>school:gender</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:school:gender%3Dfemale' target='_blank'>female</a>
### 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
This document is autogenerated from [assets/layers/tertiary_education/tertiary_education.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/tertiary_education/tertiary_education.json)

View file

@ -261,14 +261,21 @@ If you have your JSON file, there are three ways to distribute your theme:
### Getting your theme included into the official mapcomplete ### Getting your theme included into the official mapcomplete
Did you make an awesome theme that you want to share with the OpenStreetMap community? Have it included in the main Did you make an awesome theme that you want to share with the OpenStreetMap community? Have it included in the main
application, which makes it more discoverable. application. This makes sure that:
Your theme has to be: - Your theme will be discovered by more people
- It will be included in the translation program
- Metadata will be generated (such as links with TagInfo or layer documentation)
- Maintanence is included
- Parts of your theme might be reused by others
0) Make sure the theme has an English version. This makes it easier for me to understand what is going on. The more The following conditions must be met:
0) The theme must be relevant for a global audience
1) There must be an English translation. This makes it easier for me to understand what is going on and is needed for the translators. The more
other languages, the better of course! other languages, the better of course!
1) Make sure your theme has good tagging 2) Make sure your theme has good tagging - i.e. a wiki page must exist for the used tags
3) Make sure there are somewhat decent icons. Note that there is _no_ styleguide at the moment though. 3) Make sure there are somewhat decent icons. Note that there is _no_ styleguide at the moment though. Icons must be included and have license info in the corresponding `license_info.json`-files. (Run `npm run query:licenses` to build those)
The preferred way to add your theme is via a Pull Request. A Pull Request is less work for the maintainer (which makes The preferred way to add your theme is via a Pull Request. A Pull Request is less work for the maintainer (which makes
it really easy for me to add it) and your name will be included in the git history (so you'll be listed as it really easy for me to add it) and your name will be included in the git history (so you'll be listed as

View file

@ -13,7 +13,7 @@
+ [date](#date) + [date](#date)
+ [nat](#nat) + [nat](#nat)
+ [int](#int) + [int](#int)
+ [length](#length) + [distance](#distance)
+ [direction](#direction) + [direction](#direction)
+ [wikidata](#wikidata) + [wikidata](#wikidata)
+ [pnat](#pnat) + [pnat](#pnat)
@ -71,11 +71,11 @@ A number
### length ### distance
A geographical length in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `["21", "map,photo"] A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `["21", "map,photo"]

View file

@ -0,0 +1,321 @@
{
"data_format": 1,
"project": {
"name": "MapComplete Education",
"description": "On this map, you'll find information about all types of schools and eduction and can easily add more information",
"project_url": "https://mapcomplete.osm.be/education",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/layers/school/college.svg",
"contact_name": "Pieter Vander Vennet, MapComplete",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "amenity",
"description": "The MapComplete theme Education has a layer Colleges and universities showing features with this tag",
"value": "college"
},
{
"key": "amenity",
"description": "The MapComplete theme Education has a layer Colleges and universities showing features with this tag",
"value": "university"
},
{
"key": "amenity",
"description": "The MapComplete theme Education has a layer Colleges and universities showing features with this tag",
"value": "school"
},
{
"key": "isced:2011:level",
"description": "The MapComplete theme Education has a layer Colleges and universities showing features with this tag"
},
{
"key": "isced:2011:level",
"description": "The MapComplete theme Education has a layer Colleges and universities showing features with this tag"
},
{
"key": "amenity",
"description": "Layer 'Colleges and universities' shows amenity=college with a fixed text, namely 'This is an institution of post-secondary, non-tertiary education. One has to have completed secondary education to enroll here, but no bachelor (or higher) degrees are awarded here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "college"
},
{
"key": "amenity",
"description": "Layer 'Colleges and universities' shows amenity=university with a fixed text, namely 'This is a university, an institution of tertiary education where bachelor degrees or higher are awarded.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "university"
},
{
"key": "isced:2011:level",
"description": "Layer 'Colleges and universities' shows isced:2011:level=bachelor with a fixed text, namely 'Bachelor degrees are awarded here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "bachelor"
},
{
"key": "isced:2011:level",
"description": "Layer 'Colleges and universities' shows isced:2011:level=master with a fixed text, namely 'Master degrees are awarded here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "master"
},
{
"key": "isced:2011:level",
"description": "Layer 'Colleges and universities' shows isced:2011:level=doctorate with a fixed text, namely 'Doctorate degrees are awarded here' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "doctorate"
},
{
"key": "capacity",
"description": "Layer 'Colleges and universities' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "school:gender",
"description": "Layer 'Colleges and universities' shows school:gender=mixed with a fixed text, namely 'Both boys and girls can enroll here and have classes together' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "mixed"
},
{
"key": "school:gender",
"description": "Layer 'Colleges and universities' shows school:gender=separated with a fixed text, namely 'Both boys and girls can enroll here but they are separated (e.g. they have lessons in different classrooms or at different times)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "separated"
},
{
"key": "school:gender",
"description": "Layer 'Colleges and universities' shows school:gender=male with a fixed text, namely 'This is a boys only-school' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "male"
},
{
"key": "school:gender",
"description": "Layer 'Colleges and universities' shows school:gender=female with a fixed text, namely 'This is a girls-only school' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "female"
},
{
"key": "website",
"description": "Layer 'Colleges and universities' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:website",
"description": "Layer 'Colleges and universities' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "email",
"description": "Layer 'Colleges and universities' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:email",
"description": "Layer 'Colleges and universities' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "phone",
"description": "Layer 'Colleges and universities' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:phone",
"description": "Layer 'Colleges and universities' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "amenity",
"description": "The MapComplete theme Education has a layer Primary and secondary schools showing features with this tag",
"value": "school"
},
{
"key": "name",
"description": "Layer 'Primary and secondary schools' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "capacity",
"description": "Layer 'Primary and secondary schools' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "school",
"description": "Layer 'Primary and secondary schools' shows school=kindergarten with a fixed text, namely 'This is a school with a kindergarten section where young kids receive some education which prepares reading and writing.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "kindergarten"
},
{
"key": "school",
"description": "Layer 'Primary and secondary schools' shows school=primary with a fixed text, namely 'This is a school where one learns primary skills such as basic literacy and numerical skills. <div class='subtle'>Pupils typically enroll from 6 years old till 12 years old</div>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "primary"
},
{
"key": "school",
"description": "Layer 'Primary and secondary schools' shows school=secondary with a fixed text, namely 'This is a secondary school which offers all grades' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "secondary"
},
{
"key": "school",
"description": "Layer 'Primary and secondary schools' shows school=lower_secondary with a fixed text, namely 'This is a secondary school which does <b>not</b> have all grades, but offers <b>first and second</b> grade' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "lower_secondary"
},
{
"key": "school",
"description": "Layer 'Primary and secondary schools' shows school=middle_secondary with a fixed text, namely 'This is a secondary school which does <b>not</b> have all grades, but offers <b>third and fourth</b> grade' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "middle_secondary"
},
{
"key": "school",
"description": "Layer 'Primary and secondary schools' shows school=upper_secondary with a fixed text, namely 'This is a secondary school which does <b>not</b> have all grades, but offers <b>fifth and sixth</b> grade' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "upper_secondary"
},
{
"key": "school",
"description": "Layer 'Primary and secondary schools' shows school=post_secondary with a fixed text, namely 'This schools offers post-secondary education (e.g. a seventh or eight specialisation year)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "post_secondary"
},
{
"key": "school:gender",
"description": "Layer 'Primary and secondary schools' shows school:gender=mixed with a fixed text, namely 'Both boys and girls can enroll here and have classes together' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "mixed"
},
{
"key": "school:gender",
"description": "Layer 'Primary and secondary schools' shows school:gender=separated with a fixed text, namely 'Both boys and girls can enroll here but they are separated (e.g. they have lessons in different classrooms or at different times)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "separated"
},
{
"key": "school:gender",
"description": "Layer 'Primary and secondary schools' shows school:gender=male with a fixed text, namely 'This is a boys only-school' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "male"
},
{
"key": "school:gender",
"description": "Layer 'Primary and secondary schools' shows school:gender=female with a fixed text, namely 'This is a girls-only school' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "female"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows and asks freeform values for key 'school:for' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows with a fixed text, namely 'This is a school where students study skills at their age-adequate level. <div>There are little or no special facilities to cater for students with special needs or facilities are ad-hoc</div>' (in the MapComplete.osm.be theme 'Education') Picking this answer will delete the key school:for.",
"value": ""
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows school:for=mainstream with a fixed text, namely 'This is a school where students study skills at their age-adequate level.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "mainstream"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows school:for=adults with a fixed text, namely 'This is a school where adults are taught skills on the level as specified.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "adults"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows school:for=autism with a fixed text, namely 'This is a school with facilities for students on the autism specturm' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "autism"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows school:for=learning_disabilities with a fixed text, namely 'This is a school with facilities for students with learning disabilities' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "learning_disabilities"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows school:for=blind with a fixed text, namely 'This is a school with facilities for blind students or students with sight impairments' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "blind"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows school:for=deaf with a fixed text, namely 'This is a school with facilities for deaf students or students with hearing impairments' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "deaf"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows school:for=disabilities with a fixed text, namely 'This is a school with facilities for students with disabilities' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "disabilities"
},
{
"key": "school:for",
"description": "Layer 'Primary and secondary schools' shows school:for=special_needs with a fixed text, namely 'This is a school with facilities for students with special needs' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "special_needs"
},
{
"key": "website",
"description": "Layer 'Primary and secondary schools' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:website",
"description": "Layer 'Primary and secondary schools' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "phone",
"description": "Layer 'Primary and secondary schools' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:phone",
"description": "Layer 'Primary and secondary schools' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "email",
"description": "Layer 'Primary and secondary schools' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:email",
"description": "Layer 'Primary and secondary schools' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "school:language",
"description": "Layer 'Primary and secondary schools' shows and asks freeform values for key 'school:language' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "school:language",
"description": "Layer 'Primary and secondary schools' shows with a fixed text, namely 'The main language of this school is unknown' (in the MapComplete.osm.be theme 'Education') Picking this answer will delete the key school:language.",
"value": ""
},
{
"key": "amenity",
"description": "The MapComplete theme Education has a layer Kindergartens and childcare showing features with this tag",
"value": "childcare"
},
{
"key": "amenity",
"description": "The MapComplete theme Education has a layer Kindergartens and childcare showing features with this tag",
"value": "kindergarten"
},
{
"key": "isced:level:2011",
"description": "The MapComplete theme Education has a layer Kindergartens and childcare showing features with this tag",
"value": "early_childhood"
},
{
"key": "amenity",
"description": "Layer 'Kindergartens and childcare' shows amenity=kindergarten with a fixed text, namely 'This is a kindergarten (also known as <i>preschool</i>) where small kids receive early education.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "kindergarten"
},
{
"key": "amenity",
"description": "Layer 'Kindergartens and childcare' shows amenity=childcare with a fixed text, namely 'This is a childcare facility, such as a nursery or daycare where small kids are looked after. They do not offer an education and are ofter run as private businesses' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Education')",
"value": "childcare"
},
{
"key": "name",
"description": "Layer 'Kindergartens and childcare' shows and asks freeform values for key 'name' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "website",
"description": "Layer 'Kindergartens and childcare' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:website",
"description": "Layer 'Kindergartens and childcare' shows contact:website~^..*$ with a fixed text, namely '<a href='{contact:website}' target='_blank'>{contact:website}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "email",
"description": "Layer 'Kindergartens and childcare' shows and asks freeform values for key 'email' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:email",
"description": "Layer 'Kindergartens and childcare' shows contact:email~^..*$ with a fixed text, namely '<a href='mailto:{contact:email}' target='_blank'>{contact:email}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "phone",
"description": "Layer 'Kindergartens and childcare' shows and asks freeform values for key 'phone' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "contact:phone",
"description": "Layer 'Kindergartens and childcare' shows contact:phone~^..*$ with a fixed text, namely '<a href='tel:{contact:phone}'>{contact:phone}</a>' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "opening_hours",
"description": "Layer 'Kindergartens and childcare' shows and asks freeform values for key 'opening_hours' (in the MapComplete.osm.be theme 'Education')"
},
{
"key": "capacity",
"description": "Layer 'Kindergartens and childcare' shows and asks freeform values for key 'capacity' (in the MapComplete.osm.be theme 'Education')"
}
]
}

View file

@ -4,6 +4,14 @@ Tags format
When creating the `json` file describing your layer or theme, you'll have to add a few tags to describe what you want. When creating the `json` file describing your layer or theme, you'll have to add a few tags to describe what you want.
This document gives an overview of what every expression means and how it behaves in edge cases. This document gives an overview of what every expression means and how it behaves in edge cases.
If the schema-files note a type `string | AndOrTagConfigJson`, you can use one of these values.
In some cases, not every type of tags-filter can be used. For example, _rendering_ an option with a regex is
fine (`"if": "brand~[Bb]randname", "then":" The brand is Brandname"`); but this regex can not be used to write a value
into the database. The theme loader will however refuse to work with such inconsistencies and notify you of this while
you are building your theme.
Strict equality Strict equality
--------------- ---------------
@ -38,8 +46,8 @@ If `key` is not present or empty, this will match too.
This implies that, to check if a key is present, `key!=` can be used. This will only match if the key is present and not This implies that, to check if a key is present, `key!=` can be used. This will only match if the key is present and not
empty. empty.
Number comparison Number and date comparison
----------------- --------------------------
If the value of a tag is a number (e.g. `key=42`), one can use a filter `key<=42`, `key>=35`, `key>40` or `key<50` to If the value of a tag is a number (e.g. `key=42`), one can use a filter `key<=42`, `key>=35`, `key>40` or `key<50` to
match this, e.g. in conditions for renderings. These tags cannot be used to generate an answer nor can they be used to match this, e.g. in conditions for renderings. These tags cannot be used to generate an answer nor can they be used to
@ -51,14 +59,17 @@ special circumstances (e.g. `surface_area=42 m2` or `length=100 feet`), this wil
values (`surface=422` or if a length in meters is compared to). However, this can be partially alleviated by using ' values (`surface=422` or if a length in meters is compared to). However, this can be partially alleviated by using '
Units' to rewrite to a default format. Units' to rewrite to a default format.
Dates can be compared with the same expression: `somekey<2022-06-22` will match if `somekey` is a date and is smaller
then 22nd june '22.
Regex equals Regex equals
------------ ------------
A tag can also be tested against a regex with `key~regex`. Note that this regex __must match__ the entire value. If the A tag can also be tested against a regex with `key~regex`. Note that this regex __must match__ the entire value. If the
value is allowed to appear anywhere as substring, use `key~.*regex.*` value is allowed to appear anywhere as substring, use `key~.*regex.*`
Regexes will match the newline character with `.` too - the `s`-flag is enabled by default. Regexes will match the newline character with `.` too - the `s`-flag is enabled by default. To enable case invariant
To enable case invariant matching, use `key~i~regex` matching, use `key~i~regex`
Equivalently, `key!~regex` can be used if you _don't_ want to match the regex in order to appear. Equivalently, `key!~regex` can be used if you _don't_ want to match the regex in order to appear.
@ -87,7 +98,7 @@ To mitigate this, use:
{ {
"mappings": [ "mappings": [
{ {
"if":"key:={some_other_key}" "if":"key:={some_other_key}",
"then": "...", "then": "...",
"hideInAnswer": "some_other_key=" "hideInAnswer": "some_other_key="
} }
@ -97,3 +108,19 @@ To mitigate this, use:
One can use `key!:=prefix-{other_key}-postfix` as well, to match if `key` is _not_ the same One can use `key!:=prefix-{other_key}-postfix` as well, to match if `key` is _not_ the same
as `prefix-{other_key}-postfix` (with `other_key` substituted by the value) as `prefix-{other_key}-postfix` (with `other_key` substituted by the value)
## Logical operators
One can combine multiple tags by using `and` or `or`, e.g.:
```json
{
"osmTags": {
"or": [
"amenity=school",
"amenity=kindergarten"
]
}
}
```

View file

@ -126,7 +126,7 @@ export default class DetermineLayout {
.AttachTo("centermessage"); .AttachTo("centermessage");
} }
private static prepCustomTheme(json: any, sourceUrl?: string): LayoutConfig { private static prepCustomTheme(json: any, sourceUrl?: string, forceId?: string): LayoutConfig {
if(json.layers === undefined && json.tagRenderings !== undefined){ if(json.layers === undefined && json.tagRenderings !== undefined){
const iconTr = json.mapRendering.map(mr => mr.icon).find(icon => icon !== undefined) const iconTr = json.mapRendering.map(mr => mr.icon).find(icon => icon !== undefined)
@ -161,6 +161,7 @@ export default class DetermineLayout {
json = new PrepareTheme(converState).convertStrict(json, "While preparing a dynamic theme") json = new PrepareTheme(converState).convertStrict(json, "While preparing a dynamic theme")
console.log("The layoutconfig is ", json) console.log("The layoutconfig is ", json)
json.id = forceId ?? json.id
return new LayoutConfig(json, false, { return new LayoutConfig(json, false, {
definitionRaw: JSON.stringify(raw, null, " "), definitionRaw: JSON.stringify(raw, null, " "),
@ -178,9 +179,13 @@ export default class DetermineLayout {
let parsed = await Utils.downloadJson(link) let parsed = await Utils.downloadJson(link)
try { try {
parsed.id = link; let forcedId = parsed.id
const url = new URL(link)
if(!(url.hostname === "localhost" || url.hostname === "127.0.0.1")){
forcedId = link;
}
console.log("Loaded remote link:", link) console.log("Loaded remote link:", link)
return DetermineLayout.prepCustomTheme(parsed, link) return DetermineLayout.prepCustomTheme(parsed, link, forcedId);
} catch (e) { } catch (e) {
console.error(e) console.error(e)
DetermineLayout.ShowErrorOnCustomTheme( DetermineLayout.ShowErrorOnCustomTheme(

View file

@ -5,6 +5,7 @@ import BaseUIElement from "../UI/BaseUIElement";
import List from "../UI/Base/List"; import List from "../UI/Base/List";
import Title from "../UI/Base/Title"; import Title from "../UI/Base/Title";
import {BBox} from "./BBox"; import {BBox} from "./BBox";
import {Feature, Geometry, MultiPolygon, Polygon} from "@turf/turf";
export interface ExtraFuncParams { export interface ExtraFuncParams {
/** /**
@ -12,9 +13,9 @@ export interface ExtraFuncParams {
* Note that more features then requested can be given back. * Note that more features then requested can be given back.
* Format: [ [ geojson, geojson, geojson, ... ], [geojson, ...], ...] * Format: [ [ geojson, geojson, geojson, ... ], [geojson, ...], ...]
*/ */
getFeaturesWithin: (layerId: string, bbox: BBox) => any[][], getFeaturesWithin: (layerId: string, bbox: BBox) => Feature<Geometry, {id: string}>[][],
memberships: RelationsTracker memberships: RelationsTracker
getFeatureById: (id: string) => any getFeatureById: (id: string) => Feature<Geometry, {id: string}>
} }
/** /**
@ -24,21 +25,65 @@ interface ExtraFunction {
readonly _name: string; readonly _name: string;
readonly _args: string[]; readonly _args: string[];
readonly _doc: string; readonly _doc: string;
readonly _f: (params: ExtraFuncParams, feat: any) => any; readonly _f: (params: ExtraFuncParams, feat: Feature<Geometry, any>) => any;
} }
class EnclosingFunc implements ExtraFunction {
_name = "enclosingFeatures"
_doc = ["Gives a list of all features in the specified layers which fully contain this object. Returned features will always be (multi)polygons. (LineStrings and Points from the other layers are ignored)","",
"The result is a list of features: `{feat: Polygon}[]`",
"This function will never return the feature itself."].join("\n")
_args = ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"]
_f(params: ExtraFuncParams, feat: Feature<Geometry, any>) {
return (...layerIds: string[]) => {
const result: { feat: any }[] = []
const bbox = BBox.get(feat)
const seenIds = new Set<string>()
seenIds.add(feat.properties.id)
for (const layerId of layerIds) {
const otherFeaturess = params.getFeaturesWithin(layerId, bbox)
if (otherFeaturess === undefined) {
continue;
}
if (otherFeaturess.length === 0) {
continue;
}
for (const otherFeatures of otherFeaturess) {
for (const otherFeature of otherFeatures) {
if(seenIds.has(otherFeature.properties.id)){
continue
}
seenIds.add(otherFeature.properties.id)
if(otherFeature.geometry.type !== "Polygon" && otherFeature.geometry.type !== "MultiPolygon"){
continue;
}
if(GeoOperations.completelyWithin(feat, <Feature<Polygon | MultiPolygon, any>> otherFeature)){
result.push({feat: otherFeature})
}
}
}
}
return result;
}
}
}
class OverlapFunc implements ExtraFunction { class OverlapFunc implements ExtraFunction {
_name = "overlapWith"; _name = "overlapWith";
_doc = "Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well." + _doc = ["Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well.",
"If the current feature is a point, all features that this point is embeded in are given.\n\n" + "If the current feature is a point, all features that this point is embeded in are given." ,
"The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point.\n" + "",
"The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list\n" + "The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point." ,
"\n" + "The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list." ,
"For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`" "",
"For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`",
"",
"Also see [enclosingFeatures](#enclosingFeatures) which can be used to get all objects which fully contain this feature"
].join("\n")
_args = ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"] _args = ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"]
_f(params, feat) { _f(params, feat) {
@ -46,15 +91,15 @@ class OverlapFunc implements ExtraFunction {
const result: { feat: any, overlap: number }[] = [] const result: { feat: any, overlap: number }[] = []
const bbox = BBox.get(feat) const bbox = BBox.get(feat)
for (const layerId of layerIds) { for (const layerId of layerIds) {
const otherLayers = params.getFeaturesWithin(layerId, bbox) const otherFeaturess = params.getFeaturesWithin(layerId, bbox)
if (otherLayers === undefined) { if (otherFeaturess === undefined) {
continue; continue;
} }
if (otherLayers.length === 0) { if (otherFeaturess.length === 0) {
continue; continue;
} }
for (const otherLayer of otherLayers) { for (const otherFeatures of otherFeaturess) {
result.push(...GeoOperations.calculateOverlap(feat, otherLayer)); result.push(...GeoOperations.calculateOverlap(feat, otherFeatures));
} }
} }
@ -392,6 +437,7 @@ export class ExtraFunctions {
private static readonly allFuncs: ExtraFunction[] = [ private static readonly allFuncs: ExtraFunction[] = [
new DistanceToFunc(), new DistanceToFunc(),
new OverlapFunc(), new OverlapFunc(),
new EnclosingFunc(),
new IntersectionFunc(), new IntersectionFunc(),
new ClosestObjectFunc(), new ClosestObjectFunc(),
new ClosestNObjectFunc(), new ClosestNObjectFunc(),

View file

@ -79,6 +79,9 @@ export default class SaveTileToLocalStorageActor {
} }
loadedTiles.add(key) loadedTiles.add(key)
this.GetIdb(key).then((features: { feature: any, freshness: Date }[]) => { this.GetIdb(key).then((features: { feature: any, freshness: Date }[]) => {
if(features === undefined){
return;
}
console.debug("Loaded tile " + self._layer.id + "_" + key + " from disk") console.debug("Loaded tile " + self._layer.id + "_" + key + " from disk")
const src = new SimpleFeatureSource(self._flayer, key, new UIEventSource<{ feature: any; freshness: Date }[]>(features)) const src = new SimpleFeatureSource(self._flayer, key, new UIEventSource<{ feature: any; freshness: Date }[]>(features))
registerTile(src) registerTile(src)

View file

@ -23,6 +23,7 @@ import TileFreshnessCalculator from "./TileFreshnessCalculator";
import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource"; import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource";
import MapState from "../State/MapState"; import MapState from "../State/MapState";
import {ElementStorage} from "../ElementStorage"; import {ElementStorage} from "../ElementStorage";
import {Feature, Geometry} from "@turf/turf";
/** /**
@ -337,7 +338,7 @@ export default class FeaturePipeline {
} }
public GetAllFeaturesWithin(bbox: BBox): any[][] { public GetAllFeaturesWithin(bbox: BBox): Feature<Geometry, {id: string}>[][] {
const self = this const self = this
const tiles = [] const tiles = []
Array.from(this.perLayerHierarchy.keys()) Array.from(this.perLayerHierarchy.keys())

View file

@ -1,13 +1,10 @@
/**
* Merges features from different featureSources for a single layer
* Uses the freshest feature available in the case multiple sources offer data with the same identifier
*/
import {UIEventSource} from "../../UIEventSource"; import {UIEventSource} from "../../UIEventSource";
import FeatureSource, {FeatureSourceForLayer, IndexedFeatureSource, Tiled} from "../FeatureSource"; import FeatureSource, {FeatureSourceForLayer, IndexedFeatureSource, Tiled} from "../FeatureSource";
import FilteredLayer from "../../../Models/FilteredLayer"; import FilteredLayer from "../../../Models/FilteredLayer";
import {Tiles} from "../../../Models/TileRange"; import {Tiles} from "../../../Models/TileRange";
import {BBox} from "../../BBox"; import {BBox} from "../../BBox";
export default class FeatureSourceMerger implements FeatureSourceForLayer, Tiled, IndexedFeatureSource { export default class FeatureSourceMerger implements FeatureSourceForLayer, Tiled, IndexedFeatureSource {
public features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]); public features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{ feature: any; freshness: Date }[]>([]);
@ -17,7 +14,10 @@ export default class FeatureSourceMerger implements FeatureSourceForLayer, Tiled
public readonly bbox: BBox; public readonly bbox: BBox;
public readonly containedIds: UIEventSource<Set<string>> = new UIEventSource<Set<string>>(new Set()) public readonly containedIds: UIEventSource<Set<string>> = new UIEventSource<Set<string>>(new Set())
private readonly _sources: UIEventSource<FeatureSource[]>; private readonly _sources: UIEventSource<FeatureSource[]>;
/**
* Merges features from different featureSources for a single layer
* Uses the freshest feature available in the case multiple sources offer data with the same identifier
*/
constructor(layer: FilteredLayer, tileIndex: number, bbox: BBox, sources: UIEventSource<FeatureSource[]>) { constructor(layer: FilteredLayer, tileIndex: number, bbox: BBox, sources: UIEventSource<FeatureSource[]>) {
this.tileIndex = tileIndex; this.tileIndex = tileIndex;
this.bbox = bbox; this.bbox = bbox;

View file

@ -1,28 +1,94 @@
/** /**
* This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indicates with what renderConfig it should be rendered. * This feature source helps the ShowDataLayer class: it introduces the necessary extra features and indicates with what renderConfig it should be rendered.
*/ */
import {Store, UIEventSource} from "../../UIEventSource"; import {Store} from "../../UIEventSource";
import {GeoOperations} from "../../GeoOperations"; import {GeoOperations} from "../../GeoOperations";
import FeatureSource from "../FeatureSource"; import FeatureSource from "../FeatureSource";
import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig"; import PointRenderingConfig from "../../../Models/ThemeConfig/PointRenderingConfig";
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"; import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
import LineRenderingConfig from "../../../Models/ThemeConfig/LineRenderingConfig";
export default class RenderingMultiPlexerFeatureSource { export default class RenderingMultiPlexerFeatureSource {
public readonly features: Store<(any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined })[]>; public readonly features: Store<(any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined })[]>;
private readonly pointRenderings: { rendering: PointRenderingConfig; index: number }[];
private centroidRenderings: { rendering: PointRenderingConfig; index: number }[];
private projectedCentroidRenderings: { rendering: PointRenderingConfig; index: number }[];
private startRenderings: { rendering: PointRenderingConfig; index: number }[];
private endRenderings: { rendering: PointRenderingConfig; index: number }[];
private hasCentroid: boolean;
private lineRenderObjects: LineRenderingConfig[];
private inspectFeature(feat, addAsPoint: (feat, rendering, centerpoint: [number, number]) => void, withIndex: any[]){
if (feat.geometry.type === "Point") {
for (const rendering of this.pointRenderings) {
withIndex.push({
...feat,
pointRenderingIndex: rendering.index
})
}
} else {
// This is a a line: add the centroids
let centerpoint: [number, number] = undefined;
let projectedCenterPoint : [number, number] = undefined
if(this.hasCentroid){
centerpoint = GeoOperations.centerpointCoordinates(feat)
if(this.projectedCentroidRenderings.length > 0){
projectedCenterPoint = <[number,number]> GeoOperations.nearestPoint(feat, centerpoint).geometry.coordinates
}
}
for (const rendering of this.centroidRenderings) {
addAsPoint(feat, rendering, centerpoint)
}
if (feat.geometry.type === "LineString") {
for (const rendering of this.projectedCentroidRenderings) {
addAsPoint(feat, rendering, projectedCenterPoint)
}
// Add start- and endpoints
const coordinates = feat.geometry.coordinates
for (const rendering of this.startRenderings) {
addAsPoint(feat, rendering, coordinates[0])
}
for (const rendering of this.endRenderings) {
const coordinate = coordinates[coordinates.length - 1]
addAsPoint(feat, rendering, coordinate)
}
}else{
for (const rendering of this.projectedCentroidRenderings) {
addAsPoint(feat, rendering, centerpoint)
}
}
// AT last, add it 'as is' to what we should render
for (let i = 0; i < this.lineRenderObjects.length; i++) {
withIndex.push({
...feat,
lineRenderingIndex: i
})
}
}
}
constructor(upstream: FeatureSource, layer: LayerConfig) { constructor(upstream: FeatureSource, layer: LayerConfig) {
const pointRenderObjects: { rendering: PointRenderingConfig, index: number }[] = layer.mapRendering.map((r, i) => ({ const pointRenderObjects: { rendering: PointRenderingConfig, index: number }[] = layer.mapRendering.map((r, i) => ({
rendering: r, rendering: r,
index: i index: i
})) }))
const pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point")) this.pointRenderings = pointRenderObjects.filter(r => r.rendering.location.has("point"))
const centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid")) this.centroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("centroid"))
const projectedCentroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("projected_centerpoint")) this.projectedCentroidRenderings = pointRenderObjects.filter(r => r.rendering.location.has("projected_centerpoint"))
const startRenderings = pointRenderObjects.filter(r => r.rendering.location.has("start")) this.startRenderings = pointRenderObjects.filter(r => r.rendering.location.has("start"))
const endRenderings = pointRenderObjects.filter(r => r.rendering.location.has("end")) this.endRenderings = pointRenderObjects.filter(r => r.rendering.location.has("end"))
const hasCentroid = centroidRenderings.length > 0 || projectedCentroidRenderings.length > 0 this.hasCentroid = this.centroidRenderings.length > 0 || this.projectedCentroidRenderings.length > 0
const lineRenderObjects = layer.lineRendering this.lineRenderObjects = layer.lineRendering
this.features = upstream.features.map( this.features = upstream.features.map(
features => { features => {
@ -31,8 +97,7 @@ export default class RenderingMultiPlexerFeatureSource {
} }
const withIndex: (any & { pointRenderingIndex: number | undefined, lineRenderingIndex: number | undefined, multiLineStringIndex: number | undefined })[] = []; const withIndex: any[] = [];
function addAsPoint(feat, rendering, coordinate) { function addAsPoint(feat, rendering, coordinate) {
const patched = { const patched = {
@ -45,68 +110,14 @@ export default class RenderingMultiPlexerFeatureSource {
} }
withIndex.push(patched) withIndex.push(patched)
} }
for (const f of features) { for (const f of features) {
const feat = f.feature; const feat = f.feature;
if(feat === undefined){ if(feat === undefined){
continue continue
} }
if(feat.geometry === undefined){ this.inspectFeature(feat, addAsPoint, withIndex)
console.error("No geometry in ", feat,"provided by", upstream.features.tag, upstream.name)
}
if (feat.geometry.type === "Point") {
for (const rendering of pointRenderings) {
withIndex.push({
...feat,
pointRenderingIndex: rendering.index
})
}
continue
}
// This is a a line: add the centroids
let centerpoint: [number, number] = undefined;
let projectedCenterPoint: [number, number] = undefined
if (hasCentroid) {
centerpoint = GeoOperations.centerpointCoordinates(feat)
if (projectedCentroidRenderings.length > 0) {
projectedCenterPoint = <[number, number]>GeoOperations.nearestPoint(feat, centerpoint).geometry.coordinates
}
}
for (const rendering of centroidRenderings) {
addAsPoint(feat, rendering, centerpoint)
}
if (feat.geometry.type === "LineString") {
for (const rendering of projectedCentroidRenderings) {
addAsPoint(feat, rendering, projectedCenterPoint)
}
// Add start- and endpoints
const coordinates = feat.geometry.coordinates
for (const rendering of startRenderings) {
addAsPoint(feat, rendering, coordinates[0])
}
for (const rendering of endRenderings) {
const coordinate = coordinates[coordinates.length - 1]
addAsPoint(feat, rendering, coordinate)
}
} else {
for (const rendering of projectedCentroidRenderings) {
addAsPoint(feat, rendering, centerpoint)
}
}
// AT last, add it 'as is' to what we should render
for (let i = 0; i < lineRenderObjects.length; i++) {
withIndex.push({
...feat,
lineRenderingIndex: i
})
}
} }

View file

@ -7,7 +7,6 @@ import FilteredLayer from "../../../Models/FilteredLayer";
import {FeatureSourceForLayer, Tiled} from "../FeatureSource"; import {FeatureSourceForLayer, Tiled} from "../FeatureSource";
import {Tiles} from "../../../Models/TileRange"; import {Tiles} from "../../../Models/TileRange";
import {BBox} from "../../BBox"; import {BBox} from "../../BBox";
import {OsmConnection} from "../../Osm/OsmConnection";
import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig"; import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig";
import {Or} from "../../Tags/Or"; import {Or} from "../../Tags/Or";
import {TagsFilter} from "../../Tags/TagsFilter"; import {TagsFilter} from "../../Tags/TagsFilter";
@ -27,65 +26,71 @@ export default class OsmFeatureSource {
handleTile: (tile: FeatureSourceForLayer & Tiled) => void; handleTile: (tile: FeatureSourceForLayer & Tiled) => void;
isActive: Store<boolean>, isActive: Store<boolean>,
neededTiles: Store<number[]>, neededTiles: Store<number[]>,
state: {
readonly osmConnection: OsmConnection;
},
markTileVisited?: (tileId: number) => void markTileVisited?: (tileId: number) => void
}; };
private readonly allowedTags: TagsFilter; private readonly allowedTags: TagsFilter;
/**
*
* @param options: allowedFeatures is normally calculated from the layoutToUse
*/
constructor(options: { constructor(options: {
handleTile: (tile: FeatureSourceForLayer & Tiled) => void; handleTile: (tile: FeatureSourceForLayer & Tiled) => void;
isActive: Store<boolean>, isActive: Store<boolean>,
neededTiles: Store<number[]>, neededTiles: Store<number[]>,
state: { state: {
readonly filteredLayers: UIEventSource<FilteredLayer[]>; readonly filteredLayers: UIEventSource<FilteredLayer[]>;
readonly osmConnection: OsmConnection; readonly osmConnection: {
readonly layoutToUse: LayoutConfig Backend(): string
};
readonly layoutToUse?: LayoutConfig
}, },
readonly allowedFeatures?: TagsFilter,
markTileVisited?: (tileId: number) => void markTileVisited?: (tileId: number) => void
}) { }) {
this.options = options; this.options = options;
this._backend = options.state.osmConnection._oauth_config.url; this._backend = options.state.osmConnection.Backend();
this.filteredLayers = options.state.filteredLayers.map(layers => layers.filter(layer => layer.layerDef.source.geojsonSource === undefined)) this.filteredLayers = options.state.filteredLayers.map(layers => layers.filter(layer => layer.layerDef.source.geojsonSource === undefined))
this.handleTile = options.handleTile this.handleTile = options.handleTile
this.isActive = options.isActive this.isActive = options.isActive
const self = this const self = this
options.neededTiles.addCallbackAndRunD(neededTiles => { options.neededTiles.addCallbackAndRunD(neededTiles => {
if (options.isActive?.data === false) { self.Update(neededTiles)
return;
}
neededTiles = neededTiles.filter(tile => !self.downloadedTiles.has(tile))
if (neededTiles.length == 0) {
return;
}
self.isRunning.setData(true)
try {
for (const neededTile of neededTiles) {
self.downloadedTiles.add(neededTile)
self.LoadTile(...Tiles.tile_from_index(neededTile)).then(_ => {
console.debug("Tile ", Tiles.tile_from_index(neededTile).join("/"), "loaded from OSM")
})
}
} catch (e) {
console.error(e)
} finally {
self.isRunning.setData(false)
}
}) })
const neededLayers = (options.state.layoutToUse?.layers ?? []) const neededLayers = (options.state.layoutToUse?.layers ?? [])
.filter(layer => !layer.doNotDownload) .filter(layer => !layer.doNotDownload)
.filter(layer => layer.source.geojsonSource === undefined || layer.source.isOsmCacheLayer) .filter(layer => layer.source.geojsonSource === undefined || layer.source.isOsmCacheLayer)
this.allowedTags = new Or(neededLayers.map(l => l.source.osmTags)) this.allowedTags = options.allowedFeatures ?? new Or(neededLayers.map(l => l.source.osmTags))
} }
private async LoadTile(z, x, y): Promise<void> { private async Update(neededTiles: number[]) {
if (this.options.isActive?.data === false) {
return;
}
neededTiles = neededTiles.filter(tile => !this.downloadedTiles.has(tile))
if (neededTiles.length == 0) {
return;
}
this.isRunning.setData(true)
try {
for (const neededTile of neededTiles) {
this.downloadedTiles.add(neededTile)
this.LoadTile(...Tiles.tile_from_index(neededTile))
}
} catch (e) {
console.error(e)
} finally {
this.isRunning.setData(false)
}
}
private LoadTile(z, x, y): void {
if (z > 25) { if (z > 25) {
throw "This is an absurd high zoom level" throw "This is an absurd high zoom level"
} }
@ -96,11 +101,10 @@ export default class OsmFeatureSource {
const bbox = BBox.fromTile(z, x, y) const bbox = BBox.fromTile(z, x, y)
const url = `${this._backend}/api/0.6/map?bbox=${bbox.minLon},${bbox.minLat},${bbox.maxLon},${bbox.maxLat}` const url = `${this._backend}/api/0.6/map?bbox=${bbox.minLon},${bbox.minLat},${bbox.maxLon},${bbox.maxLat}`
try {
const osmJson = await Utils.downloadJson(url) Utils.downloadJson(url).then(osmJson => {
try { try {
console.debug("Got tile", z, x, y, "from the osm api") console.log("Got tile", z, x, y, "from the osm api")
this.rawDataHandlers.forEach(handler => handler(osmJson, Tiles.tile_index(z, x, y))) this.rawDataHandlers.forEach(handler => handler(osmJson, Tiles.tile_index(z, x, y)))
const geojson = OsmToGeoJson.default(osmJson, const geojson = OsmToGeoJson.default(osmJson,
// @ts-ignore // @ts-ignore
@ -130,17 +134,18 @@ export default class OsmFeatureSource {
} catch (e) { } catch (e) {
console.error("Weird error: ", e) console.error("Weird error: ", e)
} }
} catch (e) { })
console.error("Could not download tile", z, x, y, "due to", e, "; retrying with smaller bounds") .catch(e => {
if (e === "rate limited") { console.error("Could not download tile", z, x, y, "due to", e, "; retrying with smaller bounds")
if (e === "rate limited") {
return;
}
this.LoadTile(z + 1, x * 2, y * 2)
this.LoadTile(z + 1, 1 + x * 2, y * 2)
this.LoadTile(z + 1, x * 2, 1 + y * 2)
this.LoadTile(z + 1, 1 + x * 2, 1 + y * 2)
return; return;
} })
await this.LoadTile(z + 1, x * 2, y * 2)
await this.LoadTile(z + 1, 1 + x * 2, y * 2)
await this.LoadTile(z + 1, x * 2, 1 + y * 2)
await this.LoadTile(z + 1, 1 + x * 2, 1 + y * 2)
return;
}
} }

View file

@ -3,7 +3,7 @@ import {BBox} from "./BBox";
import togpx from "togpx" import togpx from "togpx"
import Constants from "../Models/Constants"; import Constants from "../Models/Constants";
import LayerConfig from "../Models/ThemeConfig/LayerConfig"; import LayerConfig from "../Models/ThemeConfig/LayerConfig";
import {Coord} from "@turf/turf"; import {booleanWithin, Coord, Feature, Geometry, MultiPolygon, Polygon, Properties} from "@turf/turf";
export class GeoOperations { export class GeoOperations {
@ -142,7 +142,10 @@ export class GeoOperations {
return result; return result;
} }
public static pointInPolygonCoordinates(x: number, y: number, coordinates: [number, number][][]) { /**
* Helper function which does the heavy lifting for 'inside'
*/
private static pointInPolygonCoordinates(x: number, y: number, coordinates: [number, number][][]) {
const inside = GeoOperations.pointWithinRing(x, y, /*This is the outer ring of the polygon */coordinates[0]) const inside = GeoOperations.pointWithinRing(x, y, /*This is the outer ring of the polygon */coordinates[0])
if (!inside) { if (!inside) {
return false; return false;
@ -737,6 +740,38 @@ export class GeoOperations {
return turf.bearing(a, b) return turf.bearing(a, b)
} }
/**
* Returns 'true' if one feature contains the other feature
*
* const pond: Feature<Polygon, any> = {
* "type": "Feature",
* "properties": {"natural":"water","water":"pond"},
* "geometry": {
* "type": "Polygon",
* "coordinates": [[
* [4.362924098968506,50.8435422298544 ],
* [4.363272786140442,50.8435219059949 ],
* [4.363213777542114,50.8437420806679 ],
* [4.362924098968506,50.8435422298544 ]
* ]]}}
* const park: Feature<Polygon, any> = {
* "type": "Feature",
* "properties": {"leisure":"park"},
* "geometry": {
* "type": "Polygon",
* "coordinates": [[
* [ 4.36073541641235,50.84323737103244 ],
* [ 4.36469435691833, 50.8423905305197 ],
* [ 4.36659336090087, 50.8458997374786 ],
* [ 4.36254858970642, 50.8468007074916 ],
* [ 4.36073541641235, 50.8432373710324 ]
* ]]}}
* GeoOperations.completelyWithin(pond, park) // => true
* GeoOperations.completelyWithin(park, pond) // => false
*/
static completelyWithin(feature: Feature<Geometry, any>, possiblyEncloingFeature: Feature<Polygon | MultiPolygon, any>) : boolean {
return booleanWithin(feature, possiblyEncloingFeature);
}
} }

View file

@ -155,7 +155,6 @@ export default class MetaTagging {
// Lazy function // Lazy function
const f = (feature: any) => { const f = (feature: any) => {
const oldValue = feature.properties[key]
delete feature.properties[key] delete feature.properties[key]
Object.defineProperty(feature.properties, key, { Object.defineProperty(feature.properties, key, {
configurable: true, configurable: true,

View file

@ -145,6 +145,10 @@ export class OsmConnection {
console.log("Logged out") console.log("Logged out")
this.loadingStatus.setData("not-attempted") this.loadingStatus.setData("not-attempted")
} }
public Backend(): string {
return this._oauth_config.url;
}
public AttemptLogin() { public AttemptLogin() {
this.loadingStatus.setData("loading") this.loadingStatus.setData("loading")

View file

@ -1,10 +1,12 @@
import {UIEventSource} from "../UIEventSource"; import {UIEventSource} from "../UIEventSource";
import UserDetails, {OsmConnection} from "./OsmConnection"; import UserDetails, {OsmConnection} from "./OsmConnection";
import {Utils} from "../../Utils"; import {Utils} from "../../Utils";
import {DomEvent} from "leaflet";
import preventDefault = DomEvent.preventDefault;
export class OsmPreferences { export class OsmPreferences {
public preferences = new UIEventSource<any>({}, "all-osm-preferences"); public preferences = new UIEventSource<Record<string, string>>({}, "all-osm-preferences");
private readonly preferenceSources = new Map<string, UIEventSource<string>>() private readonly preferenceSources = new Map<string, UIEventSource<string>>()
private auth: any; private auth: any;
private userDetails: UIEventSource<UserDetails>; private userDetails: UIEventSource<UserDetails>;
@ -35,7 +37,7 @@ export class OsmPreferences {
const allStartWith = prefix + key + "-combined"; const allStartWith = prefix + key + "-combined";
// Gives the number of combined preferences // Gives the number of combined preferences
const length = this.GetPreference(allStartWith + "-length", ""); const length = this.GetPreference(allStartWith + "-length", "", "");
if( (allStartWith + "-length").length > 255){ if( (allStartWith + "-length").length > 255){
throw "This preference key is too long, it has "+key.length+" characters, but at most "+(255 - "-length".length - "-combined".length - prefix.length)+" characters are allowed" throw "This preference key is too long, it has "+key.length+" characters, but at most "+(255 - "-length".length - "-combined".length - prefix.length)+" characters are allowed"
@ -51,10 +53,10 @@ export class OsmPreferences {
let count = parseInt(length.data); let count = parseInt(length.data);
for (let i = 0; i < count; i++) { for (let i = 0; i < count; i++) {
// Delete all the preferences // Delete all the preferences
self.GetPreference(allStartWith + "-" + i, "") self.GetPreference(allStartWith + "-" + i, "", "")
.setData(""); .setData("");
} }
self.GetPreference(allStartWith + "-length", "") self.GetPreference(allStartWith + "-length", "", "")
.setData(""); .setData("");
return return
} }
@ -67,7 +69,7 @@ export class OsmPreferences {
if (i > 100) { if (i > 100) {
throw "This long preference is getting very long... " throw "This long preference is getting very long... "
} }
self.GetPreference(allStartWith + "-" + i, "").setData(str.substr(0, 255)); self.GetPreference(allStartWith + "-" + i, "","").setData(str.substr(0, 255));
str = str.substr(255); str = str.substr(255);
i++; i++;
} }
@ -107,6 +109,9 @@ export class OsmPreferences {
} }
public GetPreference(key: string, defaultValue : string = undefined, prefix: string = "mapcomplete-"): UIEventSource<string> { public GetPreference(key: string, defaultValue : string = undefined, prefix: string = "mapcomplete-"): UIEventSource<string> {
if(key.startsWith(prefix) && prefix !== ""){
console.trace("A preference was requested which has a duplicate prefix in its key. This is probably a bug")
}
key = prefix + key; key = prefix + key;
key = key.replace(/[:\\\/"' {}.%]/g, '') key = key.replace(/[:\\\/"' {}.%]/g, '')
if (key.length >= 255) { if (key.length >= 255) {
@ -147,7 +152,7 @@ export class OsmPreferences {
const matches = prefixes.some(prefix => key.startsWith(prefix)) const matches = prefixes.some(prefix => key.startsWith(prefix))
if (matches) { if (matches) {
console.log("Clearing ", key) console.log("Clearing ", key)
self.GetPreference(key, "").setData("") self.GetPreference(key, "", "").setData("")
} }
} }

View file

@ -486,7 +486,7 @@ export default class SimpleMetaTaggers {
const subElements: (string | BaseUIElement)[] = [ const subElements: (string | BaseUIElement)[] = [
new Combine([ new Combine([
"Metatags are extra tags available, in order to display more data or to give better questions.", "Metatags are extra tags available, in order to display more data or to give better questions.",
"The are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an overview of the available metatags.", "They are calculated automatically on every feature when the data arrives in the webbrowser. This document gives an overview of the available metatags.",
"**Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a box in the popup for features which shows all the properties of the object" "**Hint:** when using metatags, add the [query parameter](URL_Parameters.md) `debug=true` to the URL. This will include a box in the popup for features which shows all the properties of the object"
]).SetClass("flex-col") ]).SetClass("flex-col")

View file

@ -12,6 +12,7 @@ import {Changes} from "../Osm/Changes";
import ChangeToElementsActor from "../Actors/ChangeToElementsActor"; import ChangeToElementsActor from "../Actors/ChangeToElementsActor";
import PendingChangesUploader from "../Actors/PendingChangesUploader"; import PendingChangesUploader from "../Actors/PendingChangesUploader";
import * as translators from "../../assets/translators.json" import * as translators from "../../assets/translators.json"
import {post} from "jquery";
/** /**
* The part of the state which keeps track of user-related stuff, e.g. the OSM-connection, * The part of the state which keeps track of user-related stuff, e.g. the OSM-connection,
@ -39,6 +40,8 @@ export default class UserRelatedState extends ElementsState {
public readonly isTranslator : Store<boolean>; public readonly isTranslator : Store<boolean>;
public readonly installedUserThemes: UIEventSource<string[]>
constructor(layoutToUse: LayoutConfig, options?: { attemptLogin: true | boolean }) { constructor(layoutToUse: LayoutConfig, options?: { attemptLogin: true | boolean }) {
super(layoutToUse); super(layoutToUse);
@ -116,6 +119,7 @@ export default class UserRelatedState extends ElementsState {
this.InitializeLanguage(); this.InitializeLanguage();
new SelectedElementTagsUpdater(this) new SelectedElementTagsUpdater(this)
this.installedUserThemes = this.InitInstalledUserThemes();
} }
@ -144,5 +148,51 @@ export default class UserRelatedState extends ElementsState {
}) })
Locale.language.ping(); Locale.language.ping();
} }
private InitInstalledUserThemes(): UIEventSource<string[]>{
const prefix = "mapcomplete-unofficial-theme-";
const postfix = "-combined-length"
return this.osmConnection.preferencesHandler.preferences.map(prefs =>
Object.keys(prefs)
.filter(k => k.startsWith(prefix) && k.endsWith(postfix))
.map(k => k.substring(prefix.length, k.length - postfix.length))
)
}
public GetUnofficialTheme(id: string): {
id: string
icon: string,
title: any,
shortDescription: any,
definition?: any,
isOfficial: boolean
} | undefined {
console.log("GETTING UNOFFICIAL THEME")
const pref = this.osmConnection.GetLongPreference("unofficial-theme-"+id)
const str = pref.data
if (str === undefined || str === "undefined" || str === "") {
pref.setData(null)
return undefined
}
try {
const value: {
id: string
icon: string,
title: any,
shortDescription: any,
definition?: any,
isOfficial: boolean
} = JSON.parse(str)
value.isOfficial = false
return value;
} catch (e) {
console.warn("Removing theme " + id + " as it could not be parsed from the preferences; the content is:", str)
pref.setData(null)
return undefined
}
}
} }

View file

@ -10,6 +10,9 @@ import {AndOrTagConfigJson} from "../../Models/ThemeConfig/Json/TagConfigJson";
import {isRegExp} from "util"; import {isRegExp} from "util";
import * as key_counts from "../../assets/key_totals.json" import * as key_counts from "../../assets/key_totals.json"
type Tags = Record<string, string>
type OsmTags = Tags & {id: string}
export class TagUtils { export class TagUtils {
private static keyCounts: { keys: any, tags: any } = key_counts["default"] ?? key_counts private static keyCounts: { keys: any, tags: any } = key_counts["default"] ?? key_counts
private static comparators private static comparators
@ -56,11 +59,17 @@ export class TagUtils {
return true; return true;
} }
static SplitKeys(tagsFilters: TagsFilter[]): Record<string, string[]> {
return <any>this.SplitKeysRegex(tagsFilters, false);
}
/*** /***
* Creates a hash {key --> [values : string | RegexTag ]}, with all the values present in the tagsfilter * Creates a hash {key --> [values : string | RegexTag ]}, with all the values present in the tagsfilter
*
* TagUtils.SplitKeysRegex([new Tag("isced:level", "bachelor; master")], true) // => {"isced:level": ["bachelor","master"]}
*/ */
static SplitKeys(tagsFilters: TagsFilter[], allowRegex = false) { static SplitKeysRegex(tagsFilters: TagsFilter[], allowRegex: boolean): Record<string, (string | RegexTag)[]> {
const keyValues = {} // Map string -> (string | RegexTag)[] const keyValues: Record<string, (string | RegexTag)[]> = {}
tagsFilters = [...tagsFilters] // copy all, use as queue tagsFilters = [...tagsFilters] // copy all, use as queue
while (tagsFilters.length > 0) { while (tagsFilters.length > 0) {
const tagsFilter = tagsFilters.shift(); const tagsFilter = tagsFilters.shift();
@ -78,7 +87,7 @@ export class TagUtils {
if (keyValues[tagsFilter.key] === undefined) { if (keyValues[tagsFilter.key] === undefined) {
keyValues[tagsFilter.key] = []; keyValues[tagsFilter.key] = [];
} }
keyValues[tagsFilter.key].push(...tagsFilter.value.split(";")); keyValues[tagsFilter.key].push(...tagsFilter.value.split(";").map(s => s.trim()));
continue; continue;
} }
@ -130,19 +139,23 @@ export class TagUtils {
/** /**
* Returns true if the properties match the tagsFilter, interpreted as a multikey. * Returns true if the properties match the tagsFilter, interpreted as a multikey.
* Note that this might match a regex tag * Note that this might match a regex tag
* @param tag *
* @param properties * TagUtils.MatchesMultiAnswer(new Tag("isced:level","bachelor"), {"isced:level":"bachelor; master"}) // => true
* @constructor * TagUtils.MatchesMultiAnswer(new Tag("isced:level","master"), {"isced:level":"bachelor;master"}) // => true
* TagUtils.MatchesMultiAnswer(new Tag("isced:level","doctorate"), {"isced:level":"bachelor; master"}) // => false
*
* // should match with a space too
* TagUtils.MatchesMultiAnswer(new Tag("isced:level","master"), {"isced:level":"bachelor; master"}) // => true
*/ */
static MatchesMultiAnswer(tag: TagsFilter, properties: any): boolean { static MatchesMultiAnswer(tag: TagsFilter, properties: Tags): boolean {
const splitted = TagUtils.SplitKeys([tag], true); const splitted = TagUtils.SplitKeysRegex([tag], true);
for (const splitKey in splitted) { for (const splitKey in splitted) {
const neededValues = splitted[splitKey]; const neededValues = splitted[splitKey];
if (properties[splitKey] === undefined) { if (properties[splitKey] === undefined) {
return false; return false;
} }
const actualValue = properties[splitKey].split(";"); const actualValue = properties[splitKey].split(";").map(s => s.trim());
for (const neededValue of neededValues) { for (const neededValue of neededValues) {
if (neededValue instanceof RegexTag) { if (neededValue instanceof RegexTag) {
@ -169,6 +182,7 @@ export class TagUtils {
/** /**
* Returns wether or not a keys is (probably) a valid key. * Returns wether or not a keys is (probably) a valid key.
* See 'Tags_format.md' for an overview of what every tag does
* *
* // should accept common keys * // should accept common keys
* TagUtils.isValidKey("name") // => true * TagUtils.isValidKey("name") // => true

View file

@ -205,6 +205,11 @@ export class FixImages extends DesugaringStep<LayoutConfigJson> {
let relative = url.protocol + "//" + url.host + url.pathname let relative = url.protocol + "//" + url.host + url.pathname
relative = relative.substring(0, relative.lastIndexOf("/")) relative = relative.substring(0, relative.lastIndexOf("/"))
const self = this; const self = this;
if(relative.endsWith("assets/generated/themes")){
warnings.push("Detected 'assets/generated/themes' as relative URL. I'm assuming that you are loading your file for the MC-repository, so I'm rewriting all image links as if they were absolute instead of relative")
relative = absolute
}
function replaceString(leaf: string) { function replaceString(leaf: string) {
if (self._knownImages.has(leaf)) { if (self._knownImages.has(leaf)) {

View file

@ -100,7 +100,7 @@ export class UpdateLegacyLayer extends DesugaringStep<LayerConfigJson | string |
delete config["wayHandling"] delete config["wayHandling"]
delete config["hideUnderlayingFeaturesMinPercentage"] delete config["hideUnderlayingFeaturesMinPercentage"]
for (const mapRenderingElement of config.mapRendering) { for (const mapRenderingElement of (config.mapRendering ?? [])) {
if (mapRenderingElement["iconOverlays"] !== undefined) { if (mapRenderingElement["iconOverlays"] !== undefined) {
mapRenderingElement["iconBadges"] = mapRenderingElement["iconOverlays"] mapRenderingElement["iconBadges"] = mapRenderingElement["iconOverlays"]
} }

View file

@ -60,7 +60,7 @@ export default interface PointRenderingConfigJson {
rotation?: string | TagRenderingConfigJson; rotation?: string | TagRenderingConfigJson;
/** /**
* A HTML-fragment that is shown below the icon, for example: * A HTML-fragment that is shown below the icon, for example:
* <div style="background: white; display: block">{name}</div> * <div style="background: white">{name}</div>
* *
* If the icon is undefined, then the label is shown in the center of the feature. * If the icon is undefined, then the label is shown in the center of the feature.
* Note that, if the wayhandling hides the icon then no label is shown as well. * Note that, if the wayhandling hides the icon then no label is shown as well.

View file

@ -1,3 +1,8 @@
/**
* A small interface to combine tags and tagsfilters.
*
* See https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation
*/
export interface AndOrTagConfigJson { export interface AndOrTagConfigJson {
and?: (string | AndOrTagConfigJson)[] and?: (string | AndOrTagConfigJson)[]
or?: (string | AndOrTagConfigJson)[] or?: (string | AndOrTagConfigJson)[]

View file

@ -23,7 +23,8 @@ import PrivacyPolicy from "./PrivacyPolicy";
export default class FullWelcomePaneWithTabs extends ScrollableFullScreen { export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
public static MoreThemesTabIndex = 1;
constructor(isShown: UIEventSource<boolean>, constructor(isShown: UIEventSource<boolean>,
currentTab: UIEventSource<number>, currentTab: UIEventSource<number>,
state: { state: {
@ -45,19 +46,12 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
) )
} }
private static ConstructBaseTabs(state: { private static ConstructBaseTabs(state: { layoutToUse: LayoutConfig; osmConnection: OsmConnection; featureSwitchShareScreen: UIEventSource<boolean>; featureSwitchMoreQuests: UIEventSource<boolean>; featurePipeline: FeaturePipeline; locationControl: UIEventSource<Loc>; backgroundLayer: UIEventSource<BaseLayer>; filteredLayers: UIEventSource<FilteredLayer[]> } & UserRelatedState,
layoutToUse: LayoutConfig, isShown: UIEventSource<boolean>, currentTab: UIEventSource<number>):
osmConnection: OsmConnection,
featureSwitchShareScreen: UIEventSource<boolean>,
featureSwitchMoreQuests: UIEventSource<boolean>,
featurePipeline: FeaturePipeline,
locationControl: UIEventSource<Loc>, backgroundLayer: UIEventSource<BaseLayer>, filteredLayers: UIEventSource<FilteredLayer[]>
} & UserRelatedState,
isShown: UIEventSource<boolean>):
{ header: string | BaseUIElement; content: BaseUIElement }[] { { header: string | BaseUIElement; content: BaseUIElement }[] {
const tabs: { header: string | BaseUIElement, content: BaseUIElement }[] = [ const tabs: { header: string | BaseUIElement, content: BaseUIElement }[] = [
{header: `<img src='${state.layoutToUse.icon}'>`, content: new ThemeIntroductionPanel(isShown)}, {header: `<img src='${state.layoutToUse.icon}'>`, content: new ThemeIntroductionPanel(isShown, currentTab, state)},
] ]
@ -107,8 +101,8 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
locationControl: UIEventSource<Loc>, backgroundLayer: UIEventSource<BaseLayer>, filteredLayers: UIEventSource<FilteredLayer[]> locationControl: UIEventSource<Loc>, backgroundLayer: UIEventSource<BaseLayer>, filteredLayers: UIEventSource<FilteredLayer[]>
} & UserRelatedState, currentTab: UIEventSource<number>, isShown: UIEventSource<boolean>) { } & UserRelatedState, currentTab: UIEventSource<number>, isShown: UIEventSource<boolean>) {
const tabs = FullWelcomePaneWithTabs.ConstructBaseTabs(state, isShown) const tabs = FullWelcomePaneWithTabs.ConstructBaseTabs(state, isShown, currentTab)
const tabsWithAboutMc = [...FullWelcomePaneWithTabs.ConstructBaseTabs(state, isShown)] const tabsWithAboutMc = [...FullWelcomePaneWithTabs.ConstructBaseTabs(state, isShown, currentTab)]
tabsWithAboutMc.push({ tabsWithAboutMc.push({

View file

@ -207,55 +207,19 @@ export default class MoreScreen extends Combine {
new SubtleButton(undefined, t.button, {url: "./professional.html"}), new SubtleButton(undefined, t.button, {url: "./professional.html"}),
]).SetClass("flex flex-col border border-gray-300 p-2 rounded-lg") ]).SetClass("flex flex-col border border-gray-300 p-2 rounded-lg")
} }
private static createUnofficialButtonFor(state: UserRelatedState, id: string): BaseUIElement {
const pref = state.osmConnection.GetLongPreference(id)
const str = pref.data
if (str === undefined || str === "undefined" || str === "") {
pref.setData(null)
return undefined
}
try {
const value: {
id: string
icon: string,
title: any,
shortDescription: any,
definition?: any,
isOfficial: boolean
} = JSON.parse(str)
value.isOfficial = false
return MoreScreen.createLinkButton(state, value, true)
} catch (e) {
console.warn("Removing theme " + id + " as it could not be parsed from the preferences")
pref.setData(null)
return undefined
}
}
private static createUnofficialThemeList(buttonClass: string, state: UserRelatedState, themeListClasses: string, search: UIEventSource<string>): BaseUIElement { private static createUnofficialThemeList(buttonClass: string, state: UserRelatedState, themeListClasses: string, search: UIEventSource<string>): BaseUIElement {
const prefix = "mapcomplete-unofficial-theme-"; var currentIds: UIEventSource<string[]> = state.installedUserThemes
var currentIds: Store<string[]> = state.osmConnection.preferencesHandler.preferences
.map(allPreferences => {
const ids: string[] = []
for (const key in allPreferences) {
if (key.startsWith(prefix) && key.endsWith("-combined-length")) {
const id = key.substring("mapcomplete-".length, key.length - "-combined-length".length)
ids.push(id)
}
}
return ids
});
var stableIds = Stores.ListStabilized<string>(currentIds) var stableIds = Stores.ListStabilized<string>(currentIds)
return new VariableUiElement( return new VariableUiElement(
stableIds.map(ids => { stableIds.map(ids => {
const allThemes: { element: BaseUIElement, predicate?: (s: string) => boolean }[] = [] const allThemes: { element: BaseUIElement, predicate?: (s: string) => boolean }[] = []
for (const id of ids) { for (const id of ids) {
const link = this.createUnofficialButtonFor(state, id) const themeInfo = state.GetUnofficialTheme(id)
if(themeInfo === undefined){
continue
}
const link = MoreScreen.createLinkButton(state, themeInfo, true)
if (link !== undefined) { if (link !== undefined) {
allThemes.push({ allThemes.push({
element: link.SetClass(buttonClass), element: link.SetClass(buttonClass),

View file

@ -1,4 +1,3 @@
import State from "../../State";
import Combine from "../Base/Combine"; import Combine from "../Base/Combine";
import LanguagePicker from "../LanguagePicker"; import LanguagePicker from "../LanguagePicker";
import Translations from "../i18n/Translations"; import Translations from "../i18n/Translations";
@ -6,12 +5,17 @@ import Toggle from "../Input/Toggle";
import {SubtleButton} from "../Base/SubtleButton"; import {SubtleButton} from "../Base/SubtleButton";
import {UIEventSource} from "../../Logic/UIEventSource"; import {UIEventSource} from "../../Logic/UIEventSource";
import {LoginToggle} from "../Popup/LoginButton"; import {LoginToggle} from "../Popup/LoginButton";
import Svg from "../../Svg";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {OsmConnection} from "../../Logic/Osm/OsmConnection";
import FullWelcomePaneWithTabs from "./FullWelcomePaneWithTabs";
import Title from "../Base/Title";
export default class ThemeIntroductionPanel extends Combine { export default class ThemeIntroductionPanel extends Combine {
constructor(isShown: UIEventSource<boolean>) { constructor(isShown: UIEventSource<boolean>, currentTab: UIEventSource<number>, state: { featureSwitchMoreQuests: UIEventSource<boolean>; featureSwitchAddNew: UIEventSource<boolean>; featureSwitchUserbadge: UIEventSource<boolean>; layoutToUse: LayoutConfig; osmConnection: OsmConnection }) {
const t = Translations.t.general const t = Translations.t.general
const layout = State.state.layoutToUse const layout = state.layoutToUse
const languagePicker = LanguagePicker.CreateLanguagePicker(layout.language, t.pickLanguage.Clone()) const languagePicker = LanguagePicker.CreateLanguagePicker(layout.language, t.pickLanguage.Clone())
@ -30,18 +34,35 @@ export default class ThemeIntroductionPanel extends Combine {
new Combine([Translations.t.general.loginWithOpenStreetMap.SetClass("text-xl font-bold"), new Combine([Translations.t.general.loginWithOpenStreetMap.SetClass("text-xl font-bold"),
Translations.t.general.loginOnlyNeededToEdit.Clone().SetClass("font-bold")] Translations.t.general.loginOnlyNeededToEdit.Clone().SetClass("font-bold")]
).SetClass("flex flex-col"), ).SetClass("flex flex-col"),
State.state state
), ),
undefined, undefined,
State.state.featureSwitchUserbadge state.featureSwitchUserbadge
) )
const hasPresets = layout.layers.some(l => l.presets?.length > 0)
super([ super([
layout.description.Clone().SetClass("blcok mb-4"), layout.description.Clone().SetClass("blcok mb-4"),
new Combine([
t.welcomeExplanation.general,
hasPresets ? Toggle.If( state.featureSwitchAddNew, () => t.welcomeExplanation.addNew) : undefined,
]).SetClass("flex flex-col mt-2"),
toTheMap, toTheMap,
loginStatus.SetClass("block"), loginStatus.SetClass("block"),
layout.descriptionTail?.Clone().SetClass("block mt-4"), layout.descriptionTail?.Clone().SetClass("block mt-4"),
languagePicker?.SetClass("block mt-4"), languagePicker?.SetClass("block mt-4"),
Toggle.If(state.featureSwitchMoreQuests,
() => new Combine([
t.welcomeExplanation.browseOtherThemesIntro,
new SubtleButton(Svg.add_ui().SetClass("h-6"),t.welcomeExplanation.browseMoreMaps )
.onClick(() => currentTab.setData(FullWelcomePaneWithTabs.MoreThemesTabIndex))
.SetClass("h-12")
]).SetClass("flex flex-col mt-6")),
...layout.CustomCodeSnippets() ...layout.CustomCodeSnippets()
]) ])

View file

@ -442,7 +442,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
* *
* The leaf objects are replaced in the object itself by the specified function * The leaf objects are replaced in the object itself by the specified function
*/ */
public static WalkPath(path: string[], object: any, replaceLeaf: ((leaf: any, travelledPath: string[]) => any), travelledPath: string[] = []) { public static WalkPath(path: string[], object: any, replaceLeaf: ((leaf: any, travelledPath: string[]) => any), travelledPath: string[] = []) : void {
if(object == null){
return;
}
const head = path[0] const head = path[0]
if (path.length === 1) { if (path.length === 1) {
// We have reached the leaf // We have reached the leaf

View file

@ -1,7 +1,7 @@
{ {
"contributors": [ "contributors": [
{ {
"commits": 3871, "commits": 3924,
"contributor": "Pieter Vander Vennet" "contributor": "Pieter Vander Vennet"
}, },
{ {

View file

@ -78,7 +78,7 @@
"ru": "Номер дома <b>{addr:housenumber}</b>", "ru": "Номер дома <b>{addr:housenumber}</b>",
"zh_Hans": "门牌号是<b>{addr:housenumber}</b>", "zh_Hans": "门牌号是<b>{addr:housenumber}</b>",
"id": "Nomor rumah ini <b>{addr:housenumber}</b>", "id": "Nomor rumah ini <b>{addr:housenumber}</b>",
"es": "La numeración de la casa es <b>{addr:housenumber}</b>", "es": "El número de puerta es <b>{addr:housenumber}</b>",
"da": "Husnummeret er <b>{addr:housenumber}</b>" "da": "Husnummeret er <b>{addr:housenumber}</b>"
}, },
"question": { "question": {

View file

@ -93,8 +93,8 @@
"it": " Come si chiama la strada in cui si trova questa stazione?", "it": " Come si chiama la strada in cui si trova questa stazione?",
"de": "In welcher Straße liegt die Rettungswache?", "de": "In welcher Straße liegt die Rettungswache?",
"hu": "Mi a neve annak az utcának, amelyben az állomás található?", "hu": "Mi a neve annak az utcának, amelyben az állomás található?",
"nl": " In welke straat ligt dit station?", "nl": "In welke straat ligt dit station?",
"es": " ¿Cual es el nombre de la calle en la que se encuentra la estación?", "es": "¿Cual es el nombre de la calle en la que se encuentra la estación?",
"da": " Hvad er vejnavnet, hvor stationen ligger?" "da": " Hvad er vejnavnet, hvor stationen ligger?"
}, },
"render": { "render": {

View file

@ -123,7 +123,8 @@
"en": "A machine is present which dispenses and accepts keys, eventually after authentication and/or payment. The bicycles are parked nearby", "en": "A machine is present which dispenses and accepts keys, eventually after authentication and/or payment. The bicycles are parked nearby",
"nl": "Hier is een machine die fietssleutels verdeelt en terugneemt, eventueel na aanmelden of betaling. De fietsen staan in de buurt geparkeerd", "nl": "Hier is een machine die fietssleutels verdeelt en terugneemt, eventueel na aanmelden of betaling. De fietsen staan in de buurt geparkeerd",
"hu": "Ez egy leadási pont: ennek a kerékpárkölcsönzőnek a kijelölt kerékpártárolója", "hu": "Ez egy leadási pont: ennek a kerékpárkölcsönzőnek a kijelölt kerékpártárolója",
"de": "Dies ist ein Automat, der Schlüssel ausgibt und annimmt, eventuell nach Authentifizierung und/oder Bezahlung. Die Fahrräder sind in der Nähe geparkt" "de": "Dies ist ein Automat, der Schlüssel ausgibt und annimmt, eventuell nach Authentifizierung und/oder Bezahlung. Die Fahrräder sind in der Nähe geparkt",
"es": "Una máquina que dispensa y acepta llaves, eventualmente después de la autenticación y/o el pago está presente. Las bicicletas están aparcadas cerca"
} }
}, },
{ {
@ -253,7 +254,8 @@
"nl": "Tandems kunnen hier gehuurd worden", "nl": "Tandems kunnen hier gehuurd worden",
"de": "Tandems können hier gemietet werden", "de": "Tandems können hier gemietet werden",
"da": "Tandemcykler kan lejes her", "da": "Tandemcykler kan lejes her",
"fr": "Des tandems peuvent être loués ici" "fr": "Des tandems peuvent être loués ici",
"es": "Aquí se pueden alquilar tándems"
} }
}, },
{ {

View file

@ -89,7 +89,8 @@
}, },
"then": { "then": {
"en": "Winkel", "en": "Winkel",
"de": "Geschäfte" "de": "Geschäfte",
"nl": "Shop"
} }
}, },
{ {

View file

@ -102,11 +102,13 @@
], ],
"title": { "title": {
"en": "a nightclub or disco", "en": "a nightclub or disco",
"nl": "een nachtclub of disco" "nl": "een nachtclub of disco",
"de": "einen Club oder eine Diskothek"
}, },
"description": { "description": {
"en": "A <b>nightclub</b> or disco with a focus on dancing, music by a DJ with accompanying light show and a bar to get (alcoholic) drinks", "en": "A <b>nightclub</b> or disco with a focus on dancing, music by a DJ with accompanying light show and a bar to get (alcoholic) drinks",
"nl": "Een <b>nachtclub</b> met dansvloer, DJ met bijhorende lichteffecten en bar waar men (alcoholische) dranken kan nuttigen" "nl": "Een <b>nachtclub</b> met dansvloer, DJ met bijhorende lichteffecten en bar waar men (alcoholische) dranken kan nuttigen",
"de": "Ein <b>Club</b> oder eine Diskothek mit Fokus auf Tanzen, Musik von einem DJ mit begleitender Lichtshow und einer Bar, an der man (alkoholische) Getränke bekommt"
}, },
"preciseInput": { "preciseInput": {
"preferredBackground": "map" "preferredBackground": "map"
@ -231,7 +233,8 @@
"if": "amenity=nightclub", "if": "amenity=nightclub",
"then": { "then": {
"en": "This is a <b>nightclub</b> or disco with a focus on dancing, music by a DJ with accompanying light show and a bar to get (alcoholic) drinks", "en": "This is a <b>nightclub</b> or disco with a focus on dancing, music by a DJ with accompanying light show and a bar to get (alcoholic) drinks",
"nl": "Dit is een <b>nachtclub</b> met dansvloer, DJ met bijhorende lichteffecten en bar waar men (alcoholische) dranken kan nuttigen" "nl": "Dit is een <b>nachtclub</b> met dansvloer, DJ met bijhorende lichteffecten en bar waar men (alcoholische) dranken kan nuttigen",
"de": "Dies ist ein <b>Club</b> oder eine Disco mit Fokus auf Tanzen, Musik von einem DJ mit begleitender Lichtshow und einer Bar, an der man (alkoholische) Getränke bekommt"
} }
} }
], ],

View file

@ -207,7 +207,7 @@
"if": "access=private", "if": "access=private",
"then": { "then": {
"en": "Not accessible to the general public (e.g. only accessible to the owners, employees, …)", "en": "Not accessible to the general public (e.g. only accessible to the owners, employees, …)",
"nl": "Niet toegankelijk voor het publiek <br/><span class='subtle'>Bv. enkel toegankelijk voor de eigenaar, medewerkers ,...</span>", "nl": "Niet toegankelijk voor het publiek <br/><span class='subtle'>Bv. enkel toegankelijk voor de eigenaar, medewerkers, ...</span>",
"de": "Die Station ist nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, …)", "de": "Die Station ist nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, …)",
"es": "No accesible al público general (ej. solo accesible a los propietarios, empleados, ...)" "es": "No accesible al público general (ej. solo accesible a los propietarios, empleados, ...)"
} }

View file

@ -322,11 +322,13 @@
"id": "max_bolts", "id": "max_bolts",
"question": { "question": {
"en": "How many bolts do routes in {title()} have at most?", "en": "How many bolts do routes in {title()} have at most?",
"de": "Wie viele Haken haben die Routen in {title()} maximal?" "de": "Wie viele Haken haben die Routen in {title()} maximal?",
"nl": "Wat is het maximum aantal bouten in routes ban {title()}?"
}, },
"render": { "render": {
"en": "The sport climbing routes here have at most {climbing:bolts:max} bolts.<div class='subtle'>This is without relays and indicates how much quickdraws a climber needs</div>", "en": "The sport climbing routes here have at most {climbing:bolts:max} bolts.<div class='subtle'>This is without relays and indicates how much quickdraws a climber needs</div>",
"de": "Die Sportkletterrouten hier haben maximal {climbing:bolts:max} Haken.<div class='subtle'>Dies ist ohne Relais und gibt an, wie viel Schnellspanner ein Kletterer braucht</div>" "de": "Die Sportkletterrouten hier haben maximal {climbing:bolts:max} Haken.<div class='subtle'>Dies ist ohne Relais und gibt an, wie viel Schnellspanner ein Kletterer braucht</div>",
"nl": "De sportklimroutes hebben maximaal {climbing:bolts:max} bouten. <div class='subtle'>Hierbij worden relays niet meegteld. Dit geeft aan hoeveel klimsetjes een klimmer nodig heeft</div>"
}, },
"freeform": { "freeform": {
"key": "climbing:bolts:max", "key": "climbing:bolts:max",
@ -342,12 +344,14 @@
"question": { "question": {
"en": "Is a fee required to climb here?", "en": "Is a fee required to climb here?",
"es": "¿Se requiere una tasa para escalar aquí?", "es": "¿Se requiere una tasa para escalar aquí?",
"de": "Ist das Klettern hier gebührenpflichtig?" "de": "Ist das Klettern hier gebührenpflichtig?",
"nl": "Moet men betalen om hier te klimmen?"
}, },
"render": { "render": {
"en": "A fee of {charge} should be paid for climbing here", "en": "A fee of {charge} should be paid for climbing here",
"de": "Zum Klettern wird eine Gebühr von {charge} erhoben", "de": "Zum Klettern wird eine Gebühr von {charge} erhoben",
"es": "Se debe de pagar una tasa de {charge} para escalar aquí" "es": "Se debe de pagar una tasa de {charge} para escalar aquí",
"nl": "Men moet {charge} betalen om hier te klimmen"
}, },
"freeform": { "freeform": {
"key": "charge", "key": "charge",
@ -365,7 +369,8 @@
"then": { "then": {
"en": "Climbing here is free of charge", "en": "Climbing here is free of charge",
"de": "Das Klettern ist hier kostenlos", "de": "Das Klettern ist hier kostenlos",
"es": "La escalada es gratis" "es": "La escalada es gratis",
"nl": "Hier klimmen is gratis"
} }
}, },
{ {
@ -378,7 +383,8 @@
"then": { "then": {
"en": "Paying a fee is required to climb here", "en": "Paying a fee is required to climb here",
"es": "Hay que pagar una tasa para escalar aquí", "es": "Hay que pagar una tasa para escalar aquí",
"de": "Zum Klettern ist eine Gebühr zu entrichten" "de": "Zum Klettern ist eine Gebühr zu entrichten",
"nl": "Men moet betalen om hier te klimmen"
}, },
"hideInAnswer": "charge~*" "hideInAnswer": "charge~*"
} }

View file

@ -10,7 +10,8 @@
}, },
"description": { "description": {
"en": "An area where climbing is possible, e.g. a crag, site, boulder, … Contains aggregation of routes", "en": "An area where climbing is possible, e.g. a crag, site, boulder, … Contains aggregation of routes",
"de": "Ein Gebiet, in dem Klettern möglich ist, z. B. ein Felsen, ein Klettergarten, eine Boulderhalle, … Enthält eine Sammlung von Routen" "de": "Ein Gebiet, in dem Klettern möglich ist, z. B. ein Felsen, ein Klettergarten, eine Boulderhalle, … Enthält eine Sammlung von Routen",
"nl": "Een gebied waar klimmen mogelijk is, bv. een klimsite, een bolder of klimrots,…"
}, },
"minzoom": 10, "minzoom": 10,
"source": { "source": {
@ -118,7 +119,8 @@
"en": "<h3>Length overview</h3>{histogram(_length_hist)}", "en": "<h3>Length overview</h3>{histogram(_length_hist)}",
"fr": "<h3>Résumé de longueur</h3>{histogram(_length_hist)}", "fr": "<h3>Résumé de longueur</h3>{histogram(_length_hist)}",
"de": "<h3>Längenübersicht</h3>{histogram(_length_hist)}", "de": "<h3>Längenübersicht</h3>{histogram(_length_hist)}",
"it": "<h3>Riassunto della lunghezza</h3>{histogram(_length_hist)}" "it": "<h3>Riassunto della lunghezza</h3>{histogram(_length_hist)}",
"nl": "<h3>Overzicht van lengtes</h3>{histogram(_length_hist)}"
}, },
"condition": "_length_hist!~\\[\\]", "condition": "_length_hist!~\\[\\]",
"id": "Contained routes length hist" "id": "Contained routes length hist"
@ -128,7 +130,8 @@
"en": "<h3>Grades overview</h3>{histogram(_difficulty_hist)}", "en": "<h3>Grades overview</h3>{histogram(_difficulty_hist)}",
"fr": "<h3>Résumé des difficultés</h3>{histogram(_difficulty_hist)}", "fr": "<h3>Résumé des difficultés</h3>{histogram(_difficulty_hist)}",
"de": "<h3>Schwierigkeitsübersicht</h3>{histogram(_difficulty_hist)}", "de": "<h3>Schwierigkeitsübersicht</h3>{histogram(_difficulty_hist)}",
"it": "<h3>Riassunto delle difficoltà</h3>{histogram(_difficulty_hist)}" "it": "<h3>Riassunto delle difficoltà</h3>{histogram(_difficulty_hist)}",
"nl": "<h3>Overzicht van moeilijkheidsgraden</h>{histogram(_difficulty_hist)}"
}, },
"condition": "_difficulty_hist!~\\[\\]", "condition": "_difficulty_hist!~\\[\\]",
"id": "Contained routes hist" "id": "Contained routes hist"
@ -219,13 +222,15 @@
"en": "What is the rock type here?", "en": "What is the rock type here?",
"fr": "Quel est le type de roche ?", "fr": "Quel est le type de roche ?",
"de": "Welchen Gesteinstyp gibt es hier?", "de": "Welchen Gesteinstyp gibt es hier?",
"it": "Qual è il tipo di roccia qua?" "it": "Qual è il tipo di roccia qua?",
"nl": "Wat is de rotssoort?"
}, },
"render": { "render": {
"en": "The rock type is {rock}", "en": "The rock type is {rock}",
"fr": "La roche est du {rock}", "fr": "La roche est du {rock}",
"de": "Der Gesteinstyp ist {rock}", "de": "Der Gesteinstyp ist {rock}",
"it": "Il tipo di roccia è {rock}" "it": "Il tipo di roccia è {rock}",
"nl": "De rotssoort is {rock}"
}, },
"freeform": { "freeform": {
"key": "rock" "key": "rock"

View file

@ -9,7 +9,7 @@
}, },
"description": { "description": {
"en": "A layer showing entrances and offering capabilities to survey some advanced data which is important for e.g. wheelchair users (but also bicycle users, people who want to deliver, …)", "en": "A layer showing entrances and offering capabilities to survey some advanced data which is important for e.g. wheelchair users (but also bicycle users, people who want to deliver, …)",
"nl": "Een laag met ingangen (van gebouwen etc.) waarmee je details kunt aanvullen die belangrijk zijn voor bijvoorbeeld rolstoelgebruikers (en fietsers, leveranciers, ...)", "nl": "Een laag met ingangen (van gebouwen etc.) waarmee je details kunt aanvullen die belangrijk zijn voor bijvoorbeeld rolstoelgebruikers (en fietsers, leveranciers, )",
"de": "Eine Ebene, die Eingänge anzeigt und die Möglichkeit bietet, weitere Daten zu erheben, die z. B. für Rollstuhlfahrer wichtig sind (aber auch für Radfahrer, Lieferpersonal, …)", "de": "Eine Ebene, die Eingänge anzeigt und die Möglichkeit bietet, weitere Daten zu erheben, die z. B. für Rollstuhlfahrer wichtig sind (aber auch für Radfahrer, Lieferpersonal, …)",
"es": "Una capa que muestra capas y ofrece la posibilidad de sondear algunos datos avanzados que son importantes para, por ejemplo, usuarios de sillas de ruedas (pero también incluye ciclistas, gente que quiere repartir, ...)" "es": "Una capa que muestra capas y ofrece la posibilidad de sondear algunos datos avanzados que son importantes para, por ejemplo, usuarios de sillas de ruedas (pero también incluye ciclistas, gente que quiere repartir, ...)"
}, },
@ -104,7 +104,7 @@
}, },
"then": { "then": {
"en": "This is a service entrance - normally only used for employees, delivery, …", "en": "This is a service entrance - normally only used for employees, delivery, …",
"nl": "Dit is een dienstingang - normaal gezien enkel gebruikt door werknemers, leveranciers, ...", "nl": "Dit is een dienstingang - normaal gezien enkel gebruikt door werknemers, leveranciers, ",
"de": "Dies ist ein Diensteingang - normalerweise nur für Mitarbeiter, Anlieferung, …", "de": "Dies ist ein Diensteingang - normalerweise nur für Mitarbeiter, Anlieferung, …",
"es": "Esta es una entrada de servicio - normalmente solo la utilizan empleados, repartidores, …" "es": "Esta es una entrada de servicio - normalmente solo la utilizan empleados, repartidores, …"
} }

View file

@ -8,7 +8,7 @@
"fr": "Couche des extincteurs.", "fr": "Couche des extincteurs.",
"de": "Feuerlöscher", "de": "Feuerlöscher",
"it": "Cartina degli estintori.", "it": "Cartina degli estintori.",
"nl": "Kaart van brandblussers.", "nl": "Kaart van brandblussers",
"es": "Mapa de extintores" "es": "Mapa de extintores"
}, },
"minzoom": 14, "minzoom": 14,

View file

@ -386,19 +386,23 @@
{ {
"id": "delivery", "id": "delivery",
"question": { "question": {
"en": "Delivers {title()} their food at home?" "en": "Delivers {title()} their food at home?",
"de": "Liefert {title()} ihr Essen nach Hause?",
"nl": "Levert {title()} aan huis?"
}, },
"mappings": [ "mappings": [
{ {
"if": "delivery=yes", "if": "delivery=yes",
"then": { "then": {
"en": "This business does home delivery (eventually via a third party)" "en": "This business does home delivery (eventually via a third party)",
"de": "Dieses Unternehmen liefert nach Hause (eventuell über eine dritte Partei)"
} }
}, },
{ {
"if": "delivery=no", "if": "delivery=no",
"then": { "then": {
"en": "This business does not deliver at home" "en": "This business does not deliver at home",
"de": "Dieses Unternehmen liefert nicht nach Hause"
} }
} }
] ]

View file

@ -6,7 +6,8 @@
"ru": "Хакерспейс", "ru": "Хакерспейс",
"zh_Hant": "駭客空間", "zh_Hant": "駭客空間",
"hu": "Hackerspace", "hu": "Hackerspace",
"es": "Espacio hacker" "es": "Espacio hacker",
"nl": "Hackerspace"
}, },
"minzoom": 8, "minzoom": 8,
"title": { "title": {
@ -16,7 +17,8 @@
"ru": "Хакерспейс", "ru": "Хакерспейс",
"zh_Hant": "駭客空間", "zh_Hant": "駭客空間",
"hu": "Hackerspace", "hu": "Hackerspace",
"es": "Espacio Hacker" "es": "Espacio Hacker",
"nl": "Hackerspace"
}, },
"mappings": [ "mappings": [
{ {
@ -32,7 +34,8 @@
"zh_Hant": " {name}", "zh_Hant": " {name}",
"hu": " {name}", "hu": " {name}",
"ca": " {name}", "ca": " {name}",
"es": " {name}" "es": " {name}",
"nl": " {name}"
} }
} }
] ]
@ -43,7 +46,8 @@
"ru": "Хакерспейс", "ru": "Хакерспейс",
"zh_Hant": "駭客空間", "zh_Hant": "駭客空間",
"hu": "Hackerspace", "hu": "Hackerspace",
"es": "Espacio hacker" "es": "Espacio hacker",
"nl": "Hackerspace"
}, },
"tagRenderings": [ "tagRenderings": [
{ {
@ -53,7 +57,8 @@
"de": "Ist dies ein Hackerspace oder ein Makerspace?", "de": "Ist dies ein Hackerspace oder ein Makerspace?",
"zh_Hant": "這邊是駭客空間還是創客空間?", "zh_Hant": "這邊是駭客空間還是創客空間?",
"hu": "Ez hackerspace vagy makerspace?", "hu": "Ez hackerspace vagy makerspace?",
"es": "¿Esto es un espacio hacker o un espacio maker?" "es": "¿Esto es un espacio hacker o un espacio maker?",
"nl": "Is dit een hackerspace of een makerspace?"
}, },
"mappings": [ "mappings": [
{ {
@ -63,7 +68,8 @@
"de": "Dies ist ein Makerspace", "de": "Dies ist ein Makerspace",
"zh_Hant": "這是創客空間", "zh_Hant": "這是創客空間",
"hu": "Ez egy makerspace", "hu": "Ez egy makerspace",
"es": "Este es un espacio maker" "es": "Este es un espacio maker",
"nl": "Dit is een makerspace"
} }
}, },
{ {
@ -73,7 +79,8 @@
"de": "Dies ist ein traditioneller (softwareorientierter) Hackerspace", "de": "Dies ist ein traditioneller (softwareorientierter) Hackerspace",
"zh_Hant": "這是傳統的 (軟體導向) 駭客空間", "zh_Hant": "這是傳統的 (軟體導向) 駭客空間",
"hu": "Ez egy hagyományos (szoftverekkel foglalkozó) hackerspace", "hu": "Ez egy hagyományos (szoftverekkel foglalkozó) hackerspace",
"es": "Este es un espacio hacker tradicional (orientado al software)" "es": "Este es un espacio hacker tradicional (orientado al software)",
"nl": "Dit een een traditionele (software-gerichte) hackerspace"
} }
} }
] ]
@ -83,13 +90,15 @@
"en": "What is the name of this hackerspace?", "en": "What is the name of this hackerspace?",
"de": "Wie lautet der Name dieses Hackerspace?", "de": "Wie lautet der Name dieses Hackerspace?",
"zh_Hant": "這個駭客空間的名稱是?", "zh_Hant": "這個駭客空間的名稱是?",
"es": "¿Cual es el nombre de este espacio hacker?" "es": "¿Cual es el nombre de este espacio hacker?",
"nl": "Wat is de naam van deze hackerspace?"
}, },
"render": { "render": {
"en": "This hackerspace is named <b>{name}</b>", "en": "This hackerspace is named <b>{name}</b>",
"de": "Dieser Hackerspace heißt <b>{name}</b>", "de": "Dieser Hackerspace heißt <b>{name}</b>",
"zh_Hant": "這個駭客空間叫 <b>{name}</b>", "zh_Hant": "這個駭客空間叫 <b>{name}</b>",
"es": "Este espacio hacker se llama <b>{name}</b>" "es": "Este espacio hacker se llama <b>{name}</b>",
"nl": "Deze hackerspace heet <b>{name}</b>"
}, },
"freeform": { "freeform": {
"key": "name" "key": "name"
@ -104,7 +113,8 @@
"en": "When is this hackerspace opened?", "en": "When is this hackerspace opened?",
"de": "Wann hat dieser Hackerspace geöffnet?", "de": "Wann hat dieser Hackerspace geöffnet?",
"zh_Hant": "這個駭客空間的營業時間?", "zh_Hant": "這個駭客空間的營業時間?",
"es": "¿Cuándo está abierto este espacio hacker?" "es": "¿Cuándo está abierto este espacio hacker?",
"nl": "Wanneer is deze hackerspace geopend?"
}, },
"freeform": { "freeform": {
"key": "opening_hours", "key": "opening_hours",
@ -116,7 +126,8 @@
"ru": "{opening_hours_table()}", "ru": "{opening_hours_table()}",
"zh_Hant": "{opening_hours_table()}", "zh_Hant": "{opening_hours_table()}",
"ca": "{opening_hours_table()}", "ca": "{opening_hours_table()}",
"es": "{opening_hours_table()}" "es": "{opening_hours_table()}",
"nl": "{opening_hours_table()}"
}, },
"mappings": [ "mappings": [
{ {
@ -131,7 +142,8 @@
"ru": "Открыто 24/7", "ru": "Открыто 24/7",
"zh_Hant": "24/7 營業", "zh_Hant": "24/7 營業",
"ca": "Obert 24/7", "ca": "Obert 24/7",
"es": "Abierto 24/7" "es": "Abierto 24/7",
"nl": "24/7 geopend"
} }
} }
], ],
@ -213,7 +225,8 @@
"question": { "question": {
"en": "Does this hackerspace serve Club Mate?", "en": "Does this hackerspace serve Club Mate?",
"de": "Gibt es in diesem Hackerspace Club Mate?", "de": "Gibt es in diesem Hackerspace Club Mate?",
"zh_Hant": "這個駭客空間是否服務俱樂部伙伴?" "zh_Hant": "這個駭客空間是否服務俱樂部伙伴?",
"nl": "Biedt deze hackerspace club-mate aan?"
}, },
"mappings": [ "mappings": [
{ {
@ -225,7 +238,8 @@
"then": { "then": {
"en": "This hackerspace serves club mate", "en": "This hackerspace serves club mate",
"de": "In diesem Hackerspace gibt es Club Mate", "de": "In diesem Hackerspace gibt es Club Mate",
"zh_Hant": "這個駭客空間服務俱樂部伙伴" "zh_Hant": "這個駭客空間服務俱樂部伙伴",
"nl": "Deze hackerspace biedt clube-mate aan"
} }
}, },
{ {
@ -237,7 +251,8 @@
"then": { "then": {
"en": "This hackerspace does not serve club mate", "en": "This hackerspace does not serve club mate",
"de": "In diesem Hackerspace gibt es kein Club Mate", "de": "In diesem Hackerspace gibt es kein Club Mate",
"zh_Hant": "這個駭客空間沒有服務俱樂部伙伴" "zh_Hant": "這個駭客空間沒有服務俱樂部伙伴",
"nl": "Deze hackerspace biedt geen club-mate aan"
} }
} }
] ]
@ -247,13 +262,15 @@
"en": "This hackerspace was founded at {start_date}", "en": "This hackerspace was founded at {start_date}",
"de": "Dieser Hackerspace wurde gegründet am {start_date}", "de": "Dieser Hackerspace wurde gegründet am {start_date}",
"zh_Hant": "這駭客空間是 {start_date} 成立的", "zh_Hant": "這駭客空間是 {start_date} 成立的",
"es": "Este espacio hacker se fundó el {start_date}" "es": "Este espacio hacker se fundó el {start_date}",
"nl": "Deze hackerspace is opgericht op {start_date}"
}, },
"question": { "question": {
"en": "When was this hackerspace founded?", "en": "When was this hackerspace founded?",
"de": "Wann wurde dieser Hackerspace gegründet?", "de": "Wann wurde dieser Hackerspace gegründet?",
"zh_Hant": "這個駭客空間何時成立的?", "zh_Hant": "這個駭客空間何時成立的?",
"es": "¿Cuándo se fundó este espacio hacker?" "es": "¿Cuándo se fundó este espacio hacker?",
"nl": "Wanneer is deze hackerspace opgericht?"
}, },
"freeform": { "freeform": {
"key": "start_date", "key": "start_date",
@ -273,14 +290,16 @@
"ru": "Хакерспейс", "ru": "Хакерспейс",
"zh_Hant": "駭客空間", "zh_Hant": "駭客空間",
"hu": "Hackerspace", "hu": "Hackerspace",
"es": "un espacio hacker" "es": "un espacio hacker",
"nl": "een hackerspace"
}, },
"description": { "description": {
"en": "A hackerspace is an area where people interested in software gather", "en": "A hackerspace is an area where people interested in software gather",
"de": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren", "de": "Ein Hackerspace ist ein Ort, an dem sich Menschen treffen, die sich für Software interessieren",
"zh_Hant": "駭客空間是對軟體有興趣的人聚集的地方", "zh_Hant": "駭客空間是對軟體有興趣的人聚集的地方",
"hu": "A hackerspace egy olyan hely, ahol szoftverek iránt érdeklő emberek találkoznak", "hu": "A hackerspace egy olyan hely, ahol szoftverek iránt érdeklő emberek találkoznak",
"es": "Un espacio hacker es un lugar en el que gente interesada en software se reúne" "es": "Un espacio hacker es un lugar en el que gente interesada en software se reúne",
"nl": "Een hackerspace is een ruimte waar mensen met een interesse in software samenkomen"
} }
}, },
{ {
@ -293,14 +312,16 @@
"de": "einen Makerspace", "de": "einen Makerspace",
"zh_Hant": "創客空間", "zh_Hant": "創客空間",
"hu": "Makerspace", "hu": "Makerspace",
"es": "un espacio maker" "es": "un espacio maker",
"nl": "een makerspace"
}, },
"description": { "description": {
"en": "A makerspace is a place where DIY-enthusiasts gather to experiment with electronics such as arduino, LEDstrips, …", "en": "A makerspace is a place where DIY-enthusiasts gather to experiment with electronics such as arduino, LEDstrips, …",
"de": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, …", "de": "Ein Makerspace ist ein Ort, an dem Heimwerker-Enthusiasten zusammenkommen, um mit Elektronik zu experimentieren, wie Arduino, LED-Strips, …",
"zh_Hant": "創客空間是 DIY 愛好者聚集在一起弄電子零件實驗,例如用 arduino、LEDstrips 等...", "zh_Hant": "創客空間是 DIY 愛好者聚集在一起弄電子零件實驗,例如用 arduino、LEDstrips 等...",
"hu": "A makerspace olyan hely, ahol a barkácsolás szerelmesei találkoznak, hogy olyan elektronikai eszközökkel kísérletezzenek, mint például az Arduino vagy a LEDstrips…", "hu": "A makerspace olyan hely, ahol a barkácsolás szerelmesei találkoznak, hogy olyan elektronikai eszközökkel kísérletezzenek, mint például az Arduino vagy a LEDstrips…",
"es": "Un espacio maker es un lugar donde entusiastas del DIY se reúnen para experimentar con electrónica, como arduino, …" "es": "Un espacio maker es un lugar donde entusiastas del DIY se reúnen para experimentar con electrónica, como arduino, …",
"nl": "Een makerspace is een ruimte waar makers en creatievelingen samenkomen om met electronica te experimenteren en te bouwen, bv. met Arduino, LED-strips, 3D-printers, lasercutters, …"
} }
} }
], ],

View file

@ -0,0 +1,205 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="700pt"
height="700pt"
version="1.1"
viewBox="0 0 700 700"
id="svg154"
sodipodi:docname="childcare.svg"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
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">
<sodipodi:namedview
id="namedview156"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:document-units="pt"
showgrid="false"
inkscape:zoom="0.27202157"
inkscape:cx="-84.552117"
inkscape:cy="-124.99009"
inkscape:current-layer="g152" />
<defs
id="defs68">
<symbol
id="v"
overflow="visible">
<path
d="m18.766-1.125c-0.96875 0.5-1.9805 0.875-3.0312 1.125-1.043 0.25781-2.1367 0.39062-3.2812 0.39062-3.3984 0-6.0898-0.94531-8.0781-2.8438-1.9922-1.9062-2.9844-4.4844-2.9844-7.7344 0-3.2578 0.99219-5.8359 2.9844-7.7344 1.9883-1.9062 4.6797-2.8594 8.0781-2.8594 1.1445 0 2.2383 0.13281 3.2812 0.39062 1.0508 0.25 2.0625 0.625 3.0312 1.125v4.2188c-0.98047-0.65625-1.9453-1.1406-2.8906-1.4531-0.94922-0.3125-1.9492-0.46875-3-0.46875-1.875 0-3.3516 0.60547-4.4219 1.8125-1.0742 1.1992-1.6094 2.8555-1.6094 4.9688 0 2.1055 0.53516 3.7617 1.6094 4.9688 1.0703 1.1992 2.5469 1.7969 4.4219 1.7969 1.0508 0 2.0508-0.14844 3-0.45312 0.94531-0.3125 1.9102-0.80078 2.8906-1.4688z"
id="path2" />
</symbol>
<symbol
id="d"
overflow="visible">
<path
d="m13.734-11.141c-0.4375-0.19531-0.87109-0.34375-1.2969-0.4375-0.41797-0.10156-0.83984-0.15625-1.2656-0.15625-1.2617 0-2.2305 0.40625-2.9062 1.2188-0.67969 0.80469-1.0156 1.9531-1.0156 3.4531v7.0625h-4.8906v-15.312h4.8906v2.5156c0.625-1 1.3438-1.7266 2.1562-2.1875 0.82031-0.46875 1.8008-0.70312 2.9375-0.70312 0.16406 0 0.34375 0.011719 0.53125 0.03125 0.19531 0.011719 0.47656 0.039062 0.84375 0.078125z"
id="path5" />
</symbol>
<symbol
id="a"
overflow="visible">
<path
d="m17.641-7.7031v1.4062h-11.453c0.125 1.1484 0.53906 2.0078 1.25 2.5781 0.70703 0.57422 1.7031 0.85938 2.9844 0.85938 1.0312 0 2.082-0.14844 3.1562-0.45312 1.082-0.3125 2.1914-0.77344 3.3281-1.3906v3.7656c-1.1562 0.4375-2.3125 0.76562-3.4688 0.98438-1.1562 0.22656-2.3125 0.34375-3.4688 0.34375-2.7734 0-4.9297-0.70312-6.4688-2.1094-1.5312-1.4062-2.2969-3.3789-2.2969-5.9219 0-2.5 0.75391-4.4609 2.2656-5.8906 1.5078-1.4375 3.582-2.1562 6.2188-2.1562 2.4062 0 4.332 0.73047 5.7812 2.1875 1.4453 1.4492 2.1719 3.3828 2.1719 5.7969zm-5.0312-1.625c0-0.92578-0.27344-1.6719-0.8125-2.2344-0.54297-0.57031-1.25-0.85938-2.125-0.85938-0.94922 0-1.7188 0.26562-2.3125 0.79688s-0.96484 1.2969-1.1094 2.2969z"
id="path8" />
</symbol>
<symbol
id="e"
overflow="visible">
<path
d="m9.2188-6.8906c-1.0234 0-1.793 0.17188-2.3125 0.51562-0.51172 0.34375-0.76562 0.85547-0.76562 1.5312 0 0.625 0.20703 1.1172 0.625 1.4688 0.41406 0.34375 0.98828 0.51562 1.7188 0.51562 0.92578 0 1.7031-0.32812 2.3281-0.98438 0.63281-0.66406 0.95312-1.4922 0.95312-2.4844v-0.5625zm7.4688-1.8438v8.7344h-4.9219v-2.2656c-0.65625 0.92969-1.3984 1.6055-2.2188 2.0312-0.82422 0.41406-1.8242 0.625-3 0.625-1.5859 0-2.8711-0.45703-3.8594-1.375-0.99219-0.92578-1.4844-2.1289-1.4844-3.6094 0-1.7891 0.61328-3.1016 1.8438-3.9375 1.2383-0.84375 3.1797-1.2656 5.8281-1.2656h2.8906v-0.39062c0-0.76953-0.30859-1.332-0.92188-1.6875-0.61719-0.36328-1.5703-0.54688-2.8594-0.54688-1.0547 0-2.0312 0.10547-2.9375 0.3125-0.89844 0.21094-1.7305 0.52344-2.5 0.9375v-3.7344c1.0391-0.25 2.0859-0.44141 3.1406-0.57812 1.0625-0.13281 2.125-0.20312 3.1875-0.20312 2.7578 0 4.75 0.54688 5.9688 1.6406 1.2266 1.0859 1.8438 2.8555 1.8438 5.3125z"
id="path11" />
</symbol>
<symbol
id="c"
overflow="visible">
<path
d="m7.7031-19.656v4.3438h5.0469v3.5h-5.0469v6.5c0 0.71094 0.14062 1.1875 0.42188 1.4375s0.83594 0.375 1.6719 0.375h2.5156v3.5h-4.1875c-1.9375 0-3.3125-0.39844-4.125-1.2031-0.80469-0.8125-1.2031-2.1797-1.2031-4.1094v-6.5h-2.4219v-3.5h2.4219v-4.3438z"
id="path14" />
</symbol>
<symbol
id="k"
overflow="visible">
<path
d="m12.766-13.078v-8.2031h4.9219v21.281h-4.9219v-2.2188c-0.66797 0.90625-1.4062 1.5703-2.2188 1.9844s-1.7578 0.625-2.8281 0.625c-1.8867 0-3.4336-0.75-4.6406-2.25-1.2109-1.5-1.8125-3.4258-1.8125-5.7812 0-2.3633 0.60156-4.2969 1.8125-5.7969 1.207-1.5 2.7539-2.25 4.6406-2.25 1.0625 0 2 0.21484 2.8125 0.64062 0.82031 0.42969 1.5664 1.0859 2.2344 1.9688zm-3.2188 9.9219c1.0391 0 1.8359-0.37891 2.3906-1.1406 0.55078-0.76953 0.82812-1.8828 0.82812-3.3438 0-1.457-0.27734-2.5664-0.82812-3.3281-0.55469-0.76953-1.3516-1.1562-2.3906-1.1562-1.043 0-1.8398 0.38672-2.3906 1.1562-0.55469 0.76172-0.82812 1.8711-0.82812 3.3281 0 1.4609 0.27344 2.5742 0.82812 3.3438 0.55078 0.76172 1.3477 1.1406 2.3906 1.1406z"
id="path17" />
</symbol>
<symbol
id="j"
overflow="visible">
<path
d="m10.5-3.1562c1.0508 0 1.8516-0.37891 2.4062-1.1406 0.55078-0.76953 0.82812-1.8828 0.82812-3.3438 0-1.457-0.27734-2.5664-0.82812-3.3281-0.55469-0.76953-1.3555-1.1562-2.4062-1.1562-1.0547 0-1.8594 0.38672-2.4219 1.1562-0.55469 0.77344-0.82812 1.8828-0.82812 3.3281 0 1.4492 0.27344 2.5586 0.82812 3.3281 0.5625 0.77344 1.3672 1.1562 2.4219 1.1562zm-3.25-9.9219c0.67578-0.88281 1.4219-1.5391 2.2344-1.9688 0.82031-0.42578 1.7656-0.64062 2.8281-0.64062 1.8945 0 3.4453 0.75 4.6562 2.25 1.207 1.5 1.8125 3.4336 1.8125 5.7969 0 2.3555-0.60547 4.2812-1.8125 5.7812-1.2109 1.5-2.7617 2.25-4.6562 2.25-1.0625 0-2.0078-0.21094-2.8281-0.625-0.8125-0.42578-1.5586-1.0859-2.2344-1.9844v2.2188h-4.8906v-21.281h4.8906z"
id="path20" />
</symbol>
<symbol
id="i"
overflow="visible">
<path
d="m0.34375-15.312h4.8906l4.125 10.391 3.5-10.391h4.8906l-6.4375 16.766c-0.64844 1.6953-1.4023 2.8828-2.2656 3.5625-0.86719 0.6875-2 1.0312-3.4062 1.0312h-2.8438v-3.2188h1.5312c0.83203 0 1.4375-0.13672 1.8125-0.40625 0.38281-0.26172 0.67969-0.73047 0.89062-1.4062l0.14062-0.42188z"
id="path23" />
</symbol>
<symbol
id="h"
overflow="visible">
<path
d="m7.8281-16.438v12.453h1.8906c2.1562 0 3.8008-0.53125 4.9375-1.5938 1.1328-1.0625 1.7031-2.6133 1.7031-4.6562 0-2.0195-0.57031-3.5547-1.7031-4.6094-1.125-1.0625-2.7734-1.5938-4.9375-1.5938zm-5.25-3.9688h5.5469c3.0938 0 5.3984 0.21875 6.9219 0.65625 1.5195 0.4375 2.8203 1.1875 3.9062 2.25 0.95703 0.91797 1.6641 1.9805 2.125 3.1875 0.46875 1.1992 0.70312 2.5586 0.70312 4.0781 0 1.543-0.23438 2.918-0.70312 4.125-0.46094 1.2109-1.168 2.2773-2.125 3.2031-1.0938 1.0547-2.4062 1.8047-3.9375 2.25-1.5312 0.4375-3.8281 0.65625-6.8906 0.65625h-5.5469z"
id="path26" />
</symbol>
<symbol
id="g"
overflow="visible">
<path
d="m2.3594-15.312h4.8906v15.312h-4.8906zm0-5.9688h4.8906v4h-4.8906z"
id="path29" />
</symbol>
<symbol
id="u"
overflow="visible">
<path
d="m12.766-2.5938c-0.66797 0.88672-1.4062 1.543-2.2188 1.9688-0.8125 0.41797-1.7578 0.625-2.8281 0.625-1.8672 0-3.4062-0.73438-4.625-2.2031-1.2188-1.4766-1.8281-3.3516-1.8281-5.625 0-2.2891 0.60938-4.1641 1.8281-5.625 1.2188-1.4688 2.7578-2.2031 4.625-2.2031 1.0703 0 2.0156 0.21484 2.8281 0.64062 0.8125 0.41797 1.5508 1.0742 2.2188 1.9688v-2.2656h4.9219v13.766c0 2.457-0.77734 4.3359-2.3281 5.6406-1.5547 1.3008-3.8086 1.9531-6.7656 1.9531-0.94922 0-1.8711-0.074219-2.7656-0.21875-0.89844-0.14844-1.7969-0.37109-2.7031-0.67188v-3.8125c0.86328 0.48828 1.7031 0.85156 2.5156 1.0938 0.82031 0.23828 1.6484 0.35938 2.4844 0.35938 1.6016 0 2.7734-0.35156 3.5156-1.0469 0.75-0.69922 1.125-1.7969 1.125-3.2969zm-3.2188-9.5312c-1.0117 0-1.8047 0.375-2.375 1.125-0.5625 0.74219-0.84375 1.7969-0.84375 3.1719 0 1.3984 0.26953 2.4609 0.8125 3.1875 0.55078 0.71875 1.3516 1.0781 2.4062 1.0781 1.0195 0 1.8125-0.36719 2.375-1.1094 0.5625-0.75 0.84375-1.8008 0.84375-3.1562 0-1.375-0.28125-2.4297-0.84375-3.1719-0.5625-0.75-1.3555-1.125-2.375-1.125z"
id="path32" />
</symbol>
<symbol
id="b"
overflow="visible">
<path
d="m9.6406-12.188c-1.0859 0-1.9141 0.39062-2.4844 1.1719-0.57422 0.78125-0.85938 1.9062-0.85938 3.375s0.28516 2.5938 0.85938 3.375c0.57031 0.77344 1.3984 1.1562 2.4844 1.1562 1.0625 0 1.875-0.38281 2.4375-1.1562 0.57031-0.78125 0.85938-1.9062 0.85938-3.375s-0.28906-2.5938-0.85938-3.375c-0.5625-0.78125-1.375-1.1719-2.4375-1.1719zm0-3.5c2.6328 0 4.6914 0.71484 6.1719 2.1406 1.4766 1.418 2.2188 3.3867 2.2188 5.9062 0 2.5117-0.74219 4.4805-2.2188 5.9062-1.4805 1.418-3.5391 2.125-6.1719 2.125-2.6484 0-4.7148-0.70703-6.2031-2.125-1.4922-1.4258-2.2344-3.3945-2.2344-5.9062 0-2.5195 0.74219-4.4883 2.2344-5.9062 1.4883-1.4258 3.5547-2.1406 6.2031-2.1406z"
id="path35" />
</symbol>
<symbol
id="f"
overflow="visible">
<path
d="m2.5781-20.406h5.875l7.4219 14v-14h4.9844v20.406h-5.875l-7.4219-14v14h-4.9844z"
id="path38" />
</symbol>
<symbol
id="t"
overflow="visible">
<path
d="m0.42188-15.312h4.8906l3.8281 10.578 3.7969-10.578h4.9062l-6.0312 15.312h-5.375z"
id="path41" />
</symbol>
<symbol
id="s"
overflow="visible">
<path
d="m12.422-21.281v3.2188h-2.7031c-0.6875 0-1.1719 0.125-1.4531 0.375-0.27344 0.25-0.40625 0.6875-0.40625 1.3125v1.0625h4.1875v3.5h-4.1875v11.812h-4.8906v-11.812h-2.4375v-3.5h2.4375v-1.0625c0-1.6641 0.46094-2.8984 1.3906-3.7031 0.92578-0.80078 2.3672-1.2031 4.3281-1.2031z"
id="path44" />
</symbol>
<symbol
id="r"
overflow="visible">
<path
d="m16.547-12.766c0.61328-0.94531 1.3477-1.6719 2.2031-2.1719 0.85156-0.5 1.7891-0.75 2.8125-0.75 1.7578 0 3.0977 0.54688 4.0156 1.6406 0.92578 1.0859 1.3906 2.6562 1.3906 4.7188v9.3281h-4.9219v-7.9844-0.35938c0.007813-0.13281 0.015625-0.32031 0.015625-0.5625 0-1.082-0.16406-1.8633-0.48438-2.3438-0.3125-0.48828-0.82422-0.73438-1.5312-0.73438-0.92969 0-1.6484 0.38672-2.1562 1.1562-0.51172 0.76172-0.77344 1.8672-0.78125 3.3125v7.5156h-4.9219v-7.9844c0-1.6953-0.14844-2.7852-0.4375-3.2656-0.29297-0.48828-0.8125-0.73438-1.5625-0.73438-0.9375 0-1.6641 0.38672-2.1719 1.1562-0.51172 0.76172-0.76562 1.8594-0.76562 3.2969v7.5312h-4.9219v-15.312h4.9219v2.2344c0.60156-0.86328 1.2891-1.5156 2.0625-1.9531 0.78125-0.4375 1.6406-0.65625 2.5781-0.65625 1.0625 0 2 0.25781 2.8125 0.76562 0.8125 0.51172 1.4258 1.2305 1.8438 2.1562z"
id="path47" />
</symbol>
<symbol
id="q"
overflow="visible">
<path
d="m17.75-9.3281v9.3281h-4.9219v-7.1094c0-1.3438-0.03125-2.2656-0.09375-2.7656s-0.16797-0.86719-0.3125-1.1094c-0.1875-0.3125-0.44922-0.55469-0.78125-0.73438-0.32422-0.17578-0.69531-0.26562-1.1094-0.26562-1.0234 0-1.8242 0.39844-2.4062 1.1875-0.58594 0.78125-0.875 1.8711-0.875 3.2656v7.5312h-4.8906v-21.281h4.8906v8.2031c0.73828-0.88281 1.5195-1.5391 2.3438-1.9688 0.83203-0.42578 1.75-0.64062 2.75-0.64062 1.7695 0 3.1133 0.54688 4.0312 1.6406 0.91406 1.0859 1.375 2.6562 1.375 4.7188z"
id="path50" />
</symbol>
<symbol
id="p"
overflow="visible">
<path
d="m2.1875-5.9688v-9.3438h4.9219v1.5312c0 0.83594-0.007813 1.875-0.015625 3.125-0.011719 1.25-0.015625 2.0859-0.015625 2.5 0 1.2422 0.03125 2.1328 0.09375 2.6719 0.070313 0.54297 0.17969 0.93359 0.32812 1.1719 0.20703 0.32422 0.47266 0.57422 0.79688 0.75 0.32031 0.16797 0.69141 0.25 1.1094 0.25 1.0195 0 1.8203-0.39062 2.4062-1.1719 0.58203-0.78125 0.875-1.8672 0.875-3.2656v-7.5625h4.8906v15.312h-4.8906v-2.2188c-0.74219 0.89844-1.5234 1.5586-2.3438 1.9844-0.82422 0.41406-1.7344 0.625-2.7344 0.625-1.7617 0-3.1055-0.53906-4.0312-1.625-0.92969-1.082-1.3906-2.6602-1.3906-4.7344z"
id="path53" />
</symbol>
<symbol
id="o"
overflow="visible">
<path
d="m17.75-9.3281v9.3281h-4.9219v-7.1406c0-1.3203-0.03125-2.2344-0.09375-2.7344s-0.16797-0.86719-0.3125-1.1094c-0.1875-0.3125-0.44922-0.55469-0.78125-0.73438-0.32422-0.17578-0.69531-0.26562-1.1094-0.26562-1.0234 0-1.8242 0.39844-2.4062 1.1875-0.58594 0.78125-0.875 1.8711-0.875 3.2656v7.5312h-4.8906v-15.312h4.8906v2.2344c0.73828-0.88281 1.5195-1.5391 2.3438-1.9688 0.83203-0.42578 1.75-0.64062 2.75-0.64062 1.7695 0 3.1133 0.54688 4.0312 1.6406 0.91406 1.0859 1.375 2.6562 1.375 4.7188z"
id="path56" />
</symbol>
<symbol
id="n"
overflow="visible">
<path
d="m2.5781-20.406h8.7344c2.5938 0 4.582 0.57812 5.9688 1.7344 1.3945 1.1484 2.0938 2.7891 2.0938 4.9219 0 2.1367-0.69922 3.7812-2.0938 4.9375-1.3867 1.1562-3.375 1.7344-5.9688 1.7344h-3.4844v7.0781h-5.25zm5.25 3.8125v5.7031h2.9219c1.0195 0 1.8047-0.25 2.3594-0.75 0.5625-0.5 0.84375-1.2031 0.84375-2.1094 0-0.91406-0.28125-1.6172-0.84375-2.1094-0.55469-0.48828-1.3398-0.73438-2.3594-0.73438z"
id="path59" />
</symbol>
<symbol
id="m"
overflow="visible">
<path
d="m2.3594-15.312h4.8906v15.031c0 2.0508-0.49609 3.6172-1.4844 4.7031-0.98047 1.082-2.4062 1.625-4.2812 1.625h-2.4219v-3.2188h0.85938c0.92578 0 1.5625-0.21094 1.9062-0.625 0.35156-0.41797 0.53125-1.2461 0.53125-2.4844zm0-5.9688h4.8906v4h-4.8906z"
id="path62" />
</symbol>
<symbol
id="l"
overflow="visible">
<path
d="m14.719-14.828v3.9844c-0.65625-0.45703-1.3242-0.79688-2-1.0156-0.66797-0.21875-1.3594-0.32812-2.0781-0.32812-1.3672 0-2.4336 0.40234-3.2031 1.2031-0.76172 0.79297-1.1406 1.9062-1.1406 3.3438 0 1.4297 0.37891 2.543 1.1406 3.3438 0.76953 0.79297 1.8359 1.1875 3.2031 1.1875 0.75781 0 1.4844-0.10938 2.1719-0.32812 0.6875-0.22656 1.3203-0.56641 1.9062-1.0156v4c-0.76172 0.28125-1.5391 0.48828-2.3281 0.625-0.78125 0.14453-1.5742 0.21875-2.375 0.21875-2.7617 0-4.9219-0.70703-6.4844-2.125-1.5547-1.4141-2.3281-3.3828-2.3281-5.9062 0-2.5312 0.77344-4.5039 2.3281-5.9219 1.5625-1.4141 3.7227-2.125 6.4844-2.125 0.80078 0 1.5938 0.074219 2.375 0.21875 0.78125 0.13672 1.5547 0.35156 2.3281 0.64062z"
id="path65" />
</symbol>
</defs>
<g
id="g152">
<path
d="m 665.72555,461.26937 c -11.44488,-19.82013 -36.78258,-26.61858 -56.62229,-15.16953 l -151.84212,87.67239 c -0.76012,4.37903 -2.11786,8.99243 -4.48905,13.73029 -4.76149,9.48001 -19.58638,31.25082 -54.39368,29.00874 -29.15682,-1.87885 -158.08372,-40.88858 -163.77458,-42.62398 -0.14342,-0.0431 -13.62994,-4.3504 -27.0102,-0.43983 -4.12093,1.22862 -8.38051,-0.61671 -10.43607,-4.16865 -0.349,-0.61671 -0.64539,-1.29079 -0.85095,-1.99352 -1.41024,-4.81888 1.34341,-9.87677 6.16706,-11.28713 18.99403,-5.57423 37.12648,0.38245 37.62336,0.55456 36.72996,11.1437 136.98468,40.34886 159.46666,41.80156 23.02782,1.48672 33.01927,-11.22496 36.92577,-18.98424 2.83968,-7.20439 3.49468,-12.88339 2.32812,-19.82502 -3.63335,-21.83335 -26.63326,-26.28814 -26.63326,-26.28814 0.005,-0.005 -195.7903,-70.23264 -242.62675,-80.57288 -46.83155,-10.32617 -70.33299,5.58378 -70.33299,5.58378 l -85.807267,49.54114 89.473897,154.98739 53.4146,-30.83471 c 0,0 121.26564,28.05292 190.44211,48.79582 69.18503,20.76738 88.40792,1.50117 88.40792,1.50117 L 650.5521,517.90396 c 19.82012,-11.44966 26.61857,-36.79605 15.16952,-56.62719 z m -211.03937,52.19932 146.70198,-84.69356 c -12.58232,-7.87372 -28.98548,-8.72465 -42.75371,-0.77925 l -113.85038,65.7338 c 4.66112,5.78939 8.0076,12.53949 9.90553,19.73935 z m -35.2332,-37.01634 c 4.43643,1.38637 8.51427,3.35125 12.27636,5.70813 l 122.88601,-70.94003 c -12.58232,-7.88325 -28.99038,-8.72465 -42.7586,-0.77924 l -106.61258,61.5507 z m 88.36998,-82.76723 c -12.58232,-7.88326 -28.98548,-8.72942 -42.74392,-0.7888 l -109.84474,63.4244 28.59263,8.9589 z"
fill-rule="evenodd"
id="path70"
style="stroke-width:1.22384" />
<path
d="m 299.45401,149.72805 c -0.95134,-0.94656 -2.00306,-1.67801 -3.10269,-2.32334 V 93.159125 c 0,-24.897849 -20.17871,-45.076562 -45.07656,-45.076562 -24.89295,0 -45.07656,20.178713 -45.07656,45.076562 v 54.250485 c -1.10432,0.63582 -2.15127,1.37682 -3.09779,2.31857 l -49.48974,49.48973 c -5.93282,5.94237 -5.93282,15.55137 0,21.47966 5.92805,5.93282 15.55137,5.93282 21.46987,0 l 30.634,-30.634 -37.28925,103.07568 h 42.6766 v 54.45119 c 0,8.39005 6.80763,15.18789 15.19278,15.18789 8.39005,0 15.19278,-6.80763 15.19278,-15.18789 v -54.45119 h 19.57169 v 54.45119 c 0,8.39005 6.7933,15.18789 15.17809,15.18789 8.38051,0 15.18788,-6.80763 15.18788,-15.18789 v -54.45119 h 42.68151 l -37.30272,-103.08914 30.64379,30.64868 c 5.92805,5.93283 15.54157,5.92316 21.47966,0 5.92805,-5.92804 5.92805,-15.54157 0,-21.47965 z"
id="path72"
style="stroke-width:1.22384" />
<path
d="m 525.73022,201.75359 -49.47505,-49.48484 c -2.98789,-2.98311 -6.90798,-4.46029 -10.78511,-4.44597 H 390.6627 c -3.901,0 -7.80677,1.48195 -10.7517,4.44597 l -49.49341,49.48974 c -5.92805,5.92805 -5.92805,15.54157 0,21.47966 5.92805,5.93282 15.55136,5.93282 21.47966,0 l 31.10762,-31.11742 v 101.71721 h 4.91446 V 350.12 c 0,8.38051 6.8124,15.1781 15.20257,15.1781 8.39005,0 15.1781,-6.79808 15.1781,-15.1781 v -56.28206 h 19.57168 V 350.12 c 0,8.38051 6.78376,15.1781 15.1781,15.1781 8.3805,0 15.19277,-6.79808 15.19277,-15.1781 v -56.28206 h 4.91447 v -101.727 l 31.11741,31.10762 c 5.92805,5.94714 15.54158,5.93282 21.46497,0 5.92805,-5.92804 5.92805,-15.53667 -0.01,-21.46497 z"
id="path74"
style="stroke-width:1.22384" />
<path
d="m 473.15396,95.697864 c 0,24.897846 -20.18361,45.076556 -45.07657,45.076556 -24.89295,0 -45.07656,-20.17871 -45.07656,-45.076556 0,-24.892954 20.18361,-45.071667 45.07656,-45.071667 24.89296,0 45.07657,20.178713 45.07657,45.071667"
id="path76"
style="stroke-width:1.22384" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,158 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 960 960"
style="enable-background:new 0 0 960 960;"
xml:space="preserve"
sodipodi:docname="kindergarten.svg"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
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="defs35">
<symbol
id="v"
overflow="visible"><path
d="m18.766-1.125c-0.96875 0.5-1.9805 0.875-3.0312 1.125-1.043 0.25781-2.1367 0.39062-3.2812 0.39062-3.3984 0-6.0898-0.94531-8.0781-2.8438-1.9922-1.9062-2.9844-4.4844-2.9844-7.7344 0-3.2578 0.99219-5.8359 2.9844-7.7344 1.9883-1.9062 4.6797-2.8594 8.0781-2.8594 1.1445 0 2.2383 0.13281 3.2812 0.39062 1.0508 0.25 2.0625 0.625 3.0312 1.125v4.2188c-0.98047-0.65625-1.9453-1.1406-2.8906-1.4531-0.94922-0.3125-1.9492-0.46875-3-0.46875-1.875 0-3.3516 0.60547-4.4219 1.8125-1.0742 1.1992-1.6094 2.8555-1.6094 4.9688 0 2.1055 0.53516 3.7617 1.6094 4.9688 1.0703 1.1992 2.5469 1.7969 4.4219 1.7969 1.0508 0 2.0508-0.14844 3-0.45312 0.94531-0.3125 1.9102-0.80078 2.8906-1.4688z"
id="path2" /></symbol><symbol
id="d"
overflow="visible"><path
d="m13.734-11.141c-0.4375-0.19531-0.87109-0.34375-1.2969-0.4375-0.41797-0.10156-0.83984-0.15625-1.2656-0.15625-1.2617 0-2.2305 0.40625-2.9062 1.2188-0.67969 0.80469-1.0156 1.9531-1.0156 3.4531v7.0625h-4.8906v-15.312h4.8906v2.5156c0.625-1 1.3438-1.7266 2.1562-2.1875 0.82031-0.46875 1.8008-0.70312 2.9375-0.70312 0.16406 0 0.34375 0.011719 0.53125 0.03125 0.19531 0.011719 0.47656 0.039062 0.84375 0.078125z"
id="path5" /></symbol><symbol
id="a"
overflow="visible"><path
d="m17.641-7.7031v1.4062h-11.453c0.125 1.1484 0.53906 2.0078 1.25 2.5781 0.70703 0.57422 1.7031 0.85938 2.9844 0.85938 1.0312 0 2.082-0.14844 3.1562-0.45312 1.082-0.3125 2.1914-0.77344 3.3281-1.3906v3.7656c-1.1562 0.4375-2.3125 0.76562-3.4688 0.98438-1.1562 0.22656-2.3125 0.34375-3.4688 0.34375-2.7734 0-4.9297-0.70312-6.4688-2.1094-1.5312-1.4062-2.2969-3.3789-2.2969-5.9219 0-2.5 0.75391-4.4609 2.2656-5.8906 1.5078-1.4375 3.582-2.1562 6.2188-2.1562 2.4062 0 4.332 0.73047 5.7812 2.1875 1.4453 1.4492 2.1719 3.3828 2.1719 5.7969zm-5.0312-1.625c0-0.92578-0.27344-1.6719-0.8125-2.2344-0.54297-0.57031-1.25-0.85938-2.125-0.85938-0.94922 0-1.7188 0.26562-2.3125 0.79688s-0.96484 1.2969-1.1094 2.2969z"
id="path8" /></symbol><symbol
id="e"
overflow="visible"><path
d="m9.2188-6.8906c-1.0234 0-1.793 0.17188-2.3125 0.51562-0.51172 0.34375-0.76562 0.85547-0.76562 1.5312 0 0.625 0.20703 1.1172 0.625 1.4688 0.41406 0.34375 0.98828 0.51562 1.7188 0.51562 0.92578 0 1.7031-0.32812 2.3281-0.98438 0.63281-0.66406 0.95312-1.4922 0.95312-2.4844v-0.5625zm7.4688-1.8438v8.7344h-4.9219v-2.2656c-0.65625 0.92969-1.3984 1.6055-2.2188 2.0312-0.82422 0.41406-1.8242 0.625-3 0.625-1.5859 0-2.8711-0.45703-3.8594-1.375-0.99219-0.92578-1.4844-2.1289-1.4844-3.6094 0-1.7891 0.61328-3.1016 1.8438-3.9375 1.2383-0.84375 3.1797-1.2656 5.8281-1.2656h2.8906v-0.39062c0-0.76953-0.30859-1.332-0.92188-1.6875-0.61719-0.36328-1.5703-0.54688-2.8594-0.54688-1.0547 0-2.0312 0.10547-2.9375 0.3125-0.89844 0.21094-1.7305 0.52344-2.5 0.9375v-3.7344c1.0391-0.25 2.0859-0.44141 3.1406-0.57812 1.0625-0.13281 2.125-0.20312 3.1875-0.20312 2.7578 0 4.75 0.54688 5.9688 1.6406 1.2266 1.0859 1.8438 2.8555 1.8438 5.3125z"
id="path11" /></symbol><symbol
id="c"
overflow="visible"><path
d="m7.7031-19.656v4.3438h5.0469v3.5h-5.0469v6.5c0 0.71094 0.14062 1.1875 0.42188 1.4375s0.83594 0.375 1.6719 0.375h2.5156v3.5h-4.1875c-1.9375 0-3.3125-0.39844-4.125-1.2031-0.80469-0.8125-1.2031-2.1797-1.2031-4.1094v-6.5h-2.4219v-3.5h2.4219v-4.3438z"
id="path14" /></symbol><symbol
id="k"
overflow="visible"><path
d="m12.766-13.078v-8.2031h4.9219v21.281h-4.9219v-2.2188c-0.66797 0.90625-1.4062 1.5703-2.2188 1.9844s-1.7578 0.625-2.8281 0.625c-1.8867 0-3.4336-0.75-4.6406-2.25-1.2109-1.5-1.8125-3.4258-1.8125-5.7812 0-2.3633 0.60156-4.2969 1.8125-5.7969 1.207-1.5 2.7539-2.25 4.6406-2.25 1.0625 0 2 0.21484 2.8125 0.64062 0.82031 0.42969 1.5664 1.0859 2.2344 1.9688zm-3.2188 9.9219c1.0391 0 1.8359-0.37891 2.3906-1.1406 0.55078-0.76953 0.82812-1.8828 0.82812-3.3438 0-1.457-0.27734-2.5664-0.82812-3.3281-0.55469-0.76953-1.3516-1.1562-2.3906-1.1562-1.043 0-1.8398 0.38672-2.3906 1.1562-0.55469 0.76172-0.82812 1.8711-0.82812 3.3281 0 1.4609 0.27344 2.5742 0.82812 3.3438 0.55078 0.76172 1.3477 1.1406 2.3906 1.1406z"
id="path17" /></symbol><symbol
id="j"
overflow="visible"><path
d="m10.5-3.1562c1.0508 0 1.8516-0.37891 2.4062-1.1406 0.55078-0.76953 0.82812-1.8828 0.82812-3.3438 0-1.457-0.27734-2.5664-0.82812-3.3281-0.55469-0.76953-1.3555-1.1562-2.4062-1.1562-1.0547 0-1.8594 0.38672-2.4219 1.1562-0.55469 0.77344-0.82812 1.8828-0.82812 3.3281 0 1.4492 0.27344 2.5586 0.82812 3.3281 0.5625 0.77344 1.3672 1.1562 2.4219 1.1562zm-3.25-9.9219c0.67578-0.88281 1.4219-1.5391 2.2344-1.9688 0.82031-0.42578 1.7656-0.64062 2.8281-0.64062 1.8945 0 3.4453 0.75 4.6562 2.25 1.207 1.5 1.8125 3.4336 1.8125 5.7969 0 2.3555-0.60547 4.2812-1.8125 5.7812-1.2109 1.5-2.7617 2.25-4.6562 2.25-1.0625 0-2.0078-0.21094-2.8281-0.625-0.8125-0.42578-1.5586-1.0859-2.2344-1.9844v2.2188h-4.8906v-21.281h4.8906z"
id="path20" /></symbol><symbol
id="i"
overflow="visible"><path
d="m0.34375-15.312h4.8906l4.125 10.391 3.5-10.391h4.8906l-6.4375 16.766c-0.64844 1.6953-1.4023 2.8828-2.2656 3.5625-0.86719 0.6875-2 1.0312-3.4062 1.0312h-2.8438v-3.2188h1.5312c0.83203 0 1.4375-0.13672 1.8125-0.40625 0.38281-0.26172 0.67969-0.73047 0.89062-1.4062l0.14062-0.42188z"
id="path23" /></symbol><symbol
id="h"
overflow="visible"><path
d="m7.8281-16.438v12.453h1.8906c2.1562 0 3.8008-0.53125 4.9375-1.5938 1.1328-1.0625 1.7031-2.6133 1.7031-4.6562 0-2.0195-0.57031-3.5547-1.7031-4.6094-1.125-1.0625-2.7734-1.5938-4.9375-1.5938zm-5.25-3.9688h5.5469c3.0938 0 5.3984 0.21875 6.9219 0.65625 1.5195 0.4375 2.8203 1.1875 3.9062 2.25 0.95703 0.91797 1.6641 1.9805 2.125 3.1875 0.46875 1.1992 0.70312 2.5586 0.70312 4.0781 0 1.543-0.23438 2.918-0.70312 4.125-0.46094 1.2109-1.168 2.2773-2.125 3.2031-1.0938 1.0547-2.4062 1.8047-3.9375 2.25-1.5312 0.4375-3.8281 0.65625-6.8906 0.65625h-5.5469z"
id="path26" /></symbol><symbol
id="g"
overflow="visible"><path
d="m2.3594-15.312h4.8906v15.312h-4.8906zm0-5.9688h4.8906v4h-4.8906z"
id="path29" /></symbol><symbol
id="u"
overflow="visible"><path
d="m12.766-2.5938c-0.66797 0.88672-1.4062 1.543-2.2188 1.9688-0.8125 0.41797-1.7578 0.625-2.8281 0.625-1.8672 0-3.4062-0.73438-4.625-2.2031-1.2188-1.4766-1.8281-3.3516-1.8281-5.625 0-2.2891 0.60938-4.1641 1.8281-5.625 1.2188-1.4688 2.7578-2.2031 4.625-2.2031 1.0703 0 2.0156 0.21484 2.8281 0.64062 0.8125 0.41797 1.5508 1.0742 2.2188 1.9688v-2.2656h4.9219v13.766c0 2.457-0.77734 4.3359-2.3281 5.6406-1.5547 1.3008-3.8086 1.9531-6.7656 1.9531-0.94922 0-1.8711-0.074219-2.7656-0.21875-0.89844-0.14844-1.7969-0.37109-2.7031-0.67188v-3.8125c0.86328 0.48828 1.7031 0.85156 2.5156 1.0938 0.82031 0.23828 1.6484 0.35938 2.4844 0.35938 1.6016 0 2.7734-0.35156 3.5156-1.0469 0.75-0.69922 1.125-1.7969 1.125-3.2969zm-3.2188-9.5312c-1.0117 0-1.8047 0.375-2.375 1.125-0.5625 0.74219-0.84375 1.7969-0.84375 3.1719 0 1.3984 0.26953 2.4609 0.8125 3.1875 0.55078 0.71875 1.3516 1.0781 2.4062 1.0781 1.0195 0 1.8125-0.36719 2.375-1.1094 0.5625-0.75 0.84375-1.8008 0.84375-3.1562 0-1.375-0.28125-2.4297-0.84375-3.1719-0.5625-0.75-1.3555-1.125-2.375-1.125z"
id="path32" /></symbol><symbol
id="b"
overflow="visible"><path
d="m9.6406-12.188c-1.0859 0-1.9141 0.39062-2.4844 1.1719-0.57422 0.78125-0.85938 1.9062-0.85938 3.375s0.28516 2.5938 0.85938 3.375c0.57031 0.77344 1.3984 1.1562 2.4844 1.1562 1.0625 0 1.875-0.38281 2.4375-1.1562 0.57031-0.78125 0.85938-1.9062 0.85938-3.375s-0.28906-2.5938-0.85938-3.375c-0.5625-0.78125-1.375-1.1719-2.4375-1.1719zm0-3.5c2.6328 0 4.6914 0.71484 6.1719 2.1406 1.4766 1.418 2.2188 3.3867 2.2188 5.9062 0 2.5117-0.74219 4.4805-2.2188 5.9062-1.4805 1.418-3.5391 2.125-6.1719 2.125-2.6484 0-4.7148-0.70703-6.2031-2.125-1.4922-1.4258-2.2344-3.3945-2.2344-5.9062 0-2.5195 0.74219-4.4883 2.2344-5.9062 1.4883-1.4258 3.5547-2.1406 6.2031-2.1406z"
id="path35" /></symbol><symbol
id="f"
overflow="visible"><path
d="m2.5781-20.406h5.875l7.4219 14v-14h4.9844v20.406h-5.875l-7.4219-14v14h-4.9844z"
id="path38" /></symbol><symbol
id="t"
overflow="visible"><path
d="m0.42188-15.312h4.8906l3.8281 10.578 3.7969-10.578h4.9062l-6.0312 15.312h-5.375z"
id="path41" /></symbol><symbol
id="s"
overflow="visible"><path
d="m12.422-21.281v3.2188h-2.7031c-0.6875 0-1.1719 0.125-1.4531 0.375-0.27344 0.25-0.40625 0.6875-0.40625 1.3125v1.0625h4.1875v3.5h-4.1875v11.812h-4.8906v-11.812h-2.4375v-3.5h2.4375v-1.0625c0-1.6641 0.46094-2.8984 1.3906-3.7031 0.92578-0.80078 2.3672-1.2031 4.3281-1.2031z"
id="path44" /></symbol><symbol
id="r"
overflow="visible"><path
d="m16.547-12.766c0.61328-0.94531 1.3477-1.6719 2.2031-2.1719 0.85156-0.5 1.7891-0.75 2.8125-0.75 1.7578 0 3.0977 0.54688 4.0156 1.6406 0.92578 1.0859 1.3906 2.6562 1.3906 4.7188v9.3281h-4.9219v-7.9844-0.35938c0.007813-0.13281 0.015625-0.32031 0.015625-0.5625 0-1.082-0.16406-1.8633-0.48438-2.3438-0.3125-0.48828-0.82422-0.73438-1.5312-0.73438-0.92969 0-1.6484 0.38672-2.1562 1.1562-0.51172 0.76172-0.77344 1.8672-0.78125 3.3125v7.5156h-4.9219v-7.9844c0-1.6953-0.14844-2.7852-0.4375-3.2656-0.29297-0.48828-0.8125-0.73438-1.5625-0.73438-0.9375 0-1.6641 0.38672-2.1719 1.1562-0.51172 0.76172-0.76562 1.8594-0.76562 3.2969v7.5312h-4.9219v-15.312h4.9219v2.2344c0.60156-0.86328 1.2891-1.5156 2.0625-1.9531 0.78125-0.4375 1.6406-0.65625 2.5781-0.65625 1.0625 0 2 0.25781 2.8125 0.76562 0.8125 0.51172 1.4258 1.2305 1.8438 2.1562z"
id="path47" /></symbol><symbol
id="q"
overflow="visible"><path
d="m17.75-9.3281v9.3281h-4.9219v-7.1094c0-1.3438-0.03125-2.2656-0.09375-2.7656s-0.16797-0.86719-0.3125-1.1094c-0.1875-0.3125-0.44922-0.55469-0.78125-0.73438-0.32422-0.17578-0.69531-0.26562-1.1094-0.26562-1.0234 0-1.8242 0.39844-2.4062 1.1875-0.58594 0.78125-0.875 1.8711-0.875 3.2656v7.5312h-4.8906v-21.281h4.8906v8.2031c0.73828-0.88281 1.5195-1.5391 2.3438-1.9688 0.83203-0.42578 1.75-0.64062 2.75-0.64062 1.7695 0 3.1133 0.54688 4.0312 1.6406 0.91406 1.0859 1.375 2.6562 1.375 4.7188z"
id="path50" /></symbol><symbol
id="p"
overflow="visible"><path
d="m2.1875-5.9688v-9.3438h4.9219v1.5312c0 0.83594-0.007813 1.875-0.015625 3.125-0.011719 1.25-0.015625 2.0859-0.015625 2.5 0 1.2422 0.03125 2.1328 0.09375 2.6719 0.070313 0.54297 0.17969 0.93359 0.32812 1.1719 0.20703 0.32422 0.47266 0.57422 0.79688 0.75 0.32031 0.16797 0.69141 0.25 1.1094 0.25 1.0195 0 1.8203-0.39062 2.4062-1.1719 0.58203-0.78125 0.875-1.8672 0.875-3.2656v-7.5625h4.8906v15.312h-4.8906v-2.2188c-0.74219 0.89844-1.5234 1.5586-2.3438 1.9844-0.82422 0.41406-1.7344 0.625-2.7344 0.625-1.7617 0-3.1055-0.53906-4.0312-1.625-0.92969-1.082-1.3906-2.6602-1.3906-4.7344z"
id="path53" /></symbol><symbol
id="o"
overflow="visible"><path
d="m17.75-9.3281v9.3281h-4.9219v-7.1406c0-1.3203-0.03125-2.2344-0.09375-2.7344s-0.16797-0.86719-0.3125-1.1094c-0.1875-0.3125-0.44922-0.55469-0.78125-0.73438-0.32422-0.17578-0.69531-0.26562-1.1094-0.26562-1.0234 0-1.8242 0.39844-2.4062 1.1875-0.58594 0.78125-0.875 1.8711-0.875 3.2656v7.5312h-4.8906v-15.312h4.8906v2.2344c0.73828-0.88281 1.5195-1.5391 2.3438-1.9688 0.83203-0.42578 1.75-0.64062 2.75-0.64062 1.7695 0 3.1133 0.54688 4.0312 1.6406 0.91406 1.0859 1.375 2.6562 1.375 4.7188z"
id="path56" /></symbol><symbol
id="n"
overflow="visible"><path
d="m2.5781-20.406h8.7344c2.5938 0 4.582 0.57812 5.9688 1.7344 1.3945 1.1484 2.0938 2.7891 2.0938 4.9219 0 2.1367-0.69922 3.7812-2.0938 4.9375-1.3867 1.1562-3.375 1.7344-5.9688 1.7344h-3.4844v7.0781h-5.25zm5.25 3.8125v5.7031h2.9219c1.0195 0 1.8047-0.25 2.3594-0.75 0.5625-0.5 0.84375-1.2031 0.84375-2.1094 0-0.91406-0.28125-1.6172-0.84375-2.1094-0.55469-0.48828-1.3398-0.73438-2.3594-0.73438z"
id="path59" /></symbol><symbol
id="m"
overflow="visible"><path
d="m2.3594-15.312h4.8906v15.031c0 2.0508-0.49609 3.6172-1.4844 4.7031-0.98047 1.082-2.4062 1.625-4.2812 1.625h-2.4219v-3.2188h0.85938c0.92578 0 1.5625-0.21094 1.9062-0.625 0.35156-0.41797 0.53125-1.2461 0.53125-2.4844zm0-5.9688h4.8906v4h-4.8906z"
id="path62" /></symbol><symbol
id="l"
overflow="visible"><path
d="m14.719-14.828v3.9844c-0.65625-0.45703-1.3242-0.79688-2-1.0156-0.66797-0.21875-1.3594-0.32812-2.0781-0.32812-1.3672 0-2.4336 0.40234-3.2031 1.2031-0.76172 0.79297-1.1406 1.9062-1.1406 3.3438 0 1.4297 0.37891 2.543 1.1406 3.3438 0.76953 0.79297 1.8359 1.1875 3.2031 1.1875 0.75781 0 1.4844-0.10938 2.1719-0.32812 0.6875-0.22656 1.3203-0.56641 1.9062-1.0156v4c-0.76172 0.28125-1.5391 0.48828-2.3281 0.625-0.78125 0.14453-1.5742 0.21875-2.375 0.21875-2.7617 0-4.9219-0.70703-6.4844-2.125-1.5547-1.4141-2.3281-3.3828-2.3281-5.9062 0-2.5312 0.77344-4.5039 2.3281-5.9219 1.5625-1.4141 3.7227-2.125 6.4844-2.125 0.80078 0 1.5938 0.074219 2.375 0.21875 0.78125 0.13672 1.5547 0.35156 2.3281 0.64062z"
id="path65" /></symbol></defs><sodipodi:namedview
id="namedview33"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
showguides="false"
inkscape:zoom="0.57562315"
inkscape:cx="616.72294"
inkscape:cy="580.24074"
inkscape:current-layer="Layer_1" />
<style
type="text/css"
id="style2">
.st0{fill:#DD9D57;}
.st1{fill:#C48341;}
.st2{fill:#006837;}
.st3{fill:#004924;}
.st4{fill:#FFFFFF;}
.st5{font-family:'MyriadPro-Bold';}
.st6{font-size:212.6998px;}
</style>
<g
id="g152"
transform="matrix(2.1924201,0,0,2.1924201,-255.5822,36.981846)"
style="fill:#000000;fill-opacity:1"><path
d="m 299.45401,149.72805 c -0.95134,-0.94656 -2.00306,-1.67801 -3.10269,-2.32334 V 93.159125 c 0,-24.897849 -20.17871,-45.076562 -45.07656,-45.076562 -24.89295,0 -45.07656,20.178713 -45.07656,45.076562 v 54.250485 c -1.10432,0.63582 -2.15127,1.37682 -3.09779,2.31857 l -49.48974,49.48973 c -5.93282,5.94237 -5.93282,15.55137 0,21.47966 5.92805,5.93282 15.55137,5.93282 21.46987,0 l 30.634,-30.634 -37.28925,103.07568 h 42.6766 v 54.45119 c 0,8.39005 6.80763,15.18789 15.19278,15.18789 8.39005,0 15.19278,-6.80763 15.19278,-15.18789 v -54.45119 h 19.57169 v 54.45119 c 0,8.39005 6.7933,15.18789 15.17809,15.18789 8.38051,0 15.18788,-6.80763 15.18788,-15.18789 v -54.45119 h 42.68151 l -37.30272,-103.08914 30.64379,30.64868 c 5.92805,5.93283 15.54157,5.92316 21.47966,0 5.92805,-5.92804 5.92805,-15.54157 0,-21.47965 z"
id="path72"
style="fill:#000000;fill-opacity:1;stroke-width:1.22384" /><path
d="m 525.73022,201.75359 -49.47505,-49.48484 c -2.98789,-2.98311 -6.90798,-4.46029 -10.78511,-4.44597 H 390.6627 c -3.901,0 -7.80677,1.48195 -10.7517,4.44597 l -49.49341,49.48974 c -5.92805,5.92805 -5.92805,15.54157 0,21.47966 5.92805,5.93282 15.55136,5.93282 21.47966,0 l 31.10762,-31.11742 v 101.71721 h 4.91446 V 350.12 c 0,8.38051 6.8124,15.1781 15.20257,15.1781 8.39005,0 15.1781,-6.79808 15.1781,-15.1781 v -56.28206 h 19.57168 V 350.12 c 0,8.38051 6.78376,15.1781 15.1781,15.1781 8.3805,0 15.19277,-6.79808 15.19277,-15.1781 v -56.28206 h 4.91447 v -101.727 l 31.11741,31.10762 c 5.92805,5.94714 15.54158,5.93282 21.46497,0 5.92805,-5.92804 5.92805,-15.53667 -0.01,-21.46497 z"
id="path74"
style="fill:#000000;fill-opacity:1;stroke-width:1.22384" /><path
d="m 473.15396,95.697864 c 0,24.897846 -20.18361,45.076556 -45.07657,45.076556 -24.89295,0 -45.07656,-20.17871 -45.07656,-45.076556 0,-24.892954 20.18361,-45.071667 45.07656,-45.071667 24.89296,0 45.07657,20.178713 45.07657,45.071667"
id="path76"
style="fill:#000000;fill-opacity:1;stroke-width:1.22384" /></g></svg>

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -0,0 +1,165 @@
{
"id": "kindergarten_childcare",
"name": {
"en": "Kindergartens and childcare",
"nl": "Kleuterscholen en kinderopvang"
},
"description": "Shows kindergartens and preschools. Both are grouped in one layer, as they are regularly confused with each other",
"minzoom": 12,
"source": {
"osmTags": {
"or": [
"amenity=childcare",
"amenity=kindergarten",
"isced:level:2011=early_childhood"
]
}
},
"title": {
"mappings": [
{
"if": "amenity=kindergarten",
"then": {
"en": "Kindergarten {name}",
"nl": "Kleuterschool {name}"
}
},
{
"if": "amenity=childcare",
"then": {
"en": "Childcare {name}",
"nl": "Kinderopvang {name}"
}
}
]
},
"tagRenderings": [
{
"id": "childcare-type",
"question": {
"en": "What type of facility is this?",
"nl": "Wat voor faciliteit is dit?"
},
"mappings": [
{
"if": "amenity=kindergarten",
"then": {
"en": "This is a kindergarten (also known as <i>preschool</i>) where small kids receive early education.",
"nl": "Dit is een kleuterschool waar kindjes (voorbereidend) onderwijs krijgen."
},
"addExtraTags": [
"isced:level=0",
"isced:2011:level=early_childhood"
]
},
{
"if": "amenity=childcare",
"then": {
"en": "This is a childcare facility, such as a nursery or daycare where small kids are looked after. They do not offer an education and are ofter run as private businesses",
"nl": "Dit is een kinderopvang (ook een creche of onthaalmoeder genoemd) waar er voor kleine kinderen gezorgd wordt. Onderwijs is niet de hoofdfocus."
},
"addExtraTags": [
"isced:level=",
"isced:2011:level="
]
}
]
},
{
"id": "name",
"question": "What is the name of this facility?",
"render": "This facility is named <b>{name}</b>",
"freeform": {
"key": "name"
}
},
"website",
"email",
"phone",
{
"builtin": "opening_hours",
"override": {
"question": {
"en": "When is this childcare opened?",
"nl": "Wanneer is deze kinderopvang geopend?"
},
"condition": "amenity=childcare"
}
},
{
"id": "capacity",
"question": {
"en": "How much kids (at most) can be enrolled here?",
"nl": "Hoeveel kinderen kunnen hier terecht?"
},
"render": {
"en": "This facility has room for {capacity} kids",
"nl": "Hier kunnen {capacity} kinderen terecht"
},
"freeform": {
"key": "capacity",
"type": "pnat"
}
}
],
"presets": [
{
"title": {
"en": "a kindergarten",
"nl": "een kleuterschool"
},
"description": "A kindergarten (also known as <i>preschool</i>) is a school where small kids receive early education.",
"tags": [
"amenity=kindergarten",
"isced:level=0",
"isced:2011:level=early_childhood"
]
},
{
"title": {
"en": "a childcare",
"nl": "een kinderopvang"
},
"description": "A childcare (also known as <i>a nursery</i> or <i>daycare</i>) is a facility which looks after small kids, but does not offer them an education program.",
"tags": [
"amenity=kindergarten"
]
}
],
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"label": {
"mappings": [
{
"if": "name~*",
"then": "<div class='bg-white rounded-lg p-1'>{name}</div>"
}
]
},
"icon": {
"mappings": [
{
"if": "amenity=kindergarten",
"then": "circle:white;./assets/layers/kindergarten_childcare/kindergarten.svg"
},
{
"if": "amenity=childcare",
"then": "circle:white;./assets/layers/kindergarten_childcare/childcare.svg"
}
]
}
},
{
"color": "#62fc6c",
"width": 1
}
],
"allowMove": {
"enableRelocation": true,
"enableImproveAccuracy": true
}
}

View file

@ -0,0 +1,25 @@
[
{
"path": "childcare.svg",
"license": "CC-BY",
"authors": [
"Diego Naive"
],
"sources": [
"https://thenounproject.com/icon/child-care-332981/"
]
},
{
"path": "kindergarten.svg",
"license": "CC-BY",
"authors": [
"Diego Naive",
"VideoPlasty",
"Pietervdvn"
],
"sources": [
"https://thenounproject.com/icon/child-care-332981/",
"https://commons.wikimedia.org/wiki/File:Blackboard_Flat_Icon_Vector.svg"
]
}
]

View file

@ -67,7 +67,8 @@
"before": { "before": {
"en": "<h3>Nearby images</h3>The pictures below are nearby geotagged images and might be helpful to handle this note.", "en": "<h3>Nearby images</h3>The pictures below are nearby geotagged images and might be helpful to handle this note.",
"de": "<h3>Bilder aus der Nähe</h3>Die folgenden Bilder sind mit Geotags versehene Bilder aus der Nähe und könnten für die Bearbeitung dieser Notiz hilfreich sein.", "de": "<h3>Bilder aus der Nähe</h3>Die folgenden Bilder sind mit Geotags versehene Bilder aus der Nähe und könnten für die Bearbeitung dieser Notiz hilfreich sein.",
"es": "<h3>Imágenes cercanas</h3>Las imágenes de debajo son imágenes geoetiquetadas cercanas y pueden ser útiles para encargarse de esta nota." "es": "<h3>Imágenes cercanas</h3>Las imágenes de debajo son imágenes geoetiquetadas cercanas y pueden ser útiles para encargarse de esta nota.",
"nl": "<h3>Afbeeldingen in de buurt</h3>Onderstaande afbeeldingen zijn afbeeldingen met geo-referentie en die in de buurt genomen zijn. Mogelijks zijn ze nuttig om deze kaartnota af te handelen."
}, },
"special": { "special": {
"type": "nearby_images", "type": "nearby_images",

View file

@ -368,7 +368,8 @@
"if": "leisure=playground", "if": "leisure=playground",
"then": { "then": {
"en": "This is a schoolyard - an outdoor area where the pupils can play during their breaks; but it is not accessible to the general public", "en": "This is a schoolyard - an outdoor area where the pupils can play during their breaks; but it is not accessible to the general public",
"nl": "Dit is een schoolplein - een zone waar de leerlingen kunnen spelen tijdens de pauze. Dit schoolplein is niet toegankelijk voor het publiek" "nl": "Dit is een schoolplein - een zone waar de leerlingen kunnen spelen tijdens de pauze. Dit schoolplein is niet toegankelijk voor het publiek",
"de": "Dies ist ein Schulhof - ein Außenbereich, auf dem die Schüler in den Pausen spielen können; er ist jedoch für die Öffentlichkeit nicht zugänglich"
} }
} }
] ]
@ -544,7 +545,8 @@
"if": "leisure=schoolyard", "if": "leisure=schoolyard",
"then": { "then": {
"en": "This is a schoolyard - an (outdoor) area where pupils of a school can play during recess and which is not publicly accessible", "en": "This is a schoolyard - an (outdoor) area where pupils of a school can play during recess and which is not publicly accessible",
"nl": "Dit is een schoolplein - een ruimte waar de leerlingen van een school kunnen spelen tijdens de pauze maar die niet publiek toegankelijk is" "nl": "Dit is een schoolplein - een ruimte waar de leerlingen van een school kunnen spelen tijdens de pauze maar die niet publiek toegankelijk is",
"de": "Dies ist ein Schulhof - ein (Außen-)Bereich, auf dem die Schüler einer Schule in den Pausen spielen können und der nicht öffentlich zugänglich ist"
} }
} }
], ],

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="college"
width="500"
height="500"
viewBox="0 0 500 500"
version="1.1"
sodipodi:docname="college.svg"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
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="defs7" />
<sodipodi:namedview
id="namedview5"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.1752248"
inkscape:cx="119.12615"
inkscape:cy="225.48877"
inkscape:current-layer="college" />
<path
d="M 250.0465,31 0,147.68837 66.679067,177.69395 v 56.6772 c -20.00372,6.66791 -33.339534,26.67163 -33.339534,46.67535 0,20.00372 13.335814,40.00744 33.339534,46.67535 v 3.33395 l -30.00558,70.01302 c -10.00186,30.00558 -3.333954,63.34511 46.675346,63.34511 50.009297,0 56.677207,-33.33953 46.675347,-63.34511 L 100.0186,331.0558 c 20.00372,-10.00186 33.33953,-26.67163 33.33953,-50.0093 0,-23.33767 -13.33581,-40.00744 -33.33953,-46.67535 V 194.36371 L 250.0465,264.37673 500.093,147.68837 Z m 146.69395,216.70697 -150.0279,66.67906 -80.01488,-36.67348 v 3.33395 c 0,23.33767 -10.00186,43.34139 -26.67163,60.01116 l 20.00372,46.67535 v 3.33395 c 3.33395,13.33581 6.66791,26.67163 3.33395,40.00744 23.33768,10.00186 50.0093,16.66977 83.34884,16.66977 110.02046,0 150.0279,-66.67907 150.0279,-100.0186 z"
id="path2"
style="stroke-width:33.3395" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,23 @@
[
{
"path": "college.svg",
"license": "CC0",
"authors": [
"Maki"
],
"sources": [
"https://labs.mapbox.com/maki-icons/"
]
},
{
"path": "school.svg",
"license": "CC0",
"authors": [
"Temaki"
],
"sources": [
"https://github.com/ideditor/temaki",
"https://ideditor.github.io/temaki/docs/"
]
}
]

View file

@ -0,0 +1,310 @@
{
"id": "school",
"name": {
"en": "Primary and secondary schools",
"nl": "Lagere en middelbare scholen"
},
"description": "Schools giving primary and secondary education and post-secondary, non-tertiary education. Note that this level of education does not imply an age of the pupiles",
"minzoom": 12,
"title": {
"render": {
"en": "School <i>{name}</i>",
"nl": "School <i>{name}</i>"
}
},
"calculatedTags": [
"_enclosing=feat.enclosingFeatures('school').map(f => f.feat.properties.id)",
"_is_enclosed=feat.properties._enclosing != '[]'"
],
"isShown": {
"render": "yes",
"mappings": [
{
"if": {
"and": [
"building~*",
"_is_enclosed=true"
]
},
"then": "no"
}
]
},
"tagRenderings": [
{
"render": {
"en": "This school is named {name}",
"nl": "Deze school heet <b>{name}</b>"
},
"question": {
"en": "What is the name of this school?",
"nl": "Wat is de naam van deze school?"
},
"freeform": {
"key": "name"
},
"id": "school-name"
},
{
"id": "capacity",
"question": {
"en": "How much students can at most enroll in this school?"
},
"render": {
"en": "This school can enroll at most {capacity} students",
"nl": "Deze school kan maximaal {capacity} studenten lesgeven"
},
"freeform": {
"key": "capacity",
"type": "pnat"
}
},
{
"id": "education-level-belgium",
"condition": "_country=be",
"question": {
"en": "What level of education is given on this school?",
"nl": "Wat is het onderwijsniveau van deze school?"
},
"mappings": [
{
"if": "school=kindergarten",
"then": {
"en": "This is a school with a kindergarten section where young kids receive some education which prepares reading and writing.",
"nl": "Dit is een school die ook een kleuterschool bevat"
}
},
{
"if": "school=primary",
"then": {
"en": "This is a school where one learns primary skills such as basic literacy and numerical skills. <div class='subtle'>Pupils typically enroll from 6 years old till 12 years old</div>",
"nl": "Dit is een lagere school"
}
},
{
"if": "school=secondary",
"then": {
"en": "This is a secondary school which offers all grades",
"nl": "Dit is een middelbare school die alle schooljaren aanbiedt (dus van het eerste tot en met het zesde middelbaar)"
}
},
{
"if": "school=lower_secondary",
"then": {
"en": "This is a secondary school which does <b>not</b> have all grades, but offers <b>first and second</b> grade",
"nl": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het eerste en tweede middelbaar</b>"
}
},
{
"if": "school=middle_secondary",
"then": {
"en": "This is a secondary school which does <b>not</b> have all grades, but offers <b>third and fourth</b> grade",
"nl": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het derde en vierde middelbaar</b>"
}
},
{
"if": "school=upper_secondary",
"then": {
"en": "This is a secondary school which does <b>not</b> have all grades, but offers <b>fifth and sixth</b> grade",
"nl": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het vijfde en zesde middelbaar</b>"
}
},
{
"if": "school=post_secondary",
"then": {
"en": "This schools offers post-secondary education (e.g. a seventh or eight specialisation year)",
"nl": "Deze school biedt post-secundair onderwijs (bijvoorbeeld <b>specialisatiejaren</b>)"
}
}
],
"multiAnswer": true
},
{
"id": "gender",
"question": {
"en": "Which genders can enroll at this school?",
"nl": "Mogen jongens en meisjes les volgen op deze school?"
},
"mappings": [
{
"if": "school:gender=mixed",
"then": {
"en": "Both boys and girls can enroll here and have classes together",
"nl": "Zowel jongens als meisjes kunnen hier les volgen. In de lessen zitten jongens en meisjes samen."
}
},
{
"if": "school:gender=separated",
"then": {
"en": "Both boys and girls can enroll here but they are separated (e.g. they have lessons in different classrooms or at different times)",
"nl": "Jongens en meisjes kunnen hier lesvolgen, maar de lessen zijn gescheiden (bv. de lessen zijn in andere lokalen of op andere momenten)"
}
},
{
"if": "school:gender=male",
"then": {
"en": "This is a boys only-school",
"nl": "Deze school is enkel voor jongens"
}
},
{
"if": "school:gender=female",
"then": {
"en": "This is a girls-only school",
"nl": "Deze school is enkel voor meisjes"
}
}
]
},
{
"id": "target-audience",
"condition": "school:for~*",
"question": {
"en": "Does this school target students with a special need? Which structural facilities does this school have?<div class='subtle'>Ad-hoc ",
"nl": "Richt deze school zich op leerlingen met een speciale zorgbehoefte? Welke structurele faciliteiten heeft deze school voor leerlingen met een extra zorgbehoefte?<div class='subtle'>Ad-hoc maatregelen zijn niet voldoende</div> "
},
"multiAnswer": true,
"render": {
"en": "This school has facilities for students with {school:for}",
"nl": "Deze school richt zich op studenten met {school:for}"
},
"freeform": {
"key": "school:for",
"inline": true
},
"mappings": [
{
"if": "school:for=",
"then": {
"en": "This is a school where students study skills at their age-adequate level. <div>There are little or no special facilities to cater for students with special needs or facilities are ad-hoc</div>",
"nl": "Deze school richt zich op studenten zonder extra zorgbehoefte. <div class='subtle>Dit omvat leerlingen waarbij kleine, ad-hoc maatregelen volstaan om de lessen te volgen.</div>"
},
"hideInAnswer": true
},
{
"if": "school:for=mainstream",
"then": {
"en": "This is a school for students without special needs<div class='subtle'>This includes students who can follow the courses with small, ad hoc measurements</div>",
"nl": "Deze school richt zich op studenten zonder extra zorgbehoefte<div class='subtle>Dit omvat leerlingen waarbij kleine, ad-hoc maatregelen volstaan om de lessen te volgen.</div>"
}
},
{
"if": "school:for=adults",
"then": {
"en": "This is a school where adults are taught skills on the level as specified.",
"nl": "Deze school richt zich op volwassenen"
}
},
{
"if": "school:for=autism",
"then": {
"en": "This is a school for students with autism",
"nl": "Deze school richt zich op studenten in het autisme-spectrum"
}
},
{
"if": "school:for=learning_disabilities",
"then": {
"en": "This is a school for students with learning disabilities",
"nl": "Deze school richt zich op leerlingen met een leerprobleem"
}
},
{
"if": "school:for=blind",
"then": {
"en": "This is a school for blind students or students with sight impairments",
"nl": "Deze school richt zich op blinde en slechtziende studenten"
}
},
{
"if": "school:for=deaf",
"then": {
"en": "This is a school for deaf students or students with hearing impairments",
"nl": "Deze school richt zich op dove en hardhorende studenten"
}
},
{
"if": "school:for=disabilities",
"then": {
"en": "This is a school for students with disabilities",
"nl": "Deze school richt zich op studenten met een beperking"
}
},
{
"if": "school:for=special_needs",
"then": {
"en": "This is a school for students with special needs",
"nl": "Deze school richt zich op studenten met extra zorgbehoeften"
}
}
]
},
"website",
"phone",
"email",
{
"id": "language",
"question": {
"en": "What is the main language of this school?<div class='subtle'>What language is spoken with the students in non-language related courses and with the administration?</div>",
"nl": "Wat is de voertaal van deze school?<div class='subtle'>Welke taal wordt met de studenten gesproken in niet-taal-gerelateerde vakken en met de administratie?</div>"
},
"render": {
"en": "{school:language} is the main language of {title()}",
"nl": "{school:language} is de voertaal van {title()}"
},
"freeform": {
"key": "school:language",
"inline": true
},
"mappings": [
{
"if": "school:language=",
"then": {
"en": "The main language of this school is unknown",
"nl": "De voertaal van deze school is niet gekend"
},
"hideInAnswer": true
}
]
}
],
"presets": [
{
"tags": [
"amenity=school",
"fixme=Added with MapComplete, the precise geometry should still be drawn"
],
"title": {
"en": "a primary or secondary school",
"nl": "een lagere of middelbare school"
}
}
],
"source": {
"osmTags": "amenity=school"
},
"mapRendering": [
{
"icon": "circle:white;./assets/layers/school/school.svg",
"label": {
"mappings": [
{
"if": "name~*",
"then": "<div class='bg-white rounded-lg p-1'>{name}</div>"
}
]
},
"iconSize": {
"render": "40,40,center"
},
"location": [
"point",
"centroid"
]
},
{
"color": "#fcd862",
"width": 1
}
]
}

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
x="0"
y="0"
viewBox="0 0 15 15"
id="svg6"
sodipodi:docname="school.svg"
inkscape:version="1.1.2 (1:1.1+202202050950+0a00cf5339)"
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="defs10" />
<sodipodi:namedview
id="namedview8"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="19.217129"
inkscape:cx="3.5385098"
inkscape:cy="1.4570334"
inkscape:current-layer="svg6" />
<path
d="M 9.1416908,2.1457729 V 12.854227 c 0,0 -7.1389694,0 -7.1389694,0 0,0 0,-10.7084541 0,-10.7084541 z M 8.4277939,2.8596699 H 2.7166183 V 12.14033 c 0,0 5.7111756,0 5.7111756,0 z M 3.7874637,5.0013607 c 0,0 3.5694848,0 3.5694848,0 0.3569484,0 0.3569484,0.7138969 0,0.7138969 0,0 -3.5694848,0 -3.5694848,0 -0.3569484,0 -0.3569484,-0.7138969 0,-0.7138969 z m 0,1.4277939 c 0,0 3.5694848,0 3.5694848,0 0.3569484,0 0.3569484,0.7138969 0,0.7138969 0,0 -3.5694848,0 -3.5694848,0 -0.3569484,0 -0.3569484,-0.7138969 0,-0.7138969 z m 0,1.4277939 c 0,0 3.5694848,0 3.5694848,0 0.3569484,0 0.3569484,0.7138969 0,0.7138969 0,0 -3.5694848,0 -3.5694848,0 -0.3569484,0 -0.3569484,-0.7138969 0,-0.7138969 z m 0,1.4277939 c 0,0 3.5694848,0 3.5694848,0 0.3569484,0 0.3569484,0.7138969 0,0.7138969 0,0 -3.5694848,0 -3.5694848,0 -0.3569484,0 -0.3569484,-0.7138969 0,-0.7138969 z"
id="path2"
style="stroke-width:0.713897" />
<path
d="m 9.8555878,11.426433 c 0.3569482,0.356949 1.7847422,0.356949 2.1416912,0 0,0 -0.713897,1.427794 -1.070846,1.427794 -0.356948,0 -1.0708452,-1.427794 -1.0708452,-1.427794 z m 0,-7.1389693 c 0,0.3569485 2.1416912,0.3569485 2.1416912,0 0,0 0,6.4250723 0,6.4250723 0,0.356949 -2.1416912,0.356949 -2.1416912,0 0,0 0,-6.4250723 0,-6.4250723 z M 10.926433,2.1457729 c -1.0708452,0 -1.0708452,0.3569485 -1.0708452,0.713897 0,0 0,0.7138969 0,0.7138969 0,0.3569485 2.1416912,0.3569485 2.1416912,0 0,0 0,-0.7138969 0,-0.7138969 0,-0.3569485 0,-0.713897 -1.070846,-0.713897 z"
id="path4"
style="stroke-width:0.713897" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -278,7 +278,7 @@
{ {
"if": "access=limited", "if": "access=limited",
"then": { "then": {
"nl": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)", "nl": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, )",
"fr": "Accès limité (par exemple uniquement sur réservation, à certains horaires…)", "fr": "Accès limité (par exemple uniquement sur réservation, à certains horaires…)",
"en": "Limited access (e.g. only with an appointment, during certain hours, …)", "en": "Limited access (e.g. only with an appointment, during certain hours, …)",
"it": "Accesso limitato (p.es. solo con prenotazione, in certi orari, ...)", "it": "Accesso limitato (p.es. solo con prenotazione, in certi orari, ...)",

View file

@ -183,7 +183,7 @@
}, },
"then": { "then": {
"en": "A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel, …", "en": "A public area is surveilled, such as a street, a bridge, a square, a park, a train station, a public corridor or tunnel, …",
"nl": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel...", "nl": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel",
"fr": "Une zone publique est surveillée, telle qu'une rue, un pont, une place, un parc, une gare, un couloir ou un tunnel public…", "fr": "Une zone publique est surveillée, telle qu'une rue, un pont, une place, un parc, une gare, un couloir ou un tunnel public…",
"it": "Sorveglia un'area pubblica, come una strada, un ponte, una piazza, un parco, una stazione, un passaggio o un sottopasso pubblico, ...", "it": "Sorveglia un'area pubblica, come una strada, un ponte, una piazza, un parco, una stazione, un passaggio o un sottopasso pubblico, ...",
"de": "Die Kamera überwacht einen öffentlichen Bereich, z. B. Straßen, Brücken, Plätze, Parks, Bahnhöfe, öffentliche Gänge oder Tunnel, …" "de": "Die Kamera überwacht einen öffentlichen Bereich, z. B. Straßen, Brücken, Plätze, Parks, Bahnhöfe, öffentliche Gänge oder Tunnel, …"
@ -197,7 +197,7 @@
}, },
"then": { "then": {
"en": "An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, …)", "en": "An outdoor, yet private area is surveilled (e.g. a parking lot, a fuel station, courtyard, entrance, private driveway, …)",
"nl": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, ...)", "nl": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, )",
"fr": "Une zone extérieure, mais privée, est surveillée (par exemple, un parking, une station-service, une cour, une entrée, une allée privée, etc.)", "fr": "Une zone extérieure, mais privée, est surveillée (par exemple, un parking, une station-service, une cour, une entrée, une allée privée, etc.)",
"it": "Sorveglia un'area esterna di proprietà privata (un parcheggio, una stazione di servizio, un cortile, un ingresso, un vialetto privato, ...)", "it": "Sorveglia un'area esterna di proprietà privata (un parcheggio, una stazione di servizio, un cortile, un ingresso, un vialetto privato, ...)",
"de": "Die Kamera überwacht einen privaten Außenbereich, z.B. Parkplätze, Tankstellen, Innenhöfe, Eingänge, private Einfahrten, …" "de": "Die Kamera überwacht einen privaten Außenbereich, z.B. Parkplätze, Tankstellen, Innenhöfe, Eingänge, private Einfahrten, …"
@ -210,7 +210,7 @@
] ]
}, },
"then": { "then": {
"nl": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, ...", "nl": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, ",
"en": "A private indoor area is surveilled, e.g. a shop, a private underground parking, …", "en": "A private indoor area is surveilled, e.g. a shop, a private underground parking, …",
"fr": "Une zone intérieure privée est surveillée, par exemple un magasin, un parking souterrain privé…", "fr": "Une zone intérieure privée est surveillée, par exemple un magasin, un parking souterrain privé…",
"it": "Sorveglia un ambiente interno di proprietà privata, per esempio un negozio, un parcheggio sotterraneo privato, ...", "it": "Sorveglia un ambiente interno di proprietà privata, per esempio un negozio, un parcheggio sotterraneo privato, ...",

View file

@ -0,0 +1,167 @@
{
"id": "tertiary_education",
"name": {
"en": "Colleges and universities",
"nl": "Universiteiten en hogescholen"
},
"description": "Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8)",
"source": {
"osmTags": {
"or": [
"amenity=college",
"amenity=university",
{
"and": [
"amenity=school",
{
"or": [
"isced:2011:level~.*bachelor.*",
"isced:2011:level~.*master.*"
]
}
]
}
]
}
},
"title": {
"mappings": [
{
"if": "name~*",
"then": {
"*": "{name}"
}
},
{
"if": "amenity=college",
"then": {
"en": "College",
"nl": "Hogeschool"
}
},
{
"if": "amenity=university",
"then": {
"en": "University",
"nl": "Universiteit"
}
},
{
"if": "amenity=school",
"then": {
"en": "School providing tertiary education",
"nl": "Onderwijsinstelling die tertiair onderwijs geeft"
}
}
]
},
"tagRenderings": [
{
"id": "institution-kind",
"question": {
"en": "What kind of institution is this?",
"nl": "Wat voor onderwijsinstelling is dit?"
},
"mappings": [
{
"if": "amenity=college",
"then": {
"en": "This is an institution of post-secondary, non-tertiary education. One has to have completed secondary education to enroll here, but no bachelor (or higher) degrees are awarded here",
"nl": "Dit is een onderwijsinstelling waar post-secundair, niet-tertiair onderwijs wordt gegeven. Om dit onderwijs te volgen, moet je je secundair onderwijs afgewerkt hebben maar de opleiding behaalt niet het niveau van van een bachelor."
}
},
{
"if": "amenity=university",
"then": {
"en": "This is a university, an institution of tertiary education where bachelor degrees or higher are awarded.",
"nl": "Dit is een universiteit (of hogeschool), een onderwijsinstelling van tertaire educatie. De gegeven opleidingen halen het niveau van een bachelor-opleiding of hoger."
}
}
]
},
{
"id": "isced",
"question": {
"en": "What level of education is given here?",
"nl": "Wat is het niveau van onderwijs?"
},
"multiAnswer": true,
"mappings": [
{
"if": "isced:2011:level=bachelor",
"then": {
"en": "Bachelor degrees are awarded here",
"nl": "Bacheloropleidingen (of equivalent) worden hier gegeven"
}
},
{
"if": "isced:2011:level=master",
"then": {
"en": "Master degrees are awarded here",
"nl": "Masteropleidingen (of equivalent) worden hier gegeven"
}
},
{
"if": "isced:2011:level=doctorate",
"then": {
"en": "Doctorate degrees are awarded here",
"nl": "Doctoraatsopleidingen (of equivalent) worden hier gegeven"
}
}
],
"condition": "amenity=university"
},
{
"builtin": [
"school.capacity",
"school.gender"
],
"override": {
"condition": null
}
},
"website",
"email",
"phone"
],
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"iconSize": {
"render": "40,40,center"
},
"label": {
"mappings": [
{
"if": "name~*",
"then": "<div class='bg-white rounded-lg p-1'>{name}</div>"
}
]
},
"icon": "circle:white;./assets/layers/school/college.svg"
},
{
"color": "#22f1f4",
"width": 1
}
],
"presets": [
{
"title": {
"en": "a university",
"nl": "een universiteit"
},
"description": {
"en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.",
"nl": "Een onderwijsinstelling waar tertiair onderwijs wordt gegeven - dit is onderwijs waarvan het niveau overeenkomt met een bachelor of hoger is. Eén enkel punt per campus is genoeg - gebouwen en faculteiten worden hier niet op aangeduid."
},
"tags": [
"amenity=university",
"fixme=Added with MapComplete, geometry to be drawn"
]
}
]
}

View file

@ -371,7 +371,8 @@
"en": "What species is this tree?", "en": "What species is this tree?",
"de": "Um welche Baumart handelt es sich?", "de": "Um welche Baumart handelt es sich?",
"id": "Spesies pohon apa ini?", "id": "Spesies pohon apa ini?",
"es": "¿De qué especie es este árbol?" "es": "¿De qué especie es este árbol?",
"nl": "Wat is de boomsoort?"
}, },
"render": { "render": {
"*": "{wikipedia(species:wikidata):max-height: 25rem}" "*": "{wikipedia(species:wikidata):max-height: 25rem}"

View file

@ -15,7 +15,8 @@
"en": "a veterianarian", "en": "a veterianarian",
"da": "en dyrl&aelig;ge", "da": "en dyrl&aelig;ge",
"de": "ein Tierarzt", "de": "ein Tierarzt",
"es": "un veterinario" "es": "un veterinario",
"nl": "een dierenarts"
}, },
"tags": [ "tags": [
"amenity=veterinary", "amenity=veterinary",
@ -25,7 +26,8 @@
"en": "a veterianarian, that treats dogs", "en": "a veterianarian, that treats dogs",
"da": "En dyrl&aelig;ge, der behandler hunde", "da": "En dyrl&aelig;ge, der behandler hunde",
"de": "ein Tierarzt, der Hunde behandelt", "de": "ein Tierarzt, der Hunde behandelt",
"es": "un veterinario, que trata a perros" "es": "un veterinario, que trata a perros",
"nl": "een dierenarts die honden verzorgt"
} }
} }
], ],
@ -33,7 +35,8 @@
"en": "veterinary", "en": "veterinary",
"da": "dyrl&aelig;ge", "da": "dyrl&aelig;ge",
"de": "Tierärzte", "de": "Tierärzte",
"es": "veterinario" "es": "veterinario",
"nl": "Dierenarts"
}, },
"title": { "title": {
"render": { "render": {
@ -41,7 +44,8 @@
"da": "dyrl&aelig;ge", "da": "dyrl&aelig;ge",
"de": "Tierarzt", "de": "Tierarzt",
"id": "Dokter hewan", "id": "Dokter hewan",
"es": "Veterinario" "es": "Veterinario",
"nl": "Dierenarts"
}, },
"mappings": [ "mappings": [
{ {
@ -90,12 +94,14 @@
"en": "What is the name of this veterinarian?", "en": "What is the name of this veterinarian?",
"da": "Hvad hedder denne dyrl&aelig;?", "da": "Hvad hedder denne dyrl&aelig;?",
"de": "Wie lautet der Name dieses Tierarztes?", "de": "Wie lautet der Name dieses Tierarztes?",
"es": "¿Cual es el nombre de este veterinario?" "es": "¿Cual es el nombre de este veterinario?",
"nl": "Wat is de naam van deze dierenartspraktijk?"
}, },
"render": { "render": {
"en": "The name of this veterinarian is {name}", "en": "The name of this veterinarian is {name}",
"de": "Denne dyrl&aelig; hedder {name}", "de": "Denne dyrl&aelig; hedder {name}",
"es": "El nombre de este veterinario es {name}" "es": "El nombre de este veterinario es {name}",
"nl": "Deze dierenartspraktijk heet {name}"
}, },
"freeform": { "freeform": {
"key": "name" "key": "name"

View file

@ -11,7 +11,7 @@
}, },
"description": { "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.", "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.",
"nl": "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.", "nl": "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.",
"de": "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." "de": "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."
}, },
"source": { "source": {

View file

@ -11,7 +11,8 @@
}, },
"description": { "description": {
"en": "Modern windmills generating electricity", "en": "Modern windmills generating electricity",
"de": "Moderne Windmühlen zur Stromerzeugung" "de": "Moderne Windmühlen zur Stromerzeugung",
"nl": "Windturbines (moderne windmolens die elektriciteit genereren)"
}, },
"source": { "source": {
"osmTags": "generator:source=wind" "osmTags": "generator:source=wind"
@ -40,7 +41,8 @@
"zh_Hant": "{name}", "zh_Hant": "{name}",
"id": "{name}", "id": "{name}",
"de": "{name}", "de": "{name}",
"ca": "{name}" "ca": "{name}",
"nl": "{name}"
} }
} }
] ]
@ -55,7 +57,8 @@
"zh_Hant": "這個風機的電力輸出是 {generator:output:electricity}。", "zh_Hant": "這個風機的電力輸出是 {generator:output:electricity}。",
"id": "Output daya dari turbin angin ini adalah {generator:output:electricity}.", "id": "Output daya dari turbin angin ini adalah {generator:output:electricity}.",
"hu": "A szélerőmű teljesítménye: {generator:output:electricity}.", "hu": "A szélerőmű teljesítménye: {generator:output:electricity}.",
"de": "Das Windrad erzeugt {generator:output:electricity} Strom." "de": "Das Windrad erzeugt {generator:output:electricity} Strom.",
"nl": "Deze windturbine genereert {generator:output:electricity}"
}, },
"question": { "question": {
"en": "What is the power output of this wind turbine? (e.g. 2.3 MW)", "en": "What is the power output of this wind turbine? (e.g. 2.3 MW)",
@ -64,7 +67,8 @@
"zh_Hant": "這個風機的電力輸出是多少?(例如 2.3 MW)", "zh_Hant": "這個風機的電力輸出是多少?(例如 2.3 MW)",
"id": "Berapa output daya dari turbin angin ini? (misalnya 2,3 MW)", "id": "Berapa output daya dari turbin angin ini? (misalnya 2,3 MW)",
"hu": "Mekkora a teljesítménye ennek a szélturbinának? (pl. 2.3 MW)", "hu": "Mekkora a teljesítménye ennek a szélturbinának? (pl. 2.3 MW)",
"de": "Wieviel Strom erzeugt das Windrad? (z.B. 2.3 MW)" "de": "Wieviel Strom erzeugt das Windrad? (z.B. 2.3 MW)",
"nl": "Wat is de output"
}, },
"freeform": { "freeform": {
"key": "generator:output:electricity", "key": "generator:output:electricity",
@ -126,7 +130,8 @@
"it": "Il diametro del rotore di questa pala eolica è di {rotor:diameter} metri.", "it": "Il diametro del rotore di questa pala eolica è di {rotor:diameter} metri.",
"zh_Hant": "這個風力渦輪機的風葉直徑是 {rotor:diameter} 公尺。", "zh_Hant": "這個風力渦輪機的風葉直徑是 {rotor:diameter} 公尺。",
"hu": "A szélturbina rotorátmérője: {rotor:diameter} méter.", "hu": "A szélturbina rotorátmérője: {rotor:diameter} méter.",
"de": "Der Rotordurchmesser der Windturbine ist {rotor:diameter} Meter." "de": "Der Rotordurchmesser der Windturbine ist {rotor:diameter} Meter.",
"nl": "De rotordiameter van deze windturbine is {rotor:diameter} meter."
}, },
"question": { "question": {
"en": "What is the rotor diameter of this wind turbine, in metres?", "en": "What is the rotor diameter of this wind turbine, in metres?",
@ -134,7 +139,8 @@
"it": "Qual è il diametro (in metri) del rotore di questa pala eolica?", "it": "Qual è il diametro (in metri) del rotore di questa pala eolica?",
"zh_Hant": "這個風力渦輪機的風葉直徑是多少公尺?", "zh_Hant": "這個風力渦輪機的風葉直徑是多少公尺?",
"hu": "Hány méter a rotorátmérője ennek a szélturbinának?", "hu": "Hány méter a rotorátmérője ennek a szélturbinának?",
"de": "Wie groß ist der Rotordurchmesser der Windturbine in Meter?" "de": "Wie groß ist der Rotordurchmesser der Windturbine in Meter?",
"nl": "Wat is de rotordiameter van deze windturbine?"
}, },
"freeform": { "freeform": {
"key": "rotor:diameter", "key": "rotor:diameter",
@ -150,7 +156,8 @@
"zh_Hant": "這個風機從 {start_date} 開始運轉。", "zh_Hant": "這個風機從 {start_date} 開始運轉。",
"id": "Turbin angin ini mulai beroperasi pada/dalam {start_date}.", "id": "Turbin angin ini mulai beroperasi pada/dalam {start_date}.",
"hu": "A szélerőmű üzembe helyezése: {start_date}.", "hu": "A szélerőmű üzembe helyezése: {start_date}.",
"de": "Das Windrad wurde am {start_date} in Betrieb genommen." "de": "Das Windrad wurde am {start_date} in Betrieb genommen.",
"nl": "Deze windturbine werd op {start_date} in gebruik genomen"
}, },
"question": { "question": {
"en": "When did this wind turbine go into operation?", "en": "When did this wind turbine go into operation?",
@ -159,7 +166,8 @@
"zh_Hant": "這個風機何時開始營運?", "zh_Hant": "這個風機何時開始營運?",
"id": "Kapan turbin angin ini mulai beroperasi?", "id": "Kapan turbin angin ini mulai beroperasi?",
"hu": "Mikor helyezték üzembe ezt a szélerőművet?", "hu": "Mikor helyezték üzembe ezt a szélerőművet?",
"de": "Wann wurde das Windrad in Betrieb genommen?" "de": "Wann wurde das Windrad in Betrieb genommen?",
"nl": "Wanneer werd deze windturbine in gebruik genomen?"
}, },
"freeform": { "freeform": {
"key": "start_date", "key": "start_date",

View file

@ -1034,7 +1034,9 @@
}, },
"smoking": { "smoking": {
"question": { "question": {
"en": "Is smoking allowed at {title()}?" "en": "Is smoking allowed at {title()}?",
"de": "Ist das Rauchen in {title()} erlaubt?",
"es": "¿Está permitido fumar en {title()}?"
}, },
"#condition": "Based on https://en.wikipedia.org/wiki/List_of_smoking_bans", "#condition": "Based on https://en.wikipedia.org/wiki/List_of_smoking_bans",
"condition": "_country!~al|be", "condition": "_country!~al|be",
@ -1046,7 +1048,9 @@
"size": "small" "size": "small"
}, },
"then": { "then": {
"en": "Smoking is <b>allowed</b>" "en": "Smoking is <b>allowed</b>",
"de": "Rauchen ist <b>erlaubt</b>",
"es": "Está <b>permitido</b> fumar"
} }
}, },
{ {
@ -1056,13 +1060,17 @@
"size": "small" "size": "small"
}, },
"then": { "then": {
"en": "Smoking is <b>not allowed</b>" "en": "Smoking is <b>not allowed</b>",
"de": "Rauchen ist <b>nicht erlaubt</b>",
"es": "<b>No</b> está permitido fumar"
} }
}, },
{ {
"if": "smoking=outside", "if": "smoking=outside",
"then": { "then": {
"en": "Smoking is <b>allowed outside</b>." "en": "Smoking is <b>allowed outside</b>.",
"de": "Rauchen ist <b> draußen erlaubt</b>.",
"es": "Está permitido fumar <b>en el exterior</b>."
} }
} }
] ]

View file

@ -0,0 +1,137 @@
Published as https://www.openstreetmap.org/user/Pieter%20Vander%20Vennet/diary/399339/
For my work at [anyways.eu](https://anyways.eu), I've been tasked to make sure that all schools are in OSM - especially with capacity.
No better way to do this by making it easy for contributors to add the correct data... So, I wanted to create a MapComplete theme for education. Normally, I would open up the wiki to see what tagging is needed, but for schools there is very little tagging available at the moment, which is a mess.
As it turns out, schools are diverse and this is reflected in the tagging.
This diary entry serves two goals:
1. I want to organize my thoughts on how a tagging model could look like
2. It is meant to stir up some discussion.
Hopefully, some tagging proposals will come forward from from this post.
# So, what is a school (or educational institute) anyway?
This is already a hard question. The [openstreetmap-wiki on 'education features' states](https://wiki.openstreetmap.org/wiki/Education_features):
> Education features are map objects and object features which relate to educational activities
Well, thanks, captain obvious.
Let's turn to the [International Standard Classification of Education](http://uis.unesco.org/en/files/isced-2011-operational-manual-guidelines-classifying-national-education-programmes-and-related) (from Unesco) instead:
> As national education systems vary in terms of structure and curricular content, it can be difficult to benchmark performance over time or monitor progress.
So, in other words, it is difficult as this can be highly different amonst regions. The ISCED-document however does a good job to draw some lines and to give some definitions.
## What does a standard school curriculum look like?
In most countries, the school trajectory for most people (according the the ISCED, page 21) looks more or less as following:
Before formal education starts, kids younger then about 5 or 6 go to _preschool/kindergarten_. This is optional in most countries, and some education takes place, often to prepare spelling and simple math.
ISCED calls this **level 0**
Between 6 and around 12, kids learn to read an write, learn basic math skills and other skills. This is called **primary education** and corresponds with **isced level 1**
Between 12 and 14/15, kids get lower secondary eduction and learn more skills and competencies (**isced level 2**).
Between 14/15 and 18; kids get higher secondary education (**isced level 3**).
Note that the secondary levels have a split between education preparing for (a set of) trades versus a general training which prepares for tertiary education.
These orientations are called `vocational` and `general` education.
At age of 18, someone who has obtained **upper secondary** education, could join the workforce, could follow non-tertiary education (see below) or could enroll in tertiary education.
The first cycle of tertiary education are often **bachelors** (often 3 years, but 2 years is pretty common too) and correspond with **isced level 6**, after which a **master degree** (often 2 years) which corresponds with **isced level 7** can be obtained.
The bachelors and master degrees often have an orientation too, called `professional` or `academic`
At last, a **doctorate** can be obtained which corresponds with **isced level 8**.
If, at age 18 someone does not want to enroll in tertiary education or isn't ready yet for the labour market yet, they can also follow a **post-secondary non-tertiary** (ISCED level 4) education.
This is an education which is not sufficiently complex to qualify as tertiary eduction and often has a vocational training, thus a training which prepares for direct labour market entry. Note that the ISCED does not state typical ages for this education form, as it is often taken by adults too.
At last, **isced level 5**, officially called **short-cycle tertiary education** provides education to prepare for following bachelor degree, e.g. if the skills obtained by a vocational secondary degree are not sufficient to enter a bachelors degree.
## What if the education is non-standard?
A good tagging scheme doesn't break under special cases. Lets have a look at some of them to test the waters.
While _most_ of the people might follow a trajectory as outlined above, many don't.
The ISCED-definition leaves wiggle room by more or less defining what _skills_ one gains in a certain education level - not at what _age_ someone typically obtains these skills. While the typical ages are _stated_ in the ISCED, they are not the defining features.
Some examples of non-standard trajectories could be:
- Someone who has never had the chance on learning how to read might enroll in _primary education_ as an adult.
- Someone with a learning disability might be obtaining the _lower_secondary_ skill, even though people of their age age are in _higher_secondary_.
- Someone in their forties might wish to reorient their career and follow a vocational course of the skill level of a _vocational_upper_secondary_.
- Someone might follow a course in music, dancing, skiing or scuba diving as a hobby in an informal school during the evenings, while still working their job during the day.
This last example also touches upon specialized schools. How should these be handled? Examples of these schools are:
- driving schools or flight school.
- a secondary school which focuses on arts, but has enough general skills to be compatible with ISCED-level `upper_secondary`? [iAnd what if this school contains a college with a bachelor degree in music too,n the same buildings?](https://en.wikipedia.org/wiki/Lemmensinstituut)
So, this implies that knowing the `isced`-level of a school is very useful and often does imply the age of the pupils, we still need a way to express whom is going to this school.
## Who is the school for?
By default, we could assume that most schools are normal schools where pupils follow age-adequate courses.
This is not always the case. Some schools focus e.g. on secondary education for adults, other focus on people with disabilities.
To tag this, I propose to introduce a tag `school:for`, e.g. `school:for=autism`, `school:for=adults`, `school:for=learning_disabilities`, ...
If this tag is missing, one can assume that the school is for normal-abled people whom follow courses typical for their age.
In some places, schools are separated by gender too. Some schools are boys/girls only, others teach both but they are separated. This might fit this tag too, but not quite.
## What does a school teach?
The further in the education system, the more specialized education gets.
Where all primary education teaches more-or-less the same subjects, secondary education already starts to specialize.
And tertiary education is extremely specialized, with faculties teaching about just one field.
I propose to introduce a `school:subject`-tag, which indicates what subjects are taught at a school.
This must be independent of the ISCED-level. For example: a school might focus on "teaching music",
which can range from evening school for adults, to a secondary school that qualifies as `isced=upper_secondary` to even a college in arts having doctorate students.
Giving an exhaustive list of possible values is impossible, but some common values could be:
- arts, music, dance, painting, ...
- driving
- flight
- to disambiguate, a wikidata-entity could be linked
- ...
The tag `school:subject` would also remove the need for various extra amenities, such as `amenity=dance_school`, `amenity=music_school`, reducing complexity.
Other details and assumptions (e.g. target audience and offered education level) can be clarified as explained above.
Schools which do teach skills without general education (e.g. a driving school) could thus be tagged with:
```
amenity=school
school:subject=driving
isced:2011:level=post_secondary
```
A college, tagged with `amenity=college` thus implies `isced:2011:level=professional_bachelor`. Whether or not a `master`-degree can be obtained at that college can not safely be assumed.
## Schooling method
At last, there are multiple ways to teach students. Especially secondary education has a rich variety. In Flanders, we have Montessori schools, Freinet, Steiner, CLIL, ... This could be worthy of a tag too, e.g. with `educational_method` or`educational_method:wikidata`
## Other tags
Of course, there are still other well-established tags important too, such as `capacity`, contact information, ... I'm not covering them here, as these are already widely accepted.
# Conclusion
Schools are diverse in the subjects and the level of education they teach, how they teach and who they teach. This makes tagging difficult. This post describes a possible method of splitting these subjects into orthogonal tags which can be independently measured.
This blogpost attempts to give a first attempt, but of course, I'm only aware of my own environment. There must be other types of schools which I've never heard of before, so if you know of something that is considered an 'educational feature' which cannot be tagged with the tags described above, please let me know.

View file

@ -0,0 +1,25 @@
{
"id": "education",
"description": {
"en": "On this map, you'll find information about all types of schools and eduction and can easily add more information",
"nl": "Deze kaart toont info over verschillende onderwijsinstellingen zoals kleuterscholen, middelbare scholen en tertiair onderwijs."
},
"title": {
"en": "Education",
"nl": "Onderwijs"
},
"defaultBackgroundId": "CartoDB.Voyager",
"maintainer": "MapComplete",
"version": "0.0.1",
"startLat": 0,
"startLon": 0,
"startZoom": 0,
"icon": "./assets/layers/school/college.svg",
"#layers:note": "kindergarten_childcare must be _below_ school, as it can 'catch' primary schools which do have an integrated preschool",
"layers": [
"tertiary_education",
"school",
"kindergarten_childcare"
],
"hideFromOverview": true
}

View file

@ -1,24 +1,13 @@
{ {
"id": "mapcomplete-changes", "id": "mapcomplete-changes",
"title": { "title": {
"en": "Changes made with MapComplete", "en": "Changes made with MapComplete"
"de": "Änderungen mit MapComplete",
"es": "Cambios hechos con MapComplete",
"nb_NO": "Endringer utført med MapComplete",
"nl": "Wijzigingen gemaakt met MapComplete"
}, },
"shortDescription": { "shortDescription": {
"en": "Shows changes made by MapComplete", "en": "Shows changes made by MapComplete"
"de": "Zeigt Änderungen von MapComplete",
"es": "Muestra los cambios hechos por MapComplete",
"nb_NO": "Vis endringer utført med MapComplete",
"nl": "Toont wijzigingen gemaakt met MapComplete"
}, },
"description": { "description": {
"en": "This maps shows all the changes made with MapComplete", "en": "This maps shows all the changes made with MapComplete"
"de": "Diese Karte zeigt alle Änderungen die mit MapComplete gemacht wurden",
"es": "Este mapa muestra todos los cambios hechos con MapComplete",
"nl": "Deze kaart toont alle wijzigingen die met MapComplete werden gemaakt"
}, },
"maintainer": "", "maintainer": "",
"icon": "./assets/svg/logo.svg", "icon": "./assets/svg/logo.svg",
@ -33,10 +22,7 @@
{ {
"id": "mapcomplete-changes", "id": "mapcomplete-changes",
"name": { "name": {
"en": "Changeset centers", "en": "Changeset centers"
"de": "Schwerpunkte von Änderungssätzen",
"es": "Centros de conjuntos de cambios",
"nb_NO": "Endringssettsenter"
}, },
"minzoom": 0, "minzoom": 0,
"source": { "source": {
@ -50,55 +36,35 @@
], ],
"title": { "title": {
"render": { "render": {
"en": "Changeset for {theme}", "en": "Changeset for {theme}"
"de": "Änderungen für {theme}",
"es": "Conjunto de cambios para {theme}",
"nb_NO": "Endringssett for {theme}",
"nl": "Wijzigingset voor {theme}"
} }
}, },
"description": { "description": {
"en": "Shows all MapComplete changes", "en": "Shows all MapComplete changes"
"de": "Zeigt alle MapComplete Änderungen",
"es": "Muestra todos los cambios de MapComplete",
"nl": "Toont alle wijzigingen met MapComplete"
}, },
"tagRenderings": [ "tagRenderings": [
{ {
"id": "render_id", "id": "render_id",
"render": { "render": {
"en": "Changeset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>", "en": "Changeset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
"de": "Änderung <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>",
"es": "Conjunto de cambios <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>",
"nb_NO": "Endringssett <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>",
"nl": "Wijzigingset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
} }
}, },
{ {
"id": "contributor", "id": "contributor",
"render": { "render": {
"en": "Change made by <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a>", "en": "Change made by <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a>"
"de": "Änderung wurde von <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a> gemacht",
"es": "Cambio hecho por <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a>",
"nl": "Wijziging gemaakt door <a href='https://openstreetmap.org/user/{_last_edit:contributor}' target='_blank'>{_last_edit:contributor}</a>"
} }
}, },
{ {
"id": "theme", "id": "theme",
"render": { "render": {
"en": "Change with theme <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>", "en": "Change with theme <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
"de": "Änderung mit Thema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>",
"es": "Cambio con tema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>",
"nl": "Wijziging met thema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
}, },
"mappings": [ "mappings": [
{ {
"if": "theme~http.*", "if": "theme~http.*",
"then": { "then": {
"en": "Change with <b>unofficial</b> theme <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>", "en": "Change with <b>unofficial</b> theme <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>"
"de": "Änderung mit <b>inoffiziellem</b> Thema <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>",
"es": "Cambio con tema <b>no oficial</b> <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>",
"nl": "Wijziging met <b>officieus</b> thema <a href='https://mapcomplete.osm.be/theme.html?userlayout={theme}'>{theme}</a>"
} }
} }
] ]
@ -189,6 +155,10 @@
"if": "theme=drinking_water", "if": "theme=drinking_water",
"then": "./assets/themes/drinking_water/logo.svg" "then": "./assets/themes/drinking_water/logo.svg"
}, },
{
"if": "theme=education",
"then": "./assets/layers/school/college.svg"
},
{ {
"if": "theme=entrances", "if": "theme=entrances",
"then": "./assets/layers/entrance/door.svg" "then": "./assets/layers/entrance/door.svg"
@ -370,11 +340,7 @@
} }
], ],
"question": { "question": {
"en": "Themename contains {search}", "en": "Themename contains {search}"
"de": "Themenname enthält {search}",
"es": "Nombre del tema contiene {search}",
"nb_NO": "Temanavn inneholder {search}",
"nl": "Themanaam bevat {search}"
} }
} }
] ]
@ -390,10 +356,7 @@
} }
], ],
"question": { "question": {
"en": "Made by contributor {search}", "en": "Made by contributor {search}"
"de": "Erstellt von {search}",
"es": "Hecho por contributor/a {search}",
"nl": "Gemaakt door bijdrager {search}"
} }
} }
] ]
@ -409,10 +372,7 @@
} }
], ],
"question": { "question": {
"en": "<b>Not</b> made by contributor {search}", "en": "<b>Not</b> made by contributor {search}"
"de": "<b>Nicht</b> erstellt von {search}",
"es": "<b>No</b> hecho por contributor/a {search}",
"nl": "<b>Niet</b> gemaakt door bijdrager {search}"
} }
} }
] ]
@ -427,10 +387,7 @@
{ {
"id": "link_to_more", "id": "link_to_more",
"render": { "render": {
"en": "More statistics can be found <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>here</a>", "en": "More statistics can be found <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>here</a>"
"de": "Weitere Statistiken finden Sie <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>hier</a>",
"es": "Se pueden encontrar más estadísticas <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>aquí</a>",
"nl": "Meer statistieken kunnen <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>hier</a> gevonden worden"
} }
}, },
{ {

View file

@ -1,11 +1,11 @@
{ {
"contributors": [ "contributors": [
{ {
"commits": 161, "commits": 165,
"contributor": "Pieter Vander Vennet" "contributor": "Pieter Vander Vennet"
}, },
{ {
"commits": 121, "commits": 123,
"contributor": "kjon" "contributor": "kjon"
}, },
{ {
@ -25,7 +25,7 @@
"contributor": "Artem" "contributor": "Artem"
}, },
{ {
"commits": 25, "commits": 27,
"contributor": "Iago" "contributor": "Iago"
}, },
{ {
@ -92,6 +92,10 @@
"commits": 7, "commits": 7,
"contributor": "Niels Elgaard Larsen" "contributor": "Niels Elgaard Larsen"
}, },
{
"commits": 6,
"contributor": "Joost Schouppe"
},
{ {
"commits": 6, "commits": 6,
"contributor": "Romain de Bossoreille" "contributor": "Romain de Bossoreille"
@ -124,10 +128,6 @@
"commits": 6, "commits": 6,
"contributor": "lvgx" "contributor": "lvgx"
}, },
{
"commits": 5,
"contributor": "Joost Schouppe"
},
{ {
"commits": 5, "commits": 5,
"contributor": "phlostically" "contributor": "phlostically"

View file

@ -41,7 +41,7 @@
}, },
"general": { "general": {
"about": "Easily edit and add OpenStreetMap for a certain theme", "about": "Easily edit and add OpenStreetMap for a certain theme",
"aboutMapcomplete": "<h3>About MapComplete</h3><p>Use it to add OpenStreetMap info on a <b>single theme.</b> Answer questions, and within minutes your contributions are available everywhere. The <b>theme maintainer</b> defines elements, questions and languages for it.</p><h3>Find out more</h3><p>MapComplete always <b>offers the next step</b> to learn more about OpenStreetMap.<ul><li>When embedded in a website, the iframe links to a full-screen MapComplete</li><li>The fullscreen version offers info about OpenStreetMap</li><li>Viewing works without login, but editing requires an OSM account.</li><li>If you are not logged in, you are asked to do so</li><li>Once you answered a single question, you can add new points to the map</li><li>After a while, actual OSM-tags are shown, later linking to the wiki</li></ul></p><br/><p>Did you notice <b>an issue</b>? Do you have a <b>feature request</b>? Want to <b>help translate</b>? Head over to <a href='https://github.com/pietervdvn/MapComplete' target='_blank'>the source code</a> or <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>issue tracker.</a> </p><p> Want to see <b>your progress</b>? Follow the edit count on <a href='{osmcha_link}' target='_blank' >OsmCha</a>.</p>", "aboutMapcomplete": "<h3>About MapComplete</h3><p>Use it to add OpenStreetMap info on a <b>single theme.</b> Answer questions, and within minutes your contributions are available everywhere. In most themes you can add pictures or even leave a review. The <b>theme maintainer</b> defines elements, questions and languages for it.</p><h3>Find out more</h3><p>MapComplete always <b>offers the next step</b> to learn more about OpenStreetMap.<ul><li>When embedded in a website, the iframe links to a full-screen MapComplete</li><li>The fullscreen version offers info about OpenStreetMap</li><li>Viewing works without login, but editing requires an OSM account.</li><li>If you are not logged in, you are asked to do so</li><li>Once you answered a single question, you can add new points to the map</li><li>After a while, actual OSM-tags are shown, later linking to the wiki</li></ul></p><br/><p>Did you notice <b>an issue</b>? Do you have a <b>feature request</b>? Want to <b>help translate</b>? Head over to <a href='https://github.com/pietervdvn/MapComplete' target='_blank'>the source code</a> or <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>issue tracker.</a> </p><p> Want to see <b>your progress</b>? Follow the edit count on <a href='{osmcha_link}' target='_blank' >OsmCha</a>.</p>",
"add": { "add": {
"addNew": "Add {category}", "addNew": "Add {category}",
"addNewMapLabel": "Click here to add a new item", "addNewMapLabel": "Click here to add a new item",
@ -253,6 +253,12 @@
"wednesday": "Wednesday" "wednesday": "Wednesday"
}, },
"welcomeBack": "You are logged in, welcome back!", "welcomeBack": "You are logged in, welcome back!",
"welcomeExplanation": {
"addNew": "Tap the map to add a new POI.",
"browseMoreMaps": "Discover more maps",
"browseOtherThemesIntro": "Various thematic maps exist on MapComplete",
"general": "On this map, you can see, edit and add <i>points of interest</i>. Zoom around to see the POI, tap one to see or edit the information. All data is sourced from and saved to OpenStreetMap, which can be freely reused."
},
"wikipedia": { "wikipedia": {
"createNewWikidata": "Create a new Wikidata item", "createNewWikidata": "Create a new Wikidata item",
"doSearch": "Search above to see results", "doSearch": "Search above to see results",

View file

@ -11,6 +11,8 @@
"delete": "Eliminar", "delete": "Eliminar",
"explanations": { "explanations": {
"hardDelete": "Este punto será eliminado en OpenStreetMap. Puede ser recuperado por un colaborador experimentado", "hardDelete": "Este punto será eliminado en OpenStreetMap. Puede ser recuperado por un colaborador experimentado",
"retagNoOtherThemes": "Esta característica será reclasificada y ocultada en esta aplicación",
"retagOtherThemes": "Esta característica será reetiquetada y visible en {otherThemes}",
"selectReason": "Por favor, seleccione el motivo por el que esta característica debe ser eliminada", "selectReason": "Por favor, seleccione el motivo por el que esta característica debe ser eliminada",
"softDelete": "Esta característica se actualizará y ocultará en esta aplicación. &lt;spann class='subtle'&gt;{reason}" "softDelete": "Esta característica se actualizará y ocultará en esta aplicación. &lt;spann class='subtle'&gt;{reason}"
}, },
@ -80,6 +82,9 @@
"donate": "Apoya a MapComplete de manera financiera", "donate": "Apoya a MapComplete de manera financiera",
"editId": "Abre el editor en línea de OpenStreetMap aquí", "editId": "Abre el editor en línea de OpenStreetMap aquí",
"editJosm": "Edita aquí conJOSM", "editJosm": "Edita aquí conJOSM",
"followBridge": "Las cuentas de Mastodon y Twitter están puenteadas",
"followOnMastodon": "Seguir a MapComplete en Mastodon",
"followOnTwitter": "Seguir a MapComplete en twitter",
"iconAttribution": { "iconAttribution": {
"title": "Iconos usados" "title": "Iconos usados"
}, },
@ -87,6 +92,7 @@
"josmOpened": "JOSM está abierto", "josmOpened": "JOSM está abierto",
"mapContributionsBy": "La información visible actual tiene ediciones hechas por {contributors}", "mapContributionsBy": "La información visible actual tiene ediciones hechas por {contributors}",
"mapContributionsByAndHidden": "Los datos actualmente visibles tienen ediciones hechas por {contributors} y {hiddenCount} más contribuidores", "mapContributionsByAndHidden": "Los datos actualmente visibles tienen ediciones hechas por {contributors} y {hiddenCount} más contribuidores",
"mapillaryHelp": "<b>Mapillary</b> es un servicio en línea que recoge imágenes a pié de calle y las ofrece bajo una licencia libre. Los contribuidores pueden utilizar estás imágenes para mejorar OpenStreetMap",
"openIssueTracker": "Reportar un error", "openIssueTracker": "Reportar un error",
"openMapillary": "Abrir Mapillary aquí", "openMapillary": "Abrir Mapillary aquí",
"openOsmcha": "Ver las últimas ediciones hechas con {theme}", "openOsmcha": "Ver las últimas ediciones hechas con {theme}",
@ -133,7 +139,7 @@
"zoomInToSeeThisLayer": "Amplía para ver esta capa" "zoomInToSeeThisLayer": "Amplía para ver esta capa"
}, },
"loading": "Cargando…", "loading": "Cargando…",
"loadingTheme": "Cargar {theme}...", "loadingTheme": "Cargando {theme}…",
"loginFailed": "El inicio de sesión en OpenStreetMap falló", "loginFailed": "El inicio de sesión en OpenStreetMap falló",
"loginOnlyNeededToEdit": "Si quieres editar el mapa", "loginOnlyNeededToEdit": "Si quieres editar el mapa",
"loginToStart": "Entra para contestar esta pregunta", "loginToStart": "Entra para contestar esta pregunta",
@ -143,8 +149,11 @@
"createYourOwnTheme": "Crea tu propia petición completa de MapComplete desde cero.", "createYourOwnTheme": "Crea tu propia petición completa de MapComplete desde cero.",
"hiddenExplanation": "Estos temas solo son visibles para aquellos con el enlace. Has descubierto {hidden_discovered} de {total_hidden} temas ocultos.", "hiddenExplanation": "Estos temas solo son visibles para aquellos con el enlace. Has descubierto {hidden_discovered} de {total_hidden} temas ocultos.",
"intro": "<h3>Más peticiones</h3>Te gusta captar datos? <br/>Hay más capas disponibles.", "intro": "<h3>Más peticiones</h3>Te gusta captar datos? <br/>Hay más capas disponibles.",
"noMatchingThemes": "Ningún tema coincide con tus criterios de búsqueda",
"noSearch": "Mostrar todos los temas",
"previouslyHiddenTitle": "Temas ocultos previamente visitados", "previouslyHiddenTitle": "Temas ocultos previamente visitados",
"requestATheme": "Si quieres que te hagamos una petición propia , pídela <a href='https://github.com/pietervdvn/MapComplete/issues' class='underline hover:text-blue-800' target='_blank'>aquí</a>.", "requestATheme": "Si quieres que te hagamos una petición propia , pídela <a href='https://github.com/pietervdvn/MapComplete/issues' class='underline hover:text-blue-800' target='_blank'>aquí</a>.",
"searchForATheme": "Buscar un tema",
"streetcomplete": "Otra aplicación similar es <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>." "streetcomplete": "Otra aplicación similar es <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>."
}, },
"nameInlineQuestion": "{category}: Su nombre es $$$", "nameInlineQuestion": "{category}: Su nombre es $$$",
@ -245,7 +254,8 @@
"createNewWikidata": "Crear un ítem de Wikidata nuevo", "createNewWikidata": "Crear un ítem de Wikidata nuevo",
"doSearch": "Busca arriba para ver los resultados", "doSearch": "Busca arriba para ver los resultados",
"failed": "La carga de la entrada de Wikipedia falló", "failed": "La carga de la entrada de Wikipedia falló",
"loading": "Cargando Wikipedia...", "fromWikipedia": "De Wikipedia, la enciclopedia libre",
"loading": "Cargando Wikipedia…",
"noResults": "No se encontró nada para <i>{search}</i>", "noResults": "No se encontró nada para <i>{search}</i>",
"noWikipediaPage": "Este ítem de wikidata aún no tiene una página de Wikipedia correspondiente.", "noWikipediaPage": "Este ítem de wikidata aún no tiene una página de Wikipedia correspondiente.",
"previewbox": { "previewbox": {
@ -267,6 +277,20 @@
"doDelete": "Borrar imagen", "doDelete": "Borrar imagen",
"dontDelete": "Cancelar", "dontDelete": "Cancelar",
"isDeleted": "Borrada", "isDeleted": "Borrada",
"nearbyPictures": {
"allFiltered": "Ninguna imagen coincide con tu filtro",
"browseNearby": "Buscar imágenes cercanas…",
"confirm": "La imagen seleccionada muestra {title()}",
"hasMatchingPicture": "¿Esta imagen coincide con el objeto? Selecciónalo debajo",
"loadMore": "Cargar más imágenes",
"loading": "Cargando imágenes cercanas…",
"noImageSelected": "Selecciona una imagen para enlazarla al objeto",
"nothingFound": "No se encontraron imágenes cercanas…",
"onlyTowards": "Solo mostrar imágenes que fueron sacadas hacia este objeto",
"removeFilters": "Haz clic aquí para eliminar los filtros",
"title": "Imágenes cercanas",
"withinRadius": "Solo mostrar imágenes que fueran sacadas dentro de un radio de {radius} metros para este objeto"
},
"pleaseLogin": "Acceda para cargar una imagen", "pleaseLogin": "Acceda para cargar una imagen",
"respectPrivacy": "No fotografíe personas ni matrículas. No cargue datos de Google Maps, Google StreetView u otras fuentes protegidas por derechos de autor.", "respectPrivacy": "No fotografíe personas ni matrículas. No cargue datos de Google Maps, Google StreetView u otras fuentes protegidas por derechos de autor.",
"toBig": "Tu imagen es demasiado grande, ya que pesa {actual_size}. Por favor utiliza imágenes de como máximo {max_size}", "toBig": "Tu imagen es demasiado grande, ya que pesa {actual_size}. Por favor utiliza imágenes de como máximo {max_size}",
@ -305,18 +329,22 @@
"contactedCommunity": "He contactado a la comunidad (local) sobre esta importación", "contactedCommunity": "He contactado a la comunidad (local) sobre esta importación",
"readImportGuidelines": "He leído las directrices importantes en la wiki de OSM", "readImportGuidelines": "He leído las directrices importantes en la wiki de OSM",
"title": "Licencia y comunidad", "title": "Licencia y comunidad",
"titleLong": "¿Pasaste por el proceso de importación?",
"wikipageIsMade": "El proceso está documentado en la wiki de OSM (necesitarás este enlace más adelante)" "wikipageIsMade": "El proceso está documentado en la wiki de OSM (necesitarás este enlace más adelante)"
}, },
"conflationChecker": { "conflationChecker": {
"cacheExpired": "La caché ha expirado", "cacheExpired": "La caché ha expirado",
"downloadOverpassData": "Descarga el GeoJSON cargado desde overpass", "downloadOverpassData": "Descarga el GeoJSON cargado desde overpass",
"importCandidatesCount": "Los {count} elementos rojos en el siguiente mapa son todos tus candidatos de importación.", "importCandidatesCount": "Los {count} elementos rojos en el siguiente mapa son todos tus candidatos de importación.",
"loadedDataAge": "Los datos cargados son de la caché y su edad es {age}",
"mapShowingNearbyIntro": "El siguiente mapa muestra características a importar que tienen una característica de OSM dentro ",
"nearbyWarn": "¡Los {count} elementos rojos en el siguiente mapa <b>no</b> se importarán!", "nearbyWarn": "¡Los {count} elementos rojos en el siguiente mapa <b>no</b> se importarán!",
"nothingLoaded": "No hay elementos cargados desde OpenStreetMpa que coincidan con la capa actual {name}",
"osmLoaded": "{count} elementos se cargan desde OpenStreetMap que coinciden con la capa <b>{name}</b>.", "osmLoaded": "{count} elementos se cargan desde OpenStreetMap que coinciden con la capa <b>{name}</b>.",
"setRangeToZero": "Especificar el rango en 0 o 1 si quieres importarlos todos", "setRangeToZero": "Especificar el rango en 0 o 1 si quieres importarlos todos",
"states": { "states": {
"error": "No se pudieron cargar los últimos datos de overpass debido a {error}", "error": "No se pudieron cargar los últimos datos de overpass debido a {error}",
"idle": "Comprobando almacenamiento local...", "idle": "Comprobando almacenamiento local",
"unexpected": "Estado inesperado {state}" "unexpected": "Estado inesperado {state}"
}, },
"title": "Comparar con los datos existentes", "title": "Comparar con los datos existentes",
@ -325,6 +353,7 @@
"createNotes": { "createNotes": {
"creating": "Creadas <b>{count}</b> notas de {total}", "creating": "Creadas <b>{count}</b> notas de {total}",
"done": "¡Todas las {count} notas han sido creadas!", "done": "¡Todas las {count} notas han sido creadas!",
"loading": "Espera mientras estamos cargando…",
"openImportViewer": "Inspeccionar el progreso de tus notas en el 'import_viewer'", "openImportViewer": "Inspeccionar el progreso de tus notas en el 'import_viewer'",
"title": "Creación de notas" "title": "Creación de notas"
}, },
@ -344,7 +373,7 @@
}, },
"mapPreview": { "mapPreview": {
"autodetected": "La capa se dedujo automáticamente basándose en las propiedades", "autodetected": "La capa se dedujo automáticamente basándose en las propiedades",
"confirm": "Las características están en la dirección derecha del en el mapa", "confirm": "Las características están en la localización correcta en el mapa",
"mismatch": "{count} características no coincidieron con la capa seleccionada. Asegúrate de que las etiquetas para indicar el tipo están presentes, concretamente {tags}", "mismatch": "{count} características no coincidieron con la capa seleccionada. Asegúrate de que las etiquetas para indicar el tipo están presentes, concretamente {tags}",
"selectLayer": "¿Con qué capa coincide esta importación?", "selectLayer": "¿Con qué capa coincide esta importación?",
"title": "Previsualización de mapa" "title": "Previsualización de mapa"
@ -388,14 +417,16 @@
"title": "Ayudante de importación" "title": "Ayudante de importación"
}, },
"importInspector": { "importInspector": {
"title": "Inspeccionar y dirigir las notas de importación" "title": "Inspeccionar y gestionar las notas de importación"
}, },
"importLayer": { "importLayer": {
"alreadyMapped": "{title} ya está en el mapa - este punto es un duplicado", "alreadyMapped": "{title} ya está en el mapa - este punto es un duplicado",
"description": "Una capa que importar entradas para {title}", "description": "Una capa que importar entradas para {title}",
"importButton": "import_button({layerId},_tags, He encontrado un(a) {title} aquí - añádelo al mapa,./assets/svg/addSmall.svg,,,id)",
"layerName": "Posible {title}", "layerName": "Posible {title}",
"nearbyImagesIntro": "<h3>Imágenes cercanas</h3> Las siguientes imágenes son imágenes geoetiquetadas cerca de varios servicios en línea. Pueden ayudarte a resolver esta nota. {nearby_images(open)}",
"notFound": "No he podido encontrar {title} - eliminarlo", "notFound": "No he podido encontrar {title} - eliminarlo",
"popupTitle": "Posible {title}" "popupTitle": "Puede haber {title} aquí"
}, },
"index": { "index": {
"#": "Estos textos son mostrados sobre los botones del tema cuando no hay un tema cargado", "#": "Estos textos son mostrados sobre los botones del tema cuando no hay un tema cargado",
@ -405,13 +436,100 @@
"pickTheme": "Elige un tema de abajo para empezar.", "pickTheme": "Elige un tema de abajo para empezar.",
"title": "Le damos la bienvenida a MapComplete" "title": "Le damos la bienvenida a MapComplete"
}, },
"matrixbot": {
"commandFailed": "Lo siento, algo fue mal mientras se ejecutaba <code>{cmd}</code>",
"commandNotFound": "No entendí tu petición. ¿Puede que quisieras teclear {0}, {1}, {2} o {2}? <p>Escribe <code>help</code> para ver una vista general de todos los comandos</p>",
"commands": {
"dm": {
"failed": "No pude ejecutar <code>{cmd}</code> debido a {message}",
"sendReason": "Te envié este mensaje porque <b>{sender}</b> me pidió que te enviara esto con <code>{cmd}</code>"
},
"documentation": {
"docs": "Obtiene la documentación sobre una capa, un tema o un parámetro de URL de Mapcomplete",
"noIdIntro": "Da un id para obtener más información sobre un ítem relacionado con la programación de MapComplete. Los tipos conocidos son {list}",
"urlParam": "Parámetro de URL <code>{id}</code>"
},
"dream": {
"docs": "Envía un texto generado por ordenador",
"generatedBy": "Este texto fue generado por {bot}, que es un bot basado en el aprendizaje de máquina activo en Reddit."
},
"help": {
"argcmd": "El comando sobre el que quieres más información",
"askRights": "Pedir a {admins} que te de suficientes permisos",
"docs": "Imprime información sobre los comandos soportados",
"insufficientRights": "No tienes suficientes permisos para ejecutar este comando.",
"notFound": "No encontré <code>{cmd}</code>. Puede que te refirieras a uno de {closest}?",
"p0": "¡Hola! Soy MapComplete-bot {bot_version} (construido sobre MapComplete {mc_version}).",
"p1": "Envíame un comando y contestaré algo útil: dame un comando a través de un mensaje privado o escribe <code>!</code> antes de un comando en una sala pública.",
"priviligedComand": "Comando privilegiado",
"supported": "Mis comandos soportados son:"
},
"info": {
"closed": "Cerrado",
"closedTodayAndTomorrow": "Cerrado hoy y mañana",
"couldNotDownload": "No se pudo descargar <code>{id}</code>",
"editWith": "Editar este elemento con {title}",
"fetchingInfoAbout": "Recopilando datos sobre {id}…",
"foundResults": "Se encontraron {total} resultados para <code>{search}</code>, recopilando datos sobre ellos…",
"noEditPossible": "Ningún tema de MapComplete soporta este elemento",
"noInfo": "Aún no hay información relevante",
"noOpeningHours": "No se conocen los horarios de apertura.",
"nothingFound": "No se encontró nada para <code>{_}</code>",
"provideSearch": "Por favor, provee un término de búsqueda de un id para utilizar este comando"
},
"language": {
"arglang": "El idioma que se utilizará a partir de ahora",
"currentLanguage": "El idioma actual de la sala es {language}",
"docs": "Configura el idioma de las respuestas para esta sala",
"helpTranslating": "Ayuda a traducir mis respuestas en Weblate.",
"knownLanguages": "Puedes escoger uno de los siguientes temas:",
"notFound": "El idioma {language} no se encontró"
},
"role": {
"allRevoked": "Todos los derechos de <b>{user}</b> han sido revocados",
"allRolesIntro": "Todos los usuarios que tienen derechos son:",
"argrole": "Rol a añadir; debe de ser el nombre de un comando",
"docs": "Cambiar qué y qué no puede hacer un usuario",
"noPreviousRoles": "<b>{user}</b> no tiene ningunos roles anteriores",
"noRightsNeeded": "El comando <code>{role}</code> puede ejecutarse por cualquiera, no necesitas configurar permisos para él",
"noRolesYet": "<b>{user}</b> actualmente no tiene roles.",
"userHasRoles": "<b>{user}</b> actualmente tiene los siguientes roles:"
},
"search": {
"searching": "Buscando {layerTitle} {mode} <code>{search}</code>…"
},
"shutdown": {
"argmode": "Inidica si el servicio debe de ser reiniciado, debe de ser uno de {verbs}",
"docs": "Apaga el bot",
"goodbye": "Apagando… ¡Hasta luego!",
"notYetShuttingDown": "Aún no me voy a reiniciar, solo me inicié hace {uptime} segundos. Esperaré por lo menos {min_uptime} antes de reiniciarme."
},
"tags": {
"announceSearch": "<code>{id}</code> no parece ser un id de OSM válido - buscando en todo el mundo en lugar de para {search}…"
},
"welcome": {
"p0": "¡Hola! Soy MapComplete-bot. Soy un programa informático que busca OpenStreetMap y que puede dar alguna información sobre <a href=\"https://mapcomplete.osm.be\">MapComplete</a>, que es un sitio web y aplicación que muestra mapas temáticos. Si falta información puedes añadirla fácilmente allí.",
"p1": "Envíame <code>info [searchterm]</code> y lo buscaré en OpenStreetMap por ti. Te mostraré la información que encuentre.",
"p3": "Hay unos pocos comandos más, envía <code>help</code> para verlos todos."
},
"wiki": {
"docs": "Busca e imprime (una parte de) la página especificada desde {backend}. En salas públicas, imprimirá el primer párrafo; en un MD se enviará la página entera."
}
},
"decryptionFailed": "Lo siento, no puede descifrar tu mensaje. Puedes probar a dejar este canal y conectarte de nuevo",
"noSufficientRights": "Este comando solo está disponible a administradores o usuarios que tienen este rol",
"subcommanNotFound": "No entendí tu petición. Este comando necesita un verbo para ejecutarse, pero <code>{verb}</code> no es un verbo que conozca. Sé lo verbos {known_verbs}",
"subcommandNotGiven": "No entendí tu petición. Este comando necesita un verbo para ejecutarse, pero no diste ninguno. Prueba uno de {known_verbs}",
"tooLongForPublic": "Lo siento, este mensaje es demasiado largo para una sala pública - envíame un mensaje directo"
},
"move": { "move": {
"cancel": "Cancelar movida", "cancel": "Cancelar movida",
"cannotBeMoved": "Esta característica no se puede mover.", "cannotBeMoved": "Esta característica no se puede mover.",
"confirmMove": "Mover aquí", "confirmMove": "Mover aquí",
"inviteToMove": { "inviteToMove": {
"generic": "Mover este punto", "generic": "Mover este punto",
"reasonInaccurate": "Mejorar la precisión de este punto" "reasonInaccurate": "Mejorar la precisión de este punto",
"reasonRelocation": "Mover este objeto a otro lugar porque ha sido relocalizado"
}, },
"inviteToMoveAgain": "Mover este punto otra vez", "inviteToMoveAgain": "Mover este punto otra vez",
"isRelation": "Esta característica es una relación y no se puede mover", "isRelation": "Esta característica es una relación y no se puede mover",
@ -429,11 +547,14 @@
"whyMove": "¿Por qué quieres mover este punto?", "whyMove": "¿Por qué quieres mover este punto?",
"zoomInFurther": "Acercar más para confirmar este movimiento" "zoomInFurther": "Acercar más para confirmar este movimiento"
}, },
"multi_apply": {
"autoApply": "Cuando se cambia los atributos {attr_names}, estos atributos se cambiarán también automáticamente en {count} otros objetos"
},
"notes": { "notes": {
"addAComment": "Añadir un comentario", "addAComment": "Añadir un comentario",
"addComment": "Añadir comentario", "addComment": "Añadir comentario",
"addCommentAndClose": "Añadir un comentario y cerrar", "addCommentAndClose": "Añadir un comentario y cerrar",
"addCommentPlaceholder": "Añadir un comentario...", "addCommentPlaceholder": "Añadir un comentario",
"anonymous": "Usuarioi anónimo", "anonymous": "Usuarioi anónimo",
"closeNote": "Cerrar nota", "closeNote": "Cerrar nota",
"createNote": "Crear una nota nueva", "createNote": "Crear una nota nueva",
@ -449,6 +570,7 @@
"noteLayerDoEnable": "Habilitar la capa que muestra las notas", "noteLayerDoEnable": "Habilitar la capa que muestra las notas",
"noteLayerHasFilters": "Algunas notas pueden estar ocultas por un filtro", "noteLayerHasFilters": "Algunas notas pueden estar ocultas por un filtro",
"noteLayerNotEnabled": "La capa que muestra las notas no está habilitada. Esta capa debe de habilitarse para añadir una nota nueva", "noteLayerNotEnabled": "La capa que muestra las notas no está habilitada. Esta capa debe de habilitarse para añadir una nota nueva",
"notesLayerMustBeEnabled": "La capa de notas está deshabilitada. Habilítala para añadir una nota",
"reopenNote": "Reabrir nota", "reopenNote": "Reabrir nota",
"reopenNoteAndComment": "Reabrir la nota y comentar", "reopenNoteAndComment": "Reabrir la nota y comentar",
"textNeeded": "Introduce un texto descriptivo para crear una nota", "textNeeded": "Introduce un texto descriptivo para crear una nota",
@ -457,6 +579,7 @@
}, },
"privacy": { "privacy": {
"editing": "Cuando efectúas un cambio al mapa, este cambio se grabas en OpenStreetMap y está disponible públicamente a cualquiera. Un conjunto de cambios hecho con MapComplete incluye los siguientes datos: <ul><li> Los cambios que has hecho</li><li>Tu nombre de usuario</li><li>Cuándo se efectuó el cambio</li><li>El tema que utilizaste mientras que hacías el cambio</li><li>El idioma de la interfaz de usuario</li><li>Una indicación de como de cerca estabas a los objetos cambiados. Otros mapeadores pueden utilizar esta información para determina si un cambio se hizo basándose en un sondeo o en una investigación remota</li></ul> Por favor ve a ", "editing": "Cuando efectúas un cambio al mapa, este cambio se grabas en OpenStreetMap y está disponible públicamente a cualquiera. Un conjunto de cambios hecho con MapComplete incluye los siguientes datos: <ul><li> Los cambios que has hecho</li><li>Tu nombre de usuario</li><li>Cuándo se efectuó el cambio</li><li>El tema que utilizaste mientras que hacías el cambio</li><li>El idioma de la interfaz de usuario</li><li>Una indicación de como de cerca estabas a los objetos cambiados. Otros mapeadores pueden utilizar esta información para determina si un cambio se hizo basándose en un sondeo o en una investigación remota</li></ul> Por favor ve a ",
"editingTitle": "Cuando se hagan cambios",
"geodata": "Cuando MapComplete consigue tu geolocalización, tu geolocalización y las localizaciones previamente visitadas se mantienen en tu dispositivo. Tus datos de localización nunca se envían automáticamente a ningún otro sitio - a menos que alguna funcionalidad mencione otra cosa claramente.", "geodata": "Cuando MapComplete consigue tu geolocalización, tu geolocalización y las localizaciones previamente visitadas se mantienen en tu dispositivo. Tus datos de localización nunca se envían automáticamente a ningún otro sitio - a menos que alguna funcionalidad mencione otra cosa claramente.",
"geodataTitle": "Tu geoubicación", "geodataTitle": "Tu geoubicación",
"intro": "La privacidad es importante - tanto para el individual como para la sociedad. MapComplete intenta respetar tu privacidad tanto como sea posible - hasta el punto de que no se necesita ningún banner de cookies molesto es necesario. De todas formas, nos gustaría informarte de qué información se recolecta y se comparte, bajo que circunstancias y por qué se hacen estos compromisos.", "intro": "La privacidad es importante - tanto para el individual como para la sociedad. MapComplete intenta respetar tu privacidad tanto como sea posible - hasta el punto de que no se necesita ningún banner de cookies molesto es necesario. De todas formas, nos gustaría informarte de qué información se recolecta y se comparte, bajo que circunstancias y por qué se hacen estos compromisos.",
@ -464,6 +587,7 @@
"miscCookiesTitle": "Otras cookies", "miscCookiesTitle": "Otras cookies",
"surveillance": "Ya que estás leyendo la política de privacidad, probablemente te importe la privacidad - ¡también a nosotros! Incluso hemos hecho <a href=\"https://mapcomplete.osm.be/surveillance\">un tema que muestra cámaras de seguridad.</a> ¡Siéntete libre de mapearlas todas!", "surveillance": "Ya que estás leyendo la política de privacidad, probablemente te importe la privacidad - ¡también a nosotros! Incluso hemos hecho <a href=\"https://mapcomplete.osm.be/surveillance\">un tema que muestra cámaras de seguridad.</a> ¡Siéntete libre de mapearlas todas!",
"title": "Política de privacidad", "title": "Política de privacidad",
"tracking": "Para tener una idea de quién visita nuestro sitio web, se recoge alguna información técnica. Esto incluye el país desde el que visitaste MapComplete, el sitio que te refirió a MapComplete, el tipo de tu dispositivo y el tamaño de la pantalla. Una cookie coloca en tu dispositivo para indicar que visitaste MapComplete anteriormente hoy. Estos datos no están suficientemente detallados para identificarte personalmente. Estas estadísticas solo están disponibles a cualquiera en conjunto y están <a href=\"https://pietervdvn.goatcounter.com\" target=\"_blank\">disponibles públicamente a cualquiera</a>",
"trackingTitle": "Datos estadísticos", "trackingTitle": "Datos estadísticos",
"whileYoureHere": "¿Te importa la privacidad?" "whileYoureHere": "¿Te importa la privacidad?"
}, },
@ -473,20 +597,96 @@
"title": "Utilizando los datos en procesos internos" "title": "Utilizando los datos en procesos internos"
}, },
"layers": { "layers": {
"intro": "<p>MapComplete tiene un sistema de plantillas potente, que permite crear un mapa que muestre precisamente esas características que necesitas rápidamente, mostrando atributos relevantes en popups.</p><p>Estos datos pueden obtenerse de <b>OpenStreetMap</b> directamente, pero MapComplete también puede utilizar <b>conjunto de datos externos</b> ej. para comparar OpenStreetMap con otro conjunto de datos, o para mostrar datos que no so adecuados para OpenStreetMap (actividades planificadas, estadísticas, …)</p>",
"title": "¿Qué datos se pueden mostrar con MapComplete?" "title": "¿Qué datos se pueden mostrar con MapComplete?"
}, },
"survey": { "survey": {
"intro": "<p>MapComplete es una herramienta de <i>sondeo</i> fácil de utilizar. Es ideal para recolectar lo necesario en unos pocos clics, tanto en escritorio como en móvil. Estos datos son contribuidos directamente en OpenStreetMap.</p><p>Podemos configurar una <b>herramienta de sondeo personalizada</b>, que pregunte precisamente los datos que necesitas de una forma a prueba del futuro.</p><p>¿Tienes un conjunto de datos que tiene que ser sondeado otra vez? Este es momento perfecto para cambiar a OpenStretMap. MapComplete puede mostrar tu conjunto de datos y OpenStreetMap al mismo tiempo, haciendo que sea más fácil visitar todas las localizaciones y ver lo que la comunidad ya contribuyó.</p>\n",
"title": "Posibilidades de estudio" "title": "Posibilidades de estudio"
} },
"text0": "Si un tema de MapComplete existente es lo que necesitas, siéntete libre de utilizarlo o embeberlo en tu sitio web. Incrustar los temas públicos es gratis y siempre lo será.",
"text1": "¿Necesitas algunos otros datos, pero el tema aún no existe? Los desarrolladores de MapComplete pueden <b>construirlo por tú</b> con un presupuesto decente. Ponte en contacto a través del <a href=\"mailto:pietervdvn@posteo.net\">correo electrónico</a>, <a href=\"https://github.com/pietervdvn/MapComplete/issues\">github</a> o <a href=\"https://www.openstreetmap.org/message/new/Pieter%20Vander%20Vennet\">envía un mensaje a través de osm.org</a>",
"text2": "Si todavía te sientes inseguro, las posibilidades se resumen abajo. Adicionalmente, se responde a algunas preguntas frecuentes",
"title": "Utilizar MapComplete en tu organización"
}, },
"aboutOsm": { "aboutOsm": {
"aboutOsm": {
"li0": "Las calles tienen geometría, pero también pueden tener información sobre el límite de velocidad, la superficie, si están iluminadas, su nombre, un enlace a Wikipedia, un enlace a lo que les da nombre, que rutas de senderismo, bicicleta y bus pasan por ahí, …",
"li1": "Las tiendas y otros servicios pueden tener horarios de apertura, un número de teléfono, un enlace al sitio web, qué métodos de pagos se aceptan, qué venden, qué servicios ofrecen, …",
"li2": "Los baños pueden tener información sobre la accesibilidad en silla de ruedas, si hay cambiador, si hace falta pagar, …",
"li3": "y mucho, mucho más…",
"title": "¿Qué es OpenStreetMap?"
},
"benefits": {
"intro": "Puede ser muy difícil dejar tu conjunto de datos atrás, ya que construirlo llevó tiempo y trabajó.<br>De todas formas, los beneficios de cambiar a OSM son enormes:",
"li0": "Ya no estás solo recogiendo y manteniendo el conjunto de datos - una comunidad entera está a tu lado",
"li2": "Numerosas organizaciones gubernamentales y municipalidades también utilizan OpenStreetMap en sus sitios web",
"title": "Beneficios de ecosistema OSM"
},
"license": { "license": {
"intro": "OpenStreetMap está licenciado bajo la Licencia Open Database. El <a href=\"https://osm.org/copyright\" target=\"_blank\">texto completo de copyright</a> puede resumirse así:",
"li0": "Un producto que utilice los datos de OpenStreetMap debe de atribuir.",
"li1": "Los datos de OpenStreetMap deben de permanecer <i>abiertos</i>. Esto significa que los datos de un mapa que contenga datos de OpenStreetMap puede volver a ser copiado.",
"outro": "La licencia tiene unas pocas implicaciones - se explican abajo.",
"title": "La licencia" "title": "La licencia"
},
"vandalism": {
"intro": "Como cualquiera puede editar los datos, es por tanto posible que se produzcan cambios maliciosos. De todas formas, esto es extremadamente poco común debido a unas cuántas razones:",
"li0": "la barrera técnica para hacer cambios es alta",
"li1": "a cambio malicioso pequeño tiene poco impacto, por tanto poco premio para un vándalo",
"li2": "un cambio con un impacto alto se identifica y revierte rápidamente ya que hay tanta gente que utiliza estos datos",
"li3": "Todos los cambios se unen a un solo usuario. Un infractor reincidente se bloquea rápidamente",
"li4": "En Bélgica (y otros países), la primera edición de un contribuidor nuevo se comprueba automáticamente y se corrige si es necesario.",
"title": "¿Qué pasa con el vandalismo?"
} }
}, },
"drawbacks": {
"intro": "Mientras que unirse a esta comunidad tiene beneficios tremendos, hay algunos temas que considerar cuidadosamente.",
"licenseNuances": {
"intro": "OpenStreetMap está licenciado bajo la Licencia Open Database que dice que:",
"li0": "Todos los datos pueden ser reutilizados para cualquier propósito - incluyendo propósitos comerciales",
"li1": "Las aplicaciones o productos que utilicen OpenStreetMap deben de dar un aviso de los derechos claro",
"li2": "Cualquier conjunto de datos o producto que contenga datos de OpenStreetMap también deberá de ser republicado bajo la ODbL, incluyendo modificaciones a estos conjuntos de datos en un formato utilizable.",
"outro": "Esto tiene algunas implicaciones que deberán de ser consideradas para algunos casos de uso, como se explica abajo",
"title": "Implicaciones de la ODbL: algunos casos de uso",
"usecaseGatheringOpenData": {
"intro": "MapComplete es una manera excelente de crear Datos Abiertos, pero también para gobiernos. Por defecto, estos datos serán redistribuibles libremente bajo la ODbL. Sin embargo, si hay un requisito de publicar los datos recogidos bajo una licencia del <i>dominio público</i> (donde <b>todos</b> los derechos de dan al público y no se requiere atribución), la ODbL es demasiado restrictiva. En este caso, se puede pedir a los contribuidores añadir los datos como Dominio Público (ej. informándoles en el tema de MapComplete).",
"title": "Recogiendo datos abiertos"
},
"usecaseMapDifferentSources": {
"intro": "<p>Por ejemplo, uno puede mapear todos los bancos en una ciudad, basándose en los mapas conocidos por OpenStreetMap. Este mapa impreso necesita un aviso claro de que los datos del mapa se basan en OpenStreetMap. Vender estos mapas esta permitido. Si el creador del mapa se da cuenta de que falta algunos mapas en un área y los añade al mapa impreso, los datos sobre los bancos que faltaba también se hacen libres automáticamente. Esto significa que un contribuidor de OpenStreetMap puede coger el mapa de papel y utilizarlo para añadir los bancos que faltan en OpenStreetMap.</p><p>Este contribuidor también tiene derecho a pedir el conjunto de datos con los bancos que faltan, que también se debería de proveer.</p><p>Si el creador del mapa se da cuenta de que los bancos faltan en un área y los añade al mapa impreso, los datos sobre los bancos que faltan, también son datos abiertos automáticamente. Esto significa que un contribuidor de OpenStreetMap puede coger el mapa de papel y utilizarlo para añadir los bancos que faltan en OpenStreetMpap. Este contribuidor también tiene el derecho a pedir el conjunto de datos con los bancos que faltan, que también se deberían de proveer.</p><p>Por supuesto, un mapa solo con bancos puede ser aburrido. El creador del mapa también puede decidir añadir una capa con tiendas, posiblemente recogidas de otro proveedor de geodatos bajo otra licencia. Esto también esta permitido, si el mapa declara que la fuente de los bancos es OSM (bajo ODBL) y las tiendas tienen una fuente diferente (eventualmente con un todos los derechos reservados).</p><p>Sin embargo, mezclar dos conjuntos de datos en una capa indistinguible puede no estar permitido. Por ejemplo, el creador del mapa puede encontrar que OSM tiene un conjunto de datos excelente sobre bancos en una parte de la ciudad y que el proveedor cerrado puede tener datos excelentes sobre bancos en otra parte de la ciudad, mezclar estos conjuntos de datos en uno puede ser problemático: </p>",
"li0": "la licencia abierta requeriría que las modificaciones fueran publicadas de manera abierta…",
"li1": "…mientras que la licencia con todos los derechos reservados lo prohibiría.",
"outro": "Como resultado, este tipo de mezcla no está permitida",
"title": "Crear un mapa de fuentes diferentes"
}
},
"title": "Algunos inconvenientes a tener en cuenta",
"unsuitedData": {
"intro": "La regla básica para OpenStreetMap es que todos los datos deberán de ser <b>verificables en el suelo</b> y en cierto modo permanentes. Esto implica que algunos datos <i>no</i> pueden ser enviados directamente a OpenStreetMap - pero existen algunas soluciones.",
"li0": "Los datos subjetivos (como opiniones) no son adecuados para OpenStreetMap. Sin embargo, MapComplete tiene una integración con <a href=\"https://mangrove.reviews/\">Mangrove.reviews</a> un sitio licenciado abiertamente",
"li2": "Los datos temporales (ej. estadísticas de calidad del aire, intensidad del tráfico, …) no se pueden guardar en OpenStreetMap ya que son difíciles de comprobar por un voluntario. Ten en cuenta que, si estos datos están disponibles en otro lugar, podrán ser visualizados en MapComplete como una capa extra.",
"title": "Datos no adecuados para OpenStreetMap"
}
},
"indexPage": {
"button": "Descubre nuestros servicios",
"hook": "¿Necesitas ayuda profesional?"
},
"intro": "El desarrollador de MapComplete ofrece soporte profesional. Este documento resume algunas de las posibilidades, preguntas frecuentes y los límites de MapComplete",
"osmTitle": "¿Qué pueden hacer OpenStreetMap y MapComplete para tú organización?",
"services": { "services": {
"intro": "El desarrollador de MapComplete puede ayudarte con los siguientes servicios:",
"li0": "Configurar un tema ajustado a tu necesidad",
"li1": "Ayudar a configurar el flujo de datos internos para integrar OpenStreetMap",
"li2": "Formación sobre la contribución datos con MapComplete",
"li3": "Formación avanzada (ej. para el equipo GIS) sobre como añadir datos avanzados en OpenStreetMap",
"li4": "Formación sobre como descargar datos filtrados desde OpenStreetMap",
"outro": "Estos servicios se ofrecen a precios competitivos. Un tema simple sin soporte adicional puede estar configurado por tampoco como 2000€, y un pequeño coste anual de alojamiento.",
"title": "Servicios MapComplete" "title": "Servicios MapComplete"
} },
"text1": "<p>MapComplete es el editor que hace contribuir a OpenStreetMap fácil.</p>",
"title": "Soporte profesional con MapComplete"
}, },
"reviews": { "reviews": {
"affiliated_reviewer_warning": "(Revisión afiliada)", "affiliated_reviewer_warning": "(Revisión afiliada)",
@ -499,6 +699,7 @@
"saving_review": "Guardando…", "saving_review": "Guardando…",
"title": "{count} comentarios", "title": "{count} comentarios",
"title_singular": "Un comentario", "title_singular": "Un comentario",
"tos": "Si creas una opinión, aceptas a <a href=\"https://mangrove.reviews/terms\" target=\"_blank\">los Terminos De Servicio y la Política De Privacidad de Mangrove.reviews</a>",
"write_a_comment": "Deja una reseña…" "write_a_comment": "Deja una reseña…"
}, },
"split": { "split": {
@ -513,20 +714,67 @@
"activateButton": "Ayuda a traducir MapComplete", "activateButton": "Ayuda a traducir MapComplete",
"allMissing": "Aún sin traducciónes", "allMissing": "Aún sin traducciónes",
"completeness": "Las traducciones para {theme} en {language} están al {percentage}%: {translated} cadenas de {total} están traducidas", "completeness": "Las traducciones para {theme} en {language} están al {percentage}%: {translated} cadenas de {total} están traducidas",
"deactivate": "Deshabilitar los botones de traducción" "deactivate": "Deshabilitar los botones de traducción",
"help": "Haz clic en el icono 'traducir' al lado de una cadena para introducir o actualizar un texto. Necesitas una cuenta de Weblate para esto. Crea una con tu usuario de OSM para desbloquear el modo de traducción automáticamente.",
"isTranslator": "El modo de traducción está activo si tu nombre de usuario coincide con el nombre de un traductor anterior",
"missing": "{count} cadenas sin traducir",
"notImmediate": "Las traducciones no se actualizan directamente. Habitualmente esto lleva unos días"
}, },
"validation": { "validation": {
"color": {
"description": "Un color o código hexadecimal"
},
"date": {
"description": "Una fecha, empezando con el año"
},
"direction": { "direction": {
"description": "Una orientación" "description": "Una orientación"
}, },
"email": { "email": {
"description": "dirección-electrónica" "description": "dirección-electrónica",
"feedback": "Esta no es una dirección de correo electrónico válida",
"noAt": "Una dirección de correo electrónico debe de contener un @"
}, },
"float": { "float": {
"description": "un número" "description": "un número",
"feedback": "Esto no es un número"
},
"int": {
"description": "un número entero"
},
"nat": {
"description": "un número entero, positivo o cero",
"mustBePositive": "El número debe de ser positivo",
"mustBeWhole": "Solo se permiten números enteros",
"notANumber": "Introduce un número"
}, },
"opening_hours": { "opening_hours": {
"description": "Horarios de apertura" "description": "Horarios de apertura"
},
"pfloat": {
"description": "un número positivo"
},
"phone": {
"description": "un número de teléfono",
"feedback": "Este no es un número de teléfono válido"
},
"pnat": {
"description": "un número entero positivo",
"noZero": "No se permite el cero"
},
"string": {
"description": "una cadena de texto"
},
"text": {
"description": "una cadena de texto"
},
"tooLong": "El texto es demasiado largo, como mucho se permiten 255 caracteres. Ahora tienes {count} caracteres.",
"url": {
"description": "enlace a un sitio web",
"feedback": "Esta no es una dirección web válida"
},
"wikidata": {
"description": "Un identificador de Wikidata"
} }
} }
} }

View file

@ -1274,6 +1274,10 @@
"2": { "2": {
"description": "Ein <b>Café</b>, um in ruhiger Umgebung Tee, Kaffee oder ein alkoholisches Getränk zu trinken", "description": "Ein <b>Café</b>, um in ruhiger Umgebung Tee, Kaffee oder ein alkoholisches Getränk zu trinken",
"title": "ein Café" "title": "ein Café"
},
"3": {
"description": "Ein <b>Club</b> oder eine Diskothek mit Fokus auf Tanzen, Musik von einem DJ mit begleitender Lichtshow und einer Bar, an der man (alkoholische) Getränke bekommt",
"title": "einen Club oder eine Diskothek"
} }
}, },
"tagRenderings": { "tagRenderings": {
@ -1293,6 +1297,9 @@
}, },
"4": { "4": {
"then": "Ein Außenbereich mit Bierausschank, typischerweise in Deutschland" "then": "Ein Außenbereich mit Bierausschank, typischerweise in Deutschland"
},
"5": {
"then": "Dies ist ein <b>Club</b> oder eine Disco mit Fokus auf Tanzen, Musik von einem DJ mit begleitender Lichtshow und einer Bar, an der man (alkoholische) Getränke bekommt"
} }
}, },
"question": "Was ist das für ein Café?" "question": "Was ist das für ein Café?"
@ -3723,6 +3730,17 @@
}, },
"question": "Werden hier vegetarische Gerichte angeboten?" "question": "Werden hier vegetarische Gerichte angeboten?"
}, },
"delivery": {
"mappings": {
"0": {
"then": "Dieses Unternehmen liefert nach Hause (eventuell über eine dritte Partei)"
},
"1": {
"then": "Dieses Unternehmen liefert nicht nach Hause"
}
},
"question": "Liefert {title()} ihr Essen nach Hause?"
},
"friture-oil": { "friture-oil": {
"mappings": { "mappings": {
"0": { "0": {
@ -4397,6 +4415,13 @@
} }
}, },
"playground": { "playground": {
"deletion": {
"nonDeleteMappings": {
"0": {
"then": "Dies ist ein Schulhof - ein (Außen-)Bereich, auf dem die Schüler einer Schule in den Pausen spielen können und der nicht öffentlich zugänglich ist"
}
}
},
"description": "Spielplätze", "description": "Spielplätze",
"name": "Spielplätze", "name": "Spielplätze",
"presets": { "presets": {
@ -4435,6 +4460,9 @@
}, },
"4": { "4": {
"then": "Der Spielplatz ist nicht öffentlich zugänglich" "then": "Der Spielplatz ist nicht öffentlich zugänglich"
},
"5": {
"then": "Dies ist ein Schulhof - ein Außenbereich, auf dem die Schüler in den Pausen spielen können; er ist jedoch für die Öffentlichkeit nicht zugänglich"
} }
}, },
"question": "Ist der Spielplatz öffentlich zugänglich?" "question": "Ist der Spielplatz öffentlich zugänglich?"

View file

@ -4021,6 +4021,49 @@
"render": "Information board" "render": "Information board"
} }
}, },
"kindergarten_childcare": {
"name": "Kindergartens and childcare",
"presets": {
"0": {
"title": "a kindergarten"
},
"1": {
"title": "a childcare"
}
},
"tagRenderings": {
"5": {
"override": {
"question": "When is this childcare opened?"
}
},
"capacity": {
"question": "How much kids (at most) can be enrolled here?",
"render": "This facility has room for {capacity} kids"
},
"childcare-type": {
"mappings": {
"0": {
"then": "This is a kindergarten (also known as <i>preschool</i>) where small kids receive early education."
},
"1": {
"then": "This is a childcare facility, such as a nursery or daycare where small kids are looked after. They do not offer an education and are ofter run as private businesses"
}
},
"question": "What type of facility is this?"
}
},
"title": {
"mappings": {
"0": {
"then": "Kindergarten {name}"
},
"1": {
"then": "Childcare {name}"
}
}
}
},
"map": { "map": {
"description": "A map, meant for tourists which is permanently installed in the public space", "description": "A map, meant for tourists which is permanently installed in the public space",
"name": "Maps", "name": "Maps",
@ -4908,6 +4951,112 @@
"render": "Recycling facility" "render": "Recycling facility"
} }
}, },
"school": {
"name": "Primary and secondary schools",
"presets": {
"0": {
"title": "a primary or secondary school"
}
},
"tagRenderings": {
"capacity": {
"question": "How much students can at most enroll in this school?",
"render": "This school can enroll at most {capacity} students"
},
"education-level-belgium": {
"mappings": {
"0": {
"then": "This is a school with a kindergarten section where young kids receive some education which prepares reading and writing."
},
"1": {
"then": "This is a school where one learns primary skills such as basic literacy and numerical skills. <div class='subtle'>Pupils typically enroll from 6 years old till 12 years old</div>"
},
"2": {
"then": "This is a secondary school which offers all grades"
},
"3": {
"then": "This is a secondary school which does <b>not</b> have all grades, but offers <b>first and second</b> grade"
},
"4": {
"then": "This is a secondary school which does <b>not</b> have all grades, but offers <b>third and fourth</b> grade"
},
"5": {
"then": "This is a secondary school which does <b>not</b> have all grades, but offers <b>fifth and sixth</b> grade"
},
"6": {
"then": "This schools offers post-secondary education (e.g. a seventh or eight specialisation year)"
}
},
"question": "What level of education is given on this school?"
},
"gender": {
"mappings": {
"0": {
"then": "Both boys and girls can enroll here and have classes together"
},
"1": {
"then": "Both boys and girls can enroll here but they are separated (e.g. they have lessons in different classrooms or at different times)"
},
"2": {
"then": "This is a boys only-school"
},
"3": {
"then": "This is a girls-only school"
}
},
"question": "Which genders can enroll at this school?"
},
"language": {
"mappings": {
"0": {
"then": "The main language of this school is unknown"
}
},
"question": "What is the main language of this school?<div class='subtle'>What language is spoken with the students in non-language related courses and with the administration?</div>",
"render": "{school:language} is the main language of {title()}"
},
"school-name": {
"question": "What is the name of this school?",
"render": "This school is named {name}"
},
"target-audience": {
"mappings": {
"0": {
"then": "This is a school where students study skills at their age-adequate level. <div>There are little or no special facilities to cater for students with special needs or facilities are ad-hoc</div>"
},
"1": {
"then": "This is a school for students without special needs<div class='subtle'>This includes students who can follow the courses with small, ad hoc measurements</div>"
},
"2": {
"then": "This is a school where adults are taught skills on the level as specified."
},
"3": {
"then": "This is a school for students with autism"
},
"4": {
"then": "This is a school for students with learning disabilities"
},
"5": {
"then": "This is a school for blind students or students with sight impairments"
},
"6": {
"then": "This is a school for deaf students or students with hearing impairments"
},
"7": {
"then": "This is a school for students with disabilities"
},
"8": {
"then": "This is a school for students with special needs"
}
},
"question": "Does this school target students with a special need? Which structural facilities does this school have?<div class='subtle'>Ad-hoc ",
"render": "This school has facilities for students with {school:for}"
}
},
"title": {
"render": "School <i>{name}</i>"
}
},
"shops": { "shops": {
"deletion": { "deletion": {
"extraDeleteReasons": { "extraDeleteReasons": {
@ -5428,6 +5577,55 @@
"render": "Surveillance Camera" "render": "Surveillance Camera"
} }
}, },
"tertiary_education": {
"name": "Colleges and universities",
"presets": {
"0": {
"description": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.",
"title": "a university"
}
},
"tagRenderings": {
"institution-kind": {
"mappings": {
"0": {
"then": "This is an institution of post-secondary, non-tertiary education. One has to have completed secondary education to enroll here, but no bachelor (or higher) degrees are awarded here"
},
"1": {
"then": "This is a university, an institution of tertiary education where bachelor degrees or higher are awarded."
}
},
"question": "What kind of institution is this?"
},
"isced": {
"mappings": {
"0": {
"then": "Bachelor degrees are awarded here"
},
"1": {
"then": "Master degrees are awarded here"
},
"2": {
"then": "Doctorate degrees are awarded here"
}
},
"question": "What level of education is given here?"
}
},
"title": {
"mappings": {
"1": {
"then": "College"
},
"2": {
"then": "University"
},
"3": {
"then": "School providing tertiary education"
}
}
}
},
"toilet": { "toilet": {
"description": "A layer showing (public) toilets", "description": "A layer showing (public) toilets",
"filter": { "filter": {

View file

@ -13,7 +13,7 @@
} }
}, },
"question": "¿Cuál es el número de esta casa?", "question": "¿Cuál es el número de esta casa?",
"render": "La numeración de la casa es <b>{addr:housenumber}</b>" "render": "El número de puerta es <b>{addr:housenumber}</b>"
}, },
"street": { "street": {
"question": "¿En qué calle se encuentra esta dirección?", "question": "¿En qué calle se encuentra esta dirección?",
@ -65,7 +65,7 @@
"render": "Esta estación se encuentra en {addr:place}." "render": "Esta estación se encuentra en {addr:place}."
}, },
"ambulance-street": { "ambulance-street": {
"question": " ¿Cual es el nombre de la calle en la que se encuentra la estación?", "question": "¿Cual es el nombre de la calle en la que se encuentra la estación?",
"render": "Esta estación se encuentra al lado de una autovía llamada {addr:street}." "render": "Esta estación se encuentra al lado de una autovía llamada {addr:street}."
} }
}, },
@ -486,6 +486,9 @@
"4": { "4": {
"then": "Aquí se pueden alquilar bicis infantiles" "then": "Aquí se pueden alquilar bicis infantiles"
}, },
"5": {
"then": "Aquí se pueden alquilar tándems"
},
"6": { "6": {
"then": "Aquí se pueden alquilar bicicletas de carreras" "then": "Aquí se pueden alquilar bicicletas de carreras"
}, },
@ -510,6 +513,9 @@
"3": { "3": {
"then": "Esta es una estación automática, en la que una bici se asegura mecánicamente a una estructura" "then": "Esta es una estación automática, en la que una bici se asegura mecánicamente a una estructura"
}, },
"4": {
"then": "Una máquina que dispensa y acepta llaves, eventualmente después de la autenticación y/o el pago está presente. Las bicicletas están aparcadas cerca"
},
"5": { "5": {
"then": "Este es un punto de entrega, ej. un aparcamiento reservado para colocar las bicicletas, claramente marcado como solo para el servicio de alquiler" "then": "Este es un punto de entrega, ej. un aparcamiento reservado para colocar las bicicletas, claramente marcado como solo para el servicio de alquiler"
} }

View file

@ -65,7 +65,7 @@
"render": "Dit station ligt in {addr:place}." "render": "Dit station ligt in {addr:place}."
}, },
"ambulance-street": { "ambulance-street": {
"question": " In welke straat ligt dit station?", "question": "In welke straat ligt dit station?",
"render": "Straat waar dit station ligt: {addr:street}" "render": "Straat waar dit station ligt: {addr:street}"
} }
}, },
@ -1095,6 +1095,9 @@
"0": { "0": {
"then": "Sportwinkel <i>{name}</i>" "then": "Sportwinkel <i>{name}</i>"
}, },
"1": {
"then": "Shop"
},
"2": { "2": {
"then": "Fietsverhuur <i>{name}</i>" "then": "Fietsverhuur <i>{name}</i>"
}, },
@ -1642,7 +1645,7 @@
"then": "Een <b>sleutel</b> is nodig om dit oplaadpunt te gebruiken<br/><span class='subtle'>Bv. voor klanten van een hotel of een bar, die de sleutel aan de receptie kunnen krijgen</span>" "then": "Een <b>sleutel</b> is nodig om dit oplaadpunt te gebruiken<br/><span class='subtle'>Bv. voor klanten van een hotel of een bar, die de sleutel aan de receptie kunnen krijgen</span>"
}, },
"4": { "4": {
"then": "Niet toegankelijk voor het publiek <br/><span class='subtle'>Bv. enkel toegankelijk voor de eigenaar, medewerkers ,...</span>" "then": "Niet toegankelijk voor het publiek <br/><span class='subtle'>Bv. enkel toegankelijk voor de eigenaar, medewerkers, ...</span>"
} }
}, },
"question": "Wie mag er dit oplaadpunt gebruiken?", "question": "Wie mag er dit oplaadpunt gebruiken?",
@ -2348,6 +2351,22 @@
}, },
"question": "Is het mogelijk om hier te bolderen?" "question": "Is het mogelijk om hier te bolderen?"
}, },
"fee": {
"mappings": {
"0": {
"then": "Hier klimmen is gratis"
},
"1": {
"then": "Men moet betalen om hier te klimmen"
}
},
"question": "Moet men betalen om hier te klimmen?",
"render": "Men moet {charge} betalen om hier te klimmen"
},
"max_bolts": {
"question": "Wat is het maximum aantal bouten in routes ban {title()}?",
"render": "De sportklimroutes hebben maximaal {climbing:bolts:max} bouten. <div class='subtle'>Hierbij worden relays niet meegteld. Dit geeft aan hoeveel klimsetjes een klimmer nodig heeft</div>"
},
"max_difficulty": { "max_difficulty": {
"question": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?", "question": "Wat is het niveau van de moeilijkste route, volgens het Franse classificatiesysteem?",
"render": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem" "render": "De maximale klimmoeilijkheid is {climbing:grade:french:max} volgens het Franse/Belgische systeem"
@ -2404,6 +2423,7 @@
} }
}, },
"climbing_area": { "climbing_area": {
"description": "Een gebied waar klimmen mogelijk is, bv. een klimsite, een bolder of klimrots,…",
"name": "Klimgelegenheden", "name": "Klimgelegenheden",
"presets": { "presets": {
"0": { "0": {
@ -2412,12 +2432,20 @@
} }
}, },
"tagRenderings": { "tagRenderings": {
"Contained routes hist": {
"render": "<h3>Overzicht van moeilijkheidsgraden</h>{histogram(_difficulty_hist)}"
},
"Contained routes length hist": {
"render": "<h3>Overzicht van lengtes</h3>{histogram(_length_hist)}"
},
"Rock type (crag/rock/cliff only)": { "Rock type (crag/rock/cliff only)": {
"mappings": { "mappings": {
"0": { "0": {
"then": "Kalksteen" "then": "Kalksteen"
} }
} },
"question": "Wat is de rotssoort?",
"render": "De rotssoort is {rock}"
}, },
"name": { "name": {
"mappings": { "mappings": {
@ -3251,7 +3279,7 @@
} }
}, },
"entrance": { "entrance": {
"description": "Een laag met ingangen (van gebouwen etc.) waarmee je details kunt aanvullen die belangrijk zijn voor bijvoorbeeld rolstoelgebruikers (en fietsers, leveranciers, ...)", "description": "Een laag met ingangen (van gebouwen etc.) waarmee je details kunt aanvullen die belangrijk zijn voor bijvoorbeeld rolstoelgebruikers (en fietsers, leveranciers, )",
"name": "Toegang", "name": "Toegang",
"tagRenderings": { "tagRenderings": {
"Door_type": { "Door_type": {
@ -3292,7 +3320,7 @@
"then": "Dit is een secundaire ingang" "then": "Dit is een secundaire ingang"
}, },
"4": { "4": {
"then": "Dit is een dienstingang - normaal gezien enkel gebruikt door werknemers, leveranciers, ..." "then": "Dit is een dienstingang - normaal gezien enkel gebruikt door werknemers, leveranciers, "
}, },
"5": { "5": {
"then": "Dit is enkel een uitgang, je kan hier niet naar binnen" "then": "Dit is enkel een uitgang, je kan hier niet naar binnen"
@ -3382,7 +3410,7 @@
}, },
"extinguisher": { "extinguisher": {
"description": "Kaartlaag met brandblussers.", "description": "Kaartlaag met brandblussers.",
"name": "Kaart van brandblussers.", "name": "Kaart van brandblussers",
"presets": { "presets": {
"0": { "0": {
"description": "Een brandblusser is een klein, draagbaar apparaat om een brand te blussen", "description": "Een brandblusser is een klein, draagbaar apparaat om een brand te blussen",
@ -3630,6 +3658,9 @@
}, },
"question": "Heeft deze eetgelegenheid een vegetarische optie?" "question": "Heeft deze eetgelegenheid een vegetarische optie?"
}, },
"delivery": {
"question": "Levert {title()} aan huis?"
},
"friture-oil": { "friture-oil": {
"mappings": { "mappings": {
"0": { "0": {
@ -3779,6 +3810,69 @@
"render": "Speelweide in een park" "render": "Speelweide in een park"
} }
}, },
"hackerspace": {
"description": "Hackerspace",
"name": "Hackerspace",
"presets": {
"0": {
"description": "Een hackerspace is een ruimte waar mensen met een interesse in software samenkomen",
"title": "een hackerspace"
},
"1": {
"description": "Een makerspace is een ruimte waar makers en creatievelingen samenkomen om met electronica te experimenteren en te bouwen, bv. met Arduino, LED-strips, 3D-printers, lasercutters, …",
"title": "een makerspace"
}
},
"tagRenderings": {
"hackerspaces-name": {
"question": "Wat is de naam van deze hackerspace?",
"render": "Deze hackerspace heet <b>{name}</b>"
},
"hackerspaces-opening_hours": {
"mappings": {
"0": {
"then": "24/7 geopend"
}
},
"question": "Wanneer is deze hackerspace geopend?",
"render": "{opening_hours_table()}"
},
"hackerspaces-start_date": {
"question": "Wanneer is deze hackerspace opgericht?",
"render": "Deze hackerspace is opgericht op {start_date}"
},
"hs-club-mate": {
"mappings": {
"0": {
"then": "Deze hackerspace biedt clube-mate aan"
},
"1": {
"then": "Deze hackerspace biedt geen club-mate aan"
}
},
"question": "Biedt deze hackerspace club-mate aan?"
},
"is_makerspace": {
"mappings": {
"0": {
"then": "Dit is een makerspace"
},
"1": {
"then": "Dit een een traditionele (software-gerichte) hackerspace"
}
},
"question": "Is dit een hackerspace of een makerspace?"
}
},
"title": {
"mappings": {
"0": {
"then": " {name}"
}
},
"render": "Hackerspace"
}
},
"hydrant": { "hydrant": {
"description": "Kaartlaag met brandkranen.", "description": "Kaartlaag met brandkranen.",
"name": "Kaart van brandkranen", "name": "Kaart van brandkranen",
@ -3856,6 +3950,49 @@
"render": "Informatiebord" "render": "Informatiebord"
} }
}, },
"kindergarten_childcare": {
"name": "Kleuterscholen en kinderopvang",
"presets": {
"0": {
"title": "een kleuterschool"
},
"1": {
"title": "een kinderopvang"
}
},
"tagRenderings": {
"5": {
"override": {
"question": "Wanneer is deze kinderopvang geopend?"
}
},
"capacity": {
"question": "Hoeveel kinderen kunnen hier terecht?",
"render": "Hier kunnen {capacity} kinderen terecht"
},
"childcare-type": {
"mappings": {
"0": {
"then": "Dit is een kleuterschool waar kindjes (voorbereidend) onderwijs krijgen."
},
"1": {
"then": "Dit is een kinderopvang (ook een creche of onthaalmoeder genoemd) waar er voor kleine kinderen gezorgd wordt. Onderwijs is niet de hoofdfocus."
}
},
"question": "Wat voor faciliteit is dit?"
}
},
"title": {
"mappings": {
"0": {
"then": "Kleuterschool {name}"
},
"1": {
"then": "Kinderopvang {name}"
}
}
}
},
"map": { "map": {
"description": "Een permantent geinstalleerde kaart", "description": "Een permantent geinstalleerde kaart",
"name": "Kaarten", "name": "Kaarten",
@ -4138,6 +4275,11 @@
}, },
"name": "OpenStreetMap Notes", "name": "OpenStreetMap Notes",
"tagRenderings": { "tagRenderings": {
"nearby-images": {
"render": {
"before": "<h3>Afbeeldingen in de buurt</h3>Onderstaande afbeeldingen zijn afbeeldingen met geo-referentie en die in de buurt genomen zijn. Mogelijks zijn ze nuttig om deze kaartnota af te handelen."
}
},
"report-contributor": { "report-contributor": {
"render": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={_first_user_id}&reportable_type=User' target='_blank' class='subtle'>{_first_user} melden als spam</a>" "render": "<a href='https://www.openstreetmap.org/reports/new?reportable_id={_first_user_id}&reportable_type=User' target='_blank' class='subtle'>{_first_user} melden als spam</a>"
}, },
@ -4747,6 +4889,111 @@
"render": "Recyclingfaciliteit" "render": "Recyclingfaciliteit"
} }
}, },
"school": {
"name": "Lagere en middelbare scholen",
"presets": {
"0": {
"title": "een lagere of middelbare school"
}
},
"tagRenderings": {
"capacity": {
"render": "Deze school kan maximaal {capacity} studenten lesgeven"
},
"education-level-belgium": {
"mappings": {
"0": {
"then": "Dit is een school die ook een kleuterschool bevat"
},
"1": {
"then": "Dit is een lagere school"
},
"2": {
"then": "Dit is een middelbare school die alle schooljaren aanbiedt (dus van het eerste tot en met het zesde middelbaar)"
},
"3": {
"then": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het eerste en tweede middelbaar</b>"
},
"4": {
"then": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het derde en vierde middelbaar</b>"
},
"5": {
"then": "Dit is een middenlbare school die <b>niet</b> alle schooljaren aanbiedt, maar wel <b>het vijfde en zesde middelbaar</b>"
},
"6": {
"then": "Deze school biedt post-secundair onderwijs (bijvoorbeeld <b>specialisatiejaren</b>)"
}
},
"question": "Wat is het onderwijsniveau van deze school?"
},
"gender": {
"mappings": {
"0": {
"then": "Zowel jongens als meisjes kunnen hier les volgen. In de lessen zitten jongens en meisjes samen."
},
"1": {
"then": "Jongens en meisjes kunnen hier lesvolgen, maar de lessen zijn gescheiden (bv. de lessen zijn in andere lokalen of op andere momenten)"
},
"2": {
"then": "Deze school is enkel voor jongens"
},
"3": {
"then": "Deze school is enkel voor meisjes"
}
},
"question": "Mogen jongens en meisjes les volgen op deze school?"
},
"language": {
"mappings": {
"0": {
"then": "De voertaal van deze school is niet gekend"
}
},
"question": "Wat is de voertaal van deze school?<div class='subtle'>Welke taal wordt met de studenten gesproken in niet-taal-gerelateerde vakken en met de administratie?</div>",
"render": "{school:language} is de voertaal van {title()}"
},
"school-name": {
"question": "Wat is de naam van deze school?",
"render": "Deze school heet <b>{name}</b>"
},
"target-audience": {
"mappings": {
"0": {
"then": "Deze school richt zich op studenten zonder extra zorgbehoefte. <div class='subtle>Dit omvat leerlingen waarbij kleine, ad-hoc maatregelen volstaan om de lessen te volgen.</div>"
},
"1": {
"then": "Deze school richt zich op studenten zonder extra zorgbehoefte<div class='subtle>Dit omvat leerlingen waarbij kleine, ad-hoc maatregelen volstaan om de lessen te volgen.</div>"
},
"2": {
"then": "Deze school richt zich op volwassenen"
},
"3": {
"then": "Deze school richt zich op studenten in het autisme-spectrum"
},
"4": {
"then": "Deze school richt zich op leerlingen met een leerprobleem"
},
"5": {
"then": "Deze school richt zich op blinde en slechtziende studenten"
},
"6": {
"then": "Deze school richt zich op dove en hardhorende studenten"
},
"7": {
"then": "Deze school richt zich op studenten met een beperking"
},
"8": {
"then": "Deze school richt zich op studenten met extra zorgbehoeften"
}
},
"question": "Richt deze school zich op leerlingen met een speciale zorgbehoefte? Welke structurele faciliteiten heeft deze school voor leerlingen met een extra zorgbehoefte?<div class='subtle'>Ad-hoc maatregelen zijn niet voldoende</div> ",
"render": "Deze school richt zich op studenten met {school:for}"
}
},
"title": {
"render": "School <i>{name}</i>"
}
},
"shops": { "shops": {
"deletion": { "deletion": {
"extraDeleteReasons": { "extraDeleteReasons": {
@ -4946,7 +5193,7 @@
"then": "Publiek toegankelijk" "then": "Publiek toegankelijk"
}, },
"1": { "1": {
"then": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, ...)" "then": "Beperkt toegankelijk (enkel na reservatie, tijdens bepaalde uren, )"
}, },
"2": { "2": {
"then": "Enkel toegankelijk voor leden van de bijhorende sportclub" "then": "Enkel toegankelijk voor leden van de bijhorende sportclub"
@ -5224,13 +5471,13 @@
"Surveillance type: public, outdoor, indoor": { "Surveillance type: public, outdoor, indoor": {
"mappings": { "mappings": {
"0": { "0": {
"then": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel..." "then": "Bewaking van de publieke ruilmte, dus een straat, een brug, een park, een plein, een stationsgebouw, een publiek toegankelijke gang of tunnel"
}, },
"1": { "1": {
"then": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, ...)" "then": "Een buitenruimte met privaat karakter (zoals een privé-oprit, een parking, tankstation, )"
}, },
"2": { "2": {
"then": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, ..." "then": "Een private binnenruimte wordt bewaakt, bv. een winkel, een parkeergarage, "
} }
}, },
"question": "Wat soort bewaking wordt hier uitgevoerd?" "question": "Wat soort bewaking wordt hier uitgevoerd?"
@ -5308,6 +5555,55 @@
"render": "Bewakingscamera" "render": "Bewakingscamera"
} }
}, },
"tertiary_education": {
"name": "Universiteiten en hogescholen",
"presets": {
"0": {
"description": "Een onderwijsinstelling waar tertiair onderwijs wordt gegeven - dit is onderwijs waarvan het niveau overeenkomt met een bachelor of hoger is. Eén enkel punt per campus is genoeg - gebouwen en faculteiten worden hier niet op aangeduid.",
"title": "een universiteit"
}
},
"tagRenderings": {
"institution-kind": {
"mappings": {
"0": {
"then": "Dit is een onderwijsinstelling waar post-secundair, niet-tertiair onderwijs wordt gegeven. Om dit onderwijs te volgen, moet je je secundair onderwijs afgewerkt hebben maar de opleiding behaalt niet het niveau van van een bachelor."
},
"1": {
"then": "Dit is een universiteit (of hogeschool), een onderwijsinstelling van tertaire educatie. De gegeven opleidingen halen het niveau van een bachelor-opleiding of hoger."
}
},
"question": "Wat voor onderwijsinstelling is dit?"
},
"isced": {
"mappings": {
"0": {
"then": "Bacheloropleidingen (of equivalent) worden hier gegeven"
},
"1": {
"then": "Masteropleidingen (of equivalent) worden hier gegeven"
},
"2": {
"then": "Doctoraatsopleidingen (of equivalent) worden hier gegeven"
}
},
"question": "Wat is het niveau van onderwijs?"
}
},
"title": {
"mappings": {
"1": {
"then": "Hogeschool"
},
"2": {
"then": "Universiteit"
},
"3": {
"then": "Onderwijsinstelling die tertiair onderwijs geeft"
}
}
}
},
"toilet": { "toilet": {
"description": "Een laag die publieke toiletten toont", "description": "Een laag die publieke toiletten toont",
"filter": { "filter": {
@ -5647,6 +5943,9 @@
}, },
"question": "Is dit een naald- of loofboom?" "question": "Is dit een naald- of loofboom?"
}, },
"tree-species-wikidata": {
"question": "Wat is de boomsoort?"
},
"tree_node-name": { "tree_node-name": {
"mappings": { "mappings": {
"0": { "0": {
@ -5669,6 +5968,24 @@
"render": "Boom" "render": "Boom"
} }
}, },
"veterinary": {
"name": "Dierenarts",
"presets": {
"0": {
"description": "een dierenarts die honden verzorgt",
"title": "een dierenarts"
}
},
"tagRenderings": {
"vetName": {
"question": "Wat is de naam van deze dierenartspraktijk?",
"render": "Deze dierenartspraktijk heet {name}"
}
},
"title": {
"render": "Dierenarts"
}
},
"viewpoint": { "viewpoint": {
"description": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past", "description": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past",
"name": "Uitzicht", "name": "Uitzicht",
@ -5714,7 +6031,7 @@
} }
}, },
"walls_and_buildings": { "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.", "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.",
"title": { "title": {
"render": "Muur of gebouw" "render": "Muur of gebouw"
} }
@ -5925,13 +6242,33 @@
} }
}, },
"windturbine": { "windturbine": {
"description": "Windturbines (moderne windmolens die elektriciteit genereren)",
"name": "windturbine", "name": "windturbine",
"presets": { "presets": {
"0": { "0": {
"title": "een windturbine" "title": "een windturbine"
} }
}, },
"tagRenderings": {
"turbine-diameter": {
"question": "Wat is de rotordiameter van deze windturbine?",
"render": "De rotordiameter van deze windturbine is {rotor:diameter} meter."
},
"turbine-output": {
"question": "Wat is de output",
"render": "Deze windturbine genereert {generator:output:electricity}"
},
"turbine-start-date": {
"question": "Wanneer werd deze windturbine in gebruik genomen?",
"render": "Deze windturbine werd op {start_date} in gebruik genomen"
}
},
"title": { "title": {
"mappings": {
"0": {
"then": "{name}"
}
},
"render": "windturbine" "render": "windturbine"
}, },
"units": { "units": {

View file

@ -91,6 +91,20 @@
}, },
"question": "Gibt es hier Steckdosen, an denen Kunden ihre Geräte laden können?" "question": "Gibt es hier Steckdosen, an denen Kunden ihre Geräte laden können?"
}, },
"smoking": {
"mappings": {
"0": {
"then": "Rauchen ist <b>erlaubt</b>"
},
"1": {
"then": "Rauchen ist <b>nicht erlaubt</b>"
},
"2": {
"then": "Rauchen ist <b> draußen erlaubt</b>."
}
},
"question": "Ist das Rauchen in {title()} erlaubt?"
},
"website": { "website": {
"question": "Wie lautet die Webseite von {title()}?" "question": "Wie lautet die Webseite von {title()}?"
}, },

View file

@ -91,6 +91,20 @@
}, },
"question": "¿Esta facilidad tiene enchufes eléctricos, disponibles para los clientes cuando están dentro?" "question": "¿Esta facilidad tiene enchufes eléctricos, disponibles para los clientes cuando están dentro?"
}, },
"smoking": {
"mappings": {
"0": {
"then": "Está <b>permitido</b> fumar"
},
"1": {
"then": "<b>No</b> está permitido fumar"
},
"2": {
"then": "Está permitido fumar <b>en el exterior</b>."
}
},
"question": "¿Está permitido fumar en {title()}?"
},
"website": { "website": {
"question": "¿Cual es el sitio web de {title()}?" "question": "¿Cual es el sitio web de {title()}?"
}, },

View file

@ -443,6 +443,10 @@
"description": "On this map, publicly accessible drinking water spots are shown and can be easily added", "description": "On this map, publicly accessible drinking water spots are shown and can be easily added",
"title": "Drinking Water" "title": "Drinking Water"
}, },
"education": {
"description": "On this map, you'll find information about all types of schools and eduction and can easily add more information",
"title": "Education"
},
"entrances": { "entrances": {
"description": "A map showing all entrances, which surveys for important aspects for wheelchair users", "description": "A map showing all entrances, which surveys for important aspects for wheelchair users",
"shortDescription": "Survey entrances to help wheelchair routing", "shortDescription": "Survey entrances to help wheelchair routing",

View file

@ -583,6 +583,10 @@
"description": "Op deze kaart staan publiek toegankelijke drinkwaterpunten en kan je makkelijk een nieuw drinkwaterpunt toevoegen", "description": "Op deze kaart staan publiek toegankelijke drinkwaterpunten en kan je makkelijk een nieuw drinkwaterpunt toevoegen",
"title": "Drinkwaterpunten" "title": "Drinkwaterpunten"
}, },
"education": {
"description": "Deze kaart toont info over verschillende onderwijsinstellingen zoals kleuterscholen, middelbare scholen en tertiair onderwijs.",
"title": "Onderwijs"
},
"entrances": { "entrances": {
"description": "Een kaart die alle toegangen toont,", "description": "Een kaart die alle toegangen toont,",
"shortDescription": "Breng ingangen in kaart om rolstoelnavigatie mogelijk te maken", "shortDescription": "Breng ingangen in kaart om rolstoelnavigatie mogelijk te maken",

1
package-lock.json generated
View file

@ -11,6 +11,7 @@
"dependencies": { "dependencies": {
"@babel/preset-env": "7.13.8", "@babel/preset-env": "7.13.8",
"@parcel/service-worker": "^2.6.0", "@parcel/service-worker": "^2.6.0",
"@turf/boolean-intersects": "^6.5.0",
"@turf/buffer": "^6.5.0", "@turf/buffer": "^6.5.0",
"@turf/collect": "^6.5.0", "@turf/collect": "^6.5.0",
"@turf/distance": "^6.5.0", "@turf/distance": "^6.5.0",

View file

@ -68,6 +68,7 @@
"dependencies": { "dependencies": {
"@babel/preset-env": "7.13.8", "@babel/preset-env": "7.13.8",
"@parcel/service-worker": "^2.6.0", "@parcel/service-worker": "^2.6.0",
"@turf/boolean-intersects": "^6.5.0",
"@turf/buffer": "^6.5.0", "@turf/buffer": "^6.5.0",
"@turf/collect": "^6.5.0", "@turf/collect": "^6.5.0",
"@turf/distance": "^6.5.0", "@turf/distance": "^6.5.0",

View file

@ -70,6 +70,21 @@ knownLicenses.set("streetcomplete", {
license: "CC0", license: "CC0",
sources: ["https://github.com/streetcomplete/StreetComplete/tree/master/res/graphics", "https://f-droid.org/packages/de.westnordost.streetcomplete/"] sources: ["https://github.com/streetcomplete/StreetComplete/tree/master/res/graphics", "https://f-droid.org/packages/de.westnordost.streetcomplete/"]
}) })
knownLicenses.set("temaki", {
authors: ["Temaki"],
path: undefined,
license: "CC0",
sources: ["https://github.com/ideditor/temaki","https://ideditor.github.io/temaki/docs/"]
})
knownLicenses.set("maki", {
authors: ["Maki"],
path: undefined,
license: "CC0",
sources: ["https://labs.mapbox.com/maki-icons/"]
})
knownLicenses.set("t", { knownLicenses.set("t", {
authors: [], authors: [],
path: undefined, path: undefined,

View file

@ -50,6 +50,9 @@ function addArticleToPresets(layerConfig: {presets?: {title: any}[]}){
if(txt.startsWith(article+" ")){ if(txt.startsWith(article+" ")){
return txt; return txt;
} }
if(txt.startsWith("an ")){
return txt;
}
return article +" " + txt.toLowerCase(); return article +" " + txt.toLowerCase();
}) })
.translations .translations

View file

@ -0,0 +1,70 @@
import {describe} from 'mocha'
import OsmFeatureSource from "../../../Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource";
import {UIEventSource} from "../../../Logic/UIEventSource";
import ScriptUtils from "../../../scripts/ScriptUtils";
import FilteredLayer, {FilterState} from "../../../Models/FilteredLayer";
import {Tiles} from "../../../Models/TileRange";
import {readFileSync} from "fs";
import {Utils} from "../../../Utils";
import {Tag} from "../../../Logic/Tags/Tag";
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
import {expect} from "chai";
console.log(process.cwd())
let data = JSON.parse(readFileSync("./test/Logic/FeatureSource/osmdata.json", "utf8"))
describe("OsmFeatureSource", () => {
it("should work", (done) => {
ScriptUtils.fixUtils()
Utils.injectJsonDownloadForTests("https://osm.org/api/0.6/map?bbox=4.24346923828125,50.732978448277514,4.2462158203125,50.73471682490244", data)
let fetchedTile = undefined;
const neededTiles = new UIEventSource<number[]>([Tiles.tile_index(17, 67081, 44033)]);
new OsmFeatureSource({
allowedFeatures: new Tag("amenity", "school"),
handleTile: tile => {
fetchedTile = tile
const data = tile.features.data[0].feature
expect(data.properties).deep.eq({
id: 'relation/5759328', timestamp: '2022-06-10T00:46:55Z',
version: 6,
changeset: 122187206,
user: 'Pieter Vander Vennet',
uid: 3818858,
amenity: 'school',
'isced:2011:level': 'vocational_lower_secondary;vocational_upper_secondary',
name: 'Koninklijk Technisch Atheneum Pro Technica',
'school:gender': 'mixed',
type: 'multipolygon',
website: 'http://ktahalle.be/',
_backend: 'https://osm.org'
})
expect(data.geometry.type).eq("MultiPolygon")
done()
},
isActive: new UIEventSource<boolean>(true),
neededTiles,
state: {
osmConnection: {
Backend(): string {
return "https://osm.org"
}
},
filteredLayers: new UIEventSource<FilteredLayer[]>([
{
appliedFilters: new UIEventSource<Map<string, FilterState>>(undefined),
layerDef: new LayerConfig({
id: "school",
source: {
osmTags: "amenity=school"
},
mapRendering: null
}),
isDisplayed: new UIEventSource<boolean>(true)
}
])
}
})
})
})

File diff suppressed because one or more lines are too long