Merge develop

This commit is contained in:
Pieter Vander Vennet 2021-07-27 19:59:41 +02:00
commit 0162d52b68
127 changed files with 6609 additions and 15167 deletions

View file

@ -6,12 +6,13 @@ import {And} from "../../Logic/Tags/And";
import {Tag} from "../../Logic/Tags/Tag";
import {TagsFilter} from "../../Logic/Tags/TagsFilter";
import SubstitutingTag from "../../Logic/Tags/SubstitutingTag";
import ComparingTag from "../../Logic/Tags/ComparingTag";
export class FromJSON {
public static SimpleTag(json: string, context?: string): Tag {
const tag = Utils.SplitFirst(json, "=");
if(tag.length !== 2){
if (tag.length !== 2) {
throw `Invalid tag: no (or too much) '=' found (in ${context ?? "unkown context"})`
}
return new Tag(tag[0], tag[1]);
@ -26,6 +27,15 @@ export class FromJSON {
}
}
private static comparators
: [string, (a: number, b: number) => boolean][]
= [
["<=", (a, b) => a <= b],
[">=", (a, b) => a >= b],
["<", (a, b) => a < b],
[">", (a, b) => a > b],
]
private static TagUnsafe(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter {
if (json === undefined) {
@ -33,6 +43,27 @@ export class FromJSON {
}
if (typeof (json) == "string") {
const tag = json as string;
for (const [operator, comparator] of FromJSON.comparators) {
if (tag.indexOf(operator) >= 0) {
const split = Utils.SplitFirst(tag, operator);
const val = Number(split[1].trim())
if (isNaN(val)) {
throw `Error: not a valid value for a comparison: ${split[1]}, make sure it is a number and nothing more (at ${context})`
}
const f = (value: string | undefined) => {
const b = Number(value?.replace(/[^\d.]/g,''))
if (isNaN(b)) {
return false;
}
return comparator(b, val)
}
return new ComparingTag(split[0], f, operator + val)
}
}
if (tag.indexOf("!~") >= 0) {
const split = Utils.SplitFirst(tag, "!~");
if (split[1] === "*") {
@ -54,11 +85,11 @@ export class FromJSON {
new RegExp("^" + split[1] + "$")
);
}
if(tag.indexOf(":=") >= 0){
if (tag.indexOf(":=") >= 0) {
const split = Utils.SplitFirst(tag, ":=");
return new SubstitutingTag(split[0], split[1]);
}
if (tag.indexOf("!=") >= 0) {
const split = Utils.SplitFirst(tag, "!=");
if (split[1] === "*") {

View file

@ -55,7 +55,7 @@ export interface LayerConfigJson {
* Note that both geojson-options might set a flag 'isOsmCache' indicating that the data originally comes from OSM too
*
*
* NOTE: the previous format was 'overpassTags: AndOrTagCOnfigJson | string', which is interpreted as a shorthand for source: {osmTags: "key=value"}
* NOTE: the previous format was 'overpassTags: AndOrTagConfigJson | string', which is interpreted as a shorthand for source: {osmTags: "key=value"}
* While still supported, this is considered deprecated
*/
source: { osmTags: AndOrTagConfigJson | string } |
@ -82,7 +82,7 @@ export interface LayerConfigJson {
doNotDownload?: boolean;
/**
* This tagrendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.
* This tag rendering should either be 'yes' or 'no'. If 'no' is returned, then the feature will be hidden from view.
* This is useful to hide certain features from view. Important: hiding features does not work dynamically, but is only calculated when the data is first renders.
* This implies that it is not possible to hide a feature after a tagging change
*
@ -98,8 +98,8 @@ export interface LayerConfigJson {
minzoom?: number;
/**
* If zoomed out below this zoomlevel, the data will be hidden.
* Default: minzoom
* The zoom level at which point the data is hidden again
* Default: 100 (thus: always visible
*/
minzoomVisible?: number;
@ -121,9 +121,9 @@ export interface LayerConfigJson {
* Note that this also doubles as the icon for this layer (rendered with the overpass-tags) ánd the icon in the presets.
*
* The result of the icon is rendered as follows:
* the resulting string is interpreted as a _list_ of items, seperated by ";". The bottommost layer is the first layer.
* the resulting string is interpreted as a _list_ of items, separated by ";". The bottommost layer is the first layer.
* As a result, on could use a generic pin, then overlay it with a specific icon.
* To make things even more practical, one can use all svgs from the folder "assets/svg" and _substitute the color_ in it.
* To make things even more practical, one can use all SVG's from the folder "assets/svg" and _substitute the color_ in it.
* E.g. to draw a red pin, use "pin:#f00", to have a green circle with your icon on top, use `circle:#0f0;<path to my icon.svg>`
*
*/
@ -221,7 +221,7 @@ export interface LayerConfigJson {
/**
* If set, the user will prompted to confirm the location before actually adding the data.
* THis will be with a 'drag crosshair'-method.
* This will be with a 'drag crosshair'-method.
*
* If 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.
*/
@ -236,7 +236,7 @@ export interface LayerConfigJson {
*
* Refer to the class `TagRenderingConfigJson` to see the possibilities.
*
* Note that we can also use a string here - where the string refers to a tagrenering defined in `assets/questions/questions.json`,
* Note that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,
* where a few very general questions are defined e.g. website, phone number, ...
*
* A special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.

View file

@ -95,7 +95,7 @@ export default class LayoutConfig {
}
);
this.defaultBackgroundId = json.defaultBackgroundId;
this.layers = LayoutConfig.ExtractLayers(json, this.units, official);
this.layers = LayoutConfig.ExtractLayers(json, this.units, official, context);
// ALl the layers are constructed, let them share tags in now!
const roaming: { r, source: LayerConfig }[] = []
@ -160,12 +160,12 @@ export default class LayoutConfig {
}
private static ExtractLayers(json: LayoutConfigJson, units: Unit[], official: boolean): LayerConfig[] {
private static ExtractLayers(json: LayoutConfigJson, units: Unit[], official: boolean, context: string): LayerConfig[] {
const result: LayerConfig[] = []
json.layers.forEach((layer, i) => {
if (typeof layer === "string") {
if (AllKnownLayers.sharedLayersJson[layer] !== undefined) {
if (AllKnownLayers.sharedLayersJson.get(layer) !== undefined) {
if (json.overrideAll !== undefined) {
let lyr = JSON.parse(JSON.stringify(AllKnownLayers.sharedLayersJson[layer]));
const newLayer = new LayerConfig(Utils.Merge(json.overrideAll, lyr), units, `${json.id}+overrideAll.layers[${i}]`, official)
@ -176,7 +176,8 @@ export default class LayoutConfig {
return
}
} else {
throw "Unknown fixed layer " + layer;
console.log("Layer ", layer," not kown, try one of", Array.from(AllKnownLayers.sharedLayers.keys()).join(", "))
throw `Unknown builtin layer ${layer} at ${context}.layers[${i}]`;
}
}
@ -195,9 +196,9 @@ export default class LayoutConfig {
names = [names]
}
names.forEach(name => {
const shared = AllKnownLayers.sharedLayersJson[name];
const shared = AllKnownLayers.sharedLayersJson.get(name);
if (shared === undefined) {
throw "Unknown fixed layer " + name;
throw `Unknown shared/builtin layer ${name} at ${context}.layers[${i}]. Available layers are ${Array.from(AllKnownLayers.sharedLayersJson.keys()).join(", ")}`;
}
// @ts-ignore
let newLayer: LayerConfigJson = Utils.Merge(layer.override, JSON.parse(JSON.stringify(shared))); // We make a deep copy of the shared layer, in order to protect it from changes

View file

@ -141,6 +141,7 @@ Some advanced functions are available on **feat** as well:
- overlapWith
- closest
- memberships
- score
### distanceTo
@ -168,4 +169,12 @@ Some advanced functions are available on **feat** as well:
For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`
### score
Given the path of an aspected routing json file, will calculate the score. This score is wrapped in a UIEventSource, so for further calculations, use `.map(score => ...)`
For example: `_comfort_score=feat.score('https://raw.githubusercontent.com/pietervdvn/AspectedRouting/master/Examples/bicycle/aspects/bicycle.comfort.json')`
0. path
Generated from SimpleMetaTagger, ExtraFunction

View file

@ -14,6 +14,14 @@ A string, but allows input of longer strings more comfortably (a text area)
A date
## direction
A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl)
## length
A geographical length in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma seperated) ], e.g. `["21", "map,photo"]
## wikidata
A wikidata identifier, e.g. Q42
@ -30,10 +38,6 @@ A positive number or zero
A strict positive number
## direction
A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl)
## float
A decimal

View file

@ -0,0 +1,111 @@
{
"data_format": 1,
"project": {
"name": "MapComplete Open Artwork Map",
"description": "Welcome to Open Artwork Map, a map of statues, busts, grafittis and other artwork all over the world",
"project_url": "https://mapcomplete.osm.be/artwork",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/themes/artwork/artwork.svg",
"contact_name": "Pieter Vander Vennet, MapComplete",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "tourism",
"description": "The MapComplete theme Open Artwork Map has a layer Artworks showing features with this tag",
"value": "artwork"
},
{
"key": "image",
"description": "The layer 'Artworks allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "mapillary",
"description": "The layer 'Artworks allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikidata",
"description": "The layer 'Artworks allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikipedia",
"description": "The layer 'Artworks allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows and asks freeform values for key 'artwork_type' (in the MapComplete.osm.be theme 'Open Artwork Map')"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=architecture with a fixed text, namely 'Architecture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "architecture"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=mural with a fixed text, namely 'Mural' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "mural"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=painting with a fixed text, namely 'Painting' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "painting"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=sculpture with a fixed text, namely 'Sculpture' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "sculpture"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=statue with a fixed text, namely 'Statue' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "statue"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=bust with a fixed text, namely 'Bust' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "bust"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=stone with a fixed text, namely 'Stone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "stone"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=installation with a fixed text, namely 'Installation' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "installation"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=graffiti with a fixed text, namely 'Graffiti' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "graffiti"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=relief with a fixed text, namely 'Relief' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "relief"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=azulejo with a fixed text, namely 'Azulejo (Spanish decorative tilework)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "azulejo"
},
{
"key": "artwork_type",
"description": "Layer 'Artworks' shows artwork_type=tilework with a fixed text, namely 'Tilework' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Open Artwork Map')",
"value": "tilework"
},
{
"key": "artist_name",
"description": "Layer 'Artworks' shows and asks freeform values for key 'artist_name' (in the MapComplete.osm.be theme 'Open Artwork Map')"
},
{
"key": "website",
"description": "Layer 'Artworks' shows and asks freeform values for key 'website' (in the MapComplete.osm.be theme 'Open Artwork Map')"
},
{
"key": "wikidata",
"description": "Layer 'Artworks' shows and asks freeform values for key 'wikidata' (in the MapComplete.osm.be theme 'Open Artwork Map')"
}
]
}

View file

@ -5,7 +5,7 @@
"description": "A bicycle library is a place where bicycles can be lent, often for a small yearly fee",
"project_url": "https://mapcomplete.osm.be/bicyclelib",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/themes/bicycle_library/logo.svg",
"icon_url": "https://mapcomplete.osm.be/assets/themes/bicyclelib/logo.svg",
"contact_name": "Pieter Vander Vennet, MapComplete",
"contact_email": "pietervdvn@posteo.net"
},

View file

@ -5,7 +5,7 @@
"description": "Find sites to spend the night with your camper",
"project_url": "https://mapcomplete.osm.be/campersite",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/themes/campersites/caravan.svg",
"icon_url": "https://mapcomplete.osm.be/assets/themes/campersite/caravan.svg",
"contact_name": "Pieter Vander Vennet, joost schouppe",
"contact_email": "pietervdvn@posteo.net"
},

View file

@ -0,0 +1,707 @@
{
"data_format": 1,
"project": {
"name": "MapComplete Bicycle infrastructure",
"description": "A map where you can view and edit things related to the bicycle infrastructure.",
"project_url": "https://mapcomplete.osm.be/cycle_infra",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/themes/cycle_infra/cycle-infra.svg",
"contact_name": "Pieter Vander Vennet, ",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways showing features with this tag",
"value": "cycleway"
},
{
"key": "cycleway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways showing features with this tag",
"value": "lane"
},
{
"key": "cycleway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways showing features with this tag",
"value": "shared_lane"
},
{
"key": "cycleway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways showing features with this tag",
"value": "track"
},
{
"key": "cyclestreet",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways showing features with this tag",
"value": "yes"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways showing features with this tag",
"value": "path"
},
{
"key": "bicycle",
"description": "The MapComplete theme Bicycle infrastructure has a layer Cycleways showing features with this tag",
"value": "designated"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "shared_lane"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (seperated with paint)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "lane"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn seperately from this road on the map.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "track"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways' shows cycleway=seperate with a fixed text, namely 'There is a seperately drawn cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "seperate"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "cycleway",
"description": "Layer 'Cycleways' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "lit",
"description": "Layer 'Cycleways' shows lit=yes with a fixed text, namely 'This street is lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "lit",
"description": "Layer 'Cycleways' shows lit=no with a fixed text, namely 'This road is not lit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "lit",
"description": "Layer 'Cycleways' shows lit=sunset-sunrise with a fixed text, namely 'This road is lit at night' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "sunset-sunrise"
},
{
"key": "lit",
"description": "Layer 'Cycleways' shows lit=24/7 with a fixed text, namely 'This road is lit 24/7' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "24/7"
},
{
"key": "cyclestreet",
"description": "Layer 'Cycleways' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'Cycleways' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'Cycleways' shows cyclestreet= with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways' shows and asks freeform values for key 'maxspeed' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways' shows maxspeed=20 with a fixed text, namely 'The maximum speed is 20 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "20"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways' shows maxspeed=30 with a fixed text, namely 'The maximum speed is 30 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "30"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways' shows maxspeed=50 with a fixed text, namely 'The maximum speed is 50 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "50"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways' shows maxspeed=70 with a fixed text, namely 'The maximum speed is 70 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "70"
},
{
"key": "maxspeed",
"description": "Layer 'Cycleways' shows maxspeed=90 with a fixed text, namely 'The maximum speed is 90 km/h' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "90"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways' shows and asks freeform values for key 'cycleway:surface' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways' shows cycleway:surface=wood with a fixed text, namely 'This cycleway is made of wood' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "wood"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways' shows cycleway:surface=concrete with a fixed text, namely 'This cycleway is made of concrete' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "concrete"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways' shows cycleway:surface=cobblestone with a fixed text, namely 'This cycleway is made of cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "cobblestone"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways' shows cycleway:surface=asphalt with a fixed text, namely 'This cycleway is made of asphalt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "asphalt"
},
{
"key": "cycleway:surface",
"description": "Layer 'Cycleways' shows cycleway:surface=paved with a fixed text, namely 'This cycleway is paved' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "paved"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways' shows cycleway:smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "excellent"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways' shows cycleway:smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "good"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways' shows cycleway:smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "intermediate"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways' shows cycleway:smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "bad"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways' shows cycleway:smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "very_bad"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways' shows cycleway:smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "horrible"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways' shows cycleway:smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "very_horrible"
},
{
"key": "cycleway:smoothness",
"description": "Layer 'Cycleways' shows cycleway:smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "impassable"
},
{
"key": "surface",
"description": "Layer 'Cycleways' shows and asks freeform values for key 'surface' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "surface",
"description": "Layer 'Cycleways' shows surface=wood with a fixed text, namely 'This street is made of wood' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "wood"
},
{
"key": "surface",
"description": "Layer 'Cycleways' shows surface=concrete with a fixed text, namely 'This street is made of concrete' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "concrete"
},
{
"key": "surface",
"description": "Layer 'Cycleways' shows surface=cobblestone with a fixed text, namely 'This street is made of cobblestone' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "cobblestone"
},
{
"key": "surface",
"description": "Layer 'Cycleways' shows surface=asphalt with a fixed text, namely 'This street is made of asphalt' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "asphalt"
},
{
"key": "surface",
"description": "Layer 'Cycleways' shows surface=paved with a fixed text, namely 'This street is paved' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "paved"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways' shows smoothness=excellent with a fixed text, namely 'Usable for thin rollers: rollerblade, skateboard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "excellent"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways' shows smoothness=good with a fixed text, namely 'Usable for thin wheels: racing bike' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "good"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways' shows smoothness=intermediate with a fixed text, namely 'Usable for normal wheels: city bike, wheelchair, scooter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "intermediate"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways' shows smoothness=bad with a fixed text, namely 'Usable for robust wheels: trekking bike, car, rickshaw' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "bad"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways' shows smoothness=very_bad with a fixed text, namely 'Usable for vehicles with high clearance: light duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "very_bad"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways' shows smoothness=horrible with a fixed text, namely 'Usable for off-road vehicles: heavy duty off-road vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "horrible"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways' shows smoothness=very_horrible with a fixed text, namely 'Usable for specialized off-road vehicles: tractor, ATV' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "very_horrible"
},
{
"key": "smoothness",
"description": "Layer 'Cycleways' shows smoothness=impassable with a fixed text, namely 'Impassable / No wheeled vehicle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "impassable"
},
{
"key": "width:carriageway",
"description": "Layer 'Cycleways' shows and asks freeform values for key 'width:carriageway' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign~^BE:D7;.*$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)<img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='height: 3em'> ' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D9"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D10"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "none"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=BE:D7 with a fixed text, namely 'Compulsory cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign~^BE:D7;.*$ with a fixed text, namely 'Compulsory cycleway (with supplementary sign)<img src='./assets/themes/cycle_infra/Belgian_road_sign_D07.svg' style='height: 3em'> ' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=BE:D9 with a fixed text, namely 'Segregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D09.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D9"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=BE:D10 with a fixed text, namely 'Unsegregated foot/cycleway <img src='./assets/themes/cycle_infra/Belgian_road_sign_D10.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D10"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=none with a fixed text, namely 'No traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "none"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D7;BE:M6 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M6.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M6"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D7;BE:M13 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M13.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M13"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D7;BE:M14 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M14.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M14"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D7;BE:M7 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M7.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M7"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D7;BE:M15 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M15.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M15"
},
{
"key": "cycleway:traffic_sign",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign=BE:D7;BE:M16 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M16.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M16"
},
{
"key": "cycleway:traffic_sign:supplementary",
"description": "Layer 'Cycleways' shows cycleway:traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "none"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=BE:D7;BE:M6 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M6.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M6"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=BE:D7;BE:M13 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M13.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M13"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=BE:D7;BE:M14 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M14.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M14"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=BE:D7;BE:M7 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M7.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M7"
},
{
"key": ":traffic_sign",
"description": "Layer 'Cycleways' shows :traffic_sign=BE:D7;BE:M15 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M15.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M15"
},
{
"key": "traffic_sign",
"description": "Layer 'Cycleways' shows traffic_sign=BE:D7;BE:M16 with a fixed text, namely '<img src='./assets/themes/cycle_infra/Belgian_traffic_sign_M16.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "BE:D7;BE:M16"
},
{
"key": "traffic_sign:supplementary",
"description": "Layer 'Cycleways' shows traffic_sign:supplementary=none with a fixed text, namely 'No supplementary traffic sign present' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "none"
},
{
"key": "cycleway:buffer",
"description": "Layer 'Cycleways' shows and asks freeform values for key 'cycleway:buffer' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "cycleway:seperation",
"description": "Layer 'Cycleways' shows cycleway:seperation=dashed_line with a fixed text, namely 'This cycleway is seperated by a dashed line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "dashed_line"
},
{
"key": "cycleway:seperation",
"description": "Layer 'Cycleways' shows cycleway:seperation=solid_line with a fixed text, namely 'This cycleway is seperated by a solid line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "solid_line"
},
{
"key": "cycleway:seperation",
"description": "Layer 'Cycleways' shows cycleway:seperation=parking_lane with a fixed text, namely 'This cycleway is seperated by a parking lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "parking_lane"
},
{
"key": "cycleway:seperation",
"description": "Layer 'Cycleways' shows cycleway:seperation=kerb with a fixed text, namely 'This cycleway is seperated by a kerb' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "kerb"
},
{
"key": "seperation",
"description": "Layer 'Cycleways' shows seperation=dashed_line with a fixed text, namely 'This cycleway is seperated by a dashed line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "dashed_line"
},
{
"key": "seperation",
"description": "Layer 'Cycleways' shows seperation=solid_line with a fixed text, namely 'This cycleway is seperated by a solid line' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "solid_line"
},
{
"key": "seperation",
"description": "Layer 'Cycleways' shows seperation=parking_lane with a fixed text, namely 'This cycleway is seperated by a parking lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "parking_lane"
},
{
"key": "seperation",
"description": "Layer 'Cycleways' shows seperation=kerb with a fixed text, namely 'This cycleway is seperated by a kerb' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "kerb"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer All streets showing features with this tag",
"value": "residential"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer All streets showing features with this tag",
"value": "tertiary"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer All streets showing features with this tag",
"value": "unclassified"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer All streets showing features with this tag",
"value": "primary"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer All streets showing features with this tag",
"value": "secondary"
},
{
"key": "cycleway",
"description": "Layer 'All streets' shows and asks freeform values for key 'cycleway' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "cycleway",
"description": "Layer 'All streets' shows cycleway=shared_lane with a fixed text, namely 'There is a shared lane' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "shared_lane"
},
{
"key": "cycleway",
"description": "Layer 'All streets' shows cycleway=lane with a fixed text, namely 'There is a lane next to the road (seperated with paint)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "lane"
},
{
"key": "cycleway",
"description": "Layer 'All streets' shows cycleway=track with a fixed text, namely 'There is a track, but no cycleway drawn seperately from this road on the map.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "track"
},
{
"key": "cycleway",
"description": "Layer 'All streets' shows cycleway=seperate with a fixed text, namely 'There is a seperately drawn cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "seperate"
},
{
"key": "cycleway",
"description": "Layer 'All streets' shows cycleway= with a fixed text, namely 'There is no cycleway known here' (in the MapComplete.osm.be theme 'Bicycle infrastructure') Picking this answer will delete the key cycleway.",
"value": ""
},
{
"key": "cycleway",
"description": "Layer 'All streets' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "cycleway",
"description": "Layer 'All streets' shows cycleway=no with a fixed text, namely 'There is no cycleway' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet, and a 30km/h zone.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=yes with a fixed text, namely 'This is a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'All streets' shows cyclestreet= with a fixed text, namely 'This is not a cyclestreet.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "barrier",
"description": "The MapComplete theme Bicycle infrastructure has a layer Barriers showing features with this tag",
"value": "bollard"
},
{
"key": "barrier",
"description": "The MapComplete theme Bicycle infrastructure has a layer Barriers showing features with this tag",
"value": "cycle_barrier"
},
{
"key": "bicycle",
"description": "Layer 'Barriers' shows bicycle=yes with a fixed text, namely 'A cyclist can go past this.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "bicycle",
"description": "Layer 'Barriers' shows bicycle=no with a fixed text, namely 'A cyclist can not go past this.' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "bollard",
"description": "Layer 'Barriers' shows bollard=removable with a fixed text, namely 'Removable bollard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "removable"
},
{
"key": "bollard",
"description": "Layer 'Barriers' shows bollard=fixed with a fixed text, namely 'Fixed bollard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "fixed"
},
{
"key": "bollard",
"description": "Layer 'Barriers' shows bollard=foldable with a fixed text, namely 'Bollard that can be folded down' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "foldable"
},
{
"key": "bollard",
"description": "Layer 'Barriers' shows bollard=flexible with a fixed text, namely 'Flexible bollard, usually plastic' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "flexible"
},
{
"key": "bollard",
"description": "Layer 'Barriers' shows bollard=rising with a fixed text, namely 'Rising bollard' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "rising"
},
{
"key": "cycle_barrier:type",
"description": "Layer 'Barriers' shows cycle_barrier:type=single with a fixed text, namely 'Single, just two barriers with a space inbetween <img src='./assets/themes/cycle_infra/Cycle_barrier_single.png' style='width:8em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "single"
},
{
"key": "cycle_barrier:type",
"description": "Layer 'Barriers' shows cycle_barrier:type=double with a fixed text, namely 'Double, two barriers behind each other <img src='./assets/themes/cycle_infra/Cycle_barrier_double.png' style='width:8em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "double"
},
{
"key": "cycle_barrier:type",
"description": "Layer 'Barriers' shows cycle_barrier:type=triple with a fixed text, namely 'Triple, three barriers behind each other <img src='./assets/themes/cycle_infra/Cycle_barrier_triple.png' style='width:8em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "triple"
},
{
"key": "cycle_barrier:type",
"description": "Layer 'Barriers' shows cycle_barrier:type=squeeze with a fixed text, namely 'Squeeze gate, gap is smaller at top, than at the bottom <img src='./assets/themes/cycle_infra/Cycle_barrier_squeeze.png' style='width:8em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "squeeze"
},
{
"key": "maxwidth:physical",
"description": "Layer 'Barriers' shows and asks freeform values for key 'maxwidth:physical' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "width:seperation",
"description": "Layer 'Barriers' shows and asks freeform values for key 'width:seperation' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "width:opening",
"description": "Layer 'Barriers' shows and asks freeform values for key 'width:opening' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "overlap",
"description": "Layer 'Barriers' shows and asks freeform values for key 'overlap' (in the MapComplete.osm.be theme 'Bicycle infrastructure')"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Crossings showing features with this tag",
"value": "traffic_signals"
},
{
"key": "highway",
"description": "The MapComplete theme Bicycle infrastructure has a layer Crossings showing features with this tag",
"value": "crossing"
},
{
"key": "crossing",
"description": "Layer 'Crossings' shows crossing=uncontrolled with a fixed text, namely 'Crossing, without traffic lights' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "uncontrolled"
},
{
"key": "crossing",
"description": "Layer 'Crossings' shows crossing=traffic_signals with a fixed text, namely 'Crossing with traffic signals' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "traffic_signals"
},
{
"key": "crossing",
"description": "Layer 'Crossings' shows crossing=zebra with a fixed text, namely 'Zebra crossing' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "zebra"
},
{
"key": "bicycle",
"description": "Layer 'Crossings' shows bicycle=yes with a fixed text, namely 'A cyclist can use this crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "bicycle",
"description": "Layer 'Crossings' shows bicycle=no with a fixed text, namely 'A cyclist can not use this crossing' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "crossing:island",
"description": "Layer 'Crossings' shows crossing:island=yes with a fixed text, namely 'This crossing has an island in the middle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "crossing:island",
"description": "Layer 'Crossings' shows crossing:island=no with a fixed text, namely 'This crossing does not have an island in the middle' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "tactile_paving",
"description": "Layer 'Crossings' shows tactile_paving=yes with a fixed text, namely 'This crossing has tactile paving' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "tactile_paving",
"description": "Layer 'Crossings' shows tactile_paving=no with a fixed text, namely 'This crossing does not have tactile paving' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "tactile_paving",
"description": "Layer 'Crossings' shows tactile_paving=incorrect with a fixed text, namely 'This crossing has tactile paving, but is not correct' (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "incorrect"
},
{
"key": "button_operated",
"description": "Layer 'Crossings' shows button_operated=yes with a fixed text, namely 'This traffic light has a button to request green light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "button_operated",
"description": "Layer 'Crossings' shows button_operated=no with a fixed text, namely 'This traffic light does not have a button to request green light' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "red_turn:right:bicycle",
"description": "Layer 'Crossings' shows red_turn:right:bicycle=yes with a fixed text, namely 'A cyclist can turn right if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B22.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "red_turn:right:bicycle",
"description": "Layer 'Crossings' shows red_turn:right:bicycle=yes with a fixed text, namely 'A cyclist can turn right if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "red_turn:right:bicycle",
"description": "Layer 'Crossings' shows red_turn:right:bicycle=no with a fixed text, namely 'A cyclist can not turn right if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
},
{
"key": "red_turn:straight:bicycle",
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=yes with a fixed text, namely 'A cyclist can go straight on if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B23.svg' style='height: 3em'>' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "red_turn:straight:bicycle",
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=yes with a fixed text, namely 'A cyclist can go straight on if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "yes"
},
{
"key": "red_turn:straight:bicycle",
"description": "Layer 'Crossings' shows red_turn:straight:bicycle=no with a fixed text, namely 'A cyclist can not go straight on if the light is red' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Bicycle infrastructure')",
"value": "no"
}
]
}

View file

@ -0,0 +1,264 @@
{
"data_format": 1,
"project": {
"name": "MapComplete Cyclestreets",
"description": "A map of cyclestreets",
"project_url": "https://mapcomplete.osm.be/cyclestreets",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/themes/cyclestreets/F111.svg",
"contact_name": "Pieter Vander Vennet, MapComplete",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "cyclestreet",
"description": "The MapComplete theme Cyclestreets has a layer Cyclestreets showing features with this tag",
"value": "yes"
},
{
"key": "image",
"description": "The layer 'Cyclestreets allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "mapillary",
"description": "The layer 'Cyclestreets allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikidata",
"description": "The layer 'Cyclestreets allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikipedia",
"description": "The layer 'Cyclestreets allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "cyclestreet",
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "maxspeed",
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "30"
},
{
"key": "overtaking:motor_vehicle",
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "no"
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "cyclestreet",
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'Cyclestreets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "cyclestreet",
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "overtaking:motor_vehicle",
"description": "Layer 'Cyclestreets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
"value": ""
},
{
"key": "cyclestreet:start_date",
"description": "Layer 'Cyclestreets' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
},
{
"key": "proposed:cyclestreet",
"description": "The MapComplete theme Cyclestreets has a layer Future cyclestreet showing features with this tag",
"value": "yes"
},
{
"key": "image",
"description": "The layer 'Future cyclestreet allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "mapillary",
"description": "The layer 'Future cyclestreet allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikidata",
"description": "The layer 'Future cyclestreet allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikipedia",
"description": "The layer 'Future cyclestreet allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "cyclestreet",
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "maxspeed",
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "30"
},
{
"key": "overtaking:motor_vehicle",
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "no"
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "cyclestreet",
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'Future cyclestreet' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "cyclestreet",
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "overtaking:motor_vehicle",
"description": "Layer 'Future cyclestreet' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
"value": ""
},
{
"key": "cyclestreet:start_date",
"description": "Layer 'Future cyclestreet' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
},
{
"key": "highway",
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
"value": "residential"
},
{
"key": "highway",
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
"value": "tertiary"
},
{
"key": "highway",
"description": "The MapComplete theme Cyclestreets has a layer All streets showing features with this tag",
"value": "unclassified"
},
{
"key": "image",
"description": "The layer 'All streets allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "mapillary",
"description": "The layer 'All streets allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikidata",
"description": "The layer 'All streets allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikipedia",
"description": "The layer 'All streets allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "maxspeed",
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "30"
},
{
"key": "overtaking:motor_vehicle",
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "no"
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=yes&maxspeed=30&overtaking:motor_vehicle=no&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet (and has a speed limit of 30 km/h)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=yes&proposed:cyclestreet= with a fixed text, namely 'This street is a cyclestreet' (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=yes with a fixed text, namely 'This street will become a cyclstreet soon' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets')",
"value": "yes"
},
{
"key": "cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key cyclestreet.",
"value": ""
},
{
"key": "proposed:cyclestreet",
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key proposed:cyclestreet.",
"value": ""
},
{
"key": "overtaking:motor_vehicle",
"description": "Layer 'All streets' shows cyclestreet=&proposed:cyclestreet=&overtaking:motor_vehicle= with a fixed text, namely 'This street is not a cyclestreet' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclestreets') Picking this answer will delete the key overtaking:motor_vehicle.",
"value": ""
},
{
"key": "cyclestreet:start_date",
"description": "Layer 'All streets' shows and asks freeform values for key 'cyclestreet:start_date' (in the MapComplete.osm.be theme 'Cyclestreets')"
}
]
}

View file

@ -588,6 +588,25 @@
"description": "Layer 'Bike stations (repair, pump or both)' shows manometer=broken with a fixed text, namely 'There is manometer but it is broken' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "broken"
},
{
"key": "level",
"description": "Layer 'Bike stations (repair, pump or both)' shows and asks freeform values for key 'level' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"
},
{
"key": "location",
"description": "Layer 'Bike stations (repair, pump or both)' shows location=underground with a fixed text, namely 'Located underground' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "underground"
},
{
"key": "level",
"description": "Layer 'Bike stations (repair, pump or both)' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "0"
},
{
"key": "level",
"description": "Layer 'Bike stations (repair, pump or both)' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')",
"value": "1"
},
{
"key": "service:bicycle:cleaning:charge",
"description": "Layer 'Bike stations (repair, pump or both)' shows and asks freeform values for key 'service:bicycle:cleaning:charge' (in the MapComplete.osm.be theme 'Cyclofix - an open map for cyclists')"

View file

@ -0,0 +1,55 @@
{
"data_format": 1,
"project": {
"name": "MapComplete OpenWindPowerMap",
"description": "A map for showing and editing wind turbines",
"project_url": "https://mapcomplete.osm.be/openwindpowermap",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/themes/openwindpowermap/wind_turbine.svg",
"contact_name": "Pieter Vander Vennet, Seppe Santens",
"contact_email": "pietervdvn@posteo.net"
},
"tags": [
{
"key": "generator:source",
"description": "The MapComplete theme OpenWindPowerMap has a layer wind turbine showing features with this tag",
"value": "wind"
},
{
"key": "generator:output:electricity",
"description": "Layer 'wind turbine' shows and asks freeform values for key 'generator:output:electricity' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
},
{
"key": "operator",
"description": "Layer 'wind turbine' shows and asks freeform values for key 'operator' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
},
{
"key": "height",
"description": "Layer 'wind turbine' shows and asks freeform values for key 'height' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
},
{
"key": "rotor:diameter",
"description": "Layer 'wind turbine' shows and asks freeform values for key 'rotor:diameter' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
},
{
"key": "start_date",
"description": "Layer 'wind turbine' shows and asks freeform values for key 'start_date' (in the MapComplete.osm.be theme 'OpenWindPowerMap')"
},
{
"key": "image",
"description": "The layer 'wind turbine allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "mapillary",
"description": "The layer 'wind turbine allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikidata",
"description": "The layer 'wind turbine allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
},
{
"key": "wikipedia",
"description": "The layer 'wind turbine allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary"
}
]
}

View file

@ -5,7 +5,7 @@
"description": "Surveillance cameras and other means of surveillance",
"project_url": "https://mapcomplete.osm.be/surveillance",
"doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/",
"icon_url": "https://mapcomplete.osm.be/assets/themes/surveillance_cameras/logo.svg",
"icon_url": "https://mapcomplete.osm.be/assets/themes/surveillance/logo.svg",
"contact_name": "Pieter Vander Vennet, ",
"contact_email": "pietervdvn@posteo.net"
},

View file

@ -29,6 +29,16 @@ To check if a key does _not_ equal a certain value, use `key!=value`. This is co
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.
Number 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 match this, e.g. in conditions for renderings.
These tags cannot be used to generate an answer nor can they be used to request data upstream from overpass.
Note that the value coming from OSM will first be stripped by removing all non-numeric characters. For example, `length=42 meter` will be interpreted as `length=42` and will thus match `length<=42` and `length>=42`.
In special circumstances (e.g. `surface_area=42 m2` or `length=100 feet`), this will result in erronous 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.
Regex equals
------------

View file

@ -20,158 +20,138 @@ the URL-parameters are stated in the part between the `?` and the `#`. There are
Finally, the URL-hash is the part after the `#`. It is `node/1234` in this case.
backend
---------
The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test' The default value is _osm_
test
------
If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org The default value is _false_
layout
--------
The layout to load into MapComplete The default value is __
userlayout
------------
If not 'false', a custom (non-official) theme is loaded. This custom layout can be done in multiple ways:
- The hash of the URL contains a base64-encoded .json-file containing the theme definition
- The hash of the URL contains a lz-compressed .json-file, as generated by the custom theme generator
- The parameter itself is an URL, in which case that URL will be downloaded. It should point to a .json of a theme The default value is _false_
layer-control-toggle
layer-control-toggle
----------------------
Whether or not the layer control is shown The default value is _false_
Whether or not the layer control is shown The default value is _false_
tab
tab
-----
The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >50 changesets) The default value is _0_
The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >50 changesets) The default value is _0_
z
z
---
The initial/current zoom level The default value is _14_
The initial/current zoom level The default value is _0_
lat
lat
-----
The initial/current latitude The default value is _51.2095_
The initial/current latitude The default value is _0_
lon
lon
-----
The initial/current longitude of the app The default value is _3.2228_
The initial/current longitude of the app The default value is _0_
fs-userbadge
fs-userbadge
--------------
Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode. The default value is _true_
Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode. The default value is _true_
fs-search
fs-search
-----------
Disables/Enables the search bar The default value is _true_
Disables/Enables the search bar The default value is _true_
fs-layers
fs-layers
-----------
Disables/Enables the layer control The default value is _true_
Disables/Enables the layer control The default value is _true_
fs-add-new
fs-add-new
------------
Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) The default value is _true_
Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place) The default value is _true_
fs-welcome-message
fs-welcome-message
--------------------
Disables/enables the help menu or welcome message The default value is _true_
Disables/enables the help menu or welcome message The default value is _true_
fs-iframe
fs-iframe
-----------
Disables/Enables the iframe-popup The default value is _false_
Disables/Enables the iframe-popup The default value is _false_
fs-more-quests
fs-more-quests
----------------
Disables/Enables the 'More Quests'-tab in the welcome message The default value is _true_
Disables/Enables the 'More Quests'-tab in the welcome message The default value is _true_
fs-share-screen
fs-share-screen
-----------------
Disables/Enables the 'Share-screen'-tab in the welcome message The default value is _true_
Disables/Enables the 'Share-screen'-tab in the welcome message The default value is _true_
fs-geolocation
fs-geolocation
----------------
Disables/Enables the geolocation button The default value is _true_
Disables/Enables the geolocation button The default value is _true_
fs-all-questions
fs-all-questions
------------------
Always show all questions The default value is _false_
Always show all questions The default value is _false_
fs-export
fs-export
-----------
If set, enables the 'download'-button to download everything as geojson The default value is _false_
If set, enables the 'download'-button to download everything as geojson The default value is _false_
fake-user
test
------
If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org The default value is _false_
fake-user
-----------
If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_
If true, 'dryrun' mode is activated and a fake user account is loaded The default value is _false_
debug
debug
-------
If true, shows some extra debugging help such as all the available tags on every object The default value is _false_
If true, shows some extra debugging help such as all the available tags on every object The default value is _false_
custom-css
backend
---------
The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test' The default value is _osm_
custom-css
------------
If specified, the custom css from the given link will be loaded additionaly The default value is __
If specified, the custom css from the given link will be loaded additionaly The default value is __
background
background
------------
The id of the background layer to start with The default value is _osm_
The id of the background layer to start with The default value is _osm_
oauth_token
-------------
Used to complete the login No default value set
layer-<layer-id>
------------------

View file

@ -16,7 +16,7 @@ import {LocalStorageSource} from "./Logic/Web/LocalStorageSource";
import {Utils} from "./Utils";
import Svg from "./Svg";
import Link from "./UI/Base/Link";
import * as personal from "./assets/themes/personalLayout/personalLayout.json";
import * as personal from "./assets/themes/personal/personal.json"
import LayoutConfig from "./Customizations/JSON/LayoutConfig";
import * as L from "leaflet";
import Img from "./UI/Base/Img";
@ -41,8 +41,6 @@ import FeatureSource from "./Logic/FeatureSource/FeatureSource";
import AllKnownLayers from "./Customizations/AllKnownLayers";
import LayerConfig from "./Customizations/JSON/LayerConfig";
import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers";
import {SimpleMapScreenshoter} from "leaflet-simple-map-screenshoter";
import jsPDF from "jspdf";
import {TagsFilter} from "./Logic/Tags/TagsFilter";
export class InitUiElements {
@ -221,33 +219,9 @@ export class InitUiElements {
State.state.locationControl.ping();
});
// To download pdf of leaflet you need to turn it into and image first
// Then export that image as a pdf
// leaflet-simple-map-screenshoter: to make image
// jsPDF: to make pdf
const screenshot = new MapControlButton(
new CenterFlexedElement(
Img.AsImageElement(Svg.bug, "", "width:1.25rem;height:1.25rem")
)
).onClick(() => {
const screenshotter = new SimpleMapScreenshoter();
console.log("Debug - Screenshot");
screenshotter.addTo(State.state.leafletMap.data);
let doc = new jsPDF();
screenshotter.takeScreen("image").then((image) => {
// TO DO: scale image on pdf to its original size
doc.addImage(image, "PNG", 0, 0, screen.width / 10, screen.height / 10);
doc.setDisplayMode("fullheight");
doc.save("Screenshot");
});
//screenshotter.remove();
// The line below is for downloading the png
//screenshotter.takeScreen().then(blob => Utils.offerContentsAsDownloadableFile(blob, "Screenshot.png"));
});
new Combine(
[plus, min, geolocationButton, screenshot].map((el) =>
[plus, min, geolocationButton].map((el) =>
el.SetClass("m-0.5 md:m-1")
)
)

View file

@ -26,7 +26,6 @@ export default class GeoLocationHandler extends VariableUiElement {
* @private
*/
private readonly _permission: UIEventSource<string>;
/***
* The marker on the map, in order to update it
* @private
@ -46,15 +45,11 @@ export default class GeoLocationHandler extends VariableUiElement {
* @private
*/
private readonly _leafletMap: UIEventSource<L.Map>;
/**
* The date when the user requested the geolocation. If we have a location, it'll autozoom to it the first 30 secs
* @private
*/
private _lastUserRequest: Date;
/**
* A small flag on localstorage. If the user previously granted the geolocation, it will be set.
* On firefox, the permissions api is broken (probably fingerprint resistiance) and "granted + don't ask again" doesn't stick between sessions.
@ -79,6 +74,7 @@ export default class GeoLocationHandler extends VariableUiElement {
);
const isActive = new UIEventSource<boolean>(false);
const isLocked = new UIEventSource<boolean>(false);
super(
hasLocation.map(
(hasLocationData) => {
@ -97,7 +93,6 @@ export default class GeoLocationHandler extends VariableUiElement {
return new CenterFlexedElement(
Img.AsImageElement(icon, "", "width:1.25rem;height:1.25rem")
);
},
[isActive, isLocked]
)
@ -133,7 +128,6 @@ export default class GeoLocationHandler extends VariableUiElement {
});
this.init(false);
this._currentGPSLocation.addCallback((location) => {
self._previousLocationGrant.setData("granted");
@ -173,10 +167,12 @@ export default class GeoLocationHandler extends VariableUiElement {
private init(askPermission: boolean) {
const self = this;
if (self._isActive.data) {
self.MoveToCurrentLoction(16);
return;
}
try {
navigator?.permissions
?.query({name: "geolocation"})
@ -193,6 +189,7 @@ export default class GeoLocationHandler extends VariableUiElement {
} catch (e) {
console.error(e);
}
if (askPermission) {
self.StartGeolocating(true);
} else if (this._previousLocationGrant.data === "granted") {
@ -201,7 +198,7 @@ export default class GeoLocationHandler extends VariableUiElement {
}
}
private MoveToCurrentLoction(targetZoom = 16) {
private MoveToCurrentLoction(targetZoom?: number) {
const location = this._currentGPSLocation.data;
this._lastUserRequest = undefined;
@ -256,6 +253,7 @@ export default class GeoLocationHandler extends VariableUiElement {
return;
}
self._isActive.setData(true);
navigator.geolocation.watchPosition(
function (position) {
self._currentGPSLocation.setData({
@ -265,6 +263,9 @@ export default class GeoLocationHandler extends VariableUiElement {
},
function () {
console.warn("Could not get location with navigator.geolocation");
},
{
enableHighAccuracy: true
}
);
}

View file

@ -6,6 +6,8 @@ import {Utils} from "../Utils";
import BaseUIElement from "../UI/BaseUIElement";
import List from "../UI/Base/List";
import Title from "../UI/Base/Title";
import {UIEventSourceTools} from "./UIEventSource";
import AspectedRouting from "./Osm/aspectedRouting";
export class ExtraFunction {
@ -38,12 +40,14 @@ export class ExtraFunction {
]),
"Some advanced functions are available on **feat** as well:"
]).SetClass("flex-col").AsMarkdown();
private static readonly OverlapFunc = new ExtraFunction(
"overlapWith",
"Gives a list of features from the specified layer which this feature (partly) overlaps with. If the current feature is a point, all features that embed the point 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",
["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"],
{
name: "overlapWith",
doc: "Gives a list of features from the specified layer which this feature (partly) overlaps with. If the current feature is a point, all features that embed the point 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",
args: ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"]
},
(params, feat) => {
return (...layerIds: string[]) => {
const result = []
@ -62,9 +66,11 @@ export class ExtraFunction {
}
)
private static readonly DistanceToFunc = new ExtraFunction(
"distanceTo",
"Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of coordinates, a geojson feature or the ID of an object",
["longitude", "latitude"],
{
name: "distanceTo",
doc: "Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of coordinates, a geojson feature or the ID of an object",
args: ["longitude", "latitude"]
},
(featuresPerLayer, feature) => {
return (arg0, lat) => {
if (typeof arg0 === "number") {
@ -88,9 +94,11 @@ export class ExtraFunction {
)
private static readonly ClosestObjectFunc = new ExtraFunction(
"closest",
"Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered.",
["list of features"],
{
name: "closest",
doc: "Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered.",
args: ["list of features"]
},
(params, feature) => {
return (features) => {
if (typeof features === "string") {
@ -139,28 +147,56 @@ export class ExtraFunction {
private static readonly Memberships = new ExtraFunction(
"memberships",
"Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. " +
"\n\n" +
"For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`",
[],
{
name: "memberships",
doc: "Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. " +
"\n\n" +
"For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`",
args: []
},
(params, _) => {
return () => params.relations ?? [];
}
)
private static readonly allFuncs: ExtraFunction[] = [ExtraFunction.DistanceToFunc, ExtraFunction.OverlapFunc, ExtraFunction.ClosestObjectFunc, ExtraFunction.Memberships];
private static readonly AspectedRouting = new ExtraFunction(
{
name: "score",
doc: "Given the path of an aspected routing json file, will calculate the score. This score is wrapped in a UIEventSource, so for further calculations, use `.map(score => ...)`" +
"\n\n" +
"For example: `_comfort_score=feat.score('https://raw.githubusercontent.com/pietervdvn/AspectedRouting/master/Examples/bicycle/aspects/bicycle.comfort.json')`",
args: ["path"]
},
(_, feature) => {
return (path) => {
return UIEventSourceTools.downloadJsonCached(path).map(config => {
if (config === undefined) {
return
}
return new AspectedRouting(config).evaluate(feature.properties)
})
}
}
)
private static readonly allFuncs: ExtraFunction[] = [
ExtraFunction.DistanceToFunc,
ExtraFunction.OverlapFunc,
ExtraFunction.ClosestObjectFunc,
ExtraFunction.Memberships,
ExtraFunction.AspectedRouting
];
private readonly _name: string;
private readonly _args: string[];
private readonly _doc: string;
private readonly _f: (params: { featuresPerLayer: Map<string, any[]>, relations: { role: string, relation: Relation }[] }, feat: any) => any;
constructor(name: string, doc: string, args: string[], f: ((params: { featuresPerLayer: Map<string, any[]>, relations: { role: string, relation: Relation }[] }, feat: any) => any)) {
this._name = name;
this._doc = doc;
this._args = args;
constructor(options: { name: string, doc: string, args: string[] },
f: ((params: { featuresPerLayer: Map<string, any[]>, relations: { role: string, relation: Relation }[] }, feat: any) => any)) {
this._name = options.name;
this._doc = options.doc;
this._args = options.args;
this._f = f;
}
public static FullPatchFeature(featuresPerLayer: Map<string, any[]>, relations: { role: string, relation: Relation }[], feature) {
@ -186,7 +222,6 @@ export class ExtraFunction {
}
public PatchFeature(featuresPerLayer: Map<string, any[]>, relations: { role: string, relation: Relation }[], feature: any) {
feature[this._name] = this._f({featuresPerLayer: featuresPerLayer, relations: relations}, feature);
feature[this._name] = this._f({featuresPerLayer: featuresPerLayer, relations: relations}, feature)
}
}

View file

@ -276,14 +276,61 @@ export class GeoOperations {
}
return undefined;
}
/**
* Generates the closest point on a way from a given point
* @param way The road on which you want to find a point
* @param point Point defined as [lon, lat]
*/
public static nearestPoint(way, point: [number, number]){
public static nearestPoint(way, point: [number, number]) {
return turf.nearestPointOnLine(way, point, {units: "kilometers"});
}
public static toCSV(features: any[]): string {
const headerValuesSeen = new Set<string>();
const headerValuesOrdered: string[] = []
function addH(key) {
if (!headerValuesSeen.has(key)) {
headerValuesSeen.add(key)
headerValuesOrdered.push(key)
}
}
addH("_lat")
addH("_lon")
const lines: string[] = []
for (const feature of features) {
const properties = feature.properties;
for (const key in properties) {
if (!properties.hasOwnProperty(key)) {
continue;
}
addH(key)
}
}
headerValuesOrdered.sort()
for (const feature of features) {
const properties = feature.properties;
let line = ""
for (const key of headerValuesOrdered) {
const value = properties[key]
if (value === undefined) {
line += ","
} else {
line += JSON.stringify(value)+","
}
}
lines.push(line)
}
return headerValuesOrdered.map(v => JSON.stringify(v)).join(",") + "\n" + lines.join("\n")
}
}

View file

@ -27,8 +27,8 @@ export default class MetaTagging {
relations: Map<string, { role: string, relation: Relation }[]>,
layers: LayerConfig[],
includeDates = true) {
if(features === undefined || features.length === 0){
if (features === undefined || features.length === 0) {
return;
}
@ -79,14 +79,10 @@ export default class MetaTagging {
}
}
})
}
@ -115,6 +111,17 @@ export default class MetaTagging {
const f = (featuresPerLayer, feature: any) => {
try {
let result = func(feature);
if(result instanceof UIEventSource){
result.addCallbackAndRunD(d => {
if (typeof d !== "string") {
// Make sure it is a string!
d = JSON.stringify(d);
}
feature.properties[key] = d;
})
result = result.data
}
if (result === undefined || result === "") {
return;
}
@ -124,11 +131,11 @@ export default class MetaTagging {
}
feature.properties[key] = result;
} catch (e) {
if(MetaTagging. errorPrintCount < MetaTagging.stopErrorOutputAt){
if (MetaTagging.errorPrintCount < MetaTagging.stopErrorOutputAt) {
console.warn("Could not calculate a calculated tag defined by " + code + " due to " + e + ". This is code defined in the theme. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", e)
MetaTagging. errorPrintCount ++;
if(MetaTagging. errorPrintCount == MetaTagging.stopErrorOutputAt){
console.error("Got ",MetaTagging.stopErrorOutputAt," errors calculating this metatagging - stopping output now")
MetaTagging.errorPrintCount++;
if (MetaTagging.errorPrintCount == MetaTagging.stopErrorOutputAt) {
console.error("Got ", MetaTagging.stopErrorOutputAt, " errors calculating this metatagging - stopping output now")
}
}
}

View file

@ -0,0 +1,194 @@
export default class AspectedRouting {
public readonly name: string
public readonly description: string
public readonly units: string
public readonly program: any
public constructor(program) {
this.name = program.name;
this.description = program.description;
this.units = program.unit
this.program = JSON.parse(JSON.stringify(program))
delete this.program.name
delete this.program.description
delete this.program.unit
}
public evaluate(properties){
return AspectedRouting.interpret(this.program, properties)
}
/**
* Interprets the given Aspected-routing program for the given properties
*/
public static interpret(program: any, properties: any) {
if (typeof program !== "object") {
return program;
}
let functionName /*: string*/ = undefined;
let functionArguments /*: any */ = undefined
let otherValues = {}
// @ts-ignore
Object.entries(program).forEach(tag => {
const [key, value] = tag;
if (key.startsWith("$")) {
functionName = key
functionArguments = value
} else {
otherValues[key] = value
}
}
)
if (functionName === undefined) {
return AspectedRouting.interpretAsDictionary(program, properties)
}
if (functionName === '$multiply') {
return AspectedRouting.multiplyScore(properties, functionArguments);
} else if (functionName === '$firstMatchOf') {
return AspectedRouting.getFirstMatchScore(properties, functionArguments);
} else if (functionName === '$min') {
return AspectedRouting.getMinValue(properties, functionArguments);
} else if (functionName === '$max') {
return AspectedRouting.getMaxValue(properties, functionArguments);
} else if (functionName === '$default') {
return AspectedRouting.defaultV(functionArguments, otherValues, properties)
} else {
console.error(`Error: Program ${functionName} is not implemented yet. ${JSON.stringify(program)}`);
}
}
/**
* Given a 'program' without function invocation, interprets it as a dictionary
*
* E.g., given the program
*
* {
* highway: {
* residential: 30,
* living_street: 20
* },
* surface: {
* sett : 0.9
* }
*
* }
*
* in combination with the tags {highway: residential},
*
* the result should be [30, undefined];
*
* For the tags {highway: residential, surface: sett} we should get [30, 0.9]
*
*
* @param program
* @param tags
* @return {(undefined|*)[]}
*/
private static interpretAsDictionary(program, tags) {
// @ts-ignore
return Object.entries(tags).map(tag => {
const [key, value] = tag;
const propertyValue = program[key]
if (propertyValue === undefined) {
return undefined
}
if (typeof propertyValue !== "object") {
return propertyValue
}
// @ts-ignore
return propertyValue[value]
});
}
private static defaultV(subProgram, otherArgs, tags) {
// @ts-ignore
const normalProgram = Object.entries(otherArgs)[0][1]
const value = AspectedRouting.interpret(normalProgram, tags)
if (value !== undefined) {
return value;
}
return AspectedRouting.interpret(subProgram, tags)
}
/**
* Multiplies the default score with the proper values
* @param tags {object} the active tags to check against
* @param subprograms which should generate a list of values
* @returns score after multiplication
*/
private static multiplyScore(tags, subprograms) {
let number = 1
let subResults: any[]
if (subprograms.length !== undefined) {
subResults = AspectedRouting.concatMap(subprograms, subprogram => AspectedRouting.interpret(subprogram, tags))
} else {
subResults = AspectedRouting.interpret(subprograms, tags)
}
subResults.filter(r => r !== undefined).forEach(r => number *= parseFloat(r))
return number.toFixed(2);
}
private static getFirstMatchScore(tags, order: any) {
/*Order should be a list of arguments after evaluation*/
order = <string[]>AspectedRouting.interpret(order, tags)
for (let key of order) {
// @ts-ignore
for (let entry of Object.entries(JSON.parse(tags))) {
const [tagKey, value] = entry;
if (key === tagKey) {
// We have a match... let's evaluate the subprogram
const evaluated = AspectedRouting.interpret(value, tags)
if (evaluated !== undefined) {
return evaluated;
}
}
}
}
// Not a single match found...
return undefined
}
private static getMinValue(tags, subprogram) {
const minArr = subprogram.map(part => {
if (typeof (part) === 'object') {
const calculatedValue = this.interpret(part, tags)
return parseFloat(calculatedValue)
} else {
return parseFloat(part);
}
}).filter(v => !isNaN(v));
return Math.min(...minArr);
}
private static getMaxValue(tags, subprogram) {
const maxArr = subprogram.map(part => {
if (typeof (part) === 'object') {
return parseFloat(AspectedRouting.interpret(part, tags))
} else {
return parseFloat(part);
}
}).filter(v => !isNaN(v));
return Math.max(...maxArr);
}
private static concatMap(list, f): any[] {
const result = []
list = list.map(f)
for (const elem of list) {
if (elem.length !== undefined) {
// This is a list
result.push(...elem)
} else {
result.push(elem)
}
}
return result;
}
}

View file

@ -0,0 +1,42 @@
import {TagsFilter} from "./TagsFilter";
export default class ComparingTag implements TagsFilter {
private readonly _key: string;
private readonly _predicate: (value: string) => boolean;
private readonly _representation: string;
constructor(key: string, predicate : (value:string | undefined) => boolean, representation: string = "") {
this._key = key;
this._predicate = predicate;
this._representation = representation;
}
asChange(properties: any): { k: string; v: string }[] {
throw "A comparable tag can not be used to be uploaded to OSM"
}
asHumanString(linkToWiki: boolean, shorten: boolean, properties: any) {
return this._key+this._representation
}
asOverpass(): string[] {
throw "A comparable tag can not be used as overpass filter"
}
isEquivalent(other: TagsFilter): boolean {
return other === this;
}
isUsableAsAnswer(): boolean {
return false;
}
matchesProperties(properties: any): boolean {
return this._predicate(properties[this._key]);
}
usedKeys(): string[] {
return [this._key];
}
}

View file

@ -1,7 +1,6 @@
import {Utils} from "../../Utils";
import {RegexTag} from "./RegexTag";
import {TagsFilter} from "./TagsFilter";
import {TagUtils} from "./TagUtils";
export class Tag extends TagsFilter {
public key: string
@ -46,11 +45,6 @@ export class Tag extends TagsFilter {
}
return [`["${this.key}"="${this.value}"]`];
}
substituteValues(tags: any) {
return new Tag(this.key, TagUtils.ApplyTemplate(this.value as string, tags));
}
asHumanString(linkToWiki?: boolean, shorten?: boolean) {
let v = this.value;
if (shorten) {

View file

@ -166,4 +166,21 @@ export class UIEventSource<T> {
}
})
}
}
export class UIEventSourceTools {
private static readonly _download_cache = new Map<string, UIEventSource<any>>()
public static downloadJsonCached(url: string): UIEventSource<any>{
const cached = UIEventSourceTools._download_cache.get(url)
if(cached !== undefined){
return cached;
}
const src = new UIEventSource<any>(undefined)
UIEventSourceTools._download_cache.set(url, src)
Utils.downloadJson(url).then(r => src.setData(r))
return src;
}
}

View file

@ -2,7 +2,7 @@ import { Utils } from "../Utils";
export default class Constants {
public static vNumber = "0.8.4-rc3";
public static vNumber = "0.8.4a";
// The user journey states thresholds when a new feature gets unlocked
public static userJourney = {

7
Svg.ts
View file

@ -44,6 +44,11 @@ export default class Svg {
public static back_svg() { return new Img(Svg.back, true);}
public static back_ui() { return new FixedUiElement(Svg.back_img);}
public static barrier = " <svg version=\"1.1\" viewBox=\"0 0 128 128\" xmlns=\"http://www.w3.org/2000/svg\"> <path class=\"st0\" d=\"m128 64a64 64 0 0 1-64 64 64 64 0 0 1-64-64 64 64 0 0 1 64-64 64 64 0 0 1 64 64\" fill=\"#529add\"/> <path d=\"m31.992 32.08v87.273a64 64 0 0 0 16 6.5293v-93.803z\" fill=\"#666\"/> <path d=\"m79.992 32.08v93.84a64 64 0 0 0 16-6.582v-87.258z\" fill=\"#666\"/> <path d=\"m23.992 44.08c-4.456 0-8.0429 3.587-8.0429 8.043v31.914c0 4.456 3.5869 8.043 8.0429 8.043h79.914c4.456 0 8.043-3.587 8.043-8.043v-31.914c0-4.456-3.587-8.043-8.043-8.043z\" fill-opacity=\".2\"/> <path d=\"m24.036 40.08h79.913c4.456 0 8.0433 3.5873 8.0433 8.0433v31.913c0 4.456-3.5873 8.0433-8.0433 8.0433h-79.913c-4.456 0-8.0433-3.5873-8.0433-8.0433v-31.913c0-4.456 3.5873-8.0433 8.0433-8.0433z\" fill=\"#fff\" style=\"paint-order:normal\"/> <path d=\"m23.992 40.08c-3.8167 0-6.9867 2.6476-7.7949 6.2129l28.746 41.787h14.143l-32.332-48zm16.619 0 32.332 48h14.143l-32.332-48zm28 0 32.332 48h3.0488c3.6926 0 6.7759-2.4795 7.7051-5.8691l-28.943-42.131zm28 0 15.381 22v-14c0-4.432-3.568-8-8-8zm-80.619 26v14c0 4.432 3.568 8 8 8h7.0938z\" fill=\"#dd2e44\" style=\"paint-order:normal\"/> <path d=\"m24.03 40.08h79.924c4.4531 0 8.038 3.5849 8.038 8.038v31.924c0 4.453-3.5849 8.038-8.038 8.038h-79.924c-4.4531 0-8.038-3.5849-8.038-8.038v-31.924c0-4.453 3.5849-8.038 8.038-8.038z\" fill=\"none\" stroke=\"#555\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" style=\"paint-order:stroke markers fill\"/> </svg> "
public static barrier_img = Img.AsImageElement(Svg.barrier)
public static barrier_svg() { return new Img(Svg.barrier, true);}
public static barrier_ui() { return new FixedUiElement(Svg.barrier_img);}
public static bug = "<svg height=\"1024\" width=\"733.886\" xmlns=\"http://www.w3.org/2000/svg\"> <path d=\"M243.621 156.53099999999995C190.747 213.312 205.34 304 205.34 304s53.968 64 160 64c106.031 0 160.031-64 160.031-64s14.375-89.469-37.375-146.312c32.375-18.031 51.438-44.094 43.562-61.812-8.938-19.969-48.375-21.75-88.25-3.969-14.812 6.594-27.438 14.969-37.25 23.875-12.438-2.25-25.625-3.781-40.72-3.781-14.061 0-26.561 1.344-38.344 3.25-9.656-8.75-22.062-16.875-36.531-23.344-39.875-17.719-79.375-15.938-88.25 3.969C194.465 113.21900000000005 212.497 138.562 243.621 156.53099999999995zM644.746 569.75c-8.25-1.75-16.125-2.75-23.75-3.5 0-2.125 0.375-4.125 0.375-6.312 0-33.594-4.75-65.654-12.438-96.125 16.438 1.406 37.375-2.375 58.562-11.779 39.875-17.781 65-48.375 56.125-68.219-8.875-19.969-48.375-21.75-88.25-3.969-18.625 8.312-33.812 19.469-44 30.906-7.75-18.25-16.5-35.781-26.812-51.719-30.188 25.156-87.312 62.719-167.062 71.062v321.781c0 0-0.25 32-32.031 32-31.75 0-32-32-32-32V430.219c-79.811-8.344-136.968-45.969-167.093-71.062-9.875 15.312-18.375 32-25.938 49.344-10.281-10.625-24.625-20.844-41.969-28.594-39.875-17.719-79.375-15.938-88.25 3.969-8.906 19.906 16.25 50.438 56.125 68.219 19.844 8.846 39.531 12.812 55.469 12.096-7.656 30.404-12.469 62.344-12.469 95.812 0 2.188 0.375 4.25 0.438 6.5-6.719 0.75-13.688 1.75-20.781 3.25-51.969 10.75-91.781 37.625-88.844 59.812 2.938 22.312 47.5 31.5 99.594 20.688 6.781-1.375 13.438-3.125 19.781-5.062C128.684 686 143.34 723.875 163.622 756.5c-12.031 6.062-24.531 15-36.031 26.625C95.715 815 82.779 853.75 98.715 869.688c15.938 15.937 54.656 3 86.531-28.812 9.344-9.375 16.844-19.25 22.656-29C251.434 854.5 305.965 880 365.465 880c60.343 0 115.781-26.25 159.531-69.938 5.875 10.312 13.75 20.812 23.625 30.688 31.812 31.875 70.625 44.812 86.562 28.875s3-54.625-28.875-86.5c-12.312-12.375-25.688-21.75-38.438-27.938 20.125-32.5 34.625-70.375 43.688-111.062 7.188 2.25 14.688 4.375 22.562 6.062 52.061 10.812 96.625 1.562 99.625-20.688C736.558 607.375 696.746 580.5 644.746 569.75z\"/> </svg>"
public static bug_img = Img.AsImageElement(Svg.bug)
public static bug_svg() { return new Img(Svg.bug, true);}
@ -389,4 +394,4 @@ export default class Svg {
public static wikipedia_svg() { return new Img(Svg.wikipedia, true);}
public static wikipedia_ui() { return new FixedUiElement(Svg.wikipedia_img);}
public static All = {"SocialImageForeground.svg": Svg.SocialImageForeground,"add.svg": Svg.add,"addSmall.svg": Svg.addSmall,"ampersand.svg": Svg.ampersand,"arrow-left-smooth.svg": Svg.arrow_left_smooth,"arrow-left-thin.svg": Svg.arrow_left_thin,"arrow-right-smooth.svg": Svg.arrow_right_smooth,"back.svg": Svg.back,"bug.svg": Svg.bug,"camera-plus.svg": Svg.camera_plus,"checkbox-empty.svg": Svg.checkbox_empty,"checkbox-filled.svg": Svg.checkbox_filled,"checkmark.svg": Svg.checkmark,"circle.svg": Svg.circle,"clock.svg": Svg.clock,"close.svg": Svg.close,"compass.svg": Svg.compass,"cross_bottom_right.svg": Svg.cross_bottom_right,"crosshair-blue-center.svg": Svg.crosshair_blue_center,"crosshair-blue.svg": Svg.crosshair_blue,"crosshair-empty.svg": Svg.crosshair_empty,"crosshair-locked.svg": Svg.crosshair_locked,"crosshair.svg": Svg.crosshair,"delete_icon.svg": Svg.delete_icon,"direction.svg": Svg.direction,"direction_gradient.svg": Svg.direction_gradient,"direction_masked.svg": Svg.direction_masked,"direction_outline.svg": Svg.direction_outline,"direction_stroke.svg": Svg.direction_stroke,"down.svg": Svg.down,"download.svg": Svg.download,"envelope.svg": Svg.envelope,"filter.svg": Svg.filter,"floppy.svg": Svg.floppy,"gear.svg": Svg.gear,"help.svg": Svg.help,"home.svg": Svg.home,"home_white_bg.svg": Svg.home_white_bg,"josm_logo.svg": Svg.josm_logo,"layers.svg": Svg.layers,"layersAdd.svg": Svg.layersAdd,"length-crosshair.svg": Svg.length_crosshair,"location.svg": Svg.location,"logo.svg": Svg.logo,"logout.svg": Svg.logout,"mapcomplete_logo.svg": Svg.mapcomplete_logo,"mapillary.svg": Svg.mapillary,"mapillary_black.svg": Svg.mapillary_black,"min-zoom.svg": Svg.min_zoom,"min.svg": Svg.min,"no_checkmark.svg": Svg.no_checkmark,"or.svg": Svg.or,"osm-copyright.svg": Svg.osm_copyright,"osm-logo-us.svg": Svg.osm_logo_us,"osm-logo.svg": Svg.osm_logo,"pencil.svg": Svg.pencil,"phone.svg": Svg.phone,"pin.svg": Svg.pin,"plus-zoom.svg": Svg.plus_zoom,"plus.svg": Svg.plus,"pop-out.svg": Svg.pop_out,"reload.svg": Svg.reload,"ring.svg": Svg.ring,"search.svg": Svg.search,"send_email.svg": Svg.send_email,"share.svg": Svg.share,"square.svg": Svg.square,"star.svg": Svg.star,"star_half.svg": Svg.star_half,"star_outline.svg": Svg.star_outline,"star_outline_half.svg": Svg.star_outline_half,"statistics.svg": Svg.statistics,"translate.svg": Svg.translate,"up.svg": Svg.up,"wikidata.svg": Svg.wikidata,"wikimedia-commons-white.svg": Svg.wikimedia_commons_white,"wikipedia.svg": Svg.wikipedia};}
public static All = {"SocialImageForeground.svg": Svg.SocialImageForeground,"add.svg": Svg.add,"addSmall.svg": Svg.addSmall,"ampersand.svg": Svg.ampersand,"arrow-left-smooth.svg": Svg.arrow_left_smooth,"arrow-left-thin.svg": Svg.arrow_left_thin,"arrow-right-smooth.svg": Svg.arrow_right_smooth,"back.svg": Svg.back,"barrier.svg": Svg.barrier,"bug.svg": Svg.bug,"camera-plus.svg": Svg.camera_plus,"checkbox-empty.svg": Svg.checkbox_empty,"checkbox-filled.svg": Svg.checkbox_filled,"checkmark.svg": Svg.checkmark,"circle.svg": Svg.circle,"clock.svg": Svg.clock,"close.svg": Svg.close,"compass.svg": Svg.compass,"cross_bottom_right.svg": Svg.cross_bottom_right,"crosshair-blue-center.svg": Svg.crosshair_blue_center,"crosshair-blue.svg": Svg.crosshair_blue,"crosshair-empty.svg": Svg.crosshair_empty,"crosshair-locked.svg": Svg.crosshair_locked,"crosshair.svg": Svg.crosshair,"delete_icon.svg": Svg.delete_icon,"direction.svg": Svg.direction,"direction_gradient.svg": Svg.direction_gradient,"direction_masked.svg": Svg.direction_masked,"direction_outline.svg": Svg.direction_outline,"direction_stroke.svg": Svg.direction_stroke,"down.svg": Svg.down,"download.svg": Svg.download,"envelope.svg": Svg.envelope,"filter.svg": Svg.filter,"floppy.svg": Svg.floppy,"gear.svg": Svg.gear,"help.svg": Svg.help,"home.svg": Svg.home,"home_white_bg.svg": Svg.home_white_bg,"josm_logo.svg": Svg.josm_logo,"layers.svg": Svg.layers,"layersAdd.svg": Svg.layersAdd,"length-crosshair.svg": Svg.length_crosshair,"location.svg": Svg.location,"logo.svg": Svg.logo,"logout.svg": Svg.logout,"mapcomplete_logo.svg": Svg.mapcomplete_logo,"mapillary.svg": Svg.mapillary,"mapillary_black.svg": Svg.mapillary_black,"min-zoom.svg": Svg.min_zoom,"min.svg": Svg.min,"no_checkmark.svg": Svg.no_checkmark,"or.svg": Svg.or,"osm-copyright.svg": Svg.osm_copyright,"osm-logo-us.svg": Svg.osm_logo_us,"osm-logo.svg": Svg.osm_logo,"pencil.svg": Svg.pencil,"phone.svg": Svg.phone,"pin.svg": Svg.pin,"plus-zoom.svg": Svg.plus_zoom,"plus.svg": Svg.plus,"pop-out.svg": Svg.pop_out,"reload.svg": Svg.reload,"ring.svg": Svg.ring,"search.svg": Svg.search,"send_email.svg": Svg.send_email,"share.svg": Svg.share,"square.svg": Svg.square,"star.svg": Svg.star,"star_half.svg": Svg.star_half,"star_outline.svg": Svg.star_outline,"star_outline_half.svg": Svg.star_outline_half,"statistics.svg": Svg.statistics,"translate.svg": Svg.translate,"up.svg": Svg.up,"wikidata.svg": Svg.wikidata,"wikimedia-commons-white.svg": Svg.wikimedia_commons_white,"wikipedia.svg": Svg.wikipedia};}

View file

@ -0,0 +1,55 @@
import {SubtleButton} from "../Base/SubtleButton";
import Svg from "../../Svg";
import Translations from "../i18n/Translations";
import State from "../../State";
import {FeatureSourceUtils} from "../../Logic/FeatureSource/FeatureSource";
import {Utils} from "../../Utils";
import Combine from "../Base/Combine";
import CheckBoxes from "../Input/Checkboxes";
import {GeoOperations} from "../../Logic/GeoOperations";
import Toggle from "../Input/Toggle";
import Title from "../Base/Title";
export class DownloadPanel extends Toggle {
constructor() {
const t = Translations.t.general.download
const somethingLoaded = State.state.featurePipeline.features.map(features => features.length > 0);
const includeMetaToggle = new CheckBoxes([t.includeMetaData.Clone()])
const metaisIncluded = includeMetaToggle.GetValue().map(selected => selected.length > 0)
const buttonGeoJson = new SubtleButton(Svg.floppy_ui(),
new Combine([t.downloadGeojson.Clone().SetClass("font-bold"),
t.downloadGeoJsonHelper.Clone()]).SetClass("flex flex-col"))
.onClick(() => {
const geojson = FeatureSourceUtils.extractGeoJson(State.state.featurePipeline, {metadata: metaisIncluded.data})
const name = State.state.layoutToUse.data.id;
Utils.offerContentsAsDownloadableFile(JSON.stringify(geojson),
`MapComplete_${name}_export_${new Date().toISOString().substr(0, 19)}.geojson`, {
mimetype: "application/vnd.geo+json"
});
})
const buttonCSV = new SubtleButton(Svg.floppy_ui(), new Combine(
[t.downloadCSV.Clone().SetClass("font-bold"),
t.downloadCSVHelper.Clone()]).SetClass("flex flex-col"))
.onClick(() => {
const geojson = FeatureSourceUtils.extractGeoJson(State.state.featurePipeline, {metadata: metaisIncluded.data})
const csv = GeoOperations.toCSV(geojson.features)
Utils.offerContentsAsDownloadableFile(csv,
`MapComplete_${name}_export_${new Date().toISOString().substr(0, 19)}.csv`, {
mimetype: "text/csv"
});
})
const downloadButtons = new Combine(
[new Title(t.title), buttonGeoJson, buttonCSV, includeMetaToggle, t.licenseInfo.Clone().SetClass("link-underline")])
.SetClass("w-full flex flex-col border-4 border-gray-300 rounded-3xl p-4")
super(
downloadButtons,
t.noDataLoaded.Clone(),
somethingLoaded)
}
}

View file

@ -1,21 +0,0 @@
import {SubtleButton} from "../Base/SubtleButton";
import Svg from "../../Svg";
import Translations from "../i18n/Translations";
import State from "../../State";
import {FeatureSourceUtils} from "../../Logic/FeatureSource/FeatureSource";
import {Utils} from "../../Utils";
import Combine from "../Base/Combine";
export class ExportDataButton extends Combine {
constructor() {
const t = Translations.t.general.download
const button = new SubtleButton(Svg.floppy_ui(), t.downloadGeojson.Clone().SetClass("font-bold"))
.onClick(() => {
const geojson = FeatureSourceUtils.extractGeoJson(State.state.featurePipeline)
const name = State.state.layoutToUse.data.id;
Utils.offerContentsAsDownloadableFile(JSON.stringify(geojson), `MapComplete_${name}_export_${new Date().toISOString().substr(0,19)}.geojson`);
})
super([button, t.licenseInfo.Clone().SetClass("link-underline")])
}
}

View file

@ -1,6 +1,6 @@
import State from "../../State";
import ThemeIntroductionPanel from "./ThemeIntroductionPanel";
import * as personal from "../../assets/themes/personalLayout/personalLayout.json";
import * as personal from "../../assets/themes/personal/personal.json";
import PersonalLayersPanel from "./PersonalLayersPanel";
import Svg from "../../Svg";
import Translations from "../i18n/Translations";

View file

@ -3,51 +3,55 @@ import BackgroundSelector from "./BackgroundSelector";
import Combine from "../Base/Combine";
import ScrollableFullScreen from "../Base/ScrollableFullScreen";
import Translations from "../i18n/Translations";
import { UIEventSource } from "../../Logic/UIEventSource";
import {UIEventSource} from "../../Logic/UIEventSource";
import BaseUIElement from "../BaseUIElement";
import Toggle from "../Input/Toggle";
import { ExportDataButton } from "./ExportDataButton";
import FilterView from "./FilterView";
import {DownloadPanel} from "./DownloadPanel";
export default class LayerControlPanel extends ScrollableFullScreen {
constructor(isShown: UIEventSource<boolean>) {
super(
LayerControlPanel.GenTitle,
LayerControlPanel.GeneratePanel,
"layers",
isShown
);
}
private static GenTitle(): BaseUIElement {
return Translations.t.general.layerSelection.title
.Clone()
.SetClass("text-2xl break-words font-bold p-2");
}
private static GeneratePanel(): BaseUIElement {
const elements: BaseUIElement[] = [];
if (State.state.layoutToUse.data.enableBackgroundLayerSelection) {
const backgroundSelector = new BackgroundSelector();
backgroundSelector.SetStyle("margin:1em");
backgroundSelector.onClick(() => {});
elements.push(backgroundSelector);
constructor(isShown: UIEventSource<boolean>) {
super(LayerControlPanel.GenTitle, LayerControlPanel.GeneratePanel, "layers", isShown);
}
elements.push(
new Toggle(
new FilterView(State.state.filteredLayers),
undefined,
State.state.filteredLayers.map(
(layers) => layers.length > 1 || layers[0].layerDef.filters.length > 0
)
)
);
private static GenTitle(): BaseUIElement {
return Translations.t.general.layerSelection.title
.Clone()
.SetClass("text-2xl break-words font-bold p-2");
}
private static GeneratePanel(): BaseUIElement {
const elements: BaseUIElement[] = [];
if (State.state.layoutToUse.data.enableBackgroundLayerSelection) {
const backgroundSelector = new BackgroundSelector();
backgroundSelector.SetStyle("margin:1em");
backgroundSelector.onClick(() => {
});
elements.push(backgroundSelector)
}
elements.push(
new Toggle(
new FilterView(State.state.filteredLayers),
undefined,
State.state.filteredLayers.map(
(layers) => layers.length > 1 || layers[0].layerDef.filters.length > 0
)
)
);
elements.push(new Toggle(
new DownloadPanel(),
undefined,
State.state.featureSwitchEnableExport
))
elements.push(
new Toggle(
new ExportDataButton(),
new DownloadPanel(),
undefined,
State.state.featureSwitchEnableExport
)

View file

@ -6,7 +6,7 @@ import State from "../../State";
import Combine from "../Base/Combine";
import {SubtleButton} from "../Base/SubtleButton";
import Translations from "../i18n/Translations";
import * as personal from "../../assets/themes/personalLayout/personalLayout.json"
import * as personal from "../../assets/themes/personal/personal.json"
import Constants from "../../Models/Constants";
import LanguagePicker from "../LanguagePicker";
import IndexText from "./IndexText";

View file

@ -358,14 +358,13 @@ export class Utils {
/**
* Triggers a 'download file' popup which will download the contents
* @param contents
* @param fileName
*/
public static offerContentsAsDownloadableFile(contents: string | Blob, fileName: string = "download.txt") {
public static offerContentsAsDownloadableFile(contents: string | Blob, fileName: string = "download.txt",
options?: { mimetype: string }) {
const element = document.createElement("a");
let file;
if (typeof (contents) === "string") {
file = new Blob([contents], {type: 'text/plain'});
file = new Blob([contents], {type: options?.mimetype ?? 'text/plain'});
} else {
file = contents;
}

View file

@ -518,7 +518,6 @@
]
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "circle:#FE6F32;./assets/layers/bench/bench.svg"
},

View file

@ -126,7 +126,6 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/benches/bench_public_transport.svg"
},

View file

@ -210,7 +210,6 @@
},
"description"
],
"hideUnderlayingFeaturesMinPercentage": 1,
"presets": [
{
"title": {

View file

@ -293,7 +293,6 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/layers/bike_cafe/bike_cafe.svg"
},

View file

@ -63,7 +63,6 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/layers/bike_monitoring_station/monitoring_station.svg"
},

View file

@ -601,7 +601,6 @@
]
}
],
"hideUnderlayingFeaturesMinPercentage": 1,
"presets": [
{
"title": {

View file

@ -56,7 +56,6 @@
"phone",
"opening_hours"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/layers/bike_themed_object/other_services.svg"
},

View file

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2816"
version="1.1"
inkscape:version="0.47 r22583"
width="95.81649"
height="83.729599"
xml:space="preserve"
sodipodi:docname="Belgian road sign B22.svg"><metadata
id="metadata2822"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs2820"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
id="perspective2824" /><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2844"><path
d="m 2562,672.668 3,0 0,-108 -3,0 0,108 z"
id="path2846" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2854"><path
d="m 731,6133.67 780,0 0,-679 -780,0 0,679 z"
id="path2856" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2892"><path
d="m 731,4841.67 780,0 0,-680 -780,0 0,680 z"
id="path2894" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3090"><path
d="m 731,2387.67 779,0 0,-684 -779,0"
id="path3092" /></clipPath><inkscape:perspective
id="perspective3129"
inkscape:persp3d-origin="47.908001 : 27.909665 : 1"
inkscape:vp_z="95.816002 : 41.864498 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 41.864498 : 1"
sodipodi:type="inkscape:persp3d" /><inkscape:perspective
id="perspective4211"
inkscape:persp3d-origin="39.790001 : 26.495 : 1"
inkscape:vp_z="79.580002 : 39.7425 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 39.7425 : 1"
sodipodi:type="inkscape:persp3d" /></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="838"
id="namedview2818"
showgrid="false"
inkscape:zoom="2.140677"
inkscape:cx="47.742493"
inkscape:cy="42.339324"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g2826" /><g
id="g2826"
inkscape:groupmode="layer"
inkscape:label="Belgio"
transform="matrix(1.25,0,0,-1.25,346.87909,480.97823)"><g
id="g2840"
transform="matrix(0.09762902,0,0,0.09762902,-202.75728,115.54083)"><g
clip-path="url(#clipPath2844)"
id="g2842"><g
transform="scale(8.33333,8.33333)"
id="g2848" /></g></g>
<path
id="path3115"
d="m -242.61678,319.6165 c 0.704,-1.1168 1.9512,-1.8176 3.3904,-1.8176 1.3752,0 1.984,0.6704 2.7192,1.6896 l 34.8976,58.5576 c 1.216,1.5944 0.9264,4.1144 -0.544,5.5816 -0.832,0.8288 -1.792,1.212 -2.8792,1.148 l -69.1224,-0.032 c -0.7992,-0.1272 -1.5672,-0.5104 -2.1752,-1.116 -1.1832,-1.212 -1.4712,-2.9656 -0.864,-4.4656 l 34.5776,-59.5456 z"
style="fill:#ed1c24" /><path
id="path3117"
d="m -242.61678,319.6165 c 0.704,-1.1168 1.9512,-1.8176 3.3904,-1.8176 1.3752,0 1.984,0.6704 2.7192,1.6896 l 34.8976,58.5576 c 1.216,1.5944 0.9264,4.1144 -0.544,5.5816 -0.832,0.8296 -1.792,1.212 -2.8792,1.148 l -69.1224,-0.032 c -0.7992,-0.1272 -1.5672,-0.5104 -2.1752,-1.116 -1.1832,-1.212 -1.4712,-2.9656 -0.864,-4.4656 l 34.5776,-59.5456 z"
stroke-miterlimit="3.863"
style="fill:none;stroke:#ed1c24;stroke-width:0;stroke-miterlimit:3.86299992" /><polygon
id="polygon3119"
points="47.926,68.261 81.192,10.892 14.66,10.892 "
clip-rule="evenodd"
transform="matrix(0.8,0,0,-0.8,-277.50318,384.7821)"
style="fill:#ffffff;fill-rule:evenodd" /><polygon
id="polygon3121"
points="47.926,68.261 81.192,10.892 14.66,10.892 "
stroke-miterlimit="3.863"
transform="matrix(0.8,0,0,-0.8,-277.50318,384.7821)"
style="fill:none;stroke:#ed1c24;stroke-width:0;stroke-miterlimit:3.86299992" /><path
style="fill:#ffed45;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.31999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="m -231.26354,357.69838 c -1.34367,0.12281 -2.52121,0.69462 -3.46633,1.68322 -0.998,1.04394 -1.53671,2.27606 -1.60888,3.67984 -0.0339,0.65964 0.11226,1.24682 0.51395,2.0645 0.57894,1.1785 1.43752,2.19077 2.29437,2.70506 0.10668,0.0641 0.31479,0.15627 0.46244,0.20495 0.52155,0.17194 0.62599,0.26164 0.62055,0.53293 -0.006,0.26596 -0.33704,0.82354 -0.7403,1.2444 -0.12913,0.13476 -0.16161,0.15184 -0.28886,0.15184 -0.16967,0 -0.31579,-0.0771 -0.958,-0.5056 -2.04063,-1.36152 -6.41288,-4.73175 -6.60552,-5.09169 -0.0559,-0.10455 -0.0285,-0.42985 0.0492,-0.58259 0.0315,-0.062 0.12797,-0.20932 0.21429,-0.32741 0.31765,-0.43453 0.41348,-0.73823 0.38564,-1.22219 -0.032,-0.55638 -0.20725,-0.9062 -0.6338,-1.26523 -0.51867,-0.43658 -0.64949,-0.45651 -1.37516,-0.20944 -0.27308,0.093 -0.50906,0.1534 -0.59909,0.1534 -0.24478,0 -0.41506,-0.14213 -0.83113,-0.69367 -0.82327,-1.09133 -1.74662,-1.78358 -2.92939,-2.19619 -0.60899,-0.21244 -0.95078,-0.26471 -1.73015,-0.26455 -0.73272,1.3e-4 -0.93055,0.0262 -1.49924,0.19736 -1.92475,0.57934 -3.4522,2.40105 -3.72021,4.43692 -0.30411,2.3101 1.01272,4.62854 3.15722,5.55867 0.64918,0.28156 1.19823,0.39229 2.06223,0.41592 0.76732,0.021 1.32941,-0.0495 1.88997,-0.23708 0.70208,-0.2349 1.19254,-0.54828 1.99128,-1.27237 0.52363,-0.4747 0.92806,-0.76798 1.03743,-0.75235 0.0574,0.008 0.0679,0.0305 0.0622,0.13141 -0.0225,0.38996 -0.5451,1.79029 -1.27378,3.41288 -0.39655,0.88303 -0.45502,0.99838 -0.67399,1.32971 -0.24305,0.36776 -0.39642,0.48005 -0.778,0.56964 -0.35042,0.0823 -0.51951,0.16055 -0.61842,0.28628 -0.16426,0.20883 -0.006,0.37121 0.43469,0.4444 0.39259,0.0653 3.63288,0.0655 3.99004,3.1e-4 0.30374,-0.0554 0.42221,-0.11317 0.46536,-0.22667 0.0531,-0.1398 -0.0206,-0.27007 -0.19734,-0.34823 -0.12228,-0.0541 -0.28608,-0.0742 -0.89427,-0.10965 -0.40952,-0.0239 -0.80194,-0.0602 -0.87206,-0.0805 -0.11725,-0.0341 -0.12596,-0.0447 -0.10851,-0.13201 0.10648,-0.53243 2.27576,-5.44935 2.40417,-5.44935 0.15339,0 0.83299,0.39345 1.84192,1.06636 0.91635,0.61116 1.72519,1.19134 4.07094,2.92004 l 1.83714,1.35389 1.84918,0.0223 c 2.38508,0.0288 2.55796,0.0498 2.81579,0.34273 0.15082,0.17134 0.32526,0.57007 0.37407,0.855 0.0282,0.16441 0.0242,0.24368 -0.0211,0.42763 -0.073,0.29561 -0.28752,0.73526 -0.42498,0.87079 -0.25047,0.24694 -0.44151,0.28458 -1.85986,0.36645 -1.21249,0.07 -1.53162,0.10049 -1.92144,0.18373 -0.23089,0.0493 -0.33407,0.1108 -0.29417,0.17536 0.0366,0.0592 0.46162,0.1317 1.0045,0.17138 0.69842,0.051 2.40993,0.0222 2.70529,-0.0456 0.34217,-0.0786 0.55789,-0.20879 0.78273,-0.47256 0.50948,-0.59769 0.72258,-1.2471 0.60028,-1.8293 -0.0842,-0.40068 -0.25149,-0.70122 -0.56153,-1.00855 -0.30557,-0.3029 -0.57152,-0.46469 -0.99823,-0.60726 -0.3324,-0.11107 -0.62458,-0.15262 -1.38578,-0.19709 -0.72069,-0.0421 -0.90676,-0.12032 -0.90536,-0.38058 8e-4,-0.18061 0.0813,-0.34664 0.32122,-0.66377 0.52666,-0.69617 0.97508,-0.97276 1.87468,-1.15631 0.72541,-0.14801 1.1711,-0.32548 1.78453,-0.71059 1.7548,-1.10164 2.62477,-2.72806 2.55011,-4.76748 -0.03,-0.81857 -0.19121,-1.47945 -0.53315,-2.18515 -0.29617,-0.61127 -0.67699,-1.08214 -1.25031,-1.54601 -1.20112,-0.97181 -2.72396,-1.52872 -3.88898,-1.42224 z"
id="path4186" /><path
style="fill:#ffed45;fill-opacity:1;stroke:#000000;stroke-width:0.31999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m -236.21364,351.37729 0.0849,2.17946 2.34342,-4.05028 -2.48076,-4.20684 0.0189,2.18003 -8.2238,0.17008 0.0334,3.86459 8.22401,-0.13708 0,-1e-5 0,5e-5 z"
id="path4222"
sodipodi:nodetypes="cccccccccc" /></g></svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2816"
version="1.1"
inkscape:version="0.47 r22583"
width="95.81649"
height="83.729599"
xml:space="preserve"
sodipodi:docname="Belgio.pdf"><metadata
id="metadata2822"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs2820"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
id="perspective2824" /><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2844"><path
d="m 2562,672.668 3,0 0,-108 -3,0 0,108 z"
id="path2846" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2854"><path
d="m 731,6133.67 780,0 0,-679 -780,0 0,679 z"
id="path2856" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2892"><path
d="m 731,4841.67 780,0 0,-680 -780,0 0,680 z"
id="path2894" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3090"><path
d="m 731,2387.67 779,0 0,-684 -779,0"
id="path3092" /></clipPath><inkscape:perspective
id="perspective3129"
inkscape:persp3d-origin="47.908001 : 27.909665 : 1"
inkscape:vp_z="95.816002 : 41.864498 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 41.864498 : 1"
sodipodi:type="inkscape:persp3d" /><inkscape:perspective
id="perspective4211"
inkscape:persp3d-origin="39.790001 : 26.495 : 1"
inkscape:vp_z="79.580002 : 39.7425 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 39.7425 : 1"
sodipodi:type="inkscape:persp3d" /></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="838"
id="namedview2818"
showgrid="false"
inkscape:zoom="2.140677"
inkscape:cx="47.742493"
inkscape:cy="42.339324"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g2826" /><g
id="g2826"
inkscape:groupmode="layer"
inkscape:label="Belgio"
transform="matrix(1.25,0,0,-1.25,346.87909,480.97823)"><g
id="g2840"
transform="matrix(0.09762902,0,0,0.09762902,-202.75728,115.54083)"><g
clip-path="url(#clipPath2844)"
id="g2842"><g
transform="scale(8.33333,8.33333)"
id="g2848" /></g></g>
<g
id="g4226"><path
style="fill:#ed1c24"
d="m -242.61678,319.6165 c 0.704,-1.1168 1.9512,-1.8176 3.3904,-1.8176 1.3752,0 1.984,0.6704 2.7192,1.6896 l 34.8976,58.5576 c 1.216,1.5944 0.9264,4.1144 -0.544,5.5816 -0.832,0.8288 -1.792,1.212 -2.8792,1.148 l -69.1224,-0.032 c -0.7992,-0.1272 -1.5672,-0.5104 -2.1752,-1.116 -1.1832,-1.212 -1.4712,-2.9656 -0.864,-4.4656 l 34.5776,-59.5456 z"
id="path3115" /><path
style="fill:none;stroke:#ed1c24;stroke-width:0;stroke-miterlimit:3.86299992"
stroke-miterlimit="3.863"
d="m -242.61678,319.6165 c 0.704,-1.1168 1.9512,-1.8176 3.3904,-1.8176 1.3752,0 1.984,0.6704 2.7192,1.6896 l 34.8976,58.5576 c 1.216,1.5944 0.9264,4.1144 -0.544,5.5816 -0.832,0.8296 -1.792,1.212 -2.8792,1.148 l -69.1224,-0.032 c -0.7992,-0.1272 -1.5672,-0.5104 -2.1752,-1.116 -1.1832,-1.212 -1.4712,-2.9656 -0.864,-4.4656 l 34.5776,-59.5456 z"
id="path3117" /><polygon
style="fill:#ffffff;fill-rule:evenodd"
transform="matrix(0.8,0,0,-0.8,-277.50318,384.7821)"
clip-rule="evenodd"
points="81.192,10.892 14.66,10.892 47.926,68.261 "
id="polygon3119" /><polygon
style="fill:none;stroke:#ed1c24;stroke-width:0;stroke-miterlimit:3.86299992"
transform="matrix(0.8,0,0,-0.8,-277.50318,384.7821)"
stroke-miterlimit="3.863"
points="81.192,10.892 14.66,10.892 47.926,68.261 "
id="polygon3121" /><path
id="path4186"
d="m -231.26354,357.69838 c -1.34367,0.12281 -2.52121,0.69462 -3.46633,1.68322 -0.998,1.04394 -1.53671,2.27606 -1.60888,3.67984 -0.0339,0.65964 0.11226,1.24682 0.51395,2.0645 0.57894,1.1785 1.43752,2.19077 2.29437,2.70506 0.10668,0.0641 0.31479,0.15627 0.46244,0.20495 0.52155,0.17194 0.62599,0.26164 0.62055,0.53293 -0.006,0.26596 -0.33704,0.82354 -0.7403,1.2444 -0.12913,0.13476 -0.16161,0.15184 -0.28886,0.15184 -0.16967,0 -0.31579,-0.0771 -0.958,-0.5056 -2.04063,-1.36152 -6.41288,-4.73175 -6.60552,-5.09169 -0.0559,-0.10455 -0.0285,-0.42985 0.0492,-0.58259 0.0315,-0.062 0.12797,-0.20932 0.21429,-0.32741 0.31765,-0.43453 0.41348,-0.73823 0.38564,-1.22219 -0.032,-0.55638 -0.20725,-0.9062 -0.6338,-1.26523 -0.51867,-0.43658 -0.64949,-0.45651 -1.37516,-0.20944 -0.27308,0.093 -0.50906,0.1534 -0.59909,0.1534 -0.24478,0 -0.41506,-0.14213 -0.83113,-0.69367 -0.82327,-1.09133 -1.74662,-1.78358 -2.92939,-2.19619 -0.60899,-0.21244 -0.95078,-0.26471 -1.73015,-0.26455 -0.73272,1.3e-4 -0.93055,0.0262 -1.49924,0.19736 -1.92475,0.57934 -3.4522,2.40105 -3.72021,4.43692 -0.30411,2.3101 1.01272,4.62854 3.15722,5.55867 0.64918,0.28156 1.19823,0.39229 2.06223,0.41592 0.76732,0.021 1.32941,-0.0495 1.88997,-0.23708 0.70208,-0.2349 1.19254,-0.54828 1.99128,-1.27237 0.52363,-0.4747 0.92806,-0.76798 1.03743,-0.75235 0.0574,0.008 0.0679,0.0305 0.0622,0.13141 -0.0225,0.38996 -0.5451,1.79029 -1.27378,3.41288 -0.39655,0.88303 -0.45502,0.99838 -0.67399,1.32971 -0.24305,0.36776 -0.39642,0.48005 -0.778,0.56964 -0.35042,0.0823 -0.51951,0.16055 -0.61842,0.28628 -0.16426,0.20883 -0.006,0.37121 0.43469,0.4444 0.39259,0.0653 3.63288,0.0655 3.99004,3.1e-4 0.30374,-0.0554 0.42221,-0.11317 0.46536,-0.22667 0.0531,-0.1398 -0.0206,-0.27007 -0.19734,-0.34823 -0.12228,-0.0541 -0.28608,-0.0742 -0.89427,-0.10965 -0.40952,-0.0239 -0.80194,-0.0602 -0.87206,-0.0805 -0.11725,-0.0341 -0.12596,-0.0447 -0.10851,-0.13201 0.10648,-0.53243 2.27576,-5.44935 2.40417,-5.44935 0.15339,0 0.83299,0.39345 1.84192,1.06636 0.91635,0.61116 1.72519,1.19134 4.07094,2.92004 l 1.83714,1.35389 1.84918,0.0223 c 2.38508,0.0288 2.55796,0.0498 2.81579,0.34273 0.15082,0.17134 0.32526,0.57007 0.37407,0.855 0.0282,0.16441 0.0242,0.24368 -0.0211,0.42763 -0.073,0.29561 -0.28752,0.73526 -0.42498,0.87079 -0.25047,0.24694 -0.44151,0.28458 -1.85986,0.36645 -1.21249,0.07 -1.53162,0.10049 -1.92144,0.18373 -0.23089,0.0493 -0.33407,0.1108 -0.29417,0.17536 0.0366,0.0592 0.46162,0.1317 1.0045,0.17138 0.69842,0.051 2.40993,0.0222 2.70529,-0.0456 0.34217,-0.0786 0.55789,-0.20879 0.78273,-0.47256 0.50948,-0.59769 0.72258,-1.2471 0.60028,-1.8293 -0.0842,-0.40068 -0.25149,-0.70122 -0.56153,-1.00855 -0.30557,-0.3029 -0.57152,-0.46469 -0.99823,-0.60726 -0.3324,-0.11107 -0.62458,-0.15262 -1.38578,-0.19709 -0.72069,-0.0421 -0.90676,-0.12032 -0.90536,-0.38058 8e-4,-0.18061 0.0813,-0.34664 0.32122,-0.66377 0.52666,-0.69617 0.97508,-0.97276 1.87468,-1.15631 0.72541,-0.14801 1.1711,-0.32548 1.78453,-0.71059 1.7548,-1.10164 2.62477,-2.72806 2.55011,-4.76748 -0.03,-0.81857 -0.19121,-1.47945 -0.53315,-2.18515 -0.29617,-0.61127 -0.67699,-1.08214 -1.25031,-1.54601 -1.20112,-0.97181 -2.72396,-1.52872 -3.88898,-1.42224 z"
style="fill:#ffed45;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.31999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /><path
sodipodi:nodetypes="cccccccccc"
id="path4222"
d="m -241.06949,349.14367 -2.18011,0.0661 4.0299,2.37829 4.22809,-2.44436 -2.18011,4e-5 -0.0991,-8.22496 -3.86473,10e-6 0.0661,8.22488 1e-5,0 -5e-5,0 z"
style="fill:#ffed45;fill-opacity:1;stroke:#000000;stroke-width:0.31999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View file

@ -0,0 +1,287 @@
{
"id": "crossings",
"name": {
"en": "Crossings",
"nl": "Oversteekplaatsen"
},
"description": {
"en": "Crossings for pedestrians and cyclists",
"nl": "Oversteekplaatsen voor voetgangers en fietsers"
},
"source": {
"osmTags": {
"or": [
"highway=traffic_signals",
"highway=crossing"
]
}
},
"minzoom": 17,
"title": {
"render": {
"en": "Crossing",
"nl": "Oversteekplaats"
},
"mappings": [
{
"if": "highway=traffic_signals",
"then": {
"en": "Traffic signal",
"nl": "Verkeerslicht"
}
},
{
"if": "crossing=traffic_signals",
"then": {
"en": "Crossing with traffic signals",
"nl": "Oversteektplaats met verkeerslichten"
}
}
]
},
"icon": {
"render": "./assets/layers/crossings/pedestrian_crossing.svg",
"mappings": [
{
"if": {
"or": [
"highway=traffic_signals",
"crossing=traffic_signals"
]
},
"then": "./assets/layers/crossings/traffic_lights.svg"
}
]
},
"width": "5",
"presets": [
{
"title": {
"en": "Crossing",
"nl": "Oversteekplaats"
},
"tags": [
"highway=crossing"
],
"description": {
"en": "Crossing for pedestrians and/or cyclists",
"nl": "Oversteekplaats voor voetgangers en/of fietsers"
}
},
{
"title": {
"en": "Traffic signal",
"nl": "Verkeerslicht"
},
"tags": [
"highway=traffic_signals"
],
"description": {
"en": "Traffic signal on a road",
"nl": "Verkeerslicht op een weg"
}
}
],
"tagRenderings": [
{
"question": {
"en": "What kind of crossing is this?",
"nl": "Wat voor oversteekplaats is dit?"
},
"condition": "highway=crossing",
"mappings": [
{
"if": "crossing=uncontrolled",
"then": {
"en": "Crossing, without traffic lights",
"nl": "Oversteekplaats, zonder verkeerslichten"
}
},
{
"if": "crossing=traffic_signals",
"then": {
"en": "Crossing with traffic signals",
"nl": "Oversteekplaats met verkeerslichten"
}
},
{
"if": "crossing=zebra",
"then": {
"en": "Zebra crossing",
"nl": "Zebrapad"
},
"hideInAnswer": true
}
]
},
{
"question": {
"en": "Is this crossing also for bicycles?",
"nl": "Is deze oversteekplaats ook voor fietsers"
},
"condition": "highway=crossing",
"mappings": [
{
"if": "bicycle=yes",
"then": {
"en": "A cyclist can use this crossing",
"nl": "Een fietser kan deze oversteekplaats gebruiken"
}
},
{
"if": "bicycle=no",
"then": {
"en": "A cyclist can not use this crossing",
"nl": "Een fietser kan niet deze oversteekplaats gebruiken"
}
}
]
},
{
"question": {
"en": "Does this crossing have an island in the middle?",
"nl": "Heeft deze oversteekplaats een verkeerseiland in het midden?"
},
"condition": "highway=crossing",
"mappings": [
{
"if": "crossing:island=yes",
"then": {
"en": "This crossing has an island in the middle",
"nl": "Deze oversteekplaats heeft een verkeerseiland in het midden"
}
},
{
"if": "crossing:island=no",
"then": {
"en": "This crossing does not have an island in the middle",
"nl": "Deze oversteekplaats heeft niet een verkeerseiland in het midden"
}
}
]
},
{
"question": {
"en": "Does this crossing have tactile paving?",
"nl": "Heeft deze oversteekplaats een geleidelijn?"
},
"condition": "highway=crossing",
"mappings": [
{
"if": "tactile_paving=yes",
"then": {
"en": "This crossing has tactile paving",
"nl": "Deze oversteekplaats heeft een geleidelijn"
}
},
{
"if": "tactile_paving=no",
"then": {
"en": "This crossing does not have tactile paving",
"nl": "Deze oversteekplaats heeft niet een geleidelijn"
}
},
{
"if": "tactile_paving=incorrect",
"then": {
"en": "This crossing has tactile paving, but is not correct",
"nl": "Deze oversteekplaats heeft een geleidelijn, die incorrect is."
},
"hideInAnswer": true
}
]
},
{
"question": {
"en": "Does this traffic light have a button to request green light?",
"nl": "Heeft dit verkeerslicht een knop voor groen licht?"
},
"condition": {
"or": [
"highway=traffic_signals",
"crossing=traffic_signals"
]
},
"mappings": [
{
"if": "button_operated=yes",
"then": {
"en": "This traffic light has a button to request green light",
"nl": "Dit verkeerslicht heeft een knop voor groen licht"
}
},
{
"if": "button_operated=no",
"then": {
"en": "This traffic light does not have a button to request green light",
"nl": "Dit verkeerlicht heeft niet een knop voor groen licht"
}
}
]
},
{
"question": {
"en": "Can a cyclist turn right when the light is red?",
"nl": "Mag een fietser rechtsaf slaan als het licht rood is?"
},
"condition": "highway=traffic_signals",
"mappings": [
{
"if": "red_turn:right:bicycle=yes",
"then": {
"en": "A cyclist can turn right if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B22.svg' style='height: 3em'>",
"nl": "Een fietser mag wel rechtsaf slaan als het licht rood is <img src='./assets/layers/crossings/Belgian_road_sign_B22.svg' style='height: 3em'>"
},
"hideInAnswer": "_country!=be"
},
{
"if": "red_turn:right:bicycle=yes",
"then": {
"en": "A cyclist can turn right if the light is red",
"nl": "Een fietser mag wel rechtsaf slaan als het licht rood is"
},
"hideInAnswer": "_country=be"
},
{
"if": "red_turn:right:bicycle=no",
"then": {
"en": "A cyclist can not turn right if the light is red",
"nl": "Een fietser mag niet rechtsaf slaan als het licht rood is"
}
}
]
},
{
"question": {
"en": "Can a cyclist go straight on when the light is red?",
"nl": "Mag een fietser rechtdoor gaan als het licht rood is?"
},
"condition": "highway=traffic_signals",
"mappings": [
{
"if": "red_turn:straight:bicycle=yes",
"then": {
"en": "A cyclist can go straight on if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B23.svg' style='height: 3em'>",
"nl": "Een fietser mag wel rechtdoor gaan als het licht rood is <img src='./assets/layers/crossings/Belgian_road_sign_B23.svg' style='height: 3em'>"
},
"hideInAnswer": "_country!=be"
},
{
"if": "red_turn:straight:bicycle=yes",
"then": {
"en": "A cyclist can go straight on if the light is red",
"nl": "Een fietser mag wel rechtdoor gaan als het licht rood is"
},
"hideInAnswer": "_country=be"
},
{
"if": "red_turn:straight:bicycle=no",
"then": {
"en": "A cyclist can not go straight on if the light is red",
"nl": "Een fietser mag niet rechtdoor gaan als het licht rood is"
}
}
]
}
]
}

View file

@ -0,0 +1,42 @@
[
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_road_sign_B22.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_road_sign_B22.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_road_sign_B23.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_road_sign_B23.svg"
]
},
{
"authors": [
"Tobias Zwick"
],
"path": "pedestrian_crossing.svg",
"license": "CC-BY-SA 4.0",
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/quest%20icons/pedestrian_crossing.svg"
]
},
{
"authors": [
"Tobias Zwick"
],
"path": "traffic_lights.svg",
"license": "CC-BY-SA 4.0",
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/quest%20icons/traffic_lights.svg"
]
}
]

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<path d="m128 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64 35.346 0 64 28.654 64 64" fill="#529add" stroke-width=".2"/>
<path d="m92.422 79.992 16.697 29.377c3.0226-3.0054 5.7459-6.3104 8.123-9.8672l-14.854-19.51zm-66.023 0.007812-15.354 19.957c2.4026 3.5304 5.1551 6.8008 8.1973 9.7773l17.156-29.734zm17.029 0-16.107 36.416c1.8389 1.2898 3.7449 2.4898 5.7188 3.584h8.9609l11-40zm15.572 0-4.0176 40.004h18l-3.9824-40.004zm16.504 0 10.5 40h8.9961c2.327-1.29 4.5634-2.7231 6.7012-4.2832l-16.02-35.717z" fill-opacity=".2" style="paint-order:stroke fill markers"/>
<path d="m59.018 75.996-4.0176 40.004h18l-3.9824-40.004zm-32.59 0.003906-16.77 21.799c2.3519 3.7733 5.0886 7.2789 8.1504 10.473l18.619-32.271zm17 0-17.459 39.471 1.0312 0.5293h15l11-40zm32.072 0 10.5 40h15l2.0352-1.2988-17.357-38.701zm16.941 0 18.121 31.881c3.0397-3.2242 5.7588-6.7537 8.082-10.555l-16.236-21.326z" fill="#fff" style="paint-order:stroke fill markers"/>
<g shape-rendering="auto">
<path d="m71.299 17.922c-6.887 0-12.545 5.655-12.545 12.543 0 3.3248 1.3636 6.3273 3.502 8.5801-0.80144 0.22851-1.5812 0.5488-2.3047 0.99414l0.58984-0.28906c-4.9491 1.851-9.5049 4.3883-12.953 8.041-3.4482 3.6527-5.6738 8.5251-5.7207 14.236v0.02734c0 4.3407 3.5924 7.9316 7.9316 7.9316 1.4032 0 2.6595-0.47614 3.8105-1.1309-1.0607 2.5391-2.982 4.8594-5.3965 6.9102-3.1794 2.7004-7.0921 4.8263-10.18 6.2305-3.9679 1.7629-5.7943 6.5041-4.0312 10.473v2e-3c1.7636 3.9663 6.504 5.7926 10.473 4.0293l0.09766-0.04297 0.09375-0.04883c7.8911-4.1097 17.996-10.303 22.869-19.449 5.0514 3.4579 9.5237 9.0918 10.295 13.514l-0.017581-0.10356c0.61316 4.3 4.6807 7.343 8.9766 6.7305 4.2955-0.61376 7.3465-4.6749 6.7324-8.9727l-0.0118-0.08204c-2.0863-12.414-10.688-21.564-21.055-26.787-0.01225-0.01706-0.06233-0.07308-0.15039-0.24805-0.11944-0.2373-0.23873-0.7591-0.36133-1.2051 7.4762 3.0887 15.486 4.0441 23.312 0.20312l0.01172-0.0059 0.01172-0.0039c3.8853-1.9415 5.4873-6.7625 3.5469-10.645v-2e-3c-1.9409-3.8803-6.759-5.4882-10.641-3.5468-4.163 2.0536-6.7656 1.5075-9.6387 0.13281-1.6546-0.79165-3.2845-1.954-4.957-3.1621 5.8039-1.0901 10.252-6.207 10.252-12.311 0-6.8876-5.6554-12.543-12.543-12.543z" color="#000000" color-rendering="auto" dominant-baseline="auto" fill-opacity=".18824" image-rendering="auto" solid-color="#000000" stop-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;isolation:auto;mix-blend-mode:normal;paint-order:stroke fill markers;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
<path d="m71.781 14.625c-6.671 0-12.143 5.4725-12.143 12.145 0 3.4881 1.5174 6.6223 3.8984 8.8438-0.88458 0.17673-1.746 0.4518-2.5488 0.88477-4.8413 1.8308-9.2786 4.3242-12.627 7.8711-3.3897 3.5907-5.5652 8.35-5.6113 13.965v0.0254c0 4.1249 3.4097 7.5312 7.5332 7.5312 1.7136 0 3.2302-0.68653 4.5039-1.6699-0.9587 3.044-3.0545 5.7932-5.832 8.1523-3.2238 2.7381-7.168 4.8773-10.277 6.291-3.7706 1.6752-5.5034 6.1761-3.8281 9.9473h0.0016c1.6759 3.7691 6.1742 5.5037 9.9453 3.8281l0.08397-0.03909 0.08397-0.043c7.9725-4.1521 18.147-10.47 22.873-19.682 5.3039 3.4687 10.048 9.3267 10.869 14.033l-0.01563-0.09375c0.58265 4.086 4.4431 6.9747 8.5254 6.3926 4.082-0.58325 6.9761-4.4374 6.3926-8.5215l-0.0042-0.03711-0.0077-0.03711c-2.063-12.275-10.566-21.323-20.852-26.502l-0.08201-0.04102-0.08397-0.03711c0.19424 0.08344 0.06977 0.09376-0.14844-0.33984-0.21824-0.4336-0.46052-1.1958-0.61914-2.0508-0.0042-0.02286 0.0026-0.03949-0.0016-0.0625 7.6188 3.3262 15.77 4.489 23.752 0.57227l0.01173-2e-3 0.0098-0.0059c3.6919-1.8449 5.2131-6.4203 3.3691-10.109l-0.0016-0.0021c-1.8445-3.6875-6.4149-5.2102-10.104-3.3652-4.2669 2.1057-7.0441 1.5444-9.9902 0.13476-1.9932-0.95368-3.9283-2.3906-5.918-3.8086 6.1272-0.59675 10.986-5.7478 10.986-12.023 0-6.6716-5.4729-12.145-12.145-12.145z" color="#000000" color-rendering="auto" dominant-baseline="auto" fill="#529add" image-rendering="auto" solid-color="#000000" stop-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;isolation:auto;mix-blend-mode:normal;paint-order:stroke fill markers;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
<path d="m71.782 17.624c-5.0493 0-9.1445 4.0943-9.1445 9.1445 0 5.0502 4.0952 9.1428 9.1445 9.1428 5.0502 0 9.1445-4.0926 9.1445-9.1428 0-5.0502-4.0943-9.1445-9.1445-9.1445zm-9.5661 21.614c-9.2519 3.4603-16.386 9.3397-16.466 19.121 0 2.5039 2.0294 4.5316 4.5332 4.5316 2.5044 0 4.5343-2.0279 4.5349-4.5316 0.07516-2.4998 1.135-4.6219 2.6841-6.3176 0.04866 2.2271 0.40401 4.7273 1.1702 7.5012-0.47188 0.78559-0.66893 1.9679-0.48304 3.6966-1.5998 9.2061-11.749 15.196-18.292 18.168-2.2886 1.0168-3.3206 3.6972-2.304 5.9857 1.0175 2.2884 3.6972 3.3208 5.9857 2.304 8.6826-4.522 19.726-11.816 22.905-21.393 7.2127 3.3625 13.962 10.917 15.178 17.889 0.3535 2.479 2.6518 4.1995 5.1308 3.846 2.479-0.35422 4.2019-2.6484 3.8477-5.1275-1.8805-11.189-9.6066-19.469-19.243-24.321-2.7914-1.1991-3.0124-7.7148-2.8551-10.064 8.4551 4.7998 17.123 6.9431 25.701 2.7339 2.2402-1.1194 3.1462-3.844 2.0268-6.0836-1.1202-2.2394-3.8407-3.1469-6.0803-2.0268-10.082 4.9845-16.362-2.6485-21.667-5.7383-1.8977-1.3294-4.4203-1.3334-6.306-0.17263z" color="#000000" color-rendering="auto" dominant-baseline="auto" fill="#fff" image-rendering="auto" solid-color="#000000" stop-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-east-asian:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;font-variation-settings:normal;inline-size:0;isolation:auto;mix-blend-mode:normal;paint-order:stroke fill markers;shape-margin:0;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<path d="m119.42 95.995c-17.67 30.605-56.806 41.092-87.411 23.422-30.605-17.67-41.092-56.806-23.422-87.411 17.67-30.605 56.806-41.092 87.411-23.422 30.605 17.67 41.092 56.806 23.422 87.411" fill="#529add" stroke-width=".19997"/>
<g>
<path d="m43.429 20.007v7.9987h-15.997c-1.0546 12.363 6.0163 12.511 15.997 19.997v7.9987h-15.997c-1.0546 12.363 6.0163 12.511 15.997 19.997v7.9987h-15.997c-1.0546 12.363 6.0163 12.511 15.997 19.997v11.998h39.993v-11.998c9.9811-7.4858 17.052-7.6337 15.997-19.997h-15.997v-7.9987c9.9811-7.4858 17.052-7.6337 15.997-19.997h-15.997v-7.9987c9.9811-7.4858 17.052-7.6337 15.997-19.997h-15.997v-7.9987z" fill-opacity=".2" style="paint-order:stroke fill markers"/>
<path d="m43.429 16.008h39.993v95.984h-39.993z" fill="#888" style="paint-order:stroke fill markers"/>
<path d="m75.536 37.46a11.996 11.996 0 0 1-11.996 11.996 11.996 11.996 0 0 1-11.996-11.996 11.996 11.996 0 0 1 11.996-11.996 11.996 11.996 0 0 1 11.996 11.996" fill="#ff6969" stroke="#555" stroke-width="2.9995" style="paint-order:normal"/>
<path d="m75.54 65.483a11.998 11.998 0 0 1-11.998 11.998 11.998 11.998 0 0 1-11.998-11.998 11.998 11.998 0 0 1 11.998-11.998 11.998 11.998 0 0 1 11.998 11.998" fill="#ffff69" stroke="#555" stroke-width="2.9995" style="paint-order:normal"/>
<path d="m75.522 93.509a11.998 11.998 0 0 1-11.998 11.998 11.998 11.998 0 0 1-11.998-11.998 11.998 11.998 0 0 1 11.998-11.998 11.998 11.998 0 0 1 11.998 11.998" fill="#69ff69" stroke="#555" stroke-width="2.9995" style="paint-order:normal"/>
<path d="m43.429 24.007h-15.997c-1.0546 12.363 6.0163 12.511 15.997 19.997z" fill="#555" fill-rule="evenodd"/>
<path d="m43.429 52.002h-15.997c-1.0546 12.363 6.0163 12.511 15.997 19.997z" fill="#555" fill-rule="evenodd"/>
<path d="m43.429 79.997h-15.997c-1.0546 12.363 6.0163 12.511 15.997 19.997z" fill="#555" fill-rule="evenodd"/>
<path d="m83.422 24.007h15.997c1.0546 12.363-6.0163 12.511-15.997 19.997z" fill="#555" fill-rule="evenodd"/>
<path d="m83.422 52.002h15.997c1.0546 12.363-6.0163 12.511-15.997 19.997z" fill="#555" fill-rule="evenodd"/>
<path d="m83.422 79.997h15.997c1.0546 12.363-6.0163 12.511-15.997 19.997z" fill="#555" fill-rule="evenodd"/>
<path d="m75.529 93.475s-5.3717 7.9483-11.998 7.9483c-6.6263 0-11.987-7.906-11.987-7.906 0 6.6263 5.3606 11.987 11.987 11.987 6.6263 0 11.998-5.4029 11.998-12.029z" fill="#fff" fill-opacity=".37647" style="paint-order:stroke fill markers"/>
<path d="m57.427 111.99h12.063v15.997h-12.063z" fill="#555" style="paint-order:stroke fill markers"/>
<path d="m75.517 65.437s-5.3717 7.9483-11.998 7.9483-11.987-7.906-11.987-7.906c0 6.6263 5.3606 11.987 11.987 11.987s11.998-5.4029 11.998-12.029z" fill="#fff" fill-opacity=".37647" style="paint-order:stroke fill markers"/>
<path d="m75.517 37.442s-5.3717 7.9483-11.998 7.9483-11.987-7.906-11.987-7.906c0 6.6263 5.3606 11.987 11.987 11.987s11.998-5.4029 11.998-12.029z" fill="#fff" fill-opacity=".37647" style="paint-order:stroke fill markers"/>
<path d="m90.532 64.479a27.66 27.66 0 0 1-27.66 27.66 27.66 27.66 0 0 1-27.66-27.66 27.66 27.66 0 0 1 27.66-27.66 27.66 27.66 0 0 1 27.66 27.66" fill="#ffff69" fill-opacity=".26667" style="paint-order:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View file

@ -29,7 +29,6 @@
"tagRenderings": [
"images"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/layers/information_board/board.svg"
},

View file

@ -159,7 +159,6 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/layers/map/map.svg",
"mappings": [

View file

@ -392,7 +392,6 @@
]
}
],
"hideUnderlayingFeaturesMinPercentage": 10,
"wayHandling": 2,
"icon": {
"render": "./assets/themes/buurtnatuur/nature_reserve.svg"

View file

@ -87,7 +87,6 @@
"render": "{reviews(name, play_forest)}"
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"hideFromOverview": false,
"icon": {
"render": "./assets/layers/play_forest/icon.svg"

View file

@ -437,7 +437,6 @@
"render": "{reviews(name, playground)}"
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/playgrounds/playground.svg"
},

View file

@ -215,7 +215,6 @@
]
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"width": {
"render": "7"
},

View file

@ -383,7 +383,6 @@
"render": "{reviews(name, sportpitch)}"
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "circle:white;./assets/layers/sport_pitch/sport_pitch.svg",
"mappings": [

View file

@ -421,21 +421,20 @@
]
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/surveillance_cameras/logo.svg",
"render": "./assets/themes/surveillance/logo.svg",
"mappings": [
{
"if": "camera:type=dome",
"then": "./assets/themes/surveillance_cameras/dome.svg"
"then": "./assets/themes/surveillance/dome.svg"
},
{
"if": "_direction:leftright=right",
"then": "./assets/themes/surveillance_cameras/cam_right.svg"
"then": "./assets/themes/surveillance/cam_right.svg"
},
{
"if": "_direction:leftright=left",
"then": "./assets/themes/surveillance_cameras/cam_left.svg"
"then": "./assets/themes/surveillance/cam_left.svg"
}
]
},

View file

@ -449,7 +449,6 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "circle:#ffffff;./assets/themes/trees/unknown.svg",
"mappings": [

10
assets/svg/barrier.svg Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<path class="st0" d="m128 64a64 64 0 0 1-64 64 64 64 0 0 1-64-64 64 64 0 0 1 64-64 64 64 0 0 1 64 64" fill="#529add"/>
<path d="m31.992 32.08v87.273a64 64 0 0 0 16 6.5293v-93.803z" fill="#666"/>
<path d="m79.992 32.08v93.84a64 64 0 0 0 16-6.582v-87.258z" fill="#666"/>
<path d="m23.992 44.08c-4.456 0-8.0429 3.587-8.0429 8.043v31.914c0 4.456 3.5869 8.043 8.0429 8.043h79.914c4.456 0 8.043-3.587 8.043-8.043v-31.914c0-4.456-3.587-8.043-8.043-8.043z" fill-opacity=".2"/>
<path d="m24.036 40.08h79.913c4.456 0 8.0433 3.5873 8.0433 8.0433v31.913c0 4.456-3.5873 8.0433-8.0433 8.0433h-79.913c-4.456 0-8.0433-3.5873-8.0433-8.0433v-31.913c0-4.456 3.5873-8.0433 8.0433-8.0433z" fill="#fff" style="paint-order:normal"/>
<path d="m23.992 40.08c-3.8167 0-6.9867 2.6476-7.7949 6.2129l28.746 41.787h14.143l-32.332-48zm16.619 0 32.332 48h14.143l-32.332-48zm28 0 32.332 48h3.0488c3.6926 0 6.7759-2.4795 7.7051-5.8691l-28.943-42.131zm28 0 15.381 22v-14c0-4.432-3.568-8-8-8zm-80.619 26v14c0 4.432 3.568 8 8 8h7.0938z" fill="#dd2e44" style="paint-order:normal"/>
<path d="m24.03 40.08h79.924c4.4531 0 8.038 3.5849 8.038 8.038v31.924c0 4.453-3.5849 8.038-8.038 8.038h-79.924c-4.4531 0-8.038-3.5849-8.038-8.038v-31.924c0-4.453 3.5849-8.038 8.038-8.038z" fill="none" stroke="#555" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" style="paint-order:stroke markers fill"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -1,4 +1,12 @@
[
{
"authors": [
"Pieter Vander Vennet"
],
"path": "length-crosshair.svg",
"license": "CC0",
"sources": []
},
{
"authors": [
"Pieter Vander Vennet"
@ -727,6 +735,16 @@
"license": "CC0",
"sources": []
},
{
"authors": [
"Tobias Zwick"
],
"path": "barrier.svg",
"license": "CC-BY-SA 4.0",
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/quest%20icons/barrier.svg"
]
},
{
"authors": [
"Github"

View file

@ -1,5 +1,5 @@
{
"id": "artworks",
"id": "artwork",
"version": "2020-08-30",
"title": {
"en": "Open Artwork Map",

View file

@ -33,7 +33,7 @@
"fr": "Une vélothèque est un endroit où on peut emprunter des vélos, souvent moyennant une petite somme annuelle. Un cas d'utilisation notable est celui des vélothèques pour les enfants, qui leur permettent de passer à un vélo plus grand quand ils sont trop grands pour leur vélo actuel",
"zh_Hant": "單車圖書館是指每年支付小額費用,然後可以租用單車的地方。最有名的單車圖書館案例是給小孩的,能夠讓長大的小孩用目前的單車換成比較大的單車"
},
"icon": "./assets/themes/bicycle_library/logo.svg",
"icon": "./assets/themes/bicyclelib/logo.svg",
"socialImage": null,
"startLat": 0,
"startLon": 0,

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 593 KiB

After

Width:  |  Height:  |  Size: 593 KiB

Before After
Before After

View file

@ -38,13 +38,13 @@
"nb_NO"
],
"maintainer": "joost schouppe",
"icon": "./assets/themes/campersites/caravan.svg",
"icon": "./assets/themes/campersite/caravan.svg",
"version": "0",
"startLat": 43.14,
"startLon": 3.14,
"startZoom": 14,
"widenFactor": 0.05,
"socialImage": "./assets/themes/campersites/Bar%C3%9Fel_Wohnmobilstellplatz.jpg",
"socialImage": "./assets/themes/campersite/Bar%C3%9Fel_Wohnmobilstellplatz.jpg",
"layers": [
{
"id": "caravansites",
@ -521,9 +521,8 @@
"questions",
"reviews"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "circle:white;./assets/themes/campersites/caravan.svg",
"render": "circle:white;./assets/themes/campersite/caravan.svg",
"mappings": [
{
"if": {
@ -531,7 +530,7 @@
"fee=no"
]
},
"then": "circle:white;./assets/themes/campersites/caravan_green.svg"
"then": "circle:white;./assets/themes/campersite/caravan_green.svg"
}
]
},
@ -862,9 +861,8 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "circle:white;./assets/themes/campersites/sanitary_dump_station.svg"
"render": "circle:white;./assets/themes/campersite/sanitary_dump_station.svg"
},
"width": {
"render": "8"

View file

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before After
Before After

View file

@ -307,7 +307,6 @@
]
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "pin:#fff;./assets/themes/charging_stations/plug.svg",
"mappings": [

View file

@ -140,7 +140,6 @@
"phone",
"opening_hours"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/climbing/club.svg"
},
@ -280,7 +279,6 @@
"opening_hours",
"reviews"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/climbing/climbing_gym.svg"
},
@ -471,7 +469,6 @@
},
"reviews"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "circle:white;./assets/themes/climbing/climbing_route.svg"
},
@ -695,7 +692,6 @@
},
"reviews"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/climbing/climbing_no_rope.svg"
},
@ -850,7 +846,6 @@
}
],
"icon": "./assets/themes/climbing/climbing_unknown.svg",
"hideUnderlayingFeaturesMinPercentage": 0,
"width": {
"render": "2"
},

View file

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="79.52px" height="79.392px" viewBox="0 0 79.52 79.392" enable-background="new 0 0 79.52 79.392" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0071B3" d="M39.742,79.218c-30.412,0-49.432-32.921-34.209-59.292
c15.224-26.336,53.23-26.336,68.453,0C89.211,46.297,70.189,79.218,39.742,79.218z"/>
<path fill="none" stroke="#0071B3" stroke-width="0.348" stroke-miterlimit="3.863" d="M39.742,79.218
c-30.412,0-49.432-32.921-34.209-59.292c15.224-26.336,53.23-26.336,68.453,0C89.211,46.297,70.189,79.218,39.742,79.218z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M39.742,77.231c-28.914,0-46.994-31.283-32.537-56.33
c14.457-25.048,50.617-25.048,65.039,0C86.702,45.948,68.656,77.231,39.742,77.231z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.348" stroke-miterlimit="3.863" d="M39.742,77.231
c-28.914,0-46.994-31.283-32.537-56.33c14.457-25.048,50.617-25.048,65.039,0C86.702,45.948,68.656,77.231,39.742,77.231z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0071B3" d="M39.742,74.827c-27.033,0-43.928-29.262-30.412-52.707
c13.517-23.41,47.343-23.41,60.859,0C83.707,45.565,66.811,74.827,39.742,74.827z"/>
<path fill="none" stroke="#0071B3" stroke-width="0.348" stroke-miterlimit="3.863" d="M39.742,74.827
c-27.033,0-43.928-29.262-30.412-52.707c13.517-23.41,47.343-23.41,60.859,0C83.707,45.565,66.811,74.827,39.742,74.827z"/>
<path fill="#FFFFFF" d="M29.396,32.433l9.998,8.883c-0.383,0.453-0.627,1.01-0.627,1.637c0,1.289,1.08,2.404,2.299,2.508v2.962
h-0.383v0.558h1.289v-0.558H41.59V45.53c1.219-0.07,2.125-1.045,2.299-2.125h1.428c0.174,4.842,4.146,8.709,9.023,8.709
c5.016,0,9.092-4.076,9.092-9.057c0-5.018-4.076-9.093-9.092-9.093c-1.498,0-2.928,0.383-4.182,1.079l-2.543-4.702l0.627-1.22
c0.176-0.383,0.697-0.278,1.012-0.592c0.033-0.209,0.033-0.349,0.033-0.558c-0.174-0.104-0.209-0.278-0.451-0.278H45.49
c-0.035,0.104-0.174,0.069-0.277,0.069c-0.035,0.035-0.07,0.069-0.105,0.069c-0.07,0.175-0.07,0.418,0,0.593
c0.035,0.034,0.105,0.069,0.174,0.069h1.707c0.174-0.035,0.35,0.035,0.523,0.105c0.068,0.034,0.068,0.034,0.139,0.068
c-0.035,0.141,0.105,0.314,0.035,0.419l-0.348,0.801h-17.35l0.488-2.056c0.383-0.139,0.697,0.14,1.498-0.209
c0.313,0,1.045-0.418,1.951-0.104c0.174-0.07-0.07-0.14,0.034-0.244c-0.104-0.07,0.14-0.244,0.105-0.313
c-0.557-0.175-1.707-0.278-2.23,0.069c-0.557,0.313-1.323,0.104-1.811,0.14l-1.707,7.386c-0.975-0.384-2.09-0.628-3.24-0.628
c-4.981,0-9.057,4.076-9.057,9.058c0,5.017,4.076,9.057,9.057,9.057c4.982,0,9.058-4.04,9.058-9.057
c0-3.658-2.195-6.758-5.295-8.221L29.396,32.433z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.348" stroke-miterlimit="3.863" d="M29.396,32.433l9.998,8.883
c-0.383,0.453-0.627,1.01-0.627,1.637c0,1.289,1.08,2.404,2.299,2.508v2.962h-0.383v0.558h1.289v-0.558H41.59V45.53
c1.219-0.07,2.125-1.045,2.299-2.125h1.428c0.174,4.842,4.146,8.709,9.023,8.709c5.016,0,9.092-4.076,9.092-9.057
c0-5.018-4.076-9.093-9.092-9.093c-1.498,0-2.928,0.383-4.182,1.079l-2.543-4.702l0.627-1.22c0.176-0.383,0.697-0.278,1.012-0.592
c0.033-0.209,0.033-0.349,0.033-0.558c-0.174-0.104-0.209-0.278-0.451-0.278H45.49c-0.035,0.104-0.174,0.069-0.277,0.069
c-0.035,0.035-0.07,0.069-0.105,0.069c-0.07,0.175-0.07,0.418,0,0.593c0.035,0.034,0.105,0.069,0.174,0.069h1.707
c0.174-0.035,0.35,0.035,0.523,0.105c0.068,0.034,0.068,0.034,0.139,0.068c-0.035,0.141,0.105,0.314,0.035,0.419l-0.348,0.801
h-17.35l0.488-2.056c0.383-0.139,0.697,0.14,1.498-0.209c0.313,0,1.045-0.418,1.951-0.104c0.174-0.07-0.07-0.14,0.034-0.244
c-0.104-0.07,0.14-0.244,0.105-0.313c-0.557-0.175-1.707-0.278-2.23,0.069c-0.557,0.313-1.323,0.104-1.811,0.14l-1.707,7.386
c-0.975-0.384-2.09-0.628-3.24-0.628c-4.981,0-9.057,4.076-9.057,9.058c0,5.017,4.076,9.057,9.057,9.057
c4.982,0,9.058-4.04,9.058-9.057c0-3.658-2.195-6.758-5.295-8.221L29.396,32.433z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.418" stroke-miterlimit="3.863" d="M23.613,33.372
c0.523-0.104,1.01-0.174,1.463-0.174c5.4,0,9.754,4.424,9.754,9.859c0,0.277,0,0.557-0.034,0.87"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M17.168,52.532 M62.213,52.532H17.169V51.87h45.043V52.532z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.348" stroke-miterlimit="3.863" d="M17.168,52.532 M62.213,52.532H17.169V51.87
h45.043V52.532z"/>
<path fill="#0071B3" d="M25.843,41.907c-0.244-0.139-0.488-0.104-0.767-0.104c-0.766,0-1.358,0.593-1.358,1.289
c0,0.731,0.592,1.323,1.358,1.323c0.592,0,1.15-0.418,1.289-0.939h6.828c-0.244,4.284-3.797,7.664-8.117,7.664
c-4.598,0-8.256-3.693-8.256-8.188c0-4.563,3.658-8.221,8.256-8.221c1.045,0,2.09,0.209,3.066,0.627l-0.558,2.194
C27.271,38.842,26.854,40.34,25.843,41.907z"/>
<path fill="none" stroke="#0071B3" stroke-width="0" stroke-miterlimit="3.863" d="M25.843,41.907
c-0.244-0.139-0.488-0.104-0.767-0.104c-0.766,0-1.358,0.593-1.358,1.289c0,0.731,0.592,1.323,1.358,1.323
c0.592,0,1.15-0.418,1.289-0.939h6.828c-0.244,4.284-3.797,7.664-8.117,7.664c-4.598,0-8.256-3.693-8.256-8.188
c0-4.563,3.658-8.221,8.256-8.221c1.045,0,2.09,0.209,3.066,0.627l-0.558,2.194C27.271,38.842,26.854,40.34,25.843,41.907z"/>
<path fill="#0071B3" d="M29.048,35.776l-0.732,2.473c-0.348,1.15-1.184,3.658-1.916,4.564c0.07,0.174-0.035-0.174,0,0h6.863
C33.158,39.608,31.695,37.101,29.048,35.776z"/>
<path fill="none" stroke="#0071B3" stroke-width="0" stroke-miterlimit="3.863" d="M29.048,35.776l-0.732,2.473
c-0.348,1.15-1.184,3.658-1.916,4.564c0.07,0.174-0.035-0.174,0,0h6.863C33.158,39.608,31.695,37.101,29.048,35.776z"/>
<path fill="#0071B3" d="M29.535,31.874l0.279-1.428h17.209L42.32,40.653c-0.209-0.07-0.348-0.349-0.662-0.279v-2.646h0.559v-0.802
h-2.195v0.802h0.592v2.717c-0.487,0.104-0.557,0.035-0.906,0.348L29.535,31.874z"/>
<path fill="none" stroke="#0071B3" stroke-width="0" stroke-miterlimit="3.863" d="M29.535,31.874l0.279-1.428h17.209L42.32,40.653
c-0.209-0.07-0.348-0.349-0.662-0.279v-2.646h0.559v-0.802h-2.195v0.802h0.592v2.717c-0.487,0.104-0.557,0.035-0.906,0.348
L29.535,31.874z"/>
<path fill="#0071B3" d="M61.828,39.469c0.662,1.149,0.768,2.16,0.768,3.589c0,4.493-3.658,8.15-8.221,8.15
c-4.426,0-7.979-3.273-8.152-7.629h6.479c0.141,0.836,0.871,1.498,1.742,1.498c1.01,0,1.848-1.08,1.848-2.02
c0-0.384-0.314-0.384-0.279-0.384C57.963,41.594,59.879,40.549,61.828,39.469z"/>
<path fill="none" stroke="#0071B3" stroke-width="0.348" stroke-miterlimit="3.863" d="M61.828,39.469
c0.662,1.149,0.768,2.16,0.768,3.589c0,4.493-3.658,8.15-8.221,8.15c-4.426,0-7.979-3.273-8.152-7.629h6.479
c0.141,0.836,0.871,1.498,1.742,1.498c1.01,0,1.848-1.08,1.848-2.02c0-0.384-0.314-0.384-0.279-0.384
C57.963,41.594,59.879,40.549,61.828,39.469z"/>
<path fill="#0071B3" d="M55.838,41.803l5.504-3.065c-1.43-2.334-4.006-3.902-7.002-3.902c-1.289,0-2.578,0.279-3.693,0.871
l3.1,5.609c0.176-0.07,0.453-0.14,0.662-0.14C54.932,41.176,55.42,41.454,55.838,41.803z"/>
<path fill="none" stroke="#0071B3" stroke-width="0" stroke-miterlimit="3.863" d="M55.838,41.803l5.504-3.065
c-1.43-2.334-4.006-3.902-7.002-3.902c-1.289,0-2.578,0.279-3.693,0.871l3.1,5.609c0.176-0.07,0.453-0.14,0.662-0.14
C54.932,41.176,55.42,41.454,55.838,41.803z"/>
<path fill="#0071B3" d="M49.984,36.09l3.205,5.782c-0.313,0.279-0.453,0.453-0.521,0.906h-6.516
C46.258,39.887,47.686,37.483,49.984,36.09z"/>
<path fill="none" stroke="#0071B3" stroke-width="0" stroke-miterlimit="3.863" d="M49.984,36.09l3.205,5.782
c-0.313,0.279-0.453,0.453-0.521,0.906h-6.516C46.258,39.887,47.686,37.483,49.984,36.09z"/>
<path fill="#0071B3" d="M47.547,31.353l-4.6,9.754c0.559,0.209,1.08,0.871,1.115,1.707l1.01-0.035c0.105-3.17,1.707-6.027,4.25-7.56
L47.547,31.353z"/>
<path fill="none" stroke="#0071B3" stroke-width="0" stroke-miterlimit="3.863" d="M47.547,31.353l-4.6,9.754
c0.559,0.209,1.08,0.871,1.115,1.707l1.01-0.035c0.105-3.17,1.707-6.027,4.25-7.56L47.547,31.353z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.418" stroke-miterlimit="3.863" d="M44.795,44.485
c-0.105-0.488-0.141-0.976-0.141-1.428c0-5.436,4.424-9.859,9.824-9.859c4.006,0,7.42,2.404,8.953,5.853"/>
</svg>

After

Width:  |  Height:  |  Size: 8.2 KiB

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="80.077px" height="79.982px" viewBox="0 0 80.077 79.982" enable-background="new 0 0 80.077 79.982" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0071B3" d="M40.031,79.904c-30.716,0-49.905-33.266-34.547-59.868
c15.358-26.603,53.753-26.619,69.111,0C89.953,46.638,70.748,79.904,40.031,79.904z"/>
<path fill="none" stroke="#0071B3" stroke-width="0.156" stroke-miterlimit="3.863" d="M40.031,79.904
c-30.716,0-49.905-33.266-34.547-59.868c15.358-26.603,53.753-26.619,69.111,0C89.953,46.638,70.748,79.904,40.031,79.904z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M40.031,77.902c-29.183,0-47.419-31.607-32.827-56.881
c14.576-25.274,51.063-25.274,65.655,0C87.45,46.294,69.215,77.902,40.031,77.902z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.156" stroke-miterlimit="3.863" d="M40.031,77.902
c-29.183,0-47.419-31.607-32.827-56.881c14.576-25.274,51.063-25.274,65.655,0C87.45,46.294,69.215,77.902,40.031,77.902z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0071B3" d="M40.031,75.462c-27.306,0-44.369-29.574-30.716-53.221
c13.654-23.647,47.778-23.647,61.433,0C84.401,45.888,67.338,75.462,40.031,75.462z"/>
<path fill="none" stroke="#0071B3" stroke-width="0.156" stroke-miterlimit="3.863" d="M40.031,75.462
c-27.306,0-44.369-29.574-30.716-53.221c13.654-23.647,47.778-23.647,61.433,0C84.401,45.888,67.338,75.462,40.031,75.462z"/>
<path fill="#FFFFFF" d="M60.598,38.787l-4.566-7.1c-0.656-0.813-2.033-1.752-3.128-1.626v-1.22c0.782-0.376,1.313-1.126,1.313-2.096
c0-1.22-0.969-2.283-2.283-2.283c-1.221,0-2.252,1.063-2.252,2.283c0,1.032,0.656,1.845,1.595,2.158v1.064
c-1.282,0-4.379,0.844-4.379,4.003v6.663c0,0.532,0.438,0.97,0.97,0.97c0.563,0,0.969-0.438,0.969-0.97v-6.162
c0-0.25,0.188-0.375,0.438-0.375s0.376,0.125,0.376,0.375v17.735c0,0.563,0.469,1.031,1.063,1.031c0.533,0,0.938-0.469,0.938-1.031
v-9.571c0-0.376,0.282-0.626,0.657-0.626c0.376,0,0.595,0.25,0.595,0.626v11.792c0,0.531,0.47,1.063,1.063,1.063
c0.531,0,0.97-0.531,0.97-1.063V33.845l3.784,5.943c0.313,0.531,0.75,0.47,1.127,0.344c0.312,1.22,0.531,1.939,1.376,1.971
l2.627,0.156l-1.876,6.068h1.438v4.441c0,0.282,0.313,0.563,0.657,0.563c0.376,0,0.657-0.28,0.657-0.563v-4.504h0.845v3.628
c0,0.313,0.281,0.626,0.656,0.626c0.376,0,0.688-0.313,0.688-0.626v-3.565h1.377l-1.314-5.004l1.689,1.877
c0.219,0.125,0.438,0.125,0.563,0c0.188-0.157,0.251-0.313,0.094-0.627l-2.283-2.596c-0.469-0.501-0.75-0.813-1.377-0.939
c-0.156-0.155-0.093-0.344-0.062-0.53c0.563-0.25,0.876-0.845,0.876-1.47c0-0.907-0.657-1.627-1.533-1.627
c-0.97,0-1.689,0.72-1.689,1.627c0,0.719,0.47,1.313,1.189,1.531c0.031,0.219,0.063,0.563-0.219,0.688h-2.189
c-0.375,0-0.563-0.062-0.813-0.345c-0.22-0.405-0.501-0.969-0.501-1.25c0-0.219-0.063-0.188-0.156-0.281
C60.66,39.225,60.723,39.1,60.598,38.787z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0" stroke-miterlimit="3.863" d="M60.598,38.787l-4.566-7.1
c-0.656-0.813-2.033-1.752-3.128-1.626v-1.22c0.782-0.376,1.313-1.126,1.313-2.096c0-1.22-0.969-2.283-2.283-2.283
c-1.221,0-2.252,1.063-2.252,2.283c0,1.032,0.656,1.845,1.595,2.158v1.064c-1.282,0-4.379,0.844-4.379,4.003v6.663
c0,0.532,0.438,0.97,0.97,0.97c0.563,0,0.969-0.438,0.969-0.97v-6.162c0-0.25,0.188-0.375,0.438-0.375s0.376,0.125,0.376,0.375
v17.735c0,0.563,0.469,1.031,1.063,1.031c0.533,0,0.938-0.469,0.938-1.031v-9.571c0-0.376,0.282-0.626,0.657-0.626
c0.376,0,0.595,0.25,0.595,0.626v11.792c0,0.531,0.47,1.063,1.063,1.063c0.531,0,0.97-0.531,0.97-1.063V33.845l3.784,5.943
c0.313,0.531,0.75,0.47,1.127,0.344c0.312,1.22,0.531,1.939,1.376,1.971l2.627,0.156l-1.876,6.068h1.438v4.441
c0,0.282,0.313,0.563,0.657,0.563c0.376,0,0.657-0.28,0.657-0.563v-4.504h0.845v3.628c0,0.313,0.281,0.626,0.656,0.626
c0.376,0,0.688-0.313,0.688-0.626v-3.565h1.377l-1.314-5.004l1.689,1.877c0.219,0.125,0.438,0.125,0.563,0
c0.188-0.157,0.251-0.313,0.094-0.627l-2.283-2.596c-0.469-0.501-0.75-0.813-1.377-0.939c-0.156-0.155-0.093-0.344-0.062-0.53
c0.563-0.25,0.876-0.845,0.876-1.47c0-0.907-0.657-1.627-1.533-1.627c-0.97,0-1.689,0.72-1.689,1.627
c0,0.719,0.47,1.313,1.189,1.531c0.031,0.219,0.063,0.563-0.219,0.688h-2.189c-0.375,0-0.563-0.062-0.813-0.345
c-0.22-0.405-0.501-0.969-0.501-1.25c0-0.219-0.063-0.188-0.156-0.281C60.66,39.225,60.723,39.1,60.598,38.787z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M39.234,77.152 M40.846,77.152h-1.611V2.816h1.611V77.152z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.156" stroke-miterlimit="3.863" d="M39.234,77.152 M40.846,77.152h-1.611V2.816
h1.611V77.152z"/>
<path fill="#FFFFFF" d="M15.258,35.347l6.538,5.88c-0.251,0.282-0.407,0.688-0.407,1.063c0,0.845,0.719,1.564,1.501,1.658v1.939
h-0.25v0.344h0.813v-0.344h-0.219V43.98c0.782-0.031,1.408-0.656,1.502-1.408h0.938c0.125,3.223,2.721,5.693,5.881,5.693
c3.315,0,5.974-2.659,5.974-5.943c0-3.252-2.659-5.912-5.974-5.912c-0.97,0-1.877,0.219-2.69,0.688l-1.689-3.065l0.406-0.844
c0.125-0.219,0.438-0.126,0.657-0.345c0.031-0.156,0.031-0.25,0.031-0.375c-0.093-0.094-0.125-0.188-0.281-0.188h-2.19
c-0.031,0.032-0.125,0-0.187,0c0,0.032-0.063,0.063-0.094,0.063c-0.031,0.156-0.031,0.281,0,0.407
c0.031,0.031,0.094,0.062,0.125,0.062h1.126c0.125-0.031,0.219,0.031,0.375,0.031c0,0.032,0,0.032,0.063,0.063
c-0.031,0.125,0.062,0.219,0,0.25l-0.219,0.532H15.634l0.312-1.345c0.282-0.063,0.47,0.125,1.001-0.094
c0.188,0,0.688-0.25,1.251-0.062c0.126-0.094-0.031-0.126,0.032-0.157c-0.063-0.031,0.094-0.219,0.062-0.25
c-0.312-0.094-1.094-0.156-1.439,0.031c-0.375,0.219-0.844,0.094-1.188,0.125l-1.126,4.849c-0.626-0.251-1.376-0.407-2.096-0.407
c-3.284,0-5.943,2.659-5.943,5.942c0,3.284,2.659,5.943,5.943,5.943c3.222,0,5.912-2.659,5.912-5.943
c0-2.408-1.47-4.441-3.503-5.379L15.258,35.347"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.156" stroke-miterlimit="3.863" d="M11.474,36.004
c0.345-0.032,0.626-0.126,0.97-0.126c3.503,0,6.381,2.908,6.381,6.443c0,0.219,0,0.438-0.031,0.627"/>
<path fill="#0071B3" d="M12.913,41.603c-0.156-0.094-0.312-0.063-0.469-0.063c-0.5,0-0.907,0.406-0.907,0.845
c0,0.5,0.407,0.844,0.907,0.844c0.344,0,0.72-0.219,0.813-0.594h4.505c-0.188,2.846-2.503,5.036-5.318,5.036
c-3.003,0-5.411-2.409-5.411-5.381c0-3.002,2.408-5.411,5.411-5.411c0.688,0,1.314,0.188,2.002,0.407l-0.375,1.47
C13.852,39.601,13.601,40.57,12.913,41.603"/>
<path fill="#0071B3" d="M14.79,37.474l-0.375,1.532c-0.188,0.688-0.782,2.221-1.251,2.815c0,0.125,0.093,0.281,0.125,0.406h4.473
C17.729,40.101,16.542,38.318,14.79,37.474z"/>
<path fill="none" stroke="#0071B3" stroke-width="0" stroke-miterlimit="3.863" d="M14.79,37.474l-0.375,1.532
c-0.188,0.688-0.782,2.221-1.251,2.815c0,0.125,0.093,0.281,0.125,0.406h4.473C17.729,40.101,16.542,38.318,14.79,37.474z"/>
<path fill="#0071B3" d="M15.353,35.034l0.188-0.938H26.8l-3.128,6.599c-0.156-0.062-0.25-0.125-0.469-0.125v-1.875h0.25V38.35
h-0.813v0.345h0.25v1.907c-0.484,0.047-0.563,0.187-0.782,0.406L15.353,35.034"/>
<path fill="#0071B3" d="M32.775,41.728l3.565-1.971c0.407,0.813,0.657,1.689,0.657,2.564c0,2.972-2.408,5.411-5.411,5.411
c-2.878,0-5.224-2.252-5.318-5.161h4.161c0.062,0.563,0.594,1.002,1.157,1.002c0.688,0,1.251-0.563,1.251-1.252
c0-0.219-0.031-0.375-0.094-0.531"/>
<path fill="#0071B3" d="M32.557,41.541l3.597-2.002c-0.97-1.533-2.597-2.565-4.598-2.565c-0.814,0-1.658,0.188-2.378,0.532
l2.034,3.722c0.093-0.062,0.281-0.094,0.375-0.094C31.961,41.133,32.305,41.291,32.557,41.541"/>
<path fill="#0071B3" d="M28.865,37.755l2.033,3.691c-0.188,0.219-0.407,0.469-0.438,0.75h-4.223
c0.031-1.877,1.064-3.535,2.565-4.473"/>
<path fill="#0071B3" d="M26.988,34.408l-2.909,6.444c0.375,0.313,0.719,0.813,0.751,1.376h0.907
c0.062-2.096,1.157-3.941,2.846-4.973L26.988,34.408"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.156" stroke-miterlimit="3.863" d="M25.331,43.324
c-0.062-0.313-0.094-0.658-0.094-1.002c0-3.535,2.909-6.443,6.412-6.443c2.659,0,4.88,1.627,5.881,3.816"/>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

View file

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="79.58px" height="79.485px" viewBox="0 0 79.58 79.485" enable-background="new 0 0 79.58 79.485" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0071B3" d="M39.783,79.408c-30.525,0-49.595-33.06-34.333-59.497
c15.263-26.438,53.419-26.453,68.683,0C89.395,46.349,70.309,79.408,39.783,79.408z"/>
<path fill="none" stroke="#0071B3" stroke-width="0.155" stroke-miterlimit="3.863" d="M39.783,79.408
c-30.525,0-49.595-33.06-34.333-59.497c15.263-26.438,53.419-26.453,68.683,0C89.395,46.349,70.309,79.408,39.783,79.408z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M39.783,77.418c-29.002,0-47.124-31.411-32.623-56.527
c14.485-25.117,50.746-25.117,65.247,0C86.908,46.007,68.785,77.418,39.783,77.418z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.155" stroke-miterlimit="3.863" d="M39.783,77.418
c-29.002,0-47.124-31.411-32.623-56.527c14.485-25.117,50.746-25.117,65.247,0C86.908,46.007,68.785,77.418,39.783,77.418z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0071B3" d="M39.783,74.994c-27.137,0-44.093-29.392-30.525-52.892
c13.569-23.5,47.482-23.5,61.05,0S66.92,74.994,39.783,74.994z"/>
<path fill="none" stroke="#0071B3" stroke-width="0.155" stroke-miterlimit="3.863" d="M39.783,74.994
c-27.137,0-44.093-29.392-30.525-52.892c13.569-23.5,47.482-23.5,61.05,0S66.92,74.994,39.783,74.994z"/>
<path fill="#FFFFFF" d="M42.208,25.973l-4.538-7.056c-0.653-0.808-2.021-1.741-3.109-1.616v-1.213
c0.777-0.373,1.306-1.119,1.306-2.082c0-1.213-0.964-2.27-2.27-2.27c-1.212,0-2.238,1.057-2.238,2.27
c0,1.025,0.653,1.834,1.586,2.144v1.057c-1.275,0-4.352,0.84-4.352,3.979v6.621c0,0.529,0.435,0.964,0.963,0.964
c0.56,0,0.964-0.435,0.964-0.964v-6.123c0-0.249,0.187-0.374,0.435-0.374c0.249,0,0.373,0.125,0.373,0.374v17.624
c0,0.56,0.467,1.026,1.057,1.026c0.529,0,0.933-0.467,0.933-1.026v-9.511c0-0.373,0.279-0.622,0.652-0.622s0.591,0.249,0.591,0.622
v11.718c0,0.529,0.466,1.058,1.057,1.058c0.528,0,0.964-0.528,0.964-1.058V21.062l3.761,5.906c0.311,0.528,0.747,0.466,1.12,0.342
c0.311,1.212,0.527,1.927,1.367,1.958l2.611,0.156l-1.865,6.03h1.43v4.414c0,0.281,0.311,0.561,0.652,0.561
c0.373,0,0.652-0.279,0.652-0.561v-4.476h0.84v3.606c0,0.31,0.279,0.621,0.652,0.621s0.685-0.312,0.685-0.621v-3.544h1.368
l-1.307-4.974l1.68,1.866c0.217,0.124,0.435,0.124,0.559,0c0.188-0.156,0.249-0.311,0.094-0.622l-2.27-2.58
c-0.467-0.498-0.746-0.808-1.367-0.933c-0.156-0.155-0.094-0.342-0.063-0.528c0.56-0.249,0.871-0.839,0.871-1.461
c0-0.902-0.653-1.617-1.523-1.617c-0.964,0-1.68,0.715-1.68,1.617c0,0.715,0.467,1.305,1.182,1.523
c0.031,0.218,0.063,0.56-0.217,0.684h-2.176c-0.373,0-0.561-0.062-0.809-0.342c-0.218-0.404-0.498-0.964-0.498-1.243
c0-0.218-0.063-0.187-0.154-0.28C42.27,26.408,42.332,26.284,42.208,25.973z"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0" stroke-miterlimit="3.863" d="M42.208,25.973l-4.538-7.056
c-0.653-0.808-2.021-1.741-3.109-1.616v-1.213c0.777-0.373,1.306-1.119,1.306-2.082c0-1.213-0.964-2.27-2.27-2.27
c-1.212,0-2.238,1.057-2.238,2.27c0,1.025,0.653,1.834,1.586,2.144v1.057c-1.275,0-4.352,0.84-4.352,3.979v6.621
c0,0.529,0.435,0.964,0.963,0.964c0.56,0,0.964-0.435,0.964-0.964v-6.123c0-0.249,0.187-0.374,0.435-0.374
c0.249,0,0.373,0.125,0.373,0.374v17.624c0,0.56,0.467,1.026,1.057,1.026c0.529,0,0.933-0.467,0.933-1.026v-9.511
c0-0.373,0.279-0.622,0.652-0.622s0.591,0.249,0.591,0.622v11.718c0,0.529,0.466,1.058,1.057,1.058c0.528,0,0.964-0.528,0.964-1.058
V21.062l3.761,5.906c0.311,0.528,0.747,0.466,1.12,0.342c0.311,1.212,0.527,1.927,1.367,1.958l2.611,0.156l-1.865,6.03h1.43v4.414
c0,0.281,0.311,0.561,0.652,0.561c0.373,0,0.652-0.279,0.652-0.561v-4.476h0.84v3.606c0,0.31,0.279,0.621,0.652,0.621
s0.685-0.312,0.685-0.621v-3.544h1.368l-1.307-4.974l1.68,1.866c0.217,0.124,0.435,0.124,0.559,0
c0.188-0.156,0.249-0.311,0.094-0.622l-2.27-2.58c-0.467-0.498-0.746-0.808-1.367-0.933c-0.156-0.155-0.094-0.342-0.063-0.528
c0.56-0.249,0.871-0.839,0.871-1.461c0-0.902-0.653-1.617-1.523-1.617c-0.964,0-1.68,0.715-1.68,1.617
c0,0.715,0.467,1.305,1.182,1.523c0.031,0.218,0.063,0.56-0.217,0.684h-2.176c-0.373,0-0.561-0.062-0.809-0.342
c-0.218-0.404-0.498-0.964-0.498-1.243c0-0.218-0.063-0.187-0.154-0.28C42.27,26.408,42.332,26.284,42.208,25.973z"/>
<path fill="#FFFFFF" d="M33.069,53.031l6.497,5.845c-0.249,0.28-0.404,0.684-0.404,1.057c0,0.839,0.715,1.554,1.492,1.647v1.928
h-0.249v0.342h0.808v-0.342h-0.217v-1.896c0.777-0.031,1.398-0.652,1.492-1.398h0.932c0.125,3.201,2.705,5.656,5.844,5.656
c3.295,0,5.938-2.642,5.938-5.905c0-3.233-2.643-5.875-5.938-5.875c-0.963,0-1.864,0.218-2.672,0.685l-1.68-3.047l0.404-0.84
c0.125-0.217,0.436-0.124,0.652-0.341C46,50.39,46,50.297,46,50.173c-0.093-0.095-0.124-0.187-0.279-0.187h-2.176
c-0.031,0.03-0.125,0-0.187,0c0,0.03-0.062,0.062-0.093,0.062c-0.031,0.155-0.031,0.28,0,0.403c0.031,0.031,0.093,0.063,0.123,0.063
h1.119c0.125-0.031,0.219,0.032,0.373,0.032c0,0.03,0,0.03,0.063,0.062c-0.031,0.125,0.063,0.217,0,0.248l-0.217,0.529H33.442
l0.311-1.337c0.28-0.062,0.466,0.125,0.995-0.093c0.186,0,0.683-0.25,1.243-0.063c0.124-0.093-0.031-0.125,0.031-0.156
c-0.062-0.031,0.093-0.217,0.062-0.248c-0.311-0.094-1.088-0.156-1.43,0.031c-0.373,0.217-0.839,0.094-1.181,0.124l-1.119,4.818
c-0.622-0.248-1.368-0.404-2.083-0.404c-3.263,0-5.906,2.642-5.906,5.906c0,3.264,2.643,5.905,5.906,5.905
c3.202,0,5.875-2.642,5.875-5.905c0-2.394-1.461-4.414-3.481-5.347L33.069,53.031"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.155" stroke-miterlimit="3.863" d="M29.308,53.685
c0.342-0.03,0.621-0.124,0.963-0.124c3.482,0,6.342,2.891,6.342,6.403c0,0.218,0,0.435-0.031,0.622"/>
<path fill="#0071B3" d="M30.738,59.248c-0.156-0.092-0.311-0.062-0.467-0.062c-0.497,0-0.901,0.404-0.901,0.839
c0,0.498,0.404,0.84,0.901,0.84c0.342,0,0.715-0.217,0.809-0.59h4.476c-0.187,2.828-2.487,5.004-5.285,5.004
c-2.984,0-5.377-2.394-5.377-5.347c0-2.983,2.393-5.378,5.377-5.378c0.684,0,1.306,0.188,1.99,0.405l-0.373,1.461
C31.67,57.26,31.422,58.223,30.738,59.248"/>
<path fill="#0071B3" d="M32.603,55.146l-0.373,1.523c-0.187,0.684-0.777,2.207-1.244,2.798c0,0.124,0.094,0.279,0.125,0.404h4.445
C35.525,57.757,34.343,55.984,32.603,55.146z"/>
<path fill="none" stroke="#0071B3" stroke-width="0" stroke-miterlimit="3.863" d="M32.603,55.146l-0.373,1.523
c-0.187,0.684-0.777,2.207-1.244,2.798c0,0.124,0.094,0.279,0.125,0.404h4.445C35.525,57.757,34.343,55.984,32.603,55.146z"/>
<path fill="#0071B3" d="M33.162,52.722l0.187-0.933h11.19l-3.107,6.559c-0.156-0.063-0.25-0.125-0.467-0.125v-1.865h0.248v-0.342
h-0.808v0.342h0.249v1.897c-0.482,0.046-0.56,0.187-0.777,0.403L33.162,52.722"/>
<path fill="#0071B3" d="M50.477,59.373l3.543-1.959c0.404,0.809,0.654,1.68,0.654,2.55c0,2.952-2.395,5.378-5.379,5.378
c-2.859,0-5.191-2.238-5.283-5.129h4.133c0.063,0.559,0.592,0.994,1.15,0.994c0.684,0,1.244-0.559,1.244-1.243
c0-0.218-0.031-0.373-0.094-0.528"/>
<path fill="#0071B3" d="M50.26,59.187l3.574-1.989c-0.964-1.522-2.581-2.549-4.57-2.549c-0.808,0-1.646,0.187-2.361,0.528
l2.02,3.699c0.094-0.063,0.28-0.093,0.373-0.093C49.668,58.783,50.01,58.938,50.26,59.187"/>
<path fill="#0071B3" d="M46.592,55.426l2.02,3.668c-0.186,0.217-0.404,0.466-0.436,0.746H43.98c0.031-1.865,1.057-3.514,2.549-4.445
"/>
<path fill="#0071B3" d="M44.727,52.1l-2.892,6.403c0.373,0.311,0.716,0.808,0.746,1.368h0.901c0.063-2.084,1.15-3.918,2.828-4.942
L44.727,52.1"/>
<path fill="none" stroke="#FFFFFF" stroke-width="0.155" stroke-miterlimit="3.863" d="M43.078,60.959
c-0.063-0.311-0.093-0.653-0.093-0.995c0-3.513,2.891-6.403,6.372-6.403c2.643,0,4.85,1.616,5.844,3.792"/>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 108 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 116 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 115 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 124 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 128.02 128.07" xmlns="http://www.w3.org/2000/svg">
<path d="m119.44 96.041c-17.673 30.611-56.815 41.099-87.426 23.426-30.611-17.673-41.099-56.815-23.426-87.426 17.673-30.611 56.815-41.099 87.426-23.426 30.611 17.673 41.099 56.815 23.426 87.426" fill="#ca72e2" stroke-width=".2"/>
<g stroke-width=".2">
<path d="m68.002 128.04c3.3659-0.17764 6.7162-0.69606 10-1.395l47.121-81.461c-1.0366-3.1937-1.7042-5.7055-4.1211-9 0 0-53 92-53 91.856z" fill-opacity=".2"/>
<path d="m96.003 8.6514c-10.102-5.8323-21.132-8.5793-32.014-8.5666l-55.412 95.977c5.4299 9.4304 13.324 17.609 23.426 23.441 10.084 5.8218 21.092 8.5693 31.955 8.5666l55.441-96.027c-5.4291-9.4089-13.313-17.569-23.396-23.39z" fill="#999"/>
<path d="m119.46 32-55.416 95.983c3.2446-3e-3 6.4749-0.24979 9.6645-0.73946l49.943-86.504c-1.1707-3.0071-2.5725-5.9278-4.1919-8.7395z" fill="#fff"/>
<path d="m64.034-1.9691e-6c-3.2446 0.0033555-6.4749 0.24979-9.6645 0.73946l-49.943 86.504c1.1707 3.0071 2.5725 5.9278 4.1919 8.7395z" fill="#fff"/>
</g>
<path d="m53.154 68.99a10.139 10.139 0 0 1-13.85 3.7111 10.139 10.139 0 0 1-3.7111-13.85 10.139 10.139 0 0 1 13.85-3.7111 10.139 10.139 0 0 1 3.7111 13.85m28.615 16.519a10.139 10.139 0 0 1-13.85 3.7111 10.139 10.139 0 0 1-3.7111-13.85 10.139 10.139 0 0 1 13.85-3.7111 10.139 10.139 0 0 1 3.7111 13.85m-24.705-32.295 3.3174 19.883 12.683 7.3225-0.93937-18.51-15.061-8.6955m16.892 5.5248 3.8679 2.2226m-17.442 12.136 13.574-14.358m-29.428 5.205 17.964-15.856 6.3415 3.6613" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" style="paint-order:normal"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,173 @@
[
{
"authors": [
"Dávid Gladiš",
"Hannah Declerck"
],
"path": "cycle-infra.svg",
"license": "CC-BY",
"sources": [
"https://thenounproject.com/davidgladis/collection/bicycles/?i=808040"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_road_sign_D07.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_road_sign_D07.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_road_sign_D09.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_road_sign_D09.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_road_sign_D10.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_road_sign_D10.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_traffic_sign_M6.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_traffic_sign_M6.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_traffic_sign_M7.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_traffic_sign_M7.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_traffic_sign_M13.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_traffic_sign_M13.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_traffic_sign_M14.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_traffic_sign_M14.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_traffic_sign_M15.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_traffic_sign_M15.svg"
]
},
{
"authors": [
"Belgische Wetgever"
],
"path": "Belgian_traffic_sign_M16.svg",
"license": "CC0",
"sources": [
"https://commons.wikimedia.org/wiki/File:Belgian_traffic_sign_M16.svg"
]
},
{
"authors": [
"Supaplex030"
],
"path": "Cycle_barrier_single.png",
"license": "CC-BY-SA 4.0",
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Cycle_barrier_single.png"
]
},
{
"authors": [
"Supaplex030"
],
"path": "Cycle_barrier_double.png",
"license": "CC-BY-SA 4.0",
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Cycle_barrier_double.png"
]
},
{
"authors": [
"Supaplex030"
],
"path": "Cycle_barrier_triple.png",
"license": "CC-BY-SA 4.0",
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Cycle_barrier_triple.png"
]
},
{
"authors": [
"Supaplex030"
],
"path": "Cycle_barrier_angular.png",
"license": "CC-BY-SA 4.0",
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Cycle_barrier_angular.png"
]
},
{
"authors": [
"Supaplex030"
],
"path": "Cycle_barrier_squeeze.png",
"license": "CC-BY-SA 4.0",
"sources": [
"https://wiki.openstreetmap.org/wiki/File:Cycle_barrier_squeeze.png"
]
},
{
"authors": [
"Tobias Zwick"
],
"path": "street.svg",
"license": "CC-BY-SA 4.0",
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/quest%20icons/street.svg"
]
},
{
"authors": [
"Tobias Zwick"
],
"path": "bicycleway.svg",
"license": "CC-BY-SA 4.0",
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/quest%20icons/bicycleway.svg"
]
}
]

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 128.02 128.07" xmlns="http://www.w3.org/2000/svg">
<path d="m119.44 96.041c-17.673 30.611-56.815 41.099-87.426 23.426-30.611-17.673-41.099-56.815-23.426-87.426 17.673-30.611 56.815-41.099 87.426-23.426 30.611 17.673 41.099 56.815 23.426 87.426" fill="#fd5" stroke-width=".2"/>
<g>
<path d="m96.003 8.6514c-10.102-5.8323-21.132-8.5793-32.014-8.5666l-55.412 95.977c5.4299 9.4304 13.324 17.609 23.426 23.441 10.084 5.8218 21.092 8.5693 31.955 8.5666l55.441-96.027c-5.4291-9.4089-13.313-17.569-23.396-23.39z" fill="#999" stroke-width=".2"/>
<path d="m34.547 107.07 6.9282 4-6 10.392-6.9282-4z" fill="#fff" style="paint-order:stroke fill markers"/>
<path d="m52.547 75.897 6.9282 4-10 17.321-6.9282-4z" fill="#fff" style="paint-order:stroke fill markers"/>
<path d="m68.003 128.04c3.3659-0.17764 6.7162-0.69607 10-1.395l47.121-81.461c-1.0366-3.1937-1.7042-5.7055-4.1211-9 0 0-53 92-53 91.856z" fill-opacity=".2" stroke-width=".2"/>
<path d="m70.547 44.72 6.9282 4-10 17.321-6.9282-4z" fill="#fff" style="paint-order:stroke fill markers"/>
<path d="m88.547 13.543 6.9282 4-10 17.321-6.9282-4z" fill="#fff" style="paint-order:stroke fill markers"/>
<path d="m119.46 32-55.416 95.983c3.2446-3e-3 6.4749-0.24979 9.6645-0.73946l49.943-86.504c-1.1707-3.0071-2.5725-5.9278-4.1919-8.7395z" fill="#fff" stroke-width=".2"/>
<path d="m64.034-1.9691e-6c-3.2446 0.0033555-6.4749 0.24979-9.6645 0.73946l-49.943 86.504c1.1707 3.0071 2.5725 5.9278 4.1919 8.7395z" fill="#fff" stroke-width=".2"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -1,5 +1,5 @@
{
"id": "fietsstraten",
"id": "cyclestreets",
"version": "2020-08-30",
"title": {
"nl": "Fietsstraten",
@ -68,7 +68,7 @@
]
},
"then": {
"nl": "Deze straat is een fietsstraat",
"nl": "Deze straat i een fietsstraat",
"en": "This street is a cyclestreet",
"ja": "この通りはcyclestreetだ",
"nb_NO": "Denne gaten er en sykkelvei"

View file

@ -330,7 +330,6 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "circle:white;./assets/themes/facadegardens/geveltuin.svg",
"mappings": [

View file

@ -1,5 +1,5 @@
{
"id": "boomgaarden",
"id": "fruit_trees",
"title": {
"nl": "Open Boomgaardenkaart"
},
@ -43,7 +43,6 @@
"tagRenderings": [
"images"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/buurtnatuur/forest.svg"
},
@ -143,7 +142,6 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/fruit_trees/fruit_tree.svg"
},

View file

@ -173,7 +173,6 @@
}
}
],
"hideUnderlayingFeaturesMinPercentage": 0,
"label": {
"mappings": [
{

View file

@ -258,7 +258,6 @@
},
"images"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/hailhydrant/hydrant.svg"
},
@ -365,7 +364,6 @@
},
"images"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/hailhydrant/Twemoji12_1f9ef.svg"
},
@ -568,7 +566,6 @@
},
"images"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/hailhydrant/Twemoji12_1f692.svg"
},
@ -744,7 +741,6 @@
},
"images"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/hailhydrant/Twemoji_1f691.svg"
},

View file

@ -305,7 +305,6 @@
"questions",
"reviews"
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
"render": "./assets/themes/shops/shop.svg"
},

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Before After
Before After

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