Merge branch 'develop'

This commit is contained in:
Pieter Vander Vennet 2022-02-22 16:13:59 +01:00
commit 5b13d3f25c
129 changed files with 4562 additions and 387 deletions

View file

@ -426,6 +426,16 @@
"items": { "items": {
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
} }
},
"syncSelection": {
"description": "If set, synchronizes wether or not this layer is selected.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes",
"enum": [
"global",
"local",
"no",
"theme-only"
],
"type": "string"
} }
}, },
"required": [ "required": [
@ -602,11 +612,32 @@
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -426,6 +426,16 @@ export default {
"items": { "items": {
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
} }
},
"syncSelection": {
"description": "If set, synchronizes wether or not this layer is selected.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes",
"enum": [
"global",
"local",
"no",
"theme-only"
],
"type": "string"
} }
}, },
"required": [ "required": [
@ -600,11 +610,32 @@ export default {
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -456,11 +456,32 @@
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",
@ -1314,6 +1335,16 @@
"items": { "items": {
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
} }
},
"syncSelection": {
"description": "If set, synchronizes wether or not this layer is selected.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes",
"enum": [
"global",
"local",
"no",
"theme-only"
],
"type": "string"
} }
}, },
"required": [ "required": [

View file

@ -454,11 +454,32 @@ export default {
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",
@ -1304,6 +1325,16 @@ export default {
"items": { "items": {
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
} }
},
"syncSelection": {
"description": "If set, synchronizes wether or not this layer is selected.\n\nno: Do not sync at all, always revert to default\nlocal: keep selection on local storage\ntheme-only: sync via OSM, but this layer will only be toggled in this theme\nglobal: all layers with this ID will be synced accross all themes",
"enum": [
"global",
"local",
"no",
"theme-only"
],
"type": "string"
} }
}, },
"required": [ "required": [

View file

@ -256,11 +256,32 @@
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -254,11 +254,32 @@ export default {
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -260,11 +260,32 @@
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -258,11 +258,32 @@ export default {
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -96,11 +96,32 @@
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -96,11 +96,32 @@ export default {
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -204,11 +204,32 @@
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -202,11 +202,32 @@ export default {
] ]
}, },
"then": { "then": {
"description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\ntype: rendered" "description": "If the condition `if` is met, the text `then` will be rendered.\nIf not known yet, the user will be presented with `then` as an option\nType: rendered"
}, },
"icon": { "icon": {
"description": "An icon supporting this mapping; typically shown pretty small\nType: icon", "description": "An icon supporting this mapping; typically shown pretty small\nType: icon",
"type": "string" "anyOf": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
}, },
"hideInAnswer": { "hideInAnswer": {
"description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}", "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\n\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\n\nTo demonstrate an example making a default assumption:\n\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\n\n\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\n\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\n\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n \n ]\n}\n\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}",

View file

@ -528,7 +528,7 @@ function stackHists<K, V>(hists: [V, Histogram<K>][]): [V, Histogram<K>][] {
runningTotals.bumpHist(hist) runningTotals.bumpHist(hist)
result.push([vhist[0], clone]) result.push([vhist[0], clone])
}) })
result.reverse() result.reverse(/* Changes in place, safe copy*/)
return result return result
} }

View file

@ -239,7 +239,7 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL
prefered = preferedCategory.data; prefered = preferedCategory.data;
} }
prefered.reverse(); prefered.reverse(/*New list, inplace reverse is fine*/);
for (const category of prefered) { for (const category of prefered) {
//Then sort all 'photo'-layers to the top. Stability of the sorting will force a 'best' photo layer on top //Then sort all 'photo'-layers to the top. Stability of the sorting will force a 'best' photo layer on top
available.sort((a, b) => { available.sort((a, b) => {

View file

@ -75,7 +75,7 @@ export default class FeaturePipeline {
this.state = state; this.state = state;
const self = this const self = this
const expiryInSeconds = Math.min(...state.layoutToUse.layers.map(l => l.maxAgeOfCache)) const expiryInSeconds = Math.min(...state.layoutToUse?.layers?.map(l => l.maxAgeOfCache) ?? [])
this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds); this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds);
this.osmSourceZoomLevel = state.osmApiTileSize.data; this.osmSourceZoomLevel = state.osmApiTileSize.data;
const useOsmApi = state.locationControl.map(l => l.zoom > (state.overpassMaxZoom.data ?? 12)) const useOsmApi = state.locationControl.map(l => l.zoom > (state.overpassMaxZoom.data ?? 12))

View file

@ -74,7 +74,7 @@ export default class ChangeGeometryApplicator implements FeatureSourceForLayer {
// We only apply the last change as that one'll have the latest geometry // We only apply the last change as that one'll have the latest geometry
const change = changesForFeature[changesForFeature.length - 1] const change = changesForFeature[changesForFeature.length - 1]
copy.feature.geometry = ChangeDescriptionTools.getGeojsonGeometry(change) copy.feature.geometry = ChangeDescriptionTools.getGeojsonGeometry(change)
console.log("Applying a geometry change onto ", feature, change, copy) console.log("Applying a geometry change onto:", feature,"The change is:", change,"which becomes:", copy)
newFeatures.push(copy) newFeatures.push(copy)
} }
this.features.setData(newFeatures) this.features.setData(newFeatures)

View file

@ -79,7 +79,7 @@ export default class OsmFeatureSource {
}) })
const neededLayers = options.state.layoutToUse.layers const neededLayers = (options.state.layoutToUse?.layers ?? [])
.filter(layer => !layer.doNotDownload) .filter(layer => !layer.doNotDownload)
.filter(layer => layer.source.geojsonSource === undefined || layer.source.isOsmCacheLayer) .filter(layer => layer.source.geojsonSource === undefined || layer.source.isOsmCacheLayer)
this.allowedTags = new Or(neededLayers.map(l => l.source.osmTags)) this.allowedTags = new Or(neededLayers.map(l => l.source.osmTags))

View file

@ -81,7 +81,7 @@ export class ChangeDescriptionTools {
case "way": case "way":
const w = new OsmWay(change.id) const w = new OsmWay(change.id)
w.nodes = change.changes["nodes"] w.nodes = change.changes["nodes"]
w.coordinates = change.changes["coordinates"].map(coor => coor.reverse()) w.coordinates = change.changes["coordinates"].map(([lon, lat]) => [lat, lon])
return w.asGeoJson().geometry return w.asGeoJson().geometry
case "relation": case "relation":
const r = new OsmRelation(change.id) const r = new OsmRelation(change.id)

View file

@ -33,12 +33,12 @@ export default class CreateMultiPolygonWithPointReuseAction extends OsmCreateAct
super(null, true); super(null, true);
this._tags = [...tags, new Tag("type", "multipolygon")]; this._tags = [...tags, new Tag("type", "multipolygon")];
this.changeType = changeType; this.changeType = changeType;
this.theme = state.layoutToUse.id this.theme = state?.layoutToUse?.id ?? ""
this.createOuterWay = new CreateWayWithPointReuseAction([], outerRingCoordinates, state, config) this.createOuterWay = new CreateWayWithPointReuseAction([], outerRingCoordinates, state, config)
this.createInnerWays = innerRingsCoordinates.map(ringCoordinates => this.createInnerWays = innerRingsCoordinates.map(ringCoordinates =>
new CreateNewWayAction([], new CreateNewWayAction([],
ringCoordinates.map(([lon, lat]) => ({lat, lon})), ringCoordinates.map(([lon, lat]) => ({lat, lon})),
{theme: state.layoutToUse.id})) {theme: state?.layoutToUse?.id}))
this.geojsonPreview = { this.geojsonPreview = {
type: "Feature", type: "Feature",

View file

@ -112,16 +112,25 @@ export default class CreateNewNodeAction extends OsmCreateAction {
const geojson = this._snapOnto.asGeoJson() const geojson = this._snapOnto.asGeoJson()
const projected = GeoOperations.nearestPoint(geojson, [this._lon, this._lat]) const projected = GeoOperations.nearestPoint(geojson, [this._lon, this._lat])
const projectedCoor= <[number, number]>projected.geometry.coordinates
const index = projected.properties.index const index = projected.properties.index
// We check that it isn't close to an already existing point // We check that it isn't close to an already existing point
let reusedPointId = undefined; let reusedPointId = undefined;
const prev = <[number, number]>geojson.geometry.coordinates[index] let outerring : [number,number][];
if (GeoOperations.distanceBetween(prev, <[number, number]>projected.geometry.coordinates) < this._reusePointDistance) {
if(geojson.geometry.type === "LineString"){
outerring = <[number, number][]> geojson.geometry.coordinates
}else if(geojson.geometry.type === "Polygon"){
outerring =<[number, number][]> geojson.geometry.coordinates[0]
}
const prev= outerring[index]
if (GeoOperations.distanceBetween(prev, projectedCoor) < this._reusePointDistance) {
// We reuse this point instead! // We reuse this point instead!
reusedPointId = this._snapOnto.nodes[index] reusedPointId = this._snapOnto.nodes[index]
} }
const next = <[number, number]>geojson.geometry.coordinates[index + 1] const next = outerring[index + 1]
if (GeoOperations.distanceBetween(next, <[number, number]>projected.geometry.coordinates) < this._reusePointDistance) { if (GeoOperations.distanceBetween(next, projectedCoor) < this._reusePointDistance) {
// We reuse this point instead! // We reuse this point instead!
reusedPointId = this._snapOnto.nodes[index + 1] reusedPointId = this._snapOnto.nodes[index + 1]
} }
@ -135,8 +144,7 @@ export default class CreateNewNodeAction extends OsmCreateAction {
}] }]
} }
const locations = [...this._snapOnto.coordinates] const locations = [...this._snapOnto.coordinates.map(([lat, lon]) =><[number,number]> [lon, lat])]
locations.forEach(coor => coor.reverse())
const ids = [...this._snapOnto.nodes] const ids = [...this._snapOnto.nodes]
locations.splice(index + 1, 0, [this._lon, this._lat]) locations.splice(index + 1, 0, [this._lon, this._lat])

View file

@ -33,7 +33,7 @@ export default class CreateNewWayAction extends OsmCreateAction {
We filter those here, as the CreateWayWithPointReuseAction delegates the actual creation to here. We filter those here, as the CreateWayWithPointReuseAction delegates the actual creation to here.
Filtering here also prevents similar bugs in other actions Filtering here also prevents similar bugs in other actions
*/ */
if(this.coordinates.length > 0 && this.coordinates[this.coordinates.length - 1].nodeId === coordinate.nodeId){ if(this.coordinates.length > 0 && coordinate.nodeId !== undefined && this.coordinates[this.coordinates.length - 1].nodeId === coordinate.nodeId){
// This is a duplicate id // This is a duplicate id
console.warn("Skipping a node in createWay to avoid a duplicate node:", coordinate,"\nThe previous coordinates are: ", this.coordinates) console.warn("Skipping a node in createWay to avoid a duplicate node:", coordinate,"\nThe previous coordinates are: ", this.coordinates)
continue continue

View file

@ -186,7 +186,7 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction {
} }
public async CreateChangeDescriptions(changes: Changes): Promise<ChangeDescription[]> { public async CreateChangeDescriptions(changes: Changes): Promise<ChangeDescription[]> {
const theme = this._state.layoutToUse.id const theme = this._state?.layoutToUse?.id
const allChanges: ChangeDescription[] = [] const allChanges: ChangeDescription[] = []
const nodeIdsToUse: { lat: number, lon: number, nodeId?: number }[] = [] const nodeIdsToUse: { lat: number, lon: number, nodeId?: number }[] = []
for (let i = 0; i < this._coordinateInfo.length; i++) { for (let i = 0; i < this._coordinateInfo.length; i++) {
@ -251,7 +251,7 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction {
const bbox = new BBox(coordinates) const bbox = new BBox(coordinates)
const state = this._state const state = this._state
const allNodes = [].concat(...state.featurePipeline.GetFeaturesWithin("type_node", bbox.pad(1.2))) const allNodes = [].concat(...state?.featurePipeline?.GetFeaturesWithin("type_node", bbox.pad(1.2))??[])
const maxDistance = Math.max(...this._config.map(c => c.withinRangeOfM)) const maxDistance = Math.max(...this._config.map(c => c.withinRangeOfM))
// Init coordianteinfo with undefined but the same length as coordinates // Init coordianteinfo with undefined but the same length as coordinates

View file

@ -28,6 +28,7 @@ export default class ReplaceGeometryAction extends OsmChangeAction {
/** /**
* The target coordinates that should end up in OpenStreetMap. * The target coordinates that should end up in OpenStreetMap.
* This is identical to either this.feature.geometry.coordinates or -in case of a polygon- feature.geometry.coordinates[0] * This is identical to either this.feature.geometry.coordinates or -in case of a polygon- feature.geometry.coordinates[0]
* Format: [lon, lat]
*/ */
private readonly targetCoordinates: [number, number][]; private readonly targetCoordinates: [number, number][];
/** /**
@ -540,8 +541,6 @@ export default class ReplaceGeometryAction extends OsmChangeAction {
id: nodeId, id: nodeId,
}) })
}) })
} }
return allChanges return allChanges

View file

@ -55,8 +55,8 @@ export class Changes {
// This doesn't matter however, as the '-1' is per piecewise upload, not global per changeset // This doesn't matter however, as the '-1' is per piecewise upload, not global per changeset
} }
private static createChangesetFor(csId: string, static createChangesetFor(csId: string,
allChanges: { allChanges: {
modifiedObjects: OsmObject[], modifiedObjects: OsmObject[],
newObjects: OsmObject[], newObjects: OsmObject[],
deletedObjects: OsmObject[] deletedObjects: OsmObject[]

View file

@ -207,27 +207,36 @@ export abstract class OsmObject {
return objects; return objects;
} }
/**
* Uses the list of polygon features to determine if the given tags are a polygon or not.
* */
protected static isPolygon(tags: any): boolean { protected static isPolygon(tags: any): boolean {
for (const tagsKey in tags) { for (const tagsKey in tags) {
if (!tags.hasOwnProperty(tagsKey)) { if (!tags.hasOwnProperty(tagsKey)) {
continue continue
} }
const polyGuide = OsmObject.polygonFeatures.get(tagsKey) const polyGuide : { values: Set<string>; blacklist: boolean } = OsmObject.polygonFeatures.get(tagsKey)
if (polyGuide === undefined) { if (polyGuide === undefined) {
continue continue
} }
if ((polyGuide.values === null)) { if ((polyGuide.values === null)) {
// We match all // .values is null, thus merely _having_ this key is enough to be a polygon (or if blacklist, being a line)
return !polyGuide.blacklist return !polyGuide.blacklist
} }
// is the key contained? // is the key contained? Then we have a match if the value is contained
return polyGuide.values.has(tags[tagsKey]) const doesMatch = polyGuide.values.has(tags[tagsKey])
if(polyGuide.blacklist){
return !doesMatch
}
return doesMatch
} }
return false;
} }
private static constructPolygonFeatures(): Map<string, { values: Set<string>, blacklist: boolean }> { private static constructPolygonFeatures(): Map<string, { values: Set<string>, blacklist: boolean }> {
const result = new Map<string, { values: Set<string>, blacklist: boolean }>(); const result = new Map<string, { values: Set<string>, blacklist: boolean }>();
for (const polygonFeature of polygon_features) { for (const polygonFeature of (polygon_features["default"] ?? polygon_features)) {
const key = polygonFeature.key; const key = polygonFeature.key;
if (polygonFeature.polygon === "all") { if (polygonFeature.polygon === "all") {
@ -381,7 +390,7 @@ export class OsmWay extends OsmObject {
} }
if (element.nodes === undefined) { if (element.nodes === undefined) {
console.log("PANIC") console.error("PANIC: no nodes!")
} }
for (const nodeId of element.nodes) { for (const nodeId of element.nodes) {
@ -417,7 +426,9 @@ export class OsmWay extends OsmObject {
} }
private isPolygon(): boolean { private isPolygon(): boolean {
if (this.coordinates[0] !== this.coordinates[this.coordinates.length - 1]) { // Compare lat and lon seperately, as the coordinate array might not be a reference to the same object
if (this.coordinates[0][0] !== this.coordinates[this.coordinates.length - 1][0] ||
this.coordinates[0][1] !== this.coordinates[this.coordinates.length - 1][1] ) {
return false; // Not closed return false; // Not closed
} }
return OsmObject.isPolygon(this.tags) return OsmObject.isPolygon(this.tags)

View file

@ -25,7 +25,7 @@ export default class FeaturePipelineState extends MapState {
constructor(layoutToUse: LayoutConfig) { constructor(layoutToUse: LayoutConfig) {
super(layoutToUse); super(layoutToUse);
const clustering = layoutToUse.clustering const clustering = layoutToUse?.clustering
this.featureAggregator = TileHierarchyAggregator.createHierarchy(this); this.featureAggregator = TileHierarchyAggregator.createHierarchy(this);
const clusterCounter = this.featureAggregator const clusterCounter = this.featureAggregator
const self = this; const self = this;

View file

@ -117,10 +117,12 @@ export default class MapState extends UserRelatedState {
}) })
this.overlayToggles = this.layoutToUse.tileLayerSources.filter(c => c.name !== undefined).map(c => ({ this.overlayToggles = this.layoutToUse?.tileLayerSources
?.filter(c => c.name !== undefined)
?.map(c => ({
config: c, config: c,
isDisplayed: QueryParameters.GetBooleanQueryParameter("overlay-" + c.id, c.defaultState, "Wether or not the overlay " + c.id + " is shown") isDisplayed: QueryParameters.GetBooleanQueryParameter("overlay-" + c.id, c.defaultState, "Wether or not the overlay " + c.id + " is shown")
})) })) ?? []
this.filteredLayers = this.InitializeFilteredLayers() this.filteredLayers = this.InitializeFilteredLayers()
@ -142,7 +144,7 @@ export default class MapState extends UserRelatedState {
initialized.add(overlayToggle.config) initialized.add(overlayToggle.config)
} }
for (const tileLayerSource of this.layoutToUse.tileLayerSources) { for (const tileLayerSource of this.layoutToUse?.tileLayerSources ?? []) {
if (initialized.has(tileLayerSource)) { if (initialized.has(tileLayerSource)) {
continue continue
} }
@ -153,28 +155,14 @@ export default class MapState extends UserRelatedState {
private lockBounds() { private lockBounds() {
const layout = this.layoutToUse; const layout = this.layoutToUse;
if (layout.lockLocation) { if (!layout?.lockLocation) {
if (layout.lockLocation === true) { return;
const tile = Tiles.embedded_tile(
layout.startLat,
layout.startLon,
layout.startZoom - 1
);
const bounds = Tiles.tile_bounds(tile.z, tile.x, tile.y);
// We use the bounds to get a sense of distance for this zoom level
const latDiff = bounds[0][0] - bounds[1][0];
const lonDiff = bounds[0][1] - bounds[1][1];
layout.lockLocation = [
[layout.startLat - latDiff, layout.startLon - lonDiff],
[layout.startLat + latDiff, layout.startLon + lonDiff],
];
}
console.warn("Locking the bounds to ", layout.lockLocation);
this.mainMapObject.installBounds(
new BBox(layout.lockLocation),
this.featureSwitchIsTesting.data
)
} }
console.warn("Locking the bounds to ", layout.lockLocation);
this.mainMapObject.installBounds(
new BBox(layout.lockLocation),
this.featureSwitchIsTesting.data
)
} }
private initCurrentView() { private initCurrentView() {
@ -364,8 +352,10 @@ export default class MapState extends UserRelatedState {
} }
private InitializeFilteredLayers() { private InitializeFilteredLayers() {
const layoutToUse = this.layoutToUse; const layoutToUse = this.layoutToUse;
if(layoutToUse === undefined){
return new UIEventSource<FilteredLayer[]>([])
}
const flayers: FilteredLayer[] = []; const flayers: FilteredLayer[] = [];
for (const layer of layoutToUse.layers) { for (const layer of layoutToUse.layers) {
let isDisplayed: UIEventSource<boolean> let isDisplayed: UIEventSource<boolean>

View file

@ -61,7 +61,7 @@ export default class Constants {
* For every bin, the totals are uploaded as metadata * For every bin, the totals are uploaded as metadata
*/ */
static distanceToChangeObjectBins = [25, 50, 100, 500, 1000, 5000, Number.MAX_VALUE] static distanceToChangeObjectBins = [25, 50, 100, 500, 1000, 5000, Number.MAX_VALUE]
static themeOrder = ["personal", "cyclofix", "hailhydrant", "bookcases", "toilets", "aed"]; static themeOrder = ["personal", "cyclofix", "waste" , "etymology", "food","cafes_and_pubs", "playgrounds", "hailhydrant", "toilets", "aed", "bookcases"];
private static isRetina(): boolean { private static isRetina(): boolean {
if (Utils.runningFromConsole) { if (Utils.runningFromConsole) {

View file

@ -6,51 +6,70 @@ import * as tagrenderingmetapaths from "../../../assets/tagrenderingconfigmeta.j
export class ExtractImages extends Conversion<LayoutConfigJson, string[]> { export class ExtractImages extends Conversion<LayoutConfigJson, string[]> {
private _isOfficial: boolean; private _isOfficial: boolean;
constructor(isOfficial: boolean) { private _sharedTagRenderings: Map<string, any>;
private static readonly layoutMetaPaths = (metapaths["default"] ?? metapaths).filter(mp => mp.typeHint !== undefined && (mp.typeHint === "image" || mp.typeHint === "icon"))
private static readonly tagRenderingMetaPaths = (tagrenderingmetapaths["default"] ?? tagrenderingmetapaths).filter(trpath => trpath.typeHint === "rendered")
constructor(isOfficial: boolean, sharedTagRenderings: Map<string, any>) {
super("Extract all images from a layoutConfig using the meta paths",[],"ExctractImages"); super("Extract all images from a layoutConfig using the meta paths",[],"ExctractImages");
this._isOfficial = isOfficial; this._isOfficial = isOfficial;
this._sharedTagRenderings = sharedTagRenderings;
} }
convert(json: LayoutConfigJson, context: string): { result: string[], errors: string[], warnings: string[] } { convert(json: LayoutConfigJson, context: string): { result: string[], errors: string[], warnings: string[] } {
const paths = metapaths["default"] ?? metapaths const allFoundImages : string[] = []
const trpaths = tagrenderingmetapaths["default"] ?? tagrenderingmetapaths
const allFoundImages = []
const errors = [] const errors = []
const warnings = [] const warnings = []
for (const metapath of paths) { for (const metapath of ExtractImages.layoutMetaPaths) {
if (metapath.typeHint === undefined) {
continue
}
if (metapath.typeHint !== "image" && metapath.typeHint !== "icon") {
continue
}
const mightBeTr = Array.isArray(metapath.type) && metapath.type.some(t => t["$ref"] == "#/definitions/TagRenderingConfigJson") const mightBeTr = Array.isArray(metapath.type) && metapath.type.some(t => t["$ref"] == "#/definitions/TagRenderingConfigJson")
const found = Utils.CollectPath(metapath.path, json) const found = Utils.CollectPath(metapath.path, json)
if (mightBeTr) { if (mightBeTr) {
// We might have tagRenderingConfigs containing icons here // We might have tagRenderingConfigs containing icons here
for (const foundImage of found) { for (const el of found) {
const path = el.path
const foundImage = el.leaf;
if (typeof foundImage === "string") { if (typeof foundImage === "string") {
if(foundImage == ""){
warnings.push(context+"."+path.join(".")+" Found an empty image")
}
if(this._sharedTagRenderings?.has(foundImage)){
// This is not an image, but a shared tag rendering
continue
}
allFoundImages.push(foundImage) allFoundImages.push(foundImage)
} else{ } else{
// This is a tagRendering where every rendered value might be an icon! // This is a tagRendering where every rendered value might be an icon!
for (const trpath of trpaths) { for (const trpath of ExtractImages.tagRenderingMetaPaths) {
if (trpath.typeHint !== "rendered") {
continue
}
const fromPath = Utils.CollectPath(trpath.path, foundImage) const fromPath = Utils.CollectPath(trpath.path, foundImage)
for (const img of fromPath) { for (const img of fromPath) {
if (typeof img !== "string") { if (typeof img.leaf !== "string") {
(this._isOfficial ? errors: warnings).push(context+": found an image path that is not a path at " + context + "." + metapath.path.join(".") + ": " + JSON.stringify(img)) (this._isOfficial ? errors: warnings).push(context+"."+img.path.join(".")+": found an image path that is not a string: " + JSON.stringify(img.leaf))
}
}
allFoundImages.push(...fromPath.map(i => i.leaf).filter(i => typeof i=== "string"))
for (const pathAndImg of fromPath) {
if(pathAndImg.leaf === "" || pathAndImg.leaf["path"] == ""){
warnings.push(context+[...path,...pathAndImg.path].join(".")+": Found an empty image at ")
} }
} }
allFoundImages.push(...fromPath.filter(i => typeof i === "string"))
} }
} }
} }
} else { } else {
allFoundImages.push(...found) for (const foundElement of found) {
if(foundElement.leaf === ""){
warnings.push(context+"."+foundElement.path.join(".")+" Found an empty image")
continue
}
allFoundImages.push(foundElement.leaf)
}
} }
} }
@ -58,6 +77,7 @@ export class ExtractImages extends Conversion<LayoutConfigJson, string[]> {
.map(img => img["path"] ?? img) .map(img => img["path"] ?? img)
.map(img => img.split(";"))) .map(img => img.split(";")))
.map(img => img.split(":")[0]) .map(img => img.split(":")[0])
.filter(img => img !== "")
return {result: Utils.Dedup(splitParts), errors, warnings}; return {result: Utils.Dedup(splitParts), errors, warnings};
} }
@ -108,7 +128,7 @@ export class FixImages extends DesugaringStep<LayoutConfigJson> {
continue continue
} }
const mightBeTr = Array.isArray(metapath.type) && metapath.type.some(t => t["$ref"] == "#/definitions/TagRenderingConfigJson") const mightBeTr = Array.isArray(metapath.type) && metapath.type.some(t => t["$ref"] == "#/definitions/TagRenderingConfigJson")
Utils.WalkPath(metapath.path, json, leaf => { Utils.WalkPath(metapath.path, json, (leaf, path) => {
if (typeof leaf === "string") { if (typeof leaf === "string") {
return replaceString(leaf) return replaceString(leaf)
} }

View file

@ -126,6 +126,11 @@ class UpdateLegacyTheme extends DesugaringStep<LayoutConfigJson> {
convert(json: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors: string[]; warnings: string[] } { convert(json: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors: string[]; warnings: string[] } {
const oldThemeConfig = {...json} const oldThemeConfig = {...json}
if(oldThemeConfig.socialImage === ""){
delete oldThemeConfig.socialImage
}
if (oldThemeConfig["roamingRenderings"] !== undefined) { if (oldThemeConfig["roamingRenderings"] !== undefined) {
if (oldThemeConfig["roamingRenderings"].length == 0) { if (oldThemeConfig["roamingRenderings"].length == 0) {

View file

@ -75,14 +75,14 @@ class ExpandTagRendering extends Conversion<string | TagRenderingConfigJson | {
if (typeof tr === "string") { if (typeof tr === "string") {
const lookup = this.lookup(tr); const lookup = this.lookup(tr);
if (lookup !== undefined) { if (lookup === undefined) {
return lookup warnings.push(ctx + "A literal rendering was detected: " + tr)
return [{
render: tr,
id: tr.replace(/![a-zA-Z0-9]/g, "")
}]
} }
warnings.push(ctx + "A literal rendering was detected: " + tr) return lookup
return [{
render: tr,
id: tr.replace(/![a-zA-Z0-9]/g, "")
}]
} }
if (tr["builtin"] !== undefined) { if (tr["builtin"] !== undefined) {
@ -122,7 +122,7 @@ class ExpandTagRendering extends Conversion<string | TagRenderingConfigJson | {
const result = [] const result = []
for (const tr of trs) { for (const tr of trs) {
if (tr["builtin"] !== undefined) { if (typeof tr === "string" || tr["builtin"] !== undefined) {
const stable = this.convertUntilStable(tr, warnings, errors, ctx + "(RECURSIVE RESOLVE)") const stable = this.convertUntilStable(tr, warnings, errors, ctx + "(RECURSIVE RESOLVE)")
result.push(...stable) result.push(...stable)
} else { } else {

View file

@ -432,8 +432,12 @@ export class PrepareTheme extends Fuse<LayoutConfigJson> {
new PreparePersonalTheme(state), new PreparePersonalTheme(state),
new OnEveryConcat("layers", new SubstituteLayer(state)), new OnEveryConcat("layers", new SubstituteLayer(state)),
new SetDefault("socialImage", "assets/SocialImage.png", true), new SetDefault("socialImage", "assets/SocialImage.png", true),
// We expand all tagrenderings first...
new OnEvery("layers", new PrepareLayer(state)), new OnEvery("layers", new PrepareLayer(state)),
// Then we apply the override all
new ApplyOverrideAll(), new ApplyOverrideAll(),
// And then we prepare all the layers _again_ in case that an override all contained unexpanded tagrenderings!
new OnEvery("layers", new PrepareLayer(state)),
new AddDefaultLayers(state), new AddDefaultLayers(state),
new AddDependencyLayersToTheme(state), new AddDependencyLayersToTheme(state),
new AddImportLayers(), new AddImportLayers(),

View file

@ -12,6 +12,7 @@ import {ExtractImages} from "./FixImages";
import ScriptUtils from "../../../scripts/ScriptUtils"; import ScriptUtils from "../../../scripts/ScriptUtils";
import {And} from "../../../Logic/Tags/And"; import {And} from "../../../Logic/Tags/And";
import Translations from "../../../UI/i18n/Translations"; import Translations from "../../../UI/i18n/Translations";
import Svg from "../../../Svg";
class ValidateLanguageCompleteness extends DesugaringStep<any> { class ValidateLanguageCompleteness extends DesugaringStep<any> {
@ -50,12 +51,14 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
private readonly _path?: string; private readonly _path?: string;
private readonly knownImagePaths: Set<string>; private readonly knownImagePaths: Set<string>;
private readonly _isBuiltin: boolean; private readonly _isBuiltin: boolean;
private _sharedTagRenderings: Map<string, any>;
constructor(knownImagePaths: Set<string>, path: string, isBuiltin: boolean) { constructor(knownImagePaths: Set<string>, path: string, isBuiltin: boolean, sharedTagRenderings: Map<string, any>) {
super("Doesn't change anything, but emits warnings and errors", [], "ValidateTheme"); super("Doesn't change anything, but emits warnings and errors", [], "ValidateTheme");
this.knownImagePaths = knownImagePaths; this.knownImagePaths = knownImagePaths;
this._path = path; this._path = path;
this._isBuiltin = isBuiltin; this._isBuiltin = isBuiltin;
this._sharedTagRenderings = sharedTagRenderings;
} }
convert(json: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors: string[], warnings: string[], information: string[] } { convert(json: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors: string[], warnings: string[], information: string[] } {
@ -78,7 +81,7 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
} }
{ {
// Check images: are they local, are the licenses there, is the theme icon square, ... // Check images: are they local, are the licenses there, is the theme icon square, ...
const images = new ExtractImages(this._isBuiltin).convertStrict(json, "validation") const images = new ExtractImages(this._isBuiltin, this._sharedTagRenderings).convertStrict(json, "validation")
const remoteImages = images.filter(img => img.indexOf("http") == 0) const remoteImages = images.filter(img => img.indexOf("http") == 0)
for (const remoteImage of remoteImages) { for (const remoteImage of remoteImages) {
errors.push("Found a remote image: " + remoteImage + " in theme " + json.id + ", please download it.") errors.push("Found a remote image: " + remoteImage + " in theme " + json.id + ", please download it.")
@ -93,8 +96,11 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
continue continue
} }
if (image.match(/[a-z]*/)) { if (image.match(/[a-z]*/)) {
// This is a builtin img, e.g. 'checkmark' or 'crosshair'
continue; if(Svg.All[image + ".svg"] !== undefined){
// This is a builtin img, e.g. 'checkmark' or 'crosshair'
continue;
}
} }
if (this.knownImagePaths !== undefined && !this.knownImagePaths.has(image)) { if (this.knownImagePaths !== undefined && !this.knownImagePaths.has(image)) {
@ -163,10 +169,10 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
} }
export class ValidateThemeAndLayers extends Fuse<LayoutConfigJson> { export class ValidateThemeAndLayers extends Fuse<LayoutConfigJson> {
constructor(knownImagePaths: Set<string>, path: string, isBuiltin: boolean) { constructor(knownImagePaths: Set<string>, path: string, isBuiltin: boolean, sharedTagRenderings: Map<string, any>) {
super("Validates a theme and the contained layers", super("Validates a theme and the contained layers",
new ValidateTheme(knownImagePaths, path, isBuiltin), new ValidateTheme(knownImagePaths, path, isBuiltin, sharedTagRenderings),
new OnEvery("layers", new ValidateLayer(knownImagePaths, undefined, false)) new OnEvery("layers", new ValidateLayer(undefined, false))
); );
} }
} }
@ -202,11 +208,29 @@ class OverrideShadowingCheck extends DesugaringStep<LayoutConfigJson> {
} }
class MiscThemeChecks extends DesugaringStep<LayoutConfigJson>{
constructor() {
super("Miscelleanous checks on the theme", [],"MiscThemesChecks");
}
convert(json: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors?: string[]; warnings?: string[]; information?: string[] } {
const warnings = []
if(json.socialImage === ""){
warnings.push("Social image for theme "+json.id+" is the emtpy string")
}
return {
result :json,
warnings
};
}
}
export class PrevalidateTheme extends Fuse<LayoutConfigJson> { export class PrevalidateTheme extends Fuse<LayoutConfigJson> {
constructor() { constructor() {
super("Various consistency checks on the raw JSON", super("Various consistency checks on the raw JSON",
new OverrideShadowingCheck() new OverrideShadowingCheck(),
new MiscThemeChecks()
); );
} }
@ -224,25 +248,32 @@ export class DetectShadowedMappings extends DesugaringStep<TagRenderingConfigJso
if (json.mappings === undefined || json.mappings.length === 0) { if (json.mappings === undefined || json.mappings.length === 0) {
return {result: json} return {result: json}
} }
const parsedConditions = json.mappings.map(m => TagUtils.Tag(m.if)) const parsedConditions = json.mappings.map(m => {
const ifTags = TagUtils.Tag(m.if);
if(m.hideInAnswer !== undefined && m.hideInAnswer !== false && m.hideInAnswer !== true){
let conditionTags = TagUtils.Tag( m.hideInAnswer)
// Merge the condition too!
return new And([conditionTags, ifTags])
}
return ifTags
})
for (let i = 0; i < json.mappings.length; i++) { for (let i = 0; i < json.mappings.length; i++) {
if(json.mappings[i].hideInAnswer === true){ if(!parsedConditions[i].isUsableAsAnswer()){
// There is no straightforward way to convert this mapping.if into a properties-object, so we simply skip this one
// Yes, it might be shadowed, but running this check is to difficult right now
continue continue
} }
const keyValues = parsedConditions[i].asChange({}); const keyValues = parsedConditions[i].asChange({});
const properties = [] const properties = {}
keyValues.forEach(({k, v}) => { keyValues.forEach(({k, v}) => {
properties[k] = v properties[k] = v
}) })
for (let j = 0; j < i; j++) { for (let j = 0; j < i; j++) {
if(json.mappings[j].hideInAnswer === true){
continue
}
const doesMatch = parsedConditions[j].matchesProperties(properties) const doesMatch = parsedConditions[j].matchesProperties(properties)
if (doesMatch) { if (doesMatch) {
// The current mapping is shadowed! // The current mapping is shadowed!
errors.push(`At ${context}: Mapping ${i} is shadowed by mapping ${j} and will thus never be shown: errors.push(`At ${context}: Mapping ${i} is shadowed by mapping ${j} and will thus never be shown:
The mapping ${parsedConditions[i].asHumanString(false, false, {})} is fully matched by a previous mapping, which matches: The mapping ${parsedConditions[i].asHumanString(false, false, {})} is fully matched by a previous mapping (namely ${j}), which matches:
${parsedConditions[j].asHumanString(false, false, {})}. ${parsedConditions[j].asHumanString(false, false, {})}.
Move the mapping up to fix this problem Move the mapping up to fix this problem
@ -252,6 +283,10 @@ export class DetectShadowedMappings extends DesugaringStep<TagRenderingConfigJso
} }
// TODO make this errors again
warnings.push(...errors)
errors.splice(0, errors.length)
return { return {
errors, errors,
warnings, warnings,
@ -265,22 +300,35 @@ export class DetectMappingsWithImages extends DesugaringStep<TagRenderingConfigJ
super("Checks that 'then'clauses in mappings don't have images, but use 'icon' instead", [], "DetectMappingsWithImages"); super("Checks that 'then'clauses in mappings don't have images, but use 'icon' instead", [], "DetectMappingsWithImages");
} }
convert(json: TagRenderingConfigJson, context: string): { result: TagRenderingConfigJson; errors?: string[]; warnings?: string[] } { convert(json: TagRenderingConfigJson, context: string): { result: TagRenderingConfigJson; errors?: string[]; warnings?: string[], information?: string[] } {
const errors = []
const warnings = [] const warnings = []
const information = []
if (json.mappings === undefined || json.mappings.length === 0) { if (json.mappings === undefined || json.mappings.length === 0) {
return {result: json} return {result: json}
} }
const ignoreToken = "ignore-image-in-then"
for (let i = 0; i < json.mappings.length; i++) { for (let i = 0; i < json.mappings.length; i++) {
const mapping = json.mappings[i] const mapping = json.mappings[i]
const ignore = mapping["#"]?.indexOf(ignoreToken) >=0
const images = Utils.Dedup(Translations.T(mapping.then).ExtractImages()) const images = Utils.Dedup(Translations.T(mapping.then).ExtractImages())
const ctx = `${context}.mappings[${i}]`
if (images.length > 0) { if (images.length > 0) {
warnings.push(context + ".mappings[" + i + "]: A mapping has an image in the 'then'-clause. Remove the image there and use `\"icon\": <your-image>` instead. The images found are "+images.join(", ")) if(!ignore){
errors.push(`${ctx}: A mapping has an image in the 'then'-clause. Remove the image there and use \`"icon": <your-image>\` instead. The images found are ${images.join(", ")}. (This check can be turned of by adding "#": "${ignoreToken}" in the mapping, but this is discouraged`)
}else{
information.push(`${ctx}: Ignored image ${images.join(", ")} in 'then'-clause of a mapping as this check has been disabled`)
}
}else if (ignore){
warnings.push(`${ctx}: unused '${ignoreToken}' - please remove this`)
} }
} }
return { return {
errors,
warnings, warnings,
information,
result: json result: json
}; };
} }
@ -289,8 +337,7 @@ export class DetectMappingsWithImages extends DesugaringStep<TagRenderingConfigJ
export class ValidateTagRenderings extends Fuse<TagRenderingConfigJson> { export class ValidateTagRenderings extends Fuse<TagRenderingConfigJson> {
constructor() { constructor() {
super("Various validation on tagRenderingConfigs", super("Various validation on tagRenderingConfigs",
// TODO enable these checks again new DetectShadowedMappings(),
// new DetectShadowedMappings(),
new DetectMappingsWithImages() new DetectMappingsWithImages()
); );
} }
@ -302,12 +349,10 @@ export class ValidateLayer extends DesugaringStep<LayerConfigJson> {
* @private * @private
*/ */
private readonly _path?: string; private readonly _path?: string;
private readonly knownImagePaths?: Set<string>;
private readonly _isBuiltin: boolean; private readonly _isBuiltin: boolean;
constructor(knownImagePaths: Set<string>, path: string, isBuiltin: boolean) { constructor(path: string, isBuiltin: boolean) {
super("Doesn't change anything, but emits warnings and errors", [], "ValidateLayer"); super("Doesn't change anything, but emits warnings and errors", [], "ValidateLayer");
this.knownImagePaths = knownImagePaths;
this._path = path; this._path = path;
this._isBuiltin = isBuiltin; this._isBuiltin = isBuiltin;
} }

View file

@ -115,7 +115,7 @@ export interface TagRenderingConfigJson {
/** /**
* If the condition `if` is met, the text `then` will be rendered. * If the condition `if` is met, the text `then` will be rendered.
* If not known yet, the user will be presented with `then` as an option * If not known yet, the user will be presented with `then` as an option
* type: rendered * Type: rendered
*/ */
then: string | any, then: string | any,
/** /**

View file

@ -71,7 +71,7 @@ export default class LayoutConfig {
this.credits = json.credits; this.credits = json.credits;
this.version = json.version; this.version = json.version;
this.language = json.mustHaveLanguage ?? Array.from(Object.keys(json.title)); this.language = json.mustHaveLanguage ?? Array.from(Object.keys(json.title));
this.usedImages = Array.from(new ExtractImages(official).convertStrict(json, "while extracting the images of " + json.id + " " + context ?? "")).sort() this.usedImages = Array.from(new ExtractImages(official, undefined).convertStrict(json, "while extracting the images of " + json.id + " " + context ?? "")).sort()
{ {
if (typeof json.title === "string") { if (typeof json.title === "string") {
throw `The title of a theme should always be a translation, as it sets the corresponding languages (${context}.title). The themenID is ${this.id}; the offending object is ${JSON.stringify(json.title)} which is a ${typeof json.title})` throw `The title of a theme should always be a translation, as it sets the corresponding languages (${context}.title). The themenID is ${this.id}; the offending object is ${JSON.stringify(json.title)} which is a ${typeof json.title})`

View file

@ -338,7 +338,8 @@ export default class TagRenderingConfig {
const free = this.freeform?.key const free = this.freeform?.key
if (free !== undefined) { if (free !== undefined) {
return tags[free] !== undefined const value = tags[free]
return value !== undefined && value !== ""
} }
return false return false

View file

@ -93,7 +93,7 @@ export default class Histogram<T> extends VariableUiElement {
keys.sort() keys.sort()
break; break;
case "name-rev": case "name-rev":
keys.sort().reverse() keys.sort().reverse(/*Copy of array, inplace reverse if fine*/)
break; break;
case "count": case "count":
keys.sort((k0, k1) => counts.get(k0) - counts.get(k1)) keys.sort((k0, k1) => counts.get(k0) - counts.get(k1))

View file

@ -543,9 +543,9 @@ class LengthTextField extends TextFieldDef {
// Bit of a hack: we project the centerpoint to the closes point on the road - if available // Bit of a hack: we project the centerpoint to the closes point on the road - if available
if (options?.feature !== undefined && options.feature.geometry.type !== "Point") { if (options?.feature !== undefined && options.feature.geometry.type !== "Point") {
const lonlat = <[number, number]>[...options.location] const lonlat = <[number, number]>[...options.location]
lonlat.reverse() lonlat.reverse(/*Changes a clone, this is safe */)
options.location = <[number, number]>GeoOperations.nearestPoint(options.feature, lonlat).geometry.coordinates options.location = <[number, number]>GeoOperations.nearestPoint(options.feature, lonlat).geometry.coordinates
options.location.reverse() options.location.reverse(/*Changes a clone, this is safe */)
} }

View file

@ -373,7 +373,7 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
{ {
name: "max_snap_distance", name: "max_snap_distance",
doc: "If the imported object is a LineString or (Multi)Polygon, already existing OSM-points will be reused to construct the geometry of the newly imported way", doc: "If the imported object is a LineString or (Multi)Polygon, already existing OSM-points will be reused to construct the geometry of the newly imported way",
defaultValue: "5" defaultValue: "0.05"
}, },
{ {
name: "move_osm_point_if", name: "move_osm_point_if",
@ -381,7 +381,7 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
}, { }, {
name: "max_move_distance", name: "max_move_distance",
doc: "If an OSM-point is moved, the maximum amount of meters it is moved. Capped on 20m", doc: "If an OSM-point is moved, the maximum amount of meters it is moved. Capped on 20m",
defaultValue: "1" defaultValue: "0.05"
}, { }, {
name: "snap_onto_layers", name: "snap_onto_layers",
doc: "If no existing nearby point exists, but a line of a specified layer is closeby, snap to this layer instead", doc: "If no existing nearby point exists, but a line of a specified layer is closeby, snap to this layer instead",
@ -406,24 +406,12 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
AbstractImportButton.importedIds.add(originalFeatureTags.data.id) AbstractImportButton.importedIds.add(originalFeatureTags.data.id)
const args = this.parseArgs(argument, originalFeatureTags) const args = this.parseArgs(argument, originalFeatureTags)
const feature = state.allElements.ContainingFeatures.get(id) const feature = state.allElements.ContainingFeatures.get(id)
console.log("Geometry to auto-import is:", feature)
const geom = feature.geometry
let coordinates: [number, number][]
if (geom.type === "LineString") {
coordinates = geom.coordinates
} else if (geom.type === "Polygon") {
coordinates = geom.coordinates[0]
}
const mergeConfigs = this.GetMergeConfig(args); const mergeConfigs = this.GetMergeConfig(args);
const action = ImportWayButton.CreateAction(
const action = this.CreateAction(
feature, feature,
args, args,
<FeaturePipelineState>state, <FeaturePipelineState>state,
mergeConfigs, mergeConfigs
coordinates
) )
await state.changes.applyAction(action) await state.changes.applyAction(action)
} }
@ -455,18 +443,8 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
// Upload the way to OSM // Upload the way to OSM
const geom = feature.geometry
let coordinates: [number, number][]
if (geom.type === "LineString") {
coordinates = geom.coordinates
} else if (geom.type === "Polygon") {
coordinates = geom.coordinates[0]
}
const mergeConfigs = this.GetMergeConfig(args); const mergeConfigs = this.GetMergeConfig(args);
let action = ImportWayButton.CreateAction(feature, args, state, mergeConfigs);
let action = this.CreateAction(feature, args, state, mergeConfigs, coordinates);
return this.createConfirmPanelForWay( return this.createConfirmPanelForWay(
state, state,
args, args,
@ -508,14 +486,12 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
return mergeConfigs; return mergeConfigs;
} }
private CreateAction(feature, private static CreateAction(feature,
args: { max_snap_distance: string; snap_onto_layers: string; icon: string; text: string; tags: string; newTags: UIEventSource<any>; targetLayer: string }, args: { max_snap_distance: string; snap_onto_layers: string; icon: string; text: string; tags: string; newTags: UIEventSource<any>; targetLayer: string },
state: FeaturePipelineState, state: FeaturePipelineState,
mergeConfigs: any[], mergeConfigs: any[]) {
coordinates: [number, number][]) {
const coors = feature.geometry.coordinates const coors = feature.geometry.coordinates
if (feature.geometry.type === "Polygon" && coors.length > 1) { if ((feature.geometry.type === "Polygon" ) && coors.length > 1) {
const outer = coors[0] const outer = coors[0]
const inner = [...coors] const inner = [...coors]
inner.splice(0, 1) inner.splice(0, 1)
@ -531,7 +507,7 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
return new CreateWayWithPointReuseAction( return new CreateWayWithPointReuseAction(
args.newTags.data, args.newTags.data,
coordinates, coors,
state, state,
mergeConfigs mergeConfigs
) )

View file

@ -28,7 +28,6 @@ export class LoginToggle extends VariableUiElement {
const login = new LoginButton(text, state) const login = new LoginButton(text, state)
super( super(
state.osmConnection.loadingStatus.map(osmConnectionState => { state.osmConnection.loadingStatus.map(osmConnectionState => {
console.trace("Current osm state is ", osmConnectionState)
if(osmConnectionState === "loading"){ if(osmConnectionState === "loading"){
return loading return loading
} }

View file

@ -107,7 +107,7 @@ export default class SplitRoadWizard extends Toggle {
.filter(p => GeoOperations.distanceBetween(p[0].geometry.coordinates, coordinates) < 5) .filter(p => GeoOperations.distanceBetween(p[0].geometry.coordinates, coordinates) < 5)
.map(p => p[1]) .map(p => p[1])
.sort((a, b) => a - b) .sort((a, b) => a - b)
.reverse() .reverse(/*Copy/derived list, inplace reverse is fine*/)
if (points.length > 0) { if (points.length > 0) {
for (const point of points) { for (const point of points) {
splitPoints.data.splice(point, 1) splitPoints.data.splice(point, 1)

View file

@ -45,6 +45,7 @@ import ImgurUploader from "../Logic/ImageProviders/ImgurUploader";
import FileSelectorButton from "./Input/FileSelectorButton"; import FileSelectorButton from "./Input/FileSelectorButton";
import {LoginToggle} from "./Popup/LoginButton"; import {LoginToggle} from "./Popup/LoginButton";
import {start} from "repl"; import {start} from "repl";
import {SubstitutedTranslation} from "./SubstitutedTranslation";
export interface SpecialVisualization { export interface SpecialVisualization {
funcName: string, funcName: string,
@ -865,13 +866,14 @@ export default class SpecialVisualizations {
args: [], args: [],
docs:"Shows the title of the popup. Useful for some cases, e.g. 'What is phone number of {title()}?'", docs:"Shows the title of the popup. Useful for some cases, e.g. 'What is phone number of {title()}?'",
example:"`What is the phone number of {title()}`, which might automatically become `What is the phone number of XYZ`.", example:"`What is the phone number of {title()}`, which might automatically become `What is the phone number of XYZ`.",
constr: (state, tags, args, guistate) => constr: (state, tagsSource, args, guistate) =>
new VariableUiElement(tags.map(tags => { new VariableUiElement(tagsSource.map(tags => {
const layer = state.layoutToUse.getMatchingLayer(tags) const layer = state.layoutToUse.getMatchingLayer(tags)
console.log("Layer for tags", tags,"is", layer.id)
const title = layer?.title?.GetRenderValue(tags) const title = layer?.title?.GetRenderValue(tags)
console.log("Title became: ", title) if(title === undefined){
return title return undefined
}
return new SubstitutedTranslation(title, tagsSource, state)
})) }))
} }
] ]

View file

@ -304,7 +304,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (target === null) { if (target === null) {
return source return source
} }
for (const key in source) { for (const key in source) {
if (!source.hasOwnProperty(key)) { if (!source.hasOwnProperty(key)) {
continue continue
@ -358,16 +358,16 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
* *
* The leaf objects are replaced by the function * The leaf objects are replaced by the function
*/ */
public static WalkPath(path: string[], object: any, replaceLeaf: ((leaf: any) => any)) { public static WalkPath(path: string[], object: any, replaceLeaf: ((leaf: any, travelledPath: string[]) => any), travelledPath: string[] = []) {
const head = path[0] const head = path[0]
if (path.length === 1) { if (path.length === 1) {
// We have reached the leaf // We have reached the leaf
const leaf = object[head]; const leaf = object[head];
if (leaf !== undefined) { if (leaf !== undefined) {
if(Array.isArray(leaf)){ if (Array.isArray(leaf)) {
object[head] = leaf.map(replaceLeaf) object[head] = leaf.map(o => replaceLeaf(o, travelledPath))
}else{ } else {
object[head] = replaceLeaf(leaf) object[head] = replaceLeaf(leaf, travelledPath)
} }
} }
return return
@ -381,10 +381,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
return; return;
} }
if (Array.isArray(sub)) { if (Array.isArray(sub)) {
sub.forEach(el => Utils.WalkPath(path.slice(1), el, replaceLeaf)) sub.forEach((el, i) => Utils.WalkPath(path.slice(1), el, replaceLeaf, [...travelledPath, head, "" + i]))
return; return;
} }
Utils.WalkPath(path.slice(1), sub, replaceLeaf) Utils.WalkPath(path.slice(1), sub, replaceLeaf, [...travelledPath, head])
} }
/** /**
@ -393,22 +393,26 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
* *
* The leaf objects are collected in the list * The leaf objects are collected in the list
*/ */
public static CollectPath(path: string[], object: any, collectedList = []): any[] { public static CollectPath(path: string[], object: any, collectedList: { leaf: any, path: string[] }[] = [], travelledPath: string[] = []): { leaf: any, path: string[] }[] {
if (object === undefined || object === null) { if (object === undefined || object === null) {
return collectedList; return collectedList;
} }
const head = path[0] const head = path[0]
travelledPath = [...travelledPath, head]
if (path.length === 1) { if (path.length === 1) {
// We have reached the leaf // We have reached the leaf
const leaf = object[head]; const leaf = object[head];
if (leaf === undefined || leaf === null) { if (leaf === undefined || leaf === null) {
return collectedList return collectedList
} }
if (Array.isArray(leaf)) { if (Array.isArray(leaf)) {
collectedList.push(...leaf) for (let i = 0; i < (<any[]>leaf).length; i++){
} else { const l = (<any[]>leaf)[i];
collectedList.push(leaf) collectedList.push({leaf: l, path: [...travelledPath, ""+i]})
} }
} else {
collectedList.push({leaf, path: travelledPath})
}
return collectedList return collectedList
} }
const sub = object[head] const sub = object[head]
@ -417,13 +421,13 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
} }
if (Array.isArray(sub)) { if (Array.isArray(sub)) {
sub.forEach(el => Utils.CollectPath(path.slice(1), el, collectedList)) sub.forEach((el, i) => Utils.CollectPath(path.slice(1), el, collectedList, [...travelledPath, "" + i]))
return collectedList; return collectedList;
} }
if (typeof sub !== "object") { if (typeof sub !== "object") {
return collectedList; return collectedList;
} }
return Utils.CollectPath(path.slice(1), sub, collectedList) return Utils.CollectPath(path.slice(1), sub, collectedList, travelledPath)
} }
/** /**
@ -725,6 +729,28 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
return new Date(str) return new Date(str)
} }
public static levenshteinDistance(str1: string, str2: string) {
const track = Array(str2.length + 1).fill(null).map(() =>
Array(str1.length + 1).fill(null));
for (let i = 0; i <= str1.length; i += 1) {
track[0][i] = i;
}
for (let j = 0; j <= str2.length; j += 1) {
track[j][0] = j;
}
for (let j = 1; j <= str2.length; j += 1) {
for (let i = 1; i <= str1.length; i += 1) {
const indicator = str1[i - 1] === str2[j - 1] ? 0 : 1;
track[j][i] = Math.min(
track[j][i - 1] + 1, // deletion
track[j - 1][i] + 1, // insertion
track[j - 1][i - 1] + indicator, // substitution
);
}
}
return track[str2.length][str1.length];
}
private static colorDiff(c0: { r: number, g: number, b: number }, c1: { r: number, g: number, b: number }) { private static colorDiff(c0: { r: number, g: number, b: number }, c1: { r: number, g: number, b: number }) {
return Math.abs(c0.r - c1.r) + Math.abs(c0.g - c1.g) + Math.abs(c0.b - c1.b); return Math.abs(c0.r - c1.r) + Math.abs(c0.g - c1.g) + Math.abs(c0.b - c1.b);
} }
@ -751,27 +777,6 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
b: parseInt(hex.substr(5, 2), 16), b: parseInt(hex.substr(5, 2), 16),
} }
} }
public static levenshteinDistance (str1: string, str2: string) {
const track = Array(str2.length + 1).fill(null).map(() =>
Array(str1.length + 1).fill(null));
for (let i = 0; i <= str1.length; i += 1) {
track[0][i] = i;
}
for (let j = 0; j <= str2.length; j += 1) {
track[j][0] = j;
}
for (let j = 1; j <= str2.length; j += 1) {
for (let i = 1; i <= str1.length; i += 1) {
const indicator = str1[i - 1] === str2[j - 1] ? 0 : 1;
track[j][i] = Math.min(
track[j][i - 1] + 1, // deletion
track[j - 1][i] + 1, // insertion
track[j - 1][i - 1] + indicator, // substitution
);
}
}
return track[str2.length][str1.length];
}
} }

View file

@ -84,6 +84,20 @@
"https://osoc.be/editions/2020/cyclofix" "https://osoc.be/editions/2020/cyclofix"
] ]
}, },
{
"path": "repair_station_broken_pump.svg",
"license": "CC-BY-SA",
"authors": [
"Pieter Fiers",
"Thibault Declercq",
"Pierre Barban",
"Joost Schouppe",
"Pieter Vander Vennet"
],
"sources": [
"https://osoc.be/editions/2020/cyclofix"
]
},
{ {
"path": "repair_station_example.jpg", "path": "repair_station_example.jpg",
"license": "CC-BY-SA 4.0", "license": "CC-BY-SA 4.0",

View file

@ -241,7 +241,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "CEE7_4F.svg", "path": "./assets/layers/charging_station/CEE7_4F.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -270,7 +270,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "TypeE.svg", "path": "./assets/layers/charging_station/TypeE.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -325,7 +325,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Chademo_type4.svg", "path": "./assets/layers/charging_station/Chademo_type4.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -380,7 +380,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Type1_J1772.svg", "path": "./assets/layers/charging_station/Type1_J1772.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -435,7 +435,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Type1_J1772.svg", "path": "./assets/layers/charging_station/Type1_J1772.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -490,7 +490,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Type1-ccs.svg", "path": "./assets/layers/charging_station/Type1-ccs.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -545,7 +545,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Tesla-hpwc-model-s.svg", "path": "./assets/layers/charging_station/Tesla-hpwc-model-s.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -600,7 +600,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Type2_socket.svg", "path": "./assets/layers/charging_station/Type2_socket.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -655,7 +655,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Type2_CCS.svg", "path": "./assets/layers/charging_station/Type2_CCS.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -710,7 +710,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Type2_tethered.svg", "path": "./assets/layers/charging_station/Type2_tethered.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -765,7 +765,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Type2_CCS.svg", "path": "./assets/layers/charging_station/Type2_CCS.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -826,7 +826,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Tesla-hpwc-model-s.svg", "path": "./assets/layers/charging_station/Tesla-hpwc-model-s.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -887,7 +887,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "Type2_tethered.svg", "path": "./assets/layers/charging_station/Type2_tethered.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -916,7 +916,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "usb_port.svg", "path": "./assets/layers/charging_station/usb_port.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -967,7 +967,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "bosch-3pin.svg", "path": "./assets/layers/charging_station/bosch-3pin.svg",
"class": "medium" "class": "medium"
} }
}, },
@ -1018,7 +1018,7 @@
}, },
"hideInAnswer": true, "hideInAnswer": true,
"icon": { "icon": {
"path": "bosch-5pin.svg", "path": "./assets/layers/charging_station/bosch-5pin.svg",
"class": "medium" "class": "medium"
} }
} }
@ -3953,7 +3953,7 @@
"operational_status=broken" "operational_status=broken"
] ]
}, },
"then": "cross:#c22;" "then": "close:#c22;"
}, },
{ {
"if": { "if": {

View file

@ -764,7 +764,7 @@
"operational_status=broken" "operational_status=broken"
] ]
}, },
"then": "cross:#c22;" "then": "close:#c22;"
}, },
{ {
"if": { "if": {

View file

@ -131,7 +131,7 @@ function run(file, protojson) {
then: txt, then: txt,
hideInAnswer: true, hideInAnswer: true,
icon:{ icon:{
path: e.image, path: `./assets/layers/charging_station/${e.image}`,
class:"medium" class:"medium"
} }
} }

View file

@ -306,11 +306,15 @@
{ {
"if": "red_turn:right:bicycle=yes", "if": "red_turn:right:bicycle=yes",
"then": { "then": {
"en": "A cyclist can turn right if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B22.svg' style='width: 3em'>", "en": "A cyclist can turn right if the light is red",
"nl": "Een fietser mag wel rechtsaf slaan als het licht rood is <img src='./assets/layers/crossings/Belgian_road_sign_B22.svg' style='width: 3em'>", "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is",
"de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen <img src='./assets/layers/crossings/Belgian_road_sign_B22.svg' style='width: 3em'>" "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen"
}, },
"hideInAnswer": "_country!=be" "hideInAnswer": "_country!=be",
"icon": {
"path": "./assets/layers/crossings/Belgian_road_sign_B22.svg",
"class": "medium"
}
}, },
{ {
"if": "red_turn:right:bicycle=yes", "if": "red_turn:right:bicycle=yes",
@ -343,11 +347,15 @@
{ {
"if": "red_turn:straight:bicycle=yes", "if": "red_turn:straight:bicycle=yes",
"then": { "then": {
"en": "A cyclist can go straight on if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B23.svg' style='width: 3em'>", "en": "A cyclist can go straight on if the light is red",
"nl": "Een fietser mag wel rechtdoor gaan als het licht rood is <img src='./assets/layers/crossings/Belgian_road_sign_B23.svg' style='width: 3em'>", "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is",
"de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren <img src='./assets/layers/crossings/Belgian_road_sign_B23.svg' style='width: 3em'>" "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren"
}, },
"hideInAnswer": "_country!=be" "hideInAnswer": "_country!=be",
"icon": {
"path": "./assets/layers/crossings/Belgian_road_sign_B23.svg",
"class": "medium"
}
}, },
{ {
"if": "red_turn:straight:bicycle=yes", "if": "red_turn:straight:bicycle=yes",

View file

@ -32,16 +32,7 @@
"presets": [], "presets": [],
"mapRendering": [ "mapRendering": [
{ {
"icon": { "icon": "direction_gradient:var(--catch-detail-color)",
"render": "direction_gradient:var(--catch-detail-color)",
"#": "For some weird reason, showing the icon in the layer control panel breaks the svg-gradient (because the svg gradient has a global color or smthng) - so we use a different icon without gradient",
"mappings": [
{
"if": "id=node/-1",
"then": "direction:var(--catch-detail-color)"
}
]
},
"iconSize": "200,200,center", "iconSize": "200,200,center",
"location": [ "location": [
"point", "point",

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<path d="m13.614 31.105 33.742 58.443c2.6742 4.6318 14.612 3.9153 23.876-1.4331 9.2637-5.3484 15.853-15.329 13.179-19.96l-33.742-58.443z" fill="#494949" stroke-width=".77865" style="paint-order:fill markers stroke"/>
<path d="m13.614 31.105 11.914 20.636c2.6742 4.6318 14.612 3.9153 23.876-1.4331 9.2637-5.3484 15.853-15.329 13.179-19.96l-11.914-20.636z" fill="#6bb019" stroke-width=".77865" style="paint-order:fill markers stroke"/>
<ellipse transform="rotate(-30)" cx="17.631" cy="33.742" rx="21.394" ry="10.694" fill="#90e925" stroke-width=".9589" style="paint-order:fill markers stroke"/>
<ellipse transform="rotate(-30)" cx="17.631" cy="33.745" rx="18.719" ry="8.0226" fill="#8a8a8a" stroke-width=".97044" style="paint-order:fill markers stroke"/>
<g transform="matrix(.38599 -.22285 .22285 .38599 -129.2 108.57)">
<path d="m392.41-4.3157v12c0 6 8 12 20 12s20-6 20-12v-12z" fill="#686868" stroke-width=".87351" style="paint-order:fill markers stroke"/>
<ellipse cx="412.41" cy="-2.3209" rx="20" ry="10" fill="#c4c4c4" stroke-width=".89654" style="paint-order:fill markers stroke"/>
</g>
<path d="m38.129 34.7 2.0056 3.4739-3.4739 2.0056 2.0056 3.4739 3.4739-2.0056 2.0056 3.4739 3.4739-2.0056-2.0056-3.4739 3.4739-2.0056-2.0056-3.4739-3.4739 2.0056-2.0056-3.4739z" fill="#202020" style="paint-order:fill markers stroke"/>
<path d="m51.276 62.035 2.4152 11.803 3.6479-3.2059 3.5887 10.025 4.7529-20.34-7.2958 6.4117 0.18683-11.105z" fill="#ffcd05" style="paint-order:markers fill stroke"/>
<path d="m19.369 36.79 29.345 52.149c4.4165 1.5533 9.4118 1.6605 12.551 0.7071-17.209-34.174-20.739-24.967-41.896-52.856z" fill-opacity=".15152"/>
<path d="m52.603 17.256 29.499 50.954c-9.4251-11.297-30.508-40.558-35.899-41.71 3.8257-3.85 6.235-6.7252 6.4006-9.2442z" fill="#fff" fill-opacity=".38384"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1.508 -1.6961e-5 1.6961e-5 1.508 -99.113 -1110.4)">
<path d="m77.219 763.36 26.408-0.91079-2.4743 8.144 1.0972 27.424-25.782-4.4246c-1.1581-6.5947 8.7192-17.809 8.7192-17.809 0.01276-0.0638-3.9046-7.1545-7.9678-12.424z" fill="#c988ad" style="paint-order:normal"/>
<path d="m102.25 798.02 18.191-9.0442c-0.80764-11.237-4.0408-21.11 0.029-35.091l-16.843 8.5669-2.4743 8.144z" fill="#b06b92"/>
<path d="m101.85 788.06 17.474-7.9c-0.35142-5.6907-1.4488-11.754-0.6013-16.846l-17.565 7.2829" fill="#c0c0c0"/>
<path d="m80.361 767.64 20.792 2.9536 0.69278 17.463-22.381-4.0918c1.6275-3.604 5.7219-8.1802 5.7219-8.1802z" fill="#eee"/>
<path d="m83.935 747.62-1.0494-6.1002 23.25-2.5784 1.2264 6.7919z" fill="#6f9adb"/>
<path d="m107.36 745.74 13.108 8.149-16.843 8.5669-19.692-14.829z" fill="#944f76"/>
<path d="m103.63 762.45 16.843-8.5669-24.069-3.1814 7.2268 11.748" fill="#a55883"/>
<path d="m77.219 763.36 6.7164-15.74 23.427-1.8868-3.735 16.716z" fill="#d19aba"/>
<g transform="rotate(-10.439,120.47,753.88)">
<path transform="translate(0,738.52)" d="m94.477 6.7129-7.4102 4.7559 1.8418 2.3164c0.91641 0.91602 1.9091 1.5023 3.2793 1.5039 2.6726-3.4e-5 4.8393-1.9481 4.8398-4.3516-0.0021-0.78748-0.42923-1.341-0.88086-2.0156z" fill="#3e66a2" style="paint-order:normal"/>
<ellipse cx="90.887" cy="747.78" rx="4.4024" ry="4.3525" fill="#6f9adb" style="paint-order:normal"/>
</g>
<path d="m85.187 775.79 16.188-1.2665-21.014-6.8778z" fill-opacity=".17172"/>
<path d="m101.15 770.6 19.317-16.711-16.843 8.5669z" fill-opacity=".18182"/>
<path d="m85.648 777.54-4.4194 5.8336 17.766-6.7175z" fill="#fff" fill-opacity=".73232"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1.0972 0 0 1.0972 22.68 -1032)">
<path d="m32.406 1002.6c-10.051-3.4923-19.236-3.306-20.516 0.4162l-0.46436 1.338c-1.2801 3.7222 5.0456 11.851 15.096 15.344 10.051 3.4923 20.02 1.0254 21.3-2.6968l0.46436-1.338c1.2801-3.7223-5.8299-9.5708-15.881-13.063z" fill="#8d8c7f" style="paint-order:fill markers stroke"/>
<path d="m26.758 963.9-2.8586 8.4361-1.3932 14.6-7.3426 10.678-1.8622 5.4151c-1.3813 4.3193 6.1294 10.605 14.298 13.451 8.1686 2.8469 17.995 2.9579 19.428-1.211l2.0224-5.8807 1.3683-12.341 7.3393-12.947 2.7091-7.9096z" fill="#c2c2c0" style="paint-order:fill markers stroke"/>
<path d="m46.888 960.52c-10.051-3.4923-19.236-3.306-20.516 0.4162l-0.46436 1.338c-1.2801 3.7222 5.2505 11.256 15.301 14.748 10.051 3.4923 19.815 1.6211 21.095-2.1011l0.46436-1.338c1.2801-3.7222-5.8299-9.5707-15.881-13.063z" fill="#8d8c7f" style="paint-order:fill markers stroke"/>
<ellipse transform="matrix(.9446 .32822 -.3252 .94564 0 0)" cx="356.71" cy="899.99" rx="16.686" ry="6.4477" fill="#5f553c" style="paint-order:fill markers stroke"/>
<g transform="matrix(.62753 .21805 -.28972 .84245 321.57 -114)">
<path d="m108.06 1267.5 0.96521 3.0021c10.298 8.8536 39.616 9.1927 52.122 0l0.86868-3.0021c-13.552 9.4413-42.55 8.7559-53.955 0z" fill="#8d8c7f"/>
<path d="m108.06 1267.5 0.96521-3.0021c11.373 8.003 40.267 8.5058 52.122 0l0.86868 3.0021c-12.75 9.2549-41.701 9.1372-53.955 0z" fill="#e1e1df"/>
</g>
<g transform="matrix(.62753 .21805 -.28972 .84245 319.83 -108.94)">
<path d="m108.06 1267.5 0.96521 3.0021c10.298 8.8536 39.616 9.1927 52.122 0l0.86868-3.0021c-13.552 9.4413-42.55 8.7559-53.955 0z" fill="#8d8c7f"/>
<path d="m108.06 1267.5 0.96521-3.0021c11.373 8.003 40.267 8.5058 52.122 0l0.86868 3.0021c-12.75 9.2549-41.701 9.1372-53.955 0z" fill="#e1e1df"/>
</g>
<g transform="matrix(.62753 .21805 -.28972 .84245 318.09 -103.88)">
<path d="m108.06 1267.5 0.96521 3.0021c10.298 8.8536 39.616 9.1927 52.122 0l0.86868-3.0021c-13.552 9.4413-42.55 8.7559-53.955 0z" fill="#8d8c7f"/>
<path d="m108.06 1267.5 0.96521-3.0021c11.373 8.003 40.267 8.5058 52.122 0l0.86868 3.0021c-12.75 9.2549-41.701 9.1372-53.955 0z" fill="#e1e1df"/>
</g>
<g transform="matrix(.62753 .21805 -.28972 .84245 316.35 -98.822)">
<path d="m108.06 1267.5 0.96521 3.0021c10.298 8.8536 39.616 9.1927 52.122 0l0.86868-3.0021c-13.552 9.4413-42.55 8.7559-53.955 0z" fill="#8d8c7f"/>
<path d="m108.06 1267.5 0.96521-3.0021c11.373 8.003 40.267 8.5058 52.122 0l0.86868 3.0021c-12.75 9.2549-41.701 9.1372-53.955 0z" fill="#e1e1df"/>
</g>
<g transform="matrix(.62753 .21805 -.28972 .84245 333.44 -74.093)">
<path d="m71.626 1223.6 0.96521 3.0021c10.298 8.8536 39.616 9.1927 52.122 0l0.86868-3.0021c-13.552 9.4413-42.55 8.7559-53.955 0z" fill="#8d8c7f"/>
</g>
<path d="m15.202 997.63 1.4755-2.3187c4.8181 9.222 22.804 15.946 32.708 11.365l-0.32464 2.7185c-10.682 5.0168-28.816-1.3953-33.858-11.765z" fill="#e1e1df"/>
<path d="m26.174 965.16c1.0575 2.3034 3.9059 5.6444 5.2903 6.626l-12.456 40.18c-2.2438-2.2859-5.2521-3.2052-5.99-8.1831z" fill="#fff" fill-opacity=".38384"/>
<path d="m36.69 975.19-13.222 39.374c8.0057-13.978 13.836-29.131 19.648-36.808z" fill="#fff" fill-opacity=".38384"/>
</g>
<g transform="matrix(.63199 -.59431 .63199 .59431 -541.33 -586.04)">
<g transform="matrix(.67182 0 0 .67182 -112.56 340.57)">
<path d="m58.426 961.93c-15.339-4.11-28.861-3.3817-30.203 1.6266l-0.48862 1.8006c-1.342 5.0083 9.1823 15.469 24.521 19.579 15.339 4.11 29.683 0.3131 31.025-4.6952l0.48862-1.8006c1.342-5.0084-10.005-12.4-25.343-16.51z" fill="#8d8c7f" style="paint-order:fill markers stroke"/>
<path d="m35.477 943.47c-3.027 24.955-1.2415 9.7101-4.891 19.187-1.4036 5.8063 10.598 13.757 23.066 17.108 12.468 3.3517 26.978 2.9847 28.482-2.6247 0 0-0.15047-0.26647 4.8726-19.119z" fill="#c2c2c0" style="paint-order:fill markers stroke"/>
<path d="m64.676 937.93c-15.339-4.11-28.861-3.3817-30.203 1.6266l-0.48862 1.8006c-1.342 5.0084 9.397 14.667 24.736 18.777 15.339 4.11 29.468 1.1146 30.81-3.8937l0.48862-1.8006c1.342-5.0084-10.005-12.4-25.343-16.51z" fill="#8d8c7f" style="paint-order:fill markers stroke"/>
<ellipse transform="rotate(15)" cx="305.22" cy="899.86" rx="24.903" ry="8.4934" fill="#5f553c" style="paint-order:fill markers stroke"/>
<path d="m34.277 950.33s1.6688-0.31142-1.9806 9.1658c-0.10121 5.0621 10.335 13.889 22.803 17.24 12.468 3.3517 26.584 1.2743 28.087-4.335l2.23-8.85c-21.34 6.2771-40.563-2.2891-51.139-13.221z" fill="#cd7a7a" style="paint-order:fill markers stroke"/>
</g>
<path d="m-86.995 958.39c3.2286-0.99089 3.7598-2.689 2.8539-4.7022 2.7822-0.0119 5.5137-0.70203 6.0502-3.5528 2.8091 1.5768 5.2325 1.5955 6.9634-1.1494 2.0909 2.0747 4.3095 2.1089 7.0776 0 1.3819 1.4858 1.585 4.0307 7.0776 1.7764 0.42535 1.8147 1.5346 2.9339 5.0228 2.6123 0.03302 1.8864-1.4097 3.7145 3.3105 5.4337-2.4681 1.5416-2.9572 3.2569-1.3699 5.1202-2.9364 0.32465-4.9981 1.0312-4.3379 3.3438-3.0927-0.33043-6.6557-1.1243-7.5342 2.4034-2.6127-0.87509-5.4743-1.6986-6.7351 0.52247l-7.3059-0.94044c-1.4264-1.6435-2.7327-3.5041-6.1643-2.0899 0.37926-2.3042-0.91391-3.805-4.6803-3.9708 2.0024-2.0561 1.1991-3.5167-0.22831-4.8067z" fill="#655e4d" stroke="#8d8c7f" stroke-width="2"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(10.235 -4.0981 4.0981 10.235 -1224.8 -2518.9)">
<path d="m22.427 256.21s-0.49716-0.97802-0.62756-1.0514c-0.1304-0.0733-0.85576-0.057-1.1247-0.163 0 0-0.33415 0.39121-0.83131 0.39121s-0.83131-0.39121-0.83131-0.39121c-0.2771 0.10595-0.99431 0.0897-1.1247 0.163-0.1304 0.0734-0.63571 1.0514-0.63571 1.0514 0.2771 0.62756 0.92911 0.76611 0.92911 0.76611l0.2608-0.40751c0.26018 0.8027 0.0044 2.0318-0.12225 3.1541 0.62756 0.36675 1.084 0.3912 1.5241 0.3912s0.88836-0.0245 1.5159-0.38305l-0.12225-3.1541 0.2608 0.40751c0-8e-3 0.66016-0.13855 0.92911-0.77426" fill="#e96f54" stroke-width=".081501"/>
<g transform="matrix(.081501 0 0 .081501 17.236 254.89)" fill="#22648c">
<path d="m32.2 7.2c-1.6 0-3.1-0.3-4.7-0.9-1.2-0.5-2.5-1.1-3.7-1.9-2-1.3-3.3-2.7-3.3-2.7 0.33569-0.26369 0.66667-0.53333 1-0.8l1.895-1.8751s0.77699 1.4453 2.577 2.6453c1.6 1 3.493 2.1319 6.293 2.1319 3.2 0 5.3698-1.2482 8.2698-4.4482l2.7652 2.1461c-1.8 2-3.6 3.5-5.6 4.4-1.7 0.8-3.5 1.3-5.5 1.3"/>
<path d="m4.7593 16.841c-1.4-1.8-1.8994-4.039-2.2994-5.039l-2.4598 4.6984c0.5 1 1.2 2.1 2.1 3.2 1.4 1.8 3 3.2 4.7 4.2 1.5 0.9 3.1 1.5 4.9 1.7l2.03-3.3127c-3.5-0.3-6.5708-2.3466-8.9708-5.4466z"/>
<path d="m59.078 17.541c1.4-1.8 2.3733-4.3124 2.7733-5.3124l2.1484 4.2712c-0.5 1-1.2 2.1-2.1 3.2-1.4 1.8-3 3.2-4.7 4.2-1.5 0.9-3.2 1.5-4.9 1.7l-2.3224-3.7809c3.5-0.3 6.7006-1.1779 9.1006-4.2779z"/>
</g>
</g>
<path d="m87.549 39.755 5.6874-14.952-34.391-13.081-5.6874 14.952c-20.145 32.07-23.166 51.583-23.166 51.583l19.308 0.9867c3.7806-24.725 17.6-36.951 17.6-36.951l1.8156 0.69061s0.38534 17.629-13.221 38.616l15.083 12.094s10.71-16.587 16.971-53.939z" fill="#428bc1" stroke-width="1.1427"/>
<g transform="matrix(1.068 .40624 -.40624 1.068 41.864 5.262)" fill="#347aa5">
<path d="m35.2 53.9 16.8 6.1-0.7 4-17-5.2z"/>
<path d="m28.8 53.9-16.8 6.1 0.7 4 17-5.2z"/>
</g>
<ellipse transform="rotate(20.825)" cx="79.508" cy="-6.994" rx="1.4855" ry="1.3712" fill="#ffce31" stroke-width="1.1427"/>
<path d="m74.587 17.662-8.2895 21.658c-0.30058 1.0612-0.50406 2.1048 0.87565 2.8605l1.7513 0.64214 6.8884-18.038m11.792 14.711c-6.2635-2.5623-5.8433-6.9594-4.2615-11.675l2.2767-5.9544m-32.38 4.5734c4.532 2.0962 8.1901-0.17686 11.166-5.8616l2.3003-5.8921m-10.158 2.9188 34.442 13.018" fill="none" stroke="#22648c" stroke-width="4"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(2.0158 -642.68)">
<path d="m16.562 710.33c10.381-3.8387 20.669-4.4029 30.815 0l-0.375 20.117c-10.657 6.1628-20.821 4.4443-30.815 0z" fill="#ede45d" style="paint-order:normal"/>
<g transform="matrix(.61557 -.61557 .61557 .61557 -541.39 180.05)">
<path d="m74.686 847.44c-7.4687 2.9602-17.238-1.3052-22.757 4.2143l-2.5286 2.5286c-1.6857 1.6857-0.95453 2.556-0.84285 4.2143-1.6583-0.11167-2.5286-0.84285-4.2143 0.84285-1.6857 1.6857-0.95453 2.556-0.84285 4.2143-1.6583-0.11168-2.5286-0.84285-4.2143 0.84285-1.6857 1.6857-0.74134 2.4511-0.84285 4.2143-1.6857 0-2.5286-0.84285-4.2143 0.84285-1.0691 0.97442-0.84285 2.5286-0.84285 4.2143-1.6857 0-12.409 9.0138-15.171 11.8-5.5239 5.5721-11.591 11.595-12.643 14.328-1.4913 7.6991 17.223 26.021 25.286 25.286 2.975-1.1891 8.9062-7.1954 14.328-12.643 2.7112-2.7237 11.8-13.486 11.8-15.171 1.6857 0 3.0607 0.31066 4.2143-0.84285 1.6857-1.6857 0.84285-2.5286 0.84285-4.2143 1.6857 0 2.5286 0.84285 4.2143-0.84285 1.6857-1.6857 0.95453-2.556 0.84285-4.2143 1.6583 0.11168 2.5286 0.84285 4.2143-0.84285 1.6857-1.6857 0.95453-2.556 0.84285-4.2143 1.6583 0.11168 2.5286 0.84285 4.2143-0.84285l2.5286-2.5286c5.3836-5.3836 1.6551-15.432 4.2143-22.757l3.3714-3.3714-8.4285-8.4285z" fill="#f2ed9a" fill-opacity=".41414" stroke="#decf8a" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m57.814 896.06c-5.7454-10.176-13.781-18.344-23.6-23.6" fill="none" stroke="#ded98a" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m62.871 891c-5.9561-10.261-13.848-18.547-23.6-23.6" fill="none" stroke="#ded98a" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m67.928 885.94c-5.5418-10.105-13.707-18.135-23.6-23.6" fill="none" stroke="#ded98a" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m72.985 880.89c-5.5418-10.105-13.707-18.135-23.6-23.6" fill="none" stroke="#ded98a" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m48.558 858.4c5.7454 10.176 13.781 18.344 23.6 23.6" fill="none" stroke="#ded98a" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m43.501 863.46c5.9561 10.261 13.848 18.547 23.6 23.6" fill="none" stroke="#ded98a" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m38.444 868.51c5.5418 10.105 13.707 18.135 23.6 23.6" fill="none" stroke="#ded98a" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m33.387 873.57c5.5418 10.105 13.707 18.135 23.6 23.6" fill="none" stroke="#ded98a" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<ellipse transform="rotate(45)" cx="658" cy="542.25" rx="9.5358" ry="3.1576" fill="#9fd770" style="paint-order:fill markers stroke"/>
<path d="m7.785 900.16c5.8047-6.5666 9.7972-13.041 24.285-22.599 2.8498 4.7631 7.5822 10.619 12.537 15.803-13.334-11.836-27.547 1.3485-36.822 6.7955z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m52.859 854.49c3.5192-5.4649 16.92-1.2746 23.842-4.8059-6.9841 7.1933-20.674 7.5327-20.418 10.257-2.0215-2.7206-3.1456-4.0854-3.4247-5.4508z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m47.434 860.31c-0.75358-0.14879-2.9459 0.94658-3.1057 2.0303 0.80223-0.87911 14.944 13.42 16.577 14.958-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m42.912 865.25c-0.75358-0.14878-2.9086 0.98383-3.0684 2.0676 0.80223-0.87911 14.907 13.383 16.54 14.921-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m37.75 870.52c-0.75358-0.14879-2.7596 1.0583-2.9194 2.142 0.80223-0.87911 14.758 13.308 16.391 14.846-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m88.46 842.07a7.1518 1.192 45 0 0-5.7123-4.2768l-0.06256-0.0625-5.0571 5.0571a7.1518 1.192 45 0 0 4.2143 5.9 7.1518 1.192 45 0 0 5.9 4.2143l4.932-4.932 0.12511-0.12511-0.06091-0.0609a7.1518 1.192 45 0 0-4.2785-5.7139z" fill="#53a23e" style="paint-order:fill markers stroke"/>
<ellipse transform="rotate(45)" cx="657.94" cy="534.05" rx="7.1891" ry="1.341" fill="#8ecd7d" style="paint-order:fill markers stroke"/>
</g>
</g>
<g transform="matrix(1.4038 0 0 1.4038 -6.2827 -914.73)">
<path d="m64.314 690.09c0 7.5974-6.1589 13.756-13.756 13.756-7.5974 0-13.756-6.1589-13.756-13.756 0-7.2012 13.678-23.846 13.678-27.48 0 3.5106 13.834 19.908 13.834 27.48z" fill="#ffc62e" fill-opacity=".71717" style="paint-order:normal"/>
<ellipse transform="rotate(45)" cx="523.65" cy="457.8" rx="9.1614" ry="6.084" fill="#ffca27" fill-opacity=".53535" style="paint-order:normal"/>
<path d="m43.002 681.93c-9.401 10.584-0.33445 19.295 6.2732 19.951-2.8032-2.1985-9.7308-7.3379-6.2732-19.951z" fill="#fff4c4" fill-opacity=".96471"/>
<path d="m50.955 667.94c3.3775 7.1811 16.527 19.234 7.0274 21.308s-6.5759-15.424-7.0274-21.308z" fill="#ffe47c" fill-opacity=".65657"/>
<path d="m51.509 669.07c3.3775 7.1811 11.277 15.046 5.5899 15.746s-5.1384-9.8614-5.5899-15.746z" fill="#fffef0" fill-opacity=".65657"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5 KiB

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(-.99816 0 0 .99816 138.2 -657.77)">
<ellipse cx="104.5" cy="726.98" rx="15.91" ry="4.29" fill="#786c5d" style="paint-order:normal"/>
<path d="m105.19 689.83 7.9594-1.7685c16.765-3.1448 17.102 8.5604 17.102 8.5604 0.41012 13.206-3.0294 20.405-7.0648 13.935l-10.037-22.495" fill="none" stroke="#494949" stroke-width="6"/>
<path d="m104.39 697.06c-7.8101-6e-5 -14.142 1.5826-14.143 3.5352 0.0047 0.22961 0.09893 0.45855 0.28125 0.68359v23.869c-0.03836 0.10129-0.05921 0.20295-0.0625 0.30469-0.0035 1.9533 6.3295 3.5372 14.143 3.5371 7.8131 6e-5 14.146-1.5838 14.143-3.5371-5e-3 -0.2336-0.10236-0.46651-0.29102-0.69531v-23.809c0.047-0.11747 0.0705-0.23545 0.0703-0.35351-8.4e-4 -1.9523-6.3313-3.535-14.141-3.5352z" fill="#97928a" style="paint-order:normal"/>
<ellipse cx="104.59" cy="702.06" rx="15.91" ry="4.54" fill="#786c5d" style="paint-order:normal"/>
<path d="m118.29 700.03s-0.13654 4.0806-13.833 4.11c-14.004 0.0302-14.01-4.11-14.01-4.11-0.39174-7.1341 6.3577-9.6087 14.046-9.6087 7.6884 0 13.796 1.9202 13.796 9.6087z" fill="#97928a" style="paint-order:normal"/>
<path d="m104.35 686.38c-3.0229-2e-5 -5.4736 0.61257-5.474 1.3683l0.08467 3.6212c-0.0013 0.75603 2.4499 1.3691 5.474 1.3691 3.0241 2e-5 5.4753-0.61303 5.474-1.3691l-0.0854-3.6212c-3.2e-4 -0.75566-2.4506-1.3682-5.4732-1.3683z" fill="#786c5d" style="paint-order:normal"/>
<path d="m105.91 687.91c1.8339-6.7519 13.861-3.4968 16.587-10.769" fill="none" stroke="#373737" stroke-width="6"/>
<path d="m104.35 686.38c-10.822-5.6125-21.261-7.2732-28.38 4.6717" fill="none" stroke="#565454" stroke-width="4"/>
</g>
<g transform="matrix(1.4038 0 0 1.4038 -4.0872 -906.77)">
<path d="m64.314 690.09c0 7.5974-6.1589 13.756-13.756 13.756-7.5974 0-13.756-6.1589-13.756-13.756 0-7.2012 13.678-23.846 13.678-27.48 0 3.5106 13.834 19.908 13.834 27.48z" stroke="#fff" stroke-linejoin="round" style="paint-order:normal"/>
<path d="m45.654 675.87c-13.069 16.506-2.9861 25.35 3.6215 26.006-2.8032-2.1985-10.836-9.2825-3.6215-26.006z" fill="#e1e1e1" fill-opacity=".96471"/>
<path d="m51.476 667.51c3.3775 7.1811 13.17 19.908 7.381 21.308s-5.7413-15.64-7.381-21.308z" fill="#bdbdbd" fill-opacity=".65657"/>
<path d="m51.854 668.9c3.3775 7.1811 9.533 15.481 6.1202 15.481s-5.1014-9.7708-6.1202-15.481z" fill="#fff" fill-opacity=".65657"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="m55.677 53.349c-8.1074 3.4446-12.161 5.1695-17.936 2.8417-5.7812-2.3339-10.388-7.5495-10.949-14.492 5.2179-4.616 12.159-5.1651 17.941-2.8405 5.773 2.3294 7.4966 6.387 10.945 14.49z" fill="#77b255"/>
<path d="m75.631 36.525c-7.4297 3.5978-12.775 4.8744-18.291 2.9637-5.5174-1.9157-10.077-6.5866-10.917-13.06 4.6708-4.5593 11.142-5.4021 16.661-3.4907 5.5118 1.919 8.9465 6.1565 12.547 13.587z" fill="#77b255"/>
<path d="m69.138 47.3c10.899 3.679 16.974 12.884 9.9401 21.954-5.3844-0.20634-8.9498-2.7202-11.248-7.5532-2.2966-4.8302-1.0942-8.021 1.308-14.401z" fill="#5c913b"/>
<path d="m33.871 67.716c-5.153 6.7824-7.7331 10.174-13.7 10.993-5.9721 0.81349-12.524-3.126-16.319-8.684" fill="#5c913b"/>
<path d="m53.443 58.7c7.0807 6.6159 10.624 9.9248 10.858 16.772 0.2348 6.8525-2.9577 13.817-9.6894 17.475-6.9655-3.1903-10.625-9.9204-10.859-16.777-0.23216-6.8447 3.0761-10.386 9.6904-17.47z" fill="#77b255"/>
<path d="m53.443 58.7c1.4308-7.4498 13.337 11.285 12.889 16.208 0.66148 8.8877-11.72 18.039-11.72 18.039" fill="#5c913b"/>
<path d="m69.137 47.3c-1.1865-5.4621 5.5526-2.7979 8.9363 1.9196 6.8422 10.74 9.1594 10.031 1.005 20.034" fill="#77b255"/>
<path d="m54.622 53.92c-4.0857-1.3477-20.587-6.1428-27.831-12.221-0.669 7.7906 8.7519 20.507 18.472 17.411 6.9039-2.5354 9.3584-5.1905 9.3584-5.1905" fill="#5c913b"/>
<path d="m75.631 36.525c-5.8039-0.98777-18.698-0.80254-29.208-10.096-0.27771 7.0081 9.9842 19.351 19.484 14.824 6.5941-3.3466 9.724-4.7277 9.724-4.7277" fill="#5c913b"/>
<path d="m33.92 67.326c-3.9085 1.2908-21.178 6.9076-28.575 4.2163-7.3921-2.6923 9.8083-19.812 26.18-10.17 4.7761 2.8117 2.3952 5.9538 2.3952 5.9538" fill="#77b255"/>
<path d="m87.811 20.712c1.2343 0.54587 2.5152 2.6385 1.971 3.8756-3.3079 7.5368-13.495 25.15-54.988 43.788-1.2318 0.55645-2.5428 0.87893-3.1361-0.33913-0.59663-1.2142 0.67557-2.0625 1.8898-2.6591 36.147-17.667 46.473-36.564 49.565-43.61 0.54646-1.2366 3.4611-1.5974 4.6988-1.0554" fill="#a06253"/>
</g>
<g transform="matrix(.8633 .74383 -.66112 .76652 280.9 -1059.4)">
<path d="m464.56 972.09c-14.537 9.5755-4.6209 20.018-1.6254 23.988l-22.001-1.1376c8.737-2.689 14.912-8.0975 3.2523-23.398z" fill="#cfc06b"/>
<path d="m455.85 967.6s-10.188-0.35428-12.717-2.3188c-2.5286-1.9645-3.0117-5.5684-1.0472-8.0971 1.9645-2.5286 5.6716-3.0675 8.2002-1.103 2.5286 1.9645 5.5636 11.519 5.5636 11.519z" fill="#83bf4f" stroke-width="1.1724"/>
<path d="m454.6 968.84c0-4.1008 2.2888-11.063 11.444-11.063v2.4796c-8.2971 0-8.9647 7.8202-8.9647 8.5832z" fill="#947151" stroke-width=".95369"/>
<path d="m451.33 967.68c-3.7298 0.0489-8.3971 2.5357-9.9323 6.5163 4.2117 4.8211 7.4229-1.4662 10.133 0.984 9.402 0.36359 6.0022-2.5965 14.932-1.989-1.9153-4.7302-7.1906-6.4518-10.623-4.8199-1.2653-0.50997-2.8144-0.71362-4.5098-0.69141zm-1.4945 23.512c-2.6062 2.2056-3.8352 1.3826-8.428 3.2881 2.3776 6.3604 4.8278 8.2725 8.1181 8.2725 2.9564 0 3.2615-1.0032 5.0735-1.0032 1.7166 0 0.36111 0.7796 4.1759 0.7796 3.2902 0 7.1969-3.0398 5.5937-8.089-6.683 1.1588-7.6583-2.2835-14.533-3.248z" fill="#d16340" stroke-width=".95369"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<path d="m16 20 44-12v56l-44 20z" fill="#9b9bbd" fill-opacity=".62353"/>
<path d="m53.986 8h6.0143v56h-5.922z" fill="#a5a5c3" fill-opacity=".5"/>
<path d="m8 84h8l44-20h-5.922z" fill="#626294" fill-opacity=".5"/>
<path d="m8 20h8v64h-8z" fill="#dfdfe9" fill-opacity=".8"/>
<path d="m8 20h8l44-12h-6.0143z" fill="#7b7ba7" fill-opacity=".8"/>
<path d="m32 20-12 16v12l22.494-32z" fill="#fff" fill-opacity=".14"/>
<path d="m20 56v20l28-60z" fill="#fff" fill-opacity=".14"/>
<g transform="matrix(.70283 .40578 -.40578 .70283 396.55 -761.51)">
<path id="glass_bottles" d="m139.5 1028.5v7.5c0.19842 0.4623 0.73815 1.1278 1.5 1.5v18.5c-5.0387 2.3857-11 6.4999-11 12.5l4e-5 46c0 5.9999 8 7.9999 17 7.9999s17-2 17-7.9999l-4e-5 -46c0-6-5.9612-10.114-11-12.5v-18.5c0.79701-0.3788 1.2966-1.0245 1.5-1.5v-7.5c-0.4451-1.4272-3.7205-2.5035-7.7446-2.5049-4.0242 0-7.2564 0.9396-7.2554 2.5049z" fill="#4c8235" fill-opacity=".90404" stroke-width="1.0807" style="paint-order:fill markers stroke"/>
<path d="m160 1114.9c6e-5 2.9313-6.54 5.3076-13.109 5.3076s-12.891-2.3763-12.891-5.3076c4.6827-2.6183 6.5732-9.4878 13.142-9.4878 6.569 0 8.2607 5.5878 12.858 9.4878z" fill="#1d3214" fill-opacity=".35859" stroke-width=".79752" style="paint-order:fill markers stroke"/>
<path d="m141 1029.6v5.875c2.6026 3.3186 9.4818 3.3788 11.75 0v-5.875c-4.2578 2.1581-7.4253 2.118-11.75 0z" fill="#1d3214" fill-opacity=".35686" stroke-width=".84656" style="paint-order:fill markers stroke"/>
<path transform="translate(0,738.52)" d="m143.06 299.91v19.088c-5.4808 2.1531-8.093 6.9939-8.9503 10.963l-0.11221 46.467c0.4677 2.2992 3.5371 3.6348 6.5 4.4369v-50.992c0.0537-3.2631 1.2299-6.7814 4.9375-10.875l-0.13281-18.424c-1.0415-0.074-1.6648-0.35806-2.2422-0.66406z" fill="#98c980" fill-opacity=".25098" style="paint-order:fill markers stroke"/>
</g>
<g transform="matrix(.71047 -.10709 .10709 .71047 -161.16 -689.13)">
<path d="m152.88 1066.5c3.8138 15.362-2.2592 35.938-0.35438 48.858 0 5.9999 8 7.9999 17 7.9999s17-2 17-7.9999c2.3305-17.401-4.9301-31.41-0.23829-48.36-11.123-5.1748-22.263-3.8151-33.407-0.4978z" fill="#ababab" fill-opacity=".62381" stroke-width="1.0807" style="paint-order:fill markers stroke"/>
<g transform="translate(22.528 .80731)">
<path d="m160 1114.9c6e-5 2.9313-6.54 5.3076-13.109 5.3076s-12.891-2.3763-12.891-5.3076c2.6489-1.7368 6.6666-2.2647 13.236-2.2647 6.569 0 9.4148 0.3349 12.764 2.2647z" fill="#434343" fill-opacity=".35859" stroke-width=".79752" style="paint-order:fill markers stroke"/>
<path d="m130.35 1065.7-0.11568 6.8431c2.9211 3.7248 30.877 4.3867 33.422 0.5945l0.10068-6.9398c-4.7789 2.4222-28.553 1.8794-33.407-0.4978z" fill="#636363" fill-opacity=".24748" stroke-width=".95016" style="paint-order:fill markers stroke"/>
<path transform="translate(0,738.52)" d="m134.11 329.96c2.5055 14.663-0.0343 30.965-0.11221 46.467 0.4677 2.2992 3.5371 3.6348 6.5 4.4369l-0.0338-49.653-6.354-1.2507z" fill="#e8e8e8" fill-opacity=".25098" style="paint-order:fill markers stroke"/>
</g>
<path d="m152.88 1066.5c11.03-4.0438 22.162-4.0393 33.407 0.4978l-0.10067 6.9398c-9.6385-3.9992-20.149-5.7909-33.422-0.5945z" fill="#636363" fill-opacity=".24748"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.86272 -.13004 .13004 .86272 -259.83 -876.38)">
<path d="m152.88 1066.5c3.8138 15.362-2.2592 35.938-0.35438 48.858 0 5.9999 8 7.9999 17 7.9999s17-2 17-7.9999c2.3305-17.401-4.9301-31.41-0.23829-48.36-11.123-5.1748-22.263-3.8151-33.407-0.4978z" fill="#ababab" fill-opacity=".62381" stroke-width="1.0807" style="paint-order:fill markers stroke"/>
<g transform="translate(22.528 .80731)">
<path d="m160 1114.9c6e-5 2.9313-6.54 5.3076-13.109 5.3076s-12.891-2.3763-12.891-5.3076c2.6489-1.7368 6.6666-2.2647 13.236-2.2647 6.569 0 9.4148 0.3349 12.764 2.2647z" fill="#434343" fill-opacity=".35859" stroke-width=".79752" style="paint-order:fill markers stroke"/>
<path d="m130.35 1065.7-0.11568 6.8431c2.9211 3.7248 30.877 4.3867 33.422 0.5945l0.10068-6.9398c-4.7789 2.4222-28.553 1.8794-33.407-0.4978z" fill="#636363" fill-opacity=".24748" stroke-width=".95016" style="paint-order:fill markers stroke"/>
<path transform="translate(0 738.52)" d="m134.11 329.96c2.5055 14.663-0.0343 30.965-0.11221 46.467 0.4677 2.2992 3.5371 3.6348 6.5 4.4369l-0.0338-49.653-6.354-1.2507z" fill="#e8e8e8" fill-opacity=".25098" style="paint-order:fill markers stroke"/>
</g>
<path d="m152.88 1066.5c11.03-4.0438 22.162-4.0393 33.407 0.4978l-0.10067 6.9398c-9.6385-3.9992-20.149-5.7909-33.422-0.5945z" fill="#636363" fill-opacity=".24748"/>
</g>
<g transform="matrix(.85344 .49273 -.49273 .85344 464.95 -942.19)">
<path id="glass_bottles" d="m139.5 1028.5v7.5c0.19842 0.4623 0.73815 1.1278 1.5 1.5v18.5c-5.0387 2.3857-11 6.4999-11 12.5l4e-5 46c0 5.9999 8 7.9999 17 7.9999s17-2 17-7.9999l-4e-5 -46c0-6-5.9612-10.114-11-12.5v-18.5c0.79701-0.3788 1.2966-1.0245 1.5-1.5v-7.5c-0.4451-1.4272-3.7205-2.5035-7.7446-2.5049-4.0242 0-7.2564 0.9396-7.2554 2.5049z" fill="#4c8235" fill-opacity=".90404" stroke-width="1.0807" style="paint-order:fill markers stroke"/>
<path d="m160 1114.9c6e-5 2.9313-6.54 5.3076-13.109 5.3076s-12.891-2.3763-12.891-5.3076c4.6827-2.6183 6.5732-9.4878 13.142-9.4878 6.569 0 8.2607 5.5878 12.858 9.4878z" fill="#1d3214" fill-opacity=".35859" stroke-width=".79752" style="paint-order:fill markers stroke"/>
<path d="m141 1029.6v5.875c2.6026 3.3186 9.4818 3.3788 11.75 0v-5.875c-4.2578 2.1581-7.4253 2.118-11.75 0z" fill="#1d3214" fill-opacity=".35686" stroke-width=".84656" style="paint-order:fill markers stroke"/>
<path transform="translate(0 738.52)" d="m143.06 299.91v19.088c-5.4808 2.1531-8.093 6.9939-8.9503 10.963l-0.11221 46.467c0.4677 2.2992 3.5371 3.6348 6.5 4.4369v-50.992c0.0537-3.2631 1.2299-6.7814 4.9375-10.875l-0.13281-18.424c-1.0415-0.074-1.6648-0.35806-2.2422-0.66406z" fill="#98c980" fill-opacity=".25098" style="paint-order:fill markers stroke"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -0,0 +1,186 @@
[
{
"path": "batteries.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/batteries.svg"
]
},
{
"path": "beverage_cartons.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/beverage_cartons.svg"
]
},
{
"path": "cans.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/cans.svg"
]
},
{
"path": "clothes.svg",
"license": "CC-BY-SA",
"authors": [
"Adrien Pavie",
"modified from EmojiOne 2: U+1F456, U+1F45"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/clothes.svg"
]
},
{
"path": "cooking_oil.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/cooking_oil.svg"
]
},
{
"path": "engine_oil.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/engine_oil.svg"
]
},
{
"path": "garden_waste.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick",
"modified from Twemoji: U+1F33F"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/garden_waste.svg"
]
},
{
"path": "glass.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/glass.svg"
]
},
{
"path": "glass_bottles.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/glass_bottles.svg"
]
},
{
"path": "newspaper.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick",
"modified from EmojiOne 2: U+1F4F0"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/newspaper.svg"
]
},
{
"path": "paper.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/paper.svg"
]
},
{
"path": "plastic.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/plastic.svg"
]
},
{
"path": "plastic_bottles.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/plastic_bottles.svg"
]
},
{
"path": "plastic_packaging.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/plastic_packaging.svg"
]
},
{
"path": "recycling-14.svg",
"license": "CC0",
"authors": [
"Michael Glanznig"
],
"sources": [
"https://github.com/gmgeo/osmic/blob/master/amenity/recycling-14.svg"
]
},
{
"path": "scrap_metal.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/scrap_metal.svg"
]
},
{
"path": "shoes.svg",
"license": "CC-BY-SA",
"authors": [
"Tobias Zwick",
"modified from EmojiOne 2: U+1F45F"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/shoes.svg"
]
},
{
"path": "small_electrical_appliances.svg",
"license": "CC-BY-SA",
"authors": [
"EmojiOne 2: U+1F50C"
],
"sources": [
"https://github.com/streetcomplete/StreetComplete/blob/master/res/graphics/recycling%20icons/small_electrical_appliances.svg"
]
}
]

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<path d="m45.059 92.075s27.848-35.765 48.063-46.791c-9.0472-17.67-54-35.341-54-35.341l-28.414 37.037 27.707 44.812c1.555 1.9791 4.5236 2.1204 6.644 0.28272" fill="#94989b" stroke-width="1.4136"/>
<path d="m39.404 84.724s54.142-37.744 47.356-59.514c-15.126 1.4136-44.105-19.225-46.226-22.335-8.4817 12.44-26.293 21.911-34.351 32.655-3.2513 4.3822-4.9477 7.4922-1.6963 12.44l34.068 43.681c-1.6963-1.9791-1.1309-5.089 0.84818-6.9268" fill="#d0d0d0" stroke-width="1.4136"/>
<g transform="matrix(1.4136 0 0 1.4136 2.6503 2.8751)" fill="#94989b">
<path d="m47.3 32.4-28.4-22.2 0.8-0.7 28.6 22z"/>
<path d="m17.9 31.2-10.2-10.7c4.9-5.6 8.9-8.2 8.9-8.2l11.6 9.7z"/>
<path d="m24.7 52.6-21.9-26.8c0.6-2.4 2.6-3.5 2.6-3.5l23.3 26.7-4 3.6"/>
<path d="m30.8 24.2-3.5 3.1 12.7 11.6 4-3.6z"/>
<path d="m23.8 30.5-3.5 3.1 11.6 12.5 4.1-3.6z"/>
<path d="m22.023 8.1579 17.247 13.301c2.2812-2.0362 4.7734-3.9318 6.1998-6.5379-6.087-3.2765-16.908-9.1747-18.599-12.174-1.2593 1.8833-3.1597 3.6071-4.8471 5.4107z" fill="#94989b"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.83009 -.31103 .31103 .83009 -385.37 -519.71)">
<g transform="matrix(1.1369 0 0 1.1369 -27.48 -122.53)">
<path transform="translate(0 738.52)" d="m234 36-24 18v24l24-18zm-9.1094 12.766a2.0002 2.0002 0 0 1 1.2871 3.5703l-4.2129 3.4141a2.0004 2.0004 0 0 1-2.5176-3.1094l4.2129-3.4121a2.0002 2.0002 0 0 1 1.2305-0.46289z" fill="#866d31"/>
<path d="m234 798.52 30 18v-25.899l-30-16.101z" fill="#957937"/>
<path d="m240.54 836.5 23.457-19.985-30-18-24 18z" fill="#b99c55"/>
<path d="m210 792.52v24l30.543 19.985 3.6505-12.948-3.1539-8.4029z" fill="#bd932d"/>
<path d="m264 792.52v24l-23.457 19.985 3.6505-12.948-3.1539-8.4029z" fill="#a47f27"/>
<path d="m210 792.52-14.287 4.0273 38.09 18.998 7.2361-0.39173z" fill="#d1a63e"/>
<path d="m250.32 828.27-0.4452-7.1279 6.5-5.75 0.29726 7.4329z" fill="#6f5329"/>
<path d="m264 790.62 10.79 1.5221-22.79 24.377-10.96-1.366z" fill="#d1a63e"/>
<path d="m210 792.52-11.293 0.9047 24.354-18.53 10.939-0.37437z" fill="#dbb969"/>
<path d="m234 774.52 6.5136-8.6673 24.537 16.577-1.0502 8.1915z" fill="#d6af53"/>
<path d="m239.03 831.3-8.5112-5.1265 2.0513-5.7109 7.7937 4.4581z" fill="#6f5329"/>
<path d="m265.05 782.43-24.537-16.577 7.7364 0.41727 26.375 12.875z" fill="#dbb969"/>
<path d="m195.71 796.55 38.09 18.998-1.2353 4.9142z" fill="#d7b157"/>
</g>
</g>
<g transform="matrix(.74872 0 0 .74872 -72.086 -628.27)">
<path d="m150.48 865.04c-14.213 4.5819-26.606-2.659-45.207 8.5037 11.787 24.96 22.18 27.849 25.122 52.331 20.182-3.259 35.247-11.378 52.412-6.4644z" fill="#e5e4ba"/>
<path d="m171.66 901.07 7.5467 12.307c-15.417-3.4329-20.245-1.2357-26.355-0.46441-2.3968 2.1811-1.6944 5.3952-2.4382 8.1272-7.5203 7e-3 -15.914-2.1408-21.479-3.2509l-3.5992-11.494z" fill-opacity=".13131"/>
<path d="m154.72 852.76c-14.213 4.5819-20.567-8.7484-39.167 2.4144 5.6322 24.481 27.723 36.208 28.227 55.374 20.255-3.1372 27.421-9.8383 43.405-6.8928z" fill="#d7e0eb"/>
<path d="m167.95 873.9 4.2958 6.3857c-2.2966 8.5916-18.319 22.64-20.782 28.678l-7.6803 2.629z" fill-opacity=".13726"/>
<path d="m114 880.25 37.845-34.028c6.81 1.6909 10.219 1.1299 20.461 5.5871 0 33.663-23.985 43.06-23.985 63.258-17.342-2.4347-20.565-10.153-46.322-8.5446 3.5312-17.314 12.244-25.866 12-26.273z" fill="#f0ecec"/>
<path d="m139.29 860.67s1.6114 4.7 2.1486 4.4314c0.53713-0.26857 3.4914-2.6857 4.0285-2.6857 0.53713 0 2.5514 0.93999 3.4914 2.2828 0.94 1.3428 0 0.53713 3.76 0.53713 3.76 0 5.9085-0.53713 5.9085-0.53713l1.4148 4.8073 5.1495-0.94778" fill="none" stroke="#c39f9f" stroke-width="2.7865"/>
<path d="m155.17 882.46s0.17361-3.2487 0.0394-4.1887c-0.13428-0.93999-1.7878-1.1462-2.325-0.0719-0.53714 1.0743-3.5875-0.34599-4.9303 0.19114-1.3428 0.53714 0.90177-3.0111 0.76749-3.5483-1.1321-1.1608-6.58 1.3428-7.52 1.3428-0.93999 0-1.2368-3.424-1.7739-3.424l-3.1438 2.1472-3.7744-1.8207-7.6889 0.68122 1.3136-3.1197" fill="none" stroke="#c39f9f" stroke-width="2.7865"/>
<path d="m165.81 858.8c-0.54019-2.0522-0.12358-5.4296-1.9717-5.6702-3.6229 2.7827-6.8332 3.1356-7.9654 2.7159 0 0-2.8315-3.449-3.7715-3.7175" fill="none" stroke="#c39f9f" stroke-width="2.7865"/>
<path d="m114 880.25c8.7206-4.0213 29.968-8.022 39.675-9.6739-3.3406-10.887-3.8625-17.197-1.8295-24.354-3.5205 0.89266-19.973 11.162-37.845 34.028" fill-opacity=".1381"/>
<path d="m118.52 881.78 0.24946 3.2429s0.74836 1.372 2.6193 0.24945c1.8709-1.1225 5.6127-3.2429 6.1116-1.372 0.4989 1.8709 0.24944 3.7418 0.99781 3.7418s6.1116 0.99781 6.1116 0.99781l0.12473-1.4967" fill="none" stroke="#c39f9f" stroke-width="2.7865"/>
<path d="m114 880.25c12.644-11.239 33.875-16.34 33.486-17.124-2.4879-5.179-5.906-12.013 4.3596-16.904-9.1359 2.7522-27.058 19.76-37.845 34.028z" fill="#fafafa"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View file

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(-.26716 -.86833 .86833 -.26716 -702.14 310.26)">
<path d="m57.814 896.06c-5.7454-10.176-13.781-18.344-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m62.871 891c-5.9561-10.261-13.848-18.547-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m67.928 885.94c-5.5418-10.105-13.707-18.135-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m72.985 880.89c-5.5418-10.105-13.707-18.135-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m74.686 847.44c-7.4687 2.9602-17.238-1.3052-22.757 4.2143l-2.5286 2.5286c-1.6857 1.6857-0.95453 2.556-0.84285 4.2143-1.6583-0.11167-2.5286-0.84285-4.2143 0.84285s-0.95453 2.556-0.84285 4.2143c-1.6583-0.11168-2.5286-0.84285-4.2143 0.84285s-0.74134 2.4511-0.84285 4.2143c-1.6857 0-2.5286-0.84285-4.2143 0.84285-1.0691 0.97442-0.84285 2.5286-0.84285 4.2143-1.6857 0-12.409 9.0138-15.171 11.8-5.5239 5.5721-11.591 11.595-12.643 14.328-1.4913 7.6991 17.223 26.021 25.286 25.286 2.975-1.1891 8.9062-7.1954 14.328-12.643 2.7112-2.7237 11.8-13.486 11.8-15.171 1.6857 0 3.0607 0.31066 4.2143-0.84285 1.6857-1.6857 0.84285-2.5286 0.84285-4.2143 1.6857 0 2.5286 0.84285 4.2143-0.84285s0.95453-2.556 0.84285-4.2143c1.6583 0.11168 2.5286 0.84285 4.2143-0.84285s0.95453-2.556 0.84285-4.2143c1.6583 0.11168 2.5286 0.84285 4.2143-0.84285l2.5286-2.5286c5.3836-5.3836 1.6551-15.432 4.2143-22.757l3.3714-3.3714-8.4285-8.4285z" fill="#9ad8f2" fill-opacity=".71717" stroke="#8ac6de" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m48.558 858.4c5.7454 10.176 13.781 18.344 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m43.501 863.46c5.9561 10.261 13.848 18.547 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m38.444 868.51c5.5418 10.105 13.707 18.135 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m33.387 873.57c5.5418 10.105 13.707 18.135 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<ellipse transform="rotate(45)" cx="658" cy="542.25" rx="9.5358" ry="3.1576" fill="#70b9d7" style="paint-order:fill markers stroke"/>
<path d="m7.785 900.16c5.8047-6.5666 9.7972-13.041 24.285-22.599 2.8498 4.7631 7.5822 10.619 12.537 15.803-13.334-11.836-27.547 1.3485-36.822 6.7955z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m52.859 854.49c3.5192-5.4649 16.92-1.2746 23.842-4.8059-6.9841 7.1933-20.674 7.5327-20.418 10.257-2.0215-2.7206-3.1456-4.0854-3.4247-5.4508z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m47.434 860.31c-0.75358-0.14879-2.9459 0.94658-3.1057 2.0303 0.80223-0.87911 14.944 13.42 16.577 14.958-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m42.912 865.25c-0.75358-0.14878-2.9086 0.98383-3.0684 2.0676 0.80223-0.87911 14.907 13.383 16.54 14.921-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m37.75 870.52c-0.75358-0.14879-2.7596 1.0583-2.9194 2.142 0.80223-0.87911 14.758 13.308 16.391 14.846-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m88.46 842.07a7.1518 1.192 45 0 0-5.7123-4.2768l-0.06256-0.0625-5.0571 5.0571a7.1518 1.192 45 0 0 4.2143 5.9 7.1518 1.192 45 0 0 5.9 4.2143l5.0571-5.0571-0.06091-0.0609a7.1518 1.192 45 0 0-4.2785-5.7139z" fill="#3e66a2" style="paint-order:fill markers stroke"/>
<ellipse transform="rotate(45)" cx="657.94" cy="534.05" rx="7.1891" ry="1.341" fill="#7d9dcd" style="paint-order:fill markers stroke"/>
<path d="m31.385 923.76c-5.5418-10.105-13.707-18.135-23.6-23.6 4.6475 10.013 12.959 17.583 23.6 23.6z" fill="#8ac6de" fill-opacity=".66667" stroke="#8ac6de" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".66667" stroke-width="2.3849"/>
</g>
<g transform="matrix(1.1123 0 0 1.1123 -80.024 -797.23)">
<path d="m77.219 763.36 26.408-0.91079-2.4743 8.144 1.0972 27.424-25.782-4.4246c-1.1581-6.5947 8.7192-17.809 8.7192-17.809 0.01276-0.0638-3.9046-7.1545-7.9678-12.424z" fill="#c988ad" style="paint-order:normal"/>
<path d="m102.25 798.02 18.191-9.0442c-0.80764-11.237-4.0408-21.11 0.029-35.091l-16.843 8.5669-2.4743 8.144z" fill="#b06b92"/>
<path d="m101.85 788.06 17.474-7.9c-0.35142-5.6907-1.4488-11.754-0.6013-16.846l-17.565 7.2829" fill="#c0c0c0"/>
<path d="m80.361 767.64 20.792 2.9536 0.69278 17.463-22.381-4.0918c1.6275-3.604 5.7219-8.1802 5.7219-8.1802z" fill="#eee"/>
<path d="m83.935 747.62-1.0494-6.1002 23.25-2.5784 1.2264 6.7919z" fill="#6f9adb"/>
<path d="m107.36 745.74 13.108 8.149-16.843 8.5669-19.692-14.829z" fill="#944f76"/>
<path d="m103.63 762.45 16.843-8.5669-24.069-3.1814 7.2268 11.748" fill="#a55883"/>
<path d="m77.219 763.36 6.7164-15.74 23.427-1.8868-3.735 16.716z" fill="#d19aba"/>
<g transform="rotate(-10.439,120.47,753.88)">
<path transform="translate(0,738.52)" d="m94.477 6.7129-7.4102 4.7559 1.8418 2.3164c0.91641 0.91602 1.9091 1.5023 3.2793 1.5039 2.6726-3.4e-5 4.8393-1.9481 4.8398-4.3516-0.0021-0.78748-0.42923-1.341-0.88086-2.0156z" fill="#3e66a2" style="paint-order:normal"/>
<ellipse cx="90.887" cy="747.78" rx="4.4024" ry="4.3525" fill="#6f9adb" style="paint-order:normal"/>
</g>
<path d="m85.187 775.79 16.188-1.2665-21.014-6.8778z" fill-opacity=".17172"/>
<path d="m101.15 770.6 19.317-16.711-16.843 8.5669z" fill-opacity=".18182"/>
<path d="m85.648 777.54-4.4194 5.8336 17.766-6.7175z" fill="#fff" fill-opacity=".73232"/>
</g>
<g transform="matrix(.82351 0 0 .82351 13.096 22.928)">
<path d="m15.95 56.074c7.5182-2.2076 24.999 0.02776 35.579-7.9388 0 0 2.3102-1.5418 10.652-10.917l1.3708-8.2421-4.752-3.1708 2.1503-2.5665c15.101 5.4037 20.445 14.983 27.687 20.463l-1.0835 4.9046c-10.825 5.8046-12.876 3.6394-24.167 11.251l-25.845 23.622z" fill="#8dcdd1"/>
<path d="m46.357 50.999c0.26529 6.6833 13.8 4.6132 17.029 8.8587l-25.845 23.622-21.591-27.405s2.2076-2.9727 8.8628-3.7314c6.8399-0.85107 15.701 2.3438 21.544-1.3443z" fill="#71c0c6"/>
<path d="m62.433 60.678-24.892 22.801-5.5855-7.8391c10.943 1.8616 21.53-9.951 30.478-14.962z" fill="#55a6ac"/>
<path d="m37.79 83.174c-2.9785 2.767-11.212-0.86567-18.389-8.1137-7.1776-7.248-7.7082-15.889-4.7297-18.656 2.9785-2.767 8.3382 1.3881 15.516 8.6361 7.1776 7.248 10.582 15.367 7.6032 18.134z" fill="#e7e7e7"/>
<path d="m22.633 55c4.9351-2.1761 10.197 1.2634 18.302 0.94601-6.5255 2.3199-5.4533 2.7434-10.072 6.4255-2.3078-3.3285-5.1894-5.5095-8.2305-7.3715z" fill="#97e1e6"/>
<path d="m62.181 37.218c1.5905 8.4175 8.5034 11.232 14.563 14.946l3.5725-3.0639 7.2373-0.49403 1.0835-4.9046-25.085-14.725z" fill="#6db7bd"/>
<path d="m56.984 27.167 3.9658-3.9281 23.8 20.097-3.5175 2.8367c-8.7898-5.0846-15.778-13.408-24.248-19.005z" fill="#bae0e4"/>
<path d="m60.95 23.239c7.6394 2.7937 15.589 6.3747 27.687 20.463l-3.8869-0.36599z" fill="#509fa5"/>
<ellipse transform="matrix(.83423 -.55141 .57775 .81621 0 0)" cx="-22.969" cy="73.621" rx="4.8244" ry="10.02" fill="#a6a6a6"/>
<rect transform="matrix(.83423 -.55141 .57775 .81621 0 0)" x="-31.436" y="64.611" width="8.6014" height="17.751" fill="#a6a6a6"/>
<ellipse transform="matrix(.83423 -.55141 .57775 .81621 0 0)" cx="-31.491" cy="73.592" rx="3.744" ry="8.9808" fill="#e7e7e7"/>
<ellipse transform="matrix(.83423 -.55141 .57775 .81621 0 0)" cx="-31.527" cy="73.573" rx="2.6582" ry="6.0968" fill="#757575"/>
<path d="m16.679 65.766-1.8666 1.8918c5.1859 1.9907 9.7764 7.5924 10.218 14.287l3.0072-0.55906c-0.34219-6.3881-4.7385-13.669-11.359-15.62z" color="#000000" color-rendering="auto" dominant-baseline="auto" fill="#d7d7d7" image-rendering="auto" shape-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;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>
<g transform="matrix(.49229 .1319 -.1319 .49229 198.7 -524.82)">
<g stroke-width="2" style="paint-order:normal">
<path d="m14 1180.2 42 18.281 49.029-14.527-44.395-15.495z" fill="#f1826b"/>
<path d="m56 1198.5v42l49.029-17.705v-38.822z" fill="#be4b32"/>
<path d="m14 1180.2 42 18.281v42l-42-23.089z" fill="#e7674c" fill-rule="evenodd"/>
</g>
<g transform="matrix(1.1073,0,0,1.1073,-5.0727,-143.78)">
<path d="m48.243 1184.5 6e-3 7.1308c0.12432 1.8975 4.1867 3.4073 9.1426 3.4083 4.9544 0 9.069-1.5153 9.1932-3.4122 4e-5 -1.709 7e-5 -5.4179 1.1e-4 -7.1269z" fill="#be4b32" style="paint-order:normal"/>
<ellipse cx="57.381" cy="1184.6" rx="9.1383" ry="3.5" fill="#e7674c" style="paint-order:normal"/>
</g>
<g transform="matrix(1.1073,0,0,1.1073,-6.4092,-129.21)">
<path d="m48.243 1184.5 6e-3 7.1308c0.12432 1.8975 4.1867 3.4073 9.1426 3.4083 4.9544 0 9.069-1.5153 9.1932-3.4122 4e-5 -1.709 7e-5 -5.4179 1.1e-4 -7.1269z" fill="#be4b32" style="paint-order:normal"/>
<ellipse cx="57.381" cy="1184.6" rx="9.1383" ry="3.5" fill="#e7674c" style="paint-order:normal"/>
</g>
<g transform="matrix(1.1073,0,0,1.1073,18.552,-135.28)">
<path d="m48.243 1184.5 6e-3 7.1308c0.12432 1.8975 4.1867 3.4073 9.1426 3.4083 4.9544 0 9.069-1.5153 9.1932-3.4122 4e-5 -1.709 7e-5 -5.4179 1.1e-4 -7.1269z" fill="#be4b32" style="paint-order:normal"/>
<ellipse cx="57.381" cy="1184.6" rx="9.1383" ry="3.5" fill="#e7674c" style="paint-order:normal"/>
</g>
<g transform="matrix(1.1073,0,0,1.1073,-28.698,-138.28)">
<path d="m48.243 1184.5 6e-3 7.1308c0.12432 1.8975 4.1867 3.4073 9.1426 3.4083 4.9544 0 9.069-1.5153 9.1932-3.4122 4e-5 -1.709 7e-5 -5.4179 1.1e-4 -7.1269z" fill="#be4b32" style="paint-order:normal"/>
<ellipse cx="57.381" cy="1184.6" rx="9.1383" ry="3.5" fill="#e7674c" style="paint-order:normal"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<path d="m57.814 61.539c-5.7454-10.176-13.781-18.344-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m62.871 56.482c-5.9561-10.261-13.848-18.547-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m67.928 51.424c-5.5418-10.105-13.707-18.135-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m72.985 46.367c-5.5418-10.105-13.707-18.135-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m74.686 12.923c-7.4687 2.9602-17.238-1.3052-22.757 4.2143l-2.5286 2.5286c-1.6857 1.6857-0.95453 2.556-0.84285 4.2143-1.6583-0.11167-2.5286-0.84285-4.2143 0.84285-1.6857 1.6857-0.95453 2.556-0.84285 4.2143-1.6583-0.11168-2.5286-0.84285-4.2143 0.84285-1.6857 1.6857-0.74134 2.4511-0.84285 4.2143-1.6857 0-2.5286-0.84285-4.2143 0.84285-1.0691 0.97442-0.84285 2.5286-0.84285 4.2143-1.6857 0-12.409 9.0138-15.171 11.8-5.5239 5.5721-11.591 11.595-12.643 14.328-1.4913 7.6991 17.223 26.021 25.286 25.286 2.975-1.1891 8.9062-7.1954 14.328-12.643 2.7112-2.7237 11.8-13.486 11.8-15.171 1.6857 0 3.0607 0.31066 4.2143-0.84285 1.6857-1.6857 0.84285-2.5286 0.84285-4.2143 1.6857 0 2.5286 0.84285 4.2143-0.84285 1.6857-1.6857 0.95453-2.556 0.84285-4.2143 1.6583 0.11168 2.5286 0.84285 4.2143-0.84285 1.6857-1.6857 0.95453-2.556 0.84285-4.2143 1.6583 0.11168 2.5286 0.84285 4.2143-0.84285l2.5286-2.5286c5.3836-5.3836 1.6551-15.432 4.2143-22.757l3.3714-3.3714-8.4285-8.4285z" fill="#9ad8f2" fill-opacity=".71717" stroke="#8ac6de" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m48.558 23.88c5.7454 10.176 13.781 18.344 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m43.501 28.937c5.9561 10.261 13.848 18.547 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m38.444 33.994c5.5418 10.105 13.707 18.135 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m33.387 39.051c5.5418 10.105 13.707 18.135 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<ellipse transform="rotate(45)" cx="67.909" cy="-47.845" rx="9.5358" ry="3.1576" fill="#70b9d7" style="paint-order:fill markers stroke"/>
<path d="m7.785 65.637c5.8047-6.5666 9.7972-13.041 24.285-22.599 2.8498 4.7631 7.5822 10.619 12.537 15.803-13.334-11.836-27.547 1.3485-36.822 6.7955z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m52.859 19.969c3.5192-5.4649 16.92-1.2746 23.842-4.8059-6.9841 7.1933-20.674 7.5327-20.418 10.257-2.0215-2.7206-3.1456-4.0854-3.4247-5.4508z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m47.434 25.794c-0.75358-0.14879-2.9459 0.94658-3.1057 2.0303 0.80223-0.87911 14.944 13.42 16.577 14.958-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m42.912 30.732c-0.75358-0.14878-2.9086 0.98383-3.0684 2.0676 0.80223-0.87911 14.907 13.383 16.54 14.921-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m37.75 36c-0.75358-0.14879-2.7596 1.0583-2.9194 2.142 0.80223-0.87911 14.758 13.308 16.391 14.846-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m88.46 7.5503a7.1518 1.192 45 0 0-5.7123-4.2768l-0.06256-0.0625-5.0571 5.0571a7.1518 1.192 45 0 0 4.2143 5.9 7.1518 1.192 45 0 0 5.9 4.2143l4.932-4.932 0.12511-0.12511-0.06091-0.0609a7.1518 1.192 45 0 0-4.2785-5.7139z" fill="#3e66a2" style="paint-order:fill markers stroke"/>
<ellipse transform="rotate(45)" cx="67.841" cy="-56.048" rx="7.1891" ry="1.341" fill="#7d9dcd" style="paint-order:fill markers stroke"/>
<path d="m31.385 89.237c-5.5418-10.105-13.707-18.135-23.6-23.6 4.6475 10.013 12.959 17.583 23.6 23.6z" fill="#8ac6de" fill-opacity=".66667" stroke="#8ac6de" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".66667" stroke-width="2.3849"/>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(-.26716 -.86833 .86833 -.26716 -702.14 310.26)">
<path d="m57.814 896.06c-5.7454-10.176-13.781-18.344-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m62.871 891c-5.9561-10.261-13.848-18.547-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m67.928 885.94c-5.5418-10.105-13.707-18.135-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m72.985 880.89c-5.5418-10.105-13.707-18.135-23.6-23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-width="2.3839"/>
<path d="m74.686 847.44c-7.4687 2.9602-17.238-1.3052-22.757 4.2143l-2.5286 2.5286c-1.6857 1.6857-0.95453 2.556-0.84285 4.2143-1.6583-0.11167-2.5286-0.84285-4.2143 0.84285s-0.95453 2.556-0.84285 4.2143c-1.6583-0.11168-2.5286-0.84285-4.2143 0.84285s-0.74134 2.4511-0.84285 4.2143c-1.6857 0-2.5286-0.84285-4.2143 0.84285-1.0691 0.97442-0.84285 2.5286-0.84285 4.2143-1.6857 0-12.409 9.0138-15.171 11.8-5.5239 5.5721-11.591 11.595-12.643 14.328-1.4913 7.6991 17.223 26.021 25.286 25.286 2.975-1.1891 8.9062-7.1954 14.328-12.643 2.7112-2.7237 11.8-13.486 11.8-15.171 1.6857 0 3.0607 0.31066 4.2143-0.84285 1.6857-1.6857 0.84285-2.5286 0.84285-4.2143 1.6857 0 2.5286 0.84285 4.2143-0.84285s0.95453-2.556 0.84285-4.2143c1.6583 0.11168 2.5286 0.84285 4.2143-0.84285s0.95453-2.556 0.84285-4.2143c1.6583 0.11168 2.5286 0.84285 4.2143-0.84285l2.5286-2.5286c5.3836-5.3836 1.6551-15.432 4.2143-22.757l3.3714-3.3714-8.4285-8.4285z" fill="#9ad8f2" fill-opacity=".71717" stroke="#8ac6de" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m48.558 858.4c5.7454 10.176 13.781 18.344 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m43.501 863.46c5.9561 10.261 13.848 18.547 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m38.444 868.51c5.5418 10.105 13.707 18.135 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<path d="m33.387 873.57c5.5418 10.105 13.707 18.135 23.6 23.6" fill="none" stroke="#8ac6de" stroke-linecap="round" stroke-opacity=".66667" stroke-width="2.3839"/>
<ellipse transform="rotate(45)" cx="658" cy="542.25" rx="9.5358" ry="3.1576" fill="#70b9d7" style="paint-order:fill markers stroke"/>
<path d="m7.785 900.16c5.8047-6.5666 9.7972-13.041 24.285-22.599 2.8498 4.7631 7.5822 10.619 12.537 15.803-13.334-11.836-27.547 1.3485-36.822 6.7955z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m52.859 854.49c3.5192-5.4649 16.92-1.2746 23.842-4.8059-6.9841 7.1933-20.674 7.5327-20.418 10.257-2.0215-2.7206-3.1456-4.0854-3.4247-5.4508z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m47.434 860.31c-0.75358-0.14879-2.9459 0.94658-3.1057 2.0303 0.80223-0.87911 14.944 13.42 16.577 14.958-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m42.912 865.25c-0.75358-0.14878-2.9086 0.98383-3.0684 2.0676 0.80223-0.87911 14.907 13.383 16.54 14.921-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m37.75 870.52c-0.75358-0.14879-2.7596 1.0583-2.9194 2.142 0.80223-0.87911 14.758 13.308 16.391 14.846-4.9558-5.6986-10.258-11.424-13.471-16.988z" fill="#eef7fb" fill-opacity=".8"/>
<path d="m88.46 842.07a7.1518 1.192 45 0 0-5.7123-4.2768l-0.06256-0.0625-5.0571 5.0571a7.1518 1.192 45 0 0 4.2143 5.9 7.1518 1.192 45 0 0 5.9 4.2143l5.0571-5.0571-0.06091-0.0609a7.1518 1.192 45 0 0-4.2785-5.7139z" fill="#3e66a2" style="paint-order:fill markers stroke"/>
<ellipse transform="rotate(45)" cx="657.94" cy="534.05" rx="7.1891" ry="1.341" fill="#7d9dcd" style="paint-order:fill markers stroke"/>
<path d="m31.385 923.76c-5.5418-10.105-13.707-18.135-23.6-23.6 4.6475 10.013 12.959 17.583 23.6 23.6z" fill="#8ac6de" fill-opacity=".66667" stroke="#8ac6de" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".66667" stroke-width="2.3849"/>
</g>
<g transform="matrix(1.1123 0 0 1.1123 -80.024 -797.23)">
<path d="m77.219 763.36 26.408-0.91079-2.4743 8.144 1.0972 27.424-25.782-4.4246c-1.1581-6.5947 8.7192-17.809 8.7192-17.809 0.01276-0.0638-3.9046-7.1545-7.9678-12.424z" fill="#c988ad" style="paint-order:normal"/>
<path d="m102.25 798.02 18.191-9.0442c-0.80764-11.237-4.0408-21.11 0.029-35.091l-16.843 8.5669-2.4743 8.144z" fill="#b06b92"/>
<path d="m101.85 788.06 17.474-7.9c-0.35142-5.6907-1.4488-11.754-0.6013-16.846l-17.565 7.2829" fill="#c0c0c0"/>
<path d="m80.361 767.64 20.792 2.9536 0.69278 17.463-22.381-4.0918c1.6275-3.604 5.7219-8.1802 5.7219-8.1802z" fill="#eee"/>
<path d="m83.935 747.62-1.0494-6.1002 23.25-2.5784 1.2264 6.7919z" fill="#6f9adb"/>
<path d="m107.36 745.74 13.108 8.149-16.843 8.5669-19.692-14.829z" fill="#944f76"/>
<path d="m103.63 762.45 16.843-8.5669-24.069-3.1814 7.2268 11.748" fill="#a55883"/>
<path d="m77.219 763.36 6.7164-15.74 23.427-1.8868-3.735 16.716z" fill="#d19aba"/>
<g transform="rotate(-10.439,120.47,753.88)">
<path transform="translate(0,738.52)" d="m94.477 6.7129-7.4102 4.7559 1.8418 2.3164c0.91641 0.91602 1.9091 1.5023 3.2793 1.5039 2.6726-3.4e-5 4.8393-1.9481 4.8398-4.3516-0.0021-0.78748-0.42923-1.341-0.88086-2.0156z" fill="#3e66a2" style="paint-order:normal"/>
<ellipse cx="90.887" cy="747.78" rx="4.4024" ry="4.3525" fill="#6f9adb" style="paint-order:normal"/>
</g>
<path d="m85.187 775.79 16.188-1.2665-21.014-6.8778z" fill-opacity=".17172"/>
<path d="m101.15 770.6 19.317-16.711-16.843 8.5669z" fill-opacity=".18182"/>
<path d="m85.648 777.54-4.4194 5.8336 17.766-6.7175z" fill="#fff" fill-opacity=".73232"/>
</g>
<g transform="matrix(.82351 0 0 .82351 21.061 23.612)">
<path d="m15.95 56.074c7.5182-2.2076 24.999 0.02776 35.579-7.9388 0 0 2.3102-1.5418 10.652-10.917l1.3708-8.2421-4.752-3.1708 2.1503-2.5665c15.101 5.4037 20.445 14.983 27.687 20.463l-1.0835 4.9046c-10.825 5.8046-12.876 3.6394-24.167 11.251l-25.845 23.622z" fill="#8dcdd1"/>
<path d="m46.357 50.999c0.26529 6.6833 13.8 4.6132 17.029 8.8587l-25.845 23.622-21.591-27.405s2.2076-2.9727 8.8628-3.7314c6.8399-0.85107 15.701 2.3438 21.544-1.3443z" fill="#71c0c6"/>
<path d="m62.433 60.678-24.892 22.801-5.5855-7.8391c10.943 1.8616 21.53-9.951 30.478-14.962z" fill="#55a6ac"/>
<path d="m37.79 83.174c-2.9785 2.767-11.212-0.86567-18.389-8.1137-7.1776-7.248-7.7082-15.889-4.7297-18.656 2.9785-2.767 8.3382 1.3881 15.516 8.6361 7.1776 7.248 10.582 15.367 7.6032 18.134z" fill="#e7e7e7"/>
<path d="m22.633 55c4.9351-2.1761 10.197 1.2634 18.302 0.94601-6.5255 2.3199-5.4533 2.7434-10.072 6.4255-2.3078-3.3285-5.1894-5.5095-8.2305-7.3715z" fill="#97e1e6"/>
<path d="m62.181 37.218c1.5905 8.4175 8.5034 11.232 14.563 14.946l3.5725-3.0639 7.2373-0.49403 1.0835-4.9046-25.085-14.725z" fill="#6db7bd"/>
<path d="m56.984 27.167 3.9658-3.9281 23.8 20.097-3.5175 2.8367c-8.7898-5.0846-15.778-13.408-24.248-19.005z" fill="#bae0e4"/>
<path d="m60.95 23.239c7.6394 2.7937 15.589 6.3747 27.687 20.463l-3.8869-0.36599z" fill="#509fa5"/>
<ellipse transform="matrix(.83423 -.55141 .57775 .81621 0 0)" cx="-22.969" cy="73.621" rx="4.8244" ry="10.02" fill="#a6a6a6"/>
<rect transform="matrix(.83423 -.55141 .57775 .81621 0 0)" x="-31.436" y="64.611" width="8.6014" height="17.751" fill="#a6a6a6"/>
<ellipse transform="matrix(.83423 -.55141 .57775 .81621 0 0)" cx="-31.491" cy="73.592" rx="3.744" ry="8.9808" fill="#e7e7e7"/>
<ellipse transform="matrix(.83423 -.55141 .57775 .81621 0 0)" cx="-31.527" cy="73.573" rx="2.6582" ry="6.0968" fill="#757575"/>
<path d="m16.679 65.766-1.8666 1.8918c5.1859 1.9907 9.7764 7.5924 10.218 14.287l3.0072-0.55906c-0.34219-6.3881-4.7385-13.669-11.359-15.62z" color="#000000" color-rendering="auto" dominant-baseline="auto" fill="#d7d7d7" image-rendering="auto" shape-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;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: 8.4 KiB

View file

@ -0,0 +1,40 @@
<?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"
version="1.1"
width="100%"
height="100%"
viewBox="0 0 14 14"
id="svg2">
<metadata
id="metadata8">
<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="defs6" />
<rect
width="14"
height="14"
x="0"
y="0"
id="canvas"
style="fill:none;stroke:none;visibility:hidden" />
<path
d="M 5.111113,8.690628 3.513352,5.804047 0.3,5.804047 1.60621,6.5880837 0.798678,8.031102 c -0.06887,0.130859 -0.103304,0.267511 -0.103301,0.409961 -3e-6,0.142456 0.03443,0.27911 0.103301,0.40996 l 1.271077,2.298282 c 0.05733,-0.166376 0.11466,-0.309011 0.171995,-0.427902 L 3.82273,7.906591 5.111113,8.690628 z m -2.38799,2.316224 c -0.09194,0.154416 -0.137914,0.320611 -0.13791,0.498585 -4e-6,0.273307 0.09456,0.504931 0.283685,0.694868 0.189119,0.189939 0.415298,0.284906 0.678537,0.284906 l 3.161963,0 0,-2.654413 -3.333432,0 C 3.352886,9.878288 3.266892,10.0327 3.117975,10.294041 l -0.394852,0.712811 z m 4.278351,-6.5745954 3.196047,0 L 11.812587,1.54622 10.506901,2.3302555 9.698844,0.8866933 C 9.549912,0.6137609 9.320934,0.4772893 9.011916,0.4772767 l -2.543205,0 c 0.10312,0.1185426 0.189116,0.2372528 0.257992,0.3561331 L 8.289856,3.6482199 8.032389,3.8086154 7.001474,4.4322566 z M 5.437797,0.6197306 C 5.07108,0.6197421 4.796134,0.7859374 4.61296,1.1183163 L 3.015198,3.9690109 C 3.622066,4.3372941 4.360906,4.7767964 5.231719,5.2875185 5.746994,4.372999 6.302478,3.3752843 6.898173,2.2943703 L 6.262635,1.1183163 C 6.079446,0.7859374 5.804501,0.6197421 5.437797,0.6197306 l 0,0 z m 4.106882,9.1751824 0,-0.320793 0,-1.228795 L 7.946393,11.131363 9.544679,14 l 0,-1.55013 1.597761,0 c 0.309366,0 0.54411,-0.136653 0.704231,-0.409962 l 1.271602,-2.298279 c -0.171656,0.04749 -0.314811,0.07123 -0.42946,0.07123 L 9.544679,9.794909 z m 2.37121,-4.88147 c -0.05735,0.035533 -0.79636,0.4750321 -2.217045,1.3185066 0.710337,1.2708484 1.271764,2.2745434 1.684282,3.0110934 l 1.288383,0 c 0.378233,2e-6 0.658946,-0.166373 0.842142,-0.499132 0.171629,-0.320788 0.165862,-0.647379 -0.01731,-0.979774 l -1.58045,-2.850694 z"
id="recycling"
style="fill:#000000;fill-opacity:1;stroke:none" />
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,999 @@
{
"id": "recycling",
"name": {
"en": "Recycling",
"nl": "Recycling"
},
"description": {
"en": "A layer with recycling containers and centres",
"nl": "Een laag met recyclagingcontainers en -centrums"
},
"source": {
"osmTags": "amenity=recycling"
},
"calculatedTags": [
"_waste_amount=Object.values(Object.keys(feat.properties).filter((key) => key.startsWith('recycling:')).reduce((cur, key) => { return Object.assign(cur, { [key]: feat.properties[key] })}, {})).reduce((n, x) => n + (x == \"yes\"), 0);"
],
"minzoom": 12,
"title": {
"render": {
"en": "Recycling facility",
"nl": "Recyclingfaciliteit"
},
"mappings": [
{
"if": "name~*",
"then": {
"*": "{name}",
"en": "Recycling centre",
"nl": "Recyclingcentrum"
}
},
{
"if": "recycling_type=centre",
"then": {
"en": "Recycling container",
"nl": "Recyclingcontainer"
}
},
{
"if": "recycling_type=container",
"then": {
"en": "Recycling container",
"nl": "Recyclingcontainer"
}
}
]
},
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"icon": {
"render": "circle:white;./assets/layers/recycling/recycling-14.svg",
"mappings": [
{
"if": {
"and": [
"_waste_amount=1",
"recycling:batteries=yes"
]
},
"then": "circle:white;./assets/layers/recycling/batteries.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:beverage_cartons=yes"
]
},
"then": "circle:white;./assets/layers/recycling/beverage_cartons.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:cans=yes"
]
},
"then": "circle:white;./assets/layers/recycling/cans.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:clothes=yes"
]
},
"then": "circle:white;./assets/layers/recycling/clothes.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:cooking_oil=yes"
]
},
"then": "circle:white;./assets/layers/recycling/cooking_oil.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:engine_oil=yes"
]
},
"then": "circle:white;./assets/layers/recycling/engine_oil.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:glass=yes"
]
},
"then": "circle:white;./assets/layers/recycling/glass.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:glass_bottles=yes"
]
},
"then": "circle:white;./assets/layers/recycling/glass_bottles.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
{
"or": [
"recycling:green_waste=yes",
"recycling:organic=yes"
]
}
]
},
"then": "circle:white;./assets/layers/recycling/garden_waste.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:newspaper=yes"
]
},
"then": "circle:white;./assets/layers/recycling/newspaper.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:paper=yes"
]
},
"then": "circle:white;./assets/layers/recycling/paper.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:plastic_bottles=yes"
]
},
"then": "circle:white;./assets/layers/recycling/plastic_bottles.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:plastic_packaging=yes"
]
},
"then": "circle:white;./assets/layers/recycling/plastic_packaging.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:plastic=yes"
]
},
"then": "circle:white;./assets/layers/recycling/plastic.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:scrap_metal=yes"
]
},
"then": "circle:white;./assets/layers/recycling/scrap_metal.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:shoes=yes"
]
},
"then": "circle:white;./assets/layers/recycling/shoes.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
{
"or": [
"recycling:small_appliances=yes",
"recycling:small_electric_appliances=yes"
]
}
]
},
"then": "circle:white;./assets/layers/recycling/small_electrical_appliances.svg"
},
{
"if": {
"and": [
"_waste_amount=1",
"recycling:waste=yes"
]
},
"then": "circle:white;./assets/layers/waste_disposal/waste_disposal.svg"
}
]
},
"iconBadges": [
{
"if": {
"and": [
"_waste_amount>1",
"recycling:batteries=yes"
]
},
"then": "circle:white;./assets/layers/recycling/batteries.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:beverage_cartons=yes"
]
},
"then": "circle:white;./assets/layers/recycling/beverage_cartons.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:cans=yes"
]
},
"then": "circle:white;./assets/layers/recycling/cans.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:clothes=yes"
]
},
"then": "circle:white;./assets/layers/recycling/clothes.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:cooking_oil=yes"
]
},
"then": "circle:white;./assets/layers/recycling/cooking_oil.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:engine_oil=yes"
]
},
"then": "circle:white;./assets/layers/recycling/engine_oil.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:glass=yes"
]
},
"then": "circle:white;./assets/layers/recycling/glass.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:glass_bottles=yes"
]
},
"then": "circle:white;./assets/layers/recycling/glass_bottles.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
{
"or": [
"recycling:green_waste=yes",
"recycling:organic=yes"
]
}
]
},
"then": "circle:white;./assets/layers/recycling/garden_waste.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:newspaper=yes"
]
},
"then": "circle:white;./assets/layers/recycling/newspaper.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:paper=yes"
]
},
"then": "circle:white;./assets/layers/recycling/paper.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:plastic_bottles=yes"
]
},
"then": "circle:white;./assets/layers/recycling/plastic_bottles.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:plastic_packaging=yes"
]
},
"then": "circle:white;./assets/layers/recycling/plastic_packaging.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:plastic=yes"
]
},
"then": "circle:white;./assets/layers/recycling/plastic.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:scrap_metal=yes"
]
},
"then": "circle:white;./assets/layers/recycling/scrap_metal.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:shoes=yes"
]
},
"then": "circle:white;./assets/layers/recycling/shoes.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
{
"or": [
"recycling:small_appliances=yes",
"recycling:small_electrical_appliances=yes"
]
}
]
},
"then": "circle:white;./assets/layers/recycling/small_electrical_appliances.svg"
},
{
"if": {
"and": [
"_waste_amount>1",
"recycling:waste=yes"
]
},
"then": "circle:white;./assets/layers/waste_disposal/waste_disposal.svg"
}
]
}
],
"presets": [
{
"title": {
"en": "recycling container",
"nl": "recycling container"
},
"tags": [
"amenity=recycling",
"recycling_type=container"
]
},
{
"title": {
"en": "recycling centre",
"nl": "recycling centre"
},
"tags": [
"amenity=recycling",
"recycling_type=centre"
]
}
],
"tagRenderings": [
"images",
{
"id": "recycling-type",
"question": {
"en": "What type of recycling is this?",
"nl": "Wat voor soort recycling is dit?"
},
"mappings": [
{
"if": "recycling_type=container",
"then": {
"en": "This is a recycling container",
"nl": "Dit is een recyclingcontainer"
}
},
{
"if": "recycling_type=centre",
"then": {
"en": "This is a recycling centre",
"nl": "Dit is een recyclingcentrum"
}
},
{
"if": "amenity=waste_disposal",
"then": {
"en": "Waste disposal container for residual waste",
"nl": "Afvalcontainer voor restafval"
},
"addExtraTags": [
"recycling:batteries=",
"recycling:beverage_cartons=",
"recycling:cans=",
"recycling:clothes=",
"recycling:cooking_oil=",
"recycling:engine_oil=",
"recycling:green_waste=",
"recycling:organic=",
"recycling:glass_bottles=",
"recycling:glass=",
"recycling:newspaper=",
"recycling:paper=",
"recycling:plastic_bottles=",
"recycling:plastic_packaging=",
"recycling:plastic=",
"recycling:scrap_metal=",
"recycling:shoes=",
"recycling:small_appliances=",
"recycling:small_electrical_appliances=",
"recycling:waste="
]
}
]
},
{
"id": "recycling-centre-name",
"question": {
"en": "What is the name of this recycling centre?",
"nl": "Wat is de naam van dit recyclagecentrum?"
},
"render": {
"en": "This recycling centre is named <b>{name}</b>",
"nl": "Dit recyclagecentrum heet <b>{name}</b>"
},
"freeform": {
"key": "name"
},
"mappings": [
{
"if": "noname=yes",
"then": {
"en": "This recycling centre doesn't have a specific name",
"nl": "Dit recyclagecentrum heeft geen specifieke naam"
}
}
],
"condition": "recycling_type=centre"
},
{
"id": "container-location",
"question": {
"en": "Where is this container located?",
"nl": "Waar bevindt deze container zich?"
},
"condition": "recycling_type=container",
"mappings": [
{
"if": "location=underground",
"then": {
"en": "This is an underground container",
"nl": "Dit is een ondergrondse container"
}
},
{
"if": "location=indoor",
"then": {
"en": "This container is located indoors",
"nl": "Deze container bevindt zich binnen"
}
},
{
"if": "location=",
"then": {
"en": "This container is located outdoors",
"nl": "Deze container is buiten"
}
}
]
},
{
"id": "recycling-accepts",
"question": {
"en": "What can be recycled here?",
"nl": "Wat kan hier gerecycled worden?"
},
"multiAnswer": true,
"mappings": [
{
"if": "recycling:batteries=yes",
"ifnot": "recycling:batteries=",
"then": {
"en": "Batteries can be recycled here",
"nl": "Batterijen kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/batteries.svg",
"class": "medium"
}
},
{
"if": "recycling:beverage_cartons=yes",
"ifnot": "recycling:beverage_cartons=",
"then": {
"en": "Beverage cartons can be recycled here",
"nl": "Drankpakken kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/beverage_cartons.svg",
"class": "medium"
}
},
{
"if": "recycling:cans=yes",
"ifnot": "recycling:cans=",
"then": {
"en": "Cans can be recycled here",
"nl": "Blikken kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/cans.svg",
"class": "medium"
}
},
{
"if": "recycling:clothes=yes",
"ifnot": "recycling:clothes=",
"then": {
"en": "Clothes can be recycled here",
"nl": "Kleren kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/clothes.svg",
"class": "medium"
}
},
{
"if": "recycling:cooking_oil=yes",
"ifnot": "recycling:cooking_oil=",
"then": {
"en": "Cooking oil can be recycled here",
"nl": "Frituurvet kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/cooking_oil.svg",
"class": "medium"
}
},
{
"if": "recycling:engine_oil=yes",
"ifnot": "recycling:engine_oil=",
"then": {
"en": "Engine oil can be recycled here",
"nl": "Motorolie kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/engine_oil.svg",
"class": "medium"
}
},
{
"if": "recycling:green_waste=yes",
"ifnot": "recycling:green_waste=",
"then": {
"en": "Green waste can be recycled here",
"nl": "Groen afval kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/garden_waste.svg",
"class": "medium"
}
},
{
"if": "recycling:organic=yes",
"ifnot": "recycling:organic=",
"then": {
"en": "Organic waste can be recycled here",
"nl": "Organisch afval kan hier gerecycled worden"
},
"hideInAnswer": true,
"icon": {
"path": "./assets/layers/recycling/garden_waste.svg",
"class": "medium"
}
},
{
"if": "recycling:glass_bottles=yes",
"ifnot": "recycling:glass_bottles=",
"then": {
"en": "Glass bottles can be recycled here",
"nl": "Glazen flessen kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/glass_bottles.svg",
"class": "medium"
}
},
{
"if": "recycling:glass=yes",
"ifnot": "recycling:glass=",
"then": {
"en": "Glass can be recycled here",
"nl": "Glas kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/glass.svg",
"class": "medium"
}
},
{
"if": "recycling:newspaper=yes",
"ifnot": "recycling:newspaper=",
"then": {
"en": "Newspapers can be recycled here",
"nl": "Kranten kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/newspaper.svg",
"class": "medium"
}
},
{
"if": "recycling:paper=yes",
"ifnot": "recycling:paper=",
"then": {
"en": "Paper can be recycled here",
"nl": "Papier kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/paper.svg",
"class": "medium"
}
},
{
"if": "recycling:plastic_bottles=yes",
"ifnot": "recycling:plastic_bottles=",
"then": {
"en": "Plastic bottles can be recycled here",
"nl": "Plastic flessen kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/plastic_bottles.svg",
"class": "medium"
}
},
{
"if": "recycling:plastic_packaging=yes",
"ifnot": "recycling:plastic_packaging=",
"then": {
"en": "Plastic packaging can be recycled here",
"nl": "Plastic verpakking kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/plastic_packaging.svg",
"class": "medium"
}
},
{
"if": "recycling:plastic=yes",
"ifnot": "recycling:plastic=",
"then": {
"en": "Plastic can be recycled here",
"nl": "Plastic kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/plastic.svg",
"class": "medium"
}
},
{
"if": "recycling:scrap_metal=yes",
"ifnot": "recycling:scrap_metal=",
"then": {
"en": "Scrap metal can be recycled here",
"nl": "Oud metaal kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/scrap_metal.svg",
"class": "medium"
}
},
{
"if": "recycling:shoes=yes",
"ifnot": "recycling:shoes=",
"then": {
"en": "Shoes can be recycled here",
"nl": "Schoenen kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/shoes.svg",
"class": "medium"
}
},
{
"if": "recycling:small_appliances=yes",
"ifnot": "recycling:small_appliances=",
"then": {
"en": "Small electrical appliances can be recycled here",
"nl": "Kleine elektrische apparaten kunnen hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/recycling/small_electrical_appliances.svg",
"class": "medium"
}
},
{
"if": "recycling:small_electrical_appliances=yes",
"ifnot": "recycling:small_electrical_appliances=",
"then": {
"en": "Small electrical appliances can be recycled here",
"nl": "Kleine elektrische apparaten kunnen hier gerecycled worden"
},
"hideInAnswer": true,
"icon": {
"path": "./assets/layers/recycling/small_electrical_appliances.svg",
"class": "medium"
}
},
{
"if": "recycling:waste=yes",
"ifnot": "recycling:waste=",
"then": {
"en": "Residual waste can be recycled here",
"nl": "Restafval kan hier gerecycled worden"
},
"icon": {
"path": "./assets/layers/waste_disposal/waste_disposal.svg",
"class": "medium"
},
"hideInAnswer": "recycling_type=container"
}
]
},
{
"id": "operator",
"render": {
"en": "This recycling facility is operated by {operator}",
"nl": "Deze recyclingfaciliteit wordt beheerd door {operator}"
},
"question": {
"en": "What company operates this recycling facility?",
"nl": "Wat is de beheerder van deze recyclingfaciliteit?"
},
"freeform": {
"key": "operator",
"type": "string"
}
},
{
"builtin": [
"website",
"email",
"phone"
],
"override": {
"condition": "recycling_type=centre"
}
},
{
"id": "opening_hours",
"render": "{opening_hours_table()}",
"question": {
"en": "What are the opening hours of this recycling facility?",
"nl": "Wat zijn de openingstijden van deze recyclingfaciliteit?"
},
"freeform": {
"key": "opening_hours",
"type": "opening_hours"
},
"mappings": [
{
"if": "opening_hours=24/7",
"then": {
"en": "24/7",
"nl": "24/7"
}
}
]
}
],
"filter": [
{
"id": "isOpen",
"options": [
{
"question": {
"en": "Currently open",
"nl": "Op dit moment open"
},
"osmTags": "_isOpen=yes"
}
]
},
{
"id": "recyclingType",
"options": [
{
"question": {
"en": "All recycling types",
"nl": "Alle recyclingtypes"
}
},
{
"question": {
"en": "Recycling of batteries",
"nl": "Recycling van batterijen"
},
"osmTags": "recycling:batteries=yes"
},
{
"question": {
"en": "Recycling of beverage cartons",
"nl": "Recycling van drankpakken"
},
"osmTags": "recycling:beverage_cartons=yes"
},
{
"question": {
"en": "Recycling of cans",
"nl": "Recycling van blikken"
},
"osmTags": "recycling:cans=yes"
},
{
"question": {
"en": "Recycling of clothes",
"nl": "Recycling van kleding"
},
"osmTags": "recycling:clothes=yes"
},
{
"question": {
"en": "Recycling of cooking oil",
"nl": "Recycling van frituurvet"
},
"osmTags": "recycling:cooking_oil=yes"
},
{
"question": {
"en": "Recycling of engine oil",
"nl": "Recycling van motorolie"
},
"osmTags": "recycling:engine_oil=yes"
},
{
"question": {
"en": "Recycling of green waste",
"nl": "Recycling van groen afval"
},
"osmTags": {
"or": [
"recycling:green_waste=yes",
"recycling:organic=yes"
]
}
},
{
"question": {
"en": "Recycling of glass bottles",
"nl": "Recycling van glazen flessen"
},
"osmTags": "recycling:glass_bottles=yes"
},
{
"question": {
"en": "Recycling of glass",
"nl": "Recycling van glas"
},
"osmTags": "recycling:glass=yes"
},
{
"question": {
"en": "Recycling of newspapers",
"nl": "Recycling van kranten"
},
"osmTags": "recycling:newspaper=yes"
},
{
"question": {
"en": "Recycling of paper",
"nl": "Recycling van papier"
},
"osmTags": "recycling:paper=yes"
},
{
"question": {
"en": "Recycling of plastic bottles",
"nl": "Recycling van plastic flessen"
},
"osmTags": "recycling:plastic_bottles=yes"
},
{
"question": {
"en": "Recycling of plastic packaging",
"nl": "Recycling van plastic verpakking"
},
"osmTags": "recycling:plastic_packaging=yes"
},
{
"question": {
"en": "Recycling of plastic",
"nl": "Recycling van plastic"
},
"osmTags": "recycling:plastic=yes"
},
{
"question": {
"en": "Recycling of scrap metal",
"nl": "Recycling van oud metaal"
},
"osmTags": "recycling:scrap_metal=yes"
},
{
"question": {
"en": "Recycling of small electrical appliances",
"nl": "Recycling van kleine elektrische apparaten"
},
"osmTags": {
"or": [
"recycling:small_appliances=yes",
"recycling:small_electrical_appliances=yes"
]
}
},
{
"question": {
"en": "Recycling of residual waste",
"nl": "Recycling van restafval"
},
"osmTags": "recycling:waste=yes"
}
]
}
],
"deletion": {
"neededChangesets": 1
},
"allowMove": {
"enableRelocation": false,
"enableImproveAccuracy": true
}
}

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1.1254 .30154 -.30154 1.1254 -102.96 -1295.6)">
<path transform="translate(0 738.52)" d="m396 318v30c0.14504 4.9302 10.979 8.8987 24.084 8.9004 13.104-3e-3 23.771-4.1329 23.916-9.0625 7e-3 -0.0583-2e-3 0.035 0 0v-29.838z" fill="#b45a5a" style="paint-order:normal"/>
<path d="m388.59 1057.9c-4.9434 6.5507-4.2946 9.6605-0.60243 15.895l10.837 0.076c1.8952-2.7077 1.0176-4.5583 0.0402-6.3728l-7.1962-0.045c-1.1178-1.384-0.46108-2.2841 0.21218-3.1797h4.2075v-6.373z" color="#000000" color-rendering="auto" dominant-baseline="auto" fill="#494949" image-rendering="auto" shape-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;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="m444.02 1058.1v6.3729h4.52c0.42757 0.6667 0.88453 1.3114 0.0136 2.9519l-7.1962 0.045c-1.4732 1.8531-1.8208 3.9115 0.0402 6.3728l11.014-0.1644c3.7679-6.1857 2.7341-10.546-0.71639-15.668z" color="#000000" color-rendering="auto" dominant-baseline="auto" fill="#494949" image-rendering="auto" shape-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;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"/>
<ellipse cx="419.99" cy="1056.5" rx="23.995" ry="9" fill="#5a5a5a" stroke="#8a8a8a" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" style="paint-order:normal"/>
</g>
<g transform="matrix(.42516 1.5867 -1.5867 .42516 1538.4 -989.13)">
<path d="m384 1032.5v18c4.0416 3.9023 8.0401 3.6381 12 0v-18z" fill="#787878"/>
<path d="m383.53 1049.6c4.3658 2.9086 9.8301 1.8443 13.305-2.7498" fill="none" stroke="#979797" stroke-width="2"/>
<path d="m383.45 1045.1c4.3658 2.9086 9.8926 1.2506 13.367-3.3435" fill="none" stroke="#979797" stroke-width="2"/>
<path d="m383.31 1040.5c4.3658 2.9086 9.8301 1.1256 13.305-3.4685" fill="none" stroke="#979797" stroke-width="2"/>
<path d="m384 1020.5h12l6 6-6 6h-12l-6-6z" fill="#979797"/>
<path d="m378 1032.5v-6l6 6v6z" fill="#b0b0b0"/>
<path d="m384 1032.5h12v6h-12z" fill="#8a8a8a"/>
<path d="m402 1026.5v6l-6 6v-6z" fill="#6b6b6b"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<path d="m11.024 15.426s2.5047-3.2413 13.555 1.768c8.6927 3.978-15.323 15.323-17.68 10.608-1.4733-2.7993 4.1253-12.376 4.1253-12.376" fill="#a8d600" stroke-width="1.4733"/>
<path d="m76.44 52.112c-13.555-9.4293-27.699-37.423-29.467-37.423-5.0093 0-8.2507 1.9153-8.2507 1.9153l32.266 46.852c0 0.14733 7.2193-10.166 5.4513-11.345" fill="#5b636b" stroke-width="1.4733"/>
<path d="m83.07 56.532c-2.0627-1.768-7.956-2.9467-9.5767-4.5673-6.188-6.7773-19.153-18.711-30.203-38.896-3.978-7.514-22.395 5.5987-22.395 5.5987l32.119 51.125c0.29467 0 37.717-6.9247 30.056-13.26" fill="#333" stroke-width="1.4733"/>
<path d="m54.193 66.551c1.9153-1.6207 1.768-10.461 0.14733-12.671-10.019-14.439-26.52-36.244-33.003-36.244-6.7773 0-7.956 9.1347-11.787 9.1347-3.2413 0 1.326-11.492 1.326-11.492-6.188 6.9247-7.2193 29.025-7.2193 29.025s26.225 43.169 50.535 22.247" fill="#5b636b" stroke-width="1.4733"/>
<g transform="matrix(1.4733 0 0 1.4733 -.17288 -4.0216)" fill="#69727a">
<path d="m2.7 31.5s-0.4-3.9 1.3-9.1c0.1 5.9 3.8 7.3 2.8 15.1l-4.1-6"/>
<path d="m22.2 49.6c4.6-10.7 24.4 0.1 34.3-8.5 1.6 0.2 4.8 5.7 4.8 5.7s-3.6 14.4-39.1 2.8"/>
</g>
<path d="m3.8051 41.652c-1.4733 0-1.1787 10.166 0 11.787 7.8087 9.724 15.912 12.229 26.667 25.194 12.965 15.47 60.701 8.1033 60.701-5.1567 0-10.903-1.326-9.8713-1.326-9.8713-3.3887 8.84-33.592 10.755-44.642 8.398-24.31-5.0093-39.78-30.351-41.401-30.351" fill="#d0d0d0" stroke-width="1.4733"/>
<g transform="matrix(1.4733 0 0 1.4733 -1.3306 -1.9448)" fill="#333" stroke-width="1.4355">
<ellipse cx="24.038" cy="29.245" rx="2.0097" ry="2.4403"/>
<ellipse cx="19.608" cy="23.016" rx="2.0097" ry="2.4403" fill="#333"/>
<ellipse cx="28.374" cy="34.959" rx="2.0097" ry="2.4403"/>
<ellipse cx="32.889" cy="39.928" rx="2.0097" ry="2.4403"/>
</g>
<g transform="matrix(1.4733 0 0 1.4733 -.17288 -4.0216)" fill="#a8d600">
<path d="m33.3 43c-0.2 0-0.5-0.1-0.7-0.3-0.4-0.5-0.4-1.2 0-1.7 0.2-0.3 5.6-6.6 15.8-6.6 0.5 0 1 0.5 1 1.2 0 0.6-0.4 1.2-1 1.2-9.4 0-14.4 5.9-14.5 5.9-0.1 0.2-0.3 0.3-0.6 0.3"/>
<path d="m28.852 37.421c-0.2 0-0.4-0.1-0.6-0.3-0.4-0.4-0.5-1.1-0.2-1.6 0.2-0.3 4.4-6.6 16.2-6.6 0.5 0 1 0.5 1 1.2 0 0.6-0.4 1.2-1 1.2-10.7 0-14.6 5.7-14.7 5.7-0.1 0.2-0.4 0.4-0.7 0.4"/>
<path d="m24.503 31.609c-0.2 0-0.5-0.1-0.7-0.3-0.4-0.4-0.4-1.2-0.1-1.7 4.8-6.4 16.1-6.5 16.6-6.5s1 0.5 1 1.2c0 0.6-0.4 1.2-1 1.2-0.1 0-10.9 0.1-15.2 5.7-0.1 0.3-0.4 0.4-0.6 0.4"/>
<path d="m20.04 24.991c-0.3 0-0.6-0.2-0.8-0.5-0.3-0.5-0.2-1.3 0.2-1.6 0.2-0.2 6-5.3 16.8-5.3 0.5 0 1 0.5 1 1.2s-0.4 1.2-1 1.2c-10.1 0-15.6 4.8-15.6 4.9-0.2 0.1-0.4 0.1-0.6 0.1"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.68656 -.14063 .14063 .68656 -304.05 -588.75)">
<path d="m312 954.52 54-12" fill="#373737" stroke="#202020" stroke-width="4"/>
<rect x="372" y="960.52" width="6" height="12" fill="#202020" style="paint-order:normal"/>
<ellipse cx="365.88" cy="942.39" rx="6" ry="6" fill="#373737" style="paint-order:normal"/>
<ellipse cx="312" cy="954.52" rx="6" ry="6" fill="#373737" style="paint-order:normal"/>
<rect x="300" y="954.52" width="72" height="48" ry="0" fill="#488b4c" style="paint-order:normal"/>
<circle cx="328" cy="978.52" r="18" fill="#1f1f1f" stroke="#435844" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" style="paint-order:normal"/>
<rect x="354" y="960.52" width="12" height="36" ry="0" fill="#c1c1c1" stroke="#435844" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" style="paint-order:normal"/>
<path d="m366 984.52h-12" fill="none" stroke="#1f1f1f" stroke-linecap="round" stroke-width="6"/>
<circle cx="327.75" cy="978.64" r="8" fill="#050505" style="paint-order:normal"/>
<path d="m310 974.52 36-1e-5" fill="none" stroke="#435844" stroke-width="3"/>
<path d="m310 982.52 36-1e-5" fill="none" stroke="#435844" stroke-width="3"/>
<path d="m314 966.52 28-1e-5" fill="none" stroke="#435844" stroke-width="3"/>
<path d="m314 990.52 28-1e-5" fill="none" stroke="#435844" stroke-width="3"/>
</g>
<g transform="matrix(-.61038 -.35241 -.35241 .61038 595.94 -265.88)">
<path d="m407.75 786.52 70.5-0.75" fill="none" stroke="#323232" stroke-width="4"/>
<path transform="translate(0 738.52)" d="m456 29.5c-16.412-0.3218-17 10.5-48 11v16.25c26.088-0.77211 30.72 6.2784 39.924 8.8457 4.4653 12.521-6.8772 36.158 2.0762 40.404 23.528 0.99912 11.011-18.167 11.867-39.799 6.4151-0.50222 12.794-1.8253 18.133-6.2012 2.2834-6.3394 4.846-12.476 0-24-8-6.1136-15.713-6.3375-24-6.5z" fill="#eeb94f"/>
<path d="m408 779.02-18-4.5v25.5l18-4.75z" fill="#494949"/>
<path d="m448.48 824.44c-2.4772-0.19991-4.2603-3.1511-3.9827-6.5917 0.27766-3.4406 2.5109-6.0677 4.9882-5.8678z" fill="#494949" style="paint-order:normal"/>
<path d="m477 772.52c1.9775 9.582 1.3284 21.313 0 28.25l7.625-2.25c4.7716-7.8509 5.8712-15.817 0-24z" fill="#494949"/>
<path d="m408 781.52c34.1-0.70415 31.216-9.1274 47.553-10.253 7.202-0.49623 11.578 2.1592 11.079 2.8248-22.801-1.0172-33.025 12.849-58.176 12.784z" fill="#fff" fill-opacity=".38431"/>
<path d="m433.88 798.1c0.44675-0.32656 14.662 8.2103 21.303 6.753 6.9588 1.2822 22.074-3.237 21.821-4.0874 1.2622-5 1.0466-14.75 0.99998-19.75-8.4366 12.556-32.379 19.726-44.124 17.084z" fill-opacity=".24242"/>
</g>
<g transform="matrix(.52617 .14099 -.14099 .52617 -30.35 -479.42)">
<rect x="312" y="834.52" width="42" height="90" rx="6" ry="15.5" fill="#3c516b" style="paint-order:normal"/>
<path d="m320 838.52c-3.324 0-4 4.028-4 14v25.525c13.614 13.877 20.055 12.712 34 0v-25.525c0-9.972-0.67601-14-4-14z" fill="#101919" style="paint-order:normal"/>
<rect x="320.38" y="848.52" width="25.25" height="24" rx="2.5" ry="2.125" fill="#7faa6c" style="paint-order:normal"/>
<path d="m319.25 892.52 2.75 2" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m344 894.52 2.75-2" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m331.58 894.52h2.75" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m319.25 902.52 2.75 2" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m344 904.52 2.75-2" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m331.58 904.52h2.75" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m319.25 912.52 2.75 2" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m344 914.52 2.75-2" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m331.58 914.52h2.75" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="6"/>
<path d="m328 843.27h10" fill="#7b7b7b" stroke="#505050" stroke-linecap="round" stroke-width="4"/>
<path d="m331.58 879.64h2.75" fill="none" stroke="#a5a5a5" stroke-linecap="round" stroke-width="8"/>
<path d="m318.19 836.32 14.546-0.37398c1.3219 11.85-17.848 113.1-18.7 73.736l0.17677-61.518c0.44657-3.5171 0.62015-9.2134 3.9775-11.844z" fill="#fff" fill-opacity=".23737"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -71,7 +71,11 @@
{ {
"if": "highway=living_street", "if": "highway=living_street",
"then": { "then": {
"nl:": "<div class='flex'><img src='./assets/layers/slow_roads/woonerf.svg' style='width: 150px; height: auto; margin-right: 0.5em;' /> <div> Dit is een woonerf: <ul><li>Voetgangers mogen hier de volledige breedte van de straat gebruiken</li><li>Gemotoriseerd verkeer mag maximaal <b>20km/h</b> rijden</li></ul></div></div>" "nl:": "<div> Dit is een woonerf: <ul><li>Voetgangers mogen hier de volledige breedte van de straat gebruiken</li><li>Gemotoriseerd verkeer mag maximaal <b>20km/h</b> rijden</li></ul></div>"
},
"icon": {
"path": "./assets/layers/slow_roads/woonerf.svg",
"class": "medium"
} }
}, },
{ {

View file

@ -77,7 +77,11 @@
] ]
}, },
"then": { "then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door Natuurpunt" "nl": "Dit gebied wordt beheerd door Natuurpunt"
},
"icon": {
"path": "./assets/themes/buurtnatuur/Natuurpunt.jpg",
"class": "small"
} }
}, },
{ {
@ -87,9 +91,13 @@
] ]
}, },
"then": { "then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door {operator}" "nl": "Dit gebied wordt beheerd door {operator}"
}, },
"hideInAnswer": true "hideInAnswer": true,
"icon": {
"path": "./assets/themes/buurtnatuur/Natuurpunt.jpg",
"class": "small"
}
} }
], ],
"id": "Operator tag" "id": "Operator tag"

View file

@ -86,6 +86,14 @@
"nl": "Een vuilnisbak voor injectienaalden en andere scherpe voorwerpen", "nl": "Een vuilnisbak voor injectienaalden en andere scherpe voorwerpen",
"de": "Ein Abfalleimer für Nadeln und andere scharfe Gegenstände" "de": "Ein Abfalleimer für Nadeln und andere scharfe Gegenstände"
} }
},
{
"if": "waste=plastic",
"then": {
"en": "A waste basket for plastic",
"nl": "Een vuilnisbak voor plastic",
"de": "Ein Abfalleimer für Plastik"
}
} }
] ]
}, },
@ -137,7 +145,7 @@
"nl": "Deze vuilnisbak heeft <b>waarschijnlijk geen</b> verdeler voor hondenpoepzakjes", "nl": "Deze vuilnisbak heeft <b>waarschijnlijk geen</b> verdeler voor hondenpoepzakjes",
"de": "Dieser Abfalleimer <b>hat keinen</b> Spender für (Hunde-)Kotbeutel" "de": "Dieser Abfalleimer <b>hat keinen</b> Spender für (Hunde-)Kotbeutel"
}, },
"hideInAnwer": true "hideInAnswer": true
} }
] ]
} }
@ -159,6 +167,81 @@
} }
} }
], ],
"filter": [
{
"id": "waste-type",
"options": [
{
"question": {
"en": "All types",
"nl": "Alle soorten",
"de": "Alle Typen"
}
},
{
"question": {
"en": "Waste basket for cigarettes",
"nl": "Vuilnisbak voor sigarettenpeuken",
"de": "Mülleimer für Zigaretten"
},
"osmTags": "waste~.*cigarettes.*"
},
{
"question": {
"en": "Waste basket for drugs",
"nl": "Vuilnisbak voor (vervallen) medicatie en drugs",
"de": "Mülleimer für Drogen"
},
"osmTags": "waste~.*drugs.*"
},
{
"question": {
"en": "Waste basket for dog excrement",
"nl": "Vuilnisbak voor hondenuitwerpselen",
"de": "Mülleimer für Hundekot"
},
"osmTags": "waste~.*dog_excrement.*"
},
{
"question": {
"en": "Waste basket for trash",
"nl": "Vuilnisbak voor zwerfvuil",
"de": "Mülleimer für allgemeinen Müll"
},
"osmTags": "waste~.*trash.*"
},
{
"question": {
"en": "Waste basket for sharps",
"nl": "Vuilnisbak voor injectienaalden en andere scherpe voorwerpen",
"de": "Mülleimer für Nadeln und andere scharfe Gegenstände"
},
"osmTags": "waste~.*sharps.*"
},
{
"question": {
"en": "Waste basket for plastic",
"nl": "Vuilnisbak voor plastic",
"de": "Mülleimer für Plastik"
},
"osmTags": "waste~.*plastic.*"
}
]
},
{
"id": "waste-vending",
"options": [
{
"question": {
"en": "Waste basket with dispenser for (dog) excrement bags",
"nl": "Vuilnisbak met verdeler voor hondenpoepzakjes",
"de": "Abfalleimer mit Spender für (Hunde-)Kotbeutel"
},
"osmTags": "vending=dog_excrement_bag"
}
]
}
],
"deletion": { "deletion": {
"softDeletionTags": { "softDeletionTags": {
"and": [ "and": [

View file

@ -0,0 +1,12 @@
[
{
"path": "waste_disposal.svg",
"license": "CC0",
"authors": [
"kocio-pl"
],
"sources": [
"https://github.com/gravitystorm/openstreetmap-carto/blob/master/symbols/amenity/waste_disposal.svg"
]
}
]

View file

@ -0,0 +1,119 @@
{
"id": "waste_disposal",
"name": {
"en": "Waste Disposal Bins"
},
"description": {
"en": "Waste Disposal Bin, medium to large bin for disposal of (household) waste"
},
"source": {
"osmTags": "amenity=waste_disposal"
},
"minzoom": 18,
"minzoomVisible": 18,
"title": {
"render": {
"en": "Waste Disposal"
}
},
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"icon": "circle:white;./assets/layers/waste_disposal/waste_disposal.svg"
}
],
"presets": [
{
"title": {
"en": "Waste Disposal Bin"
},
"tags": [
"amenity=waste_disposal"
],
"description": {
"en": "Medium to large bin for disposal of (household) waste"
}
}
],
"tagRenderings": [
{
"id": "access",
"render": {
"en": "Access: {access}"
},
"question": {
"en": "Who can use this waste disposal bin?"
},
"freeform": {
"key": "access",
"type": "string"
},
"mappings": [
{
"if": "access=yes",
"then": {
"en": "This bin can be used by anyone"
}
},
{
"if": "access=no",
"then": {
"en": "This bin is private"
}
},
{
"if": "access=residents",
"then": {
"en": "This bin is only for residents"
}
}
]
},
{
"id": "disposal-location",
"question": {
"en": "Where is this container located?",
"nl": "Waar bevindt deze container zich?"
},
"mappings": [
{
"if": "location=underground",
"then": {
"en": "This is an underground container",
"nl": "Dit is een ondergrondse container"
}
},
{
"if": "location=indoor",
"then": {
"en": "This container is located indoors",
"nl": "Deze container bevindt zich binnen"
}
},
{
"if": "location=",
"then": {
"en": "This container is located outdoors",
"nl": "Deze container is buiten"
}
}
]
}
],
"filter": [
{
"id": "public-access",
"options": [
{
"question": {
"en": "Only public access"
},
"osmTags": "access=yes"
}
]
}
]
}

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
viewBox="0 0 14 14"
height="14"
width="14"
id="svg10"
version="1.1">
<metadata
id="metadata16">
<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="defs14" />
<path
id="path817"
d="M 6 1 L 6 2 L 3 2 L 3 3 L 11 3 L 11 2 L 8 2 L 8 1 L 6 1 z M 3 5 L 4 14 L 10 14 L 11 5 L 3 5 z M 5 6 L 6 6 L 6 13 L 5 13 L 5 6 z M 8 6 L 9 6 L 9 13 L 8 13 L 8 6 z "
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1,001 B

View file

@ -146,7 +146,11 @@
] ]
}, },
"then": { "then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door Natuurpunt" "nl": "Dit gebied wordt beheerd door Natuurpunt"
},
"icon": {
"path": "./assets/themes/buurtnatuur/Natuurpunt.jpg",
"class": "small"
} }
}, },
{ {
@ -156,9 +160,13 @@
] ]
}, },
"then": { "then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door {operator}" "nl": "Dit gebied wordt beheerd door {operator}"
}, },
"hideInAnswer": true "hideInAnswer": true,
"icon": {
"path": "./assets/themes/buurtnatuur/Natuurpunt.jpg",
"class": "small"
}
} }
], ],
"id": "Operator tag" "id": "Operator tag"

View file

@ -485,6 +485,48 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"isShown",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"isShown",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -753,6 +795,48 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"title",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"title",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -1014,6 +1098,48 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"titleIcons",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"titleIcons",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -1291,6 +1417,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"icon",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"icon",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -1585,6 +1755,52 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"iconBadges",
"then",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"iconBadges",
"then",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -1852,6 +2068,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"iconSize",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"iconSize",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -2116,6 +2376,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"rotation",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"rotation",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -2380,6 +2684,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"label",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"label",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -2651,6 +2999,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"color",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"color",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -2918,6 +3310,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"width",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"width",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -3182,6 +3618,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"dashArray",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"dashArray",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -3446,6 +3926,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"lineCap",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"lineCap",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -3714,6 +4238,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"fill",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"fill",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -3978,6 +4546,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"fillColor",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"fillColor",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -4242,6 +4854,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"mapRendering",
"offset",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"mapRendering",
"offset",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -4625,6 +5281,48 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"tagRenderings",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"tagRenderings",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -4871,6 +5569,50 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"layers",
"tagRenderings",
"renderings",
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"layers",
"tagRenderings",
"renderings",
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {
@ -5160,6 +5902,13 @@
], ],
"type": "boolean" "type": "boolean"
}, },
{
"path": [
"layers",
"syncSelection"
],
"type": "string"
},
{ {
"path": [ "path": [
"layers", "layers",

View file

@ -138,6 +138,44 @@
"icon" "icon"
], ],
"typeHint": "icon", "typeHint": "icon",
"type": [
{
"type": "object",
"properties": {
"path": {
"description": "The path to the icon\nType: icon",
"type": "string"
},
"class": {
"description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-<classtype>', so defining your own in combination with a custom CSS is possible (but discouraged)",
"type": "string"
}
},
"required": [
"class",
"path"
]
},
{
"type": "string"
}
]
},
{
"path": [
"mappings",
"icon",
"path"
],
"typeHint": "icon",
"type": "string"
},
{
"path": [
"mappings",
"icon",
"class"
],
"type": "string" "type": "string"
}, },
{ {

View file

@ -45,7 +45,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 1.5, "widenFactor": 1.5,
"socialImage": "",
"layers": [ "layers": [
"bench", "bench",
"bench_at_pt", "bench_at_pt",

View file

@ -19,7 +19,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 0.05, "widenFactor": 0.05,
"socialImage": "",
"layers": [ "layers": [
"bicycle_rental" "bicycle_rental"
] ]

View file

@ -33,7 +33,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 1.5, "widenFactor": 1.5,
"socialImage": "",
"layers": [ "layers": [
"binocular" "binocular"
] ]

View file

@ -504,7 +504,8 @@
] ]
}, },
"then": { "then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door Natuurpunt" "nl": "Dit gebied wordt beheerd door Natuurpunt",
"icon": "./assets/themes/buurtnatuur/Natuurpunt.jpg"
} }
}, },
{ {
@ -514,7 +515,8 @@
] ]
}, },
"then": { "then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door {operator}" "nl": "Dit gebied wordt beheerd door {operator}",
"icon": "./assets/themes/buurtnatuur/Natuurpunt.jpg"
}, },
"hideInAnswer": true "hideInAnswer": true
}, },
@ -525,7 +527,8 @@
] ]
}, },
"then": { "then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/ANB.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door het Agentschap Natuur en Bos" "nl": "Dit gebied wordt beheerd door het Agentschap Natuur en Bos",
"icon": "./assets/themes/buurtnatuur/ANB.jpg"
} }
}, },
{ {

View file

@ -22,7 +22,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 1.5, "widenFactor": 1.5,
"socialImage": "",
"layers": [ "layers": [
"cafe_pub" "cafe_pub"
] ]

View file

@ -42,7 +42,7 @@
"startLon": 3.14, "startLon": 3.14,
"startZoom": 14, "startZoom": 14,
"widenFactor": 1.5, "widenFactor": 1.5,
"socialImage": "./assets/themes/campersite/Bar%C3%9Fel_Wohnmobilstellplatz.jpg", "socialImage": "./assets/themes/campersite/social_image.jpg",
"layers": [ "layers": [
{ {
"id": "caravansites", "id": "caravansites",

View file

@ -1,14 +1,4 @@
[ [
{
"path": "Barßel_Wohnmobilstellplatz.jpg",
"license": "CC-BY-SA 3.0",
"authors": [
"ES01"
],
"sources": [
"https://commons.wikimedia.org/wiki/File:Bar%C3%9Fel_Wohnmobilstellplatz.jpg"
]
},
{ {
"path": "caravan.svg", "path": "caravan.svg",
"license": "CC0", "license": "CC0",
@ -41,5 +31,15 @@
"https://github.com/osmandapp/Osmand/blob/master/LICENSE", "https://github.com/osmandapp/Osmand/blob/master/LICENSE",
"https://github.com/osmandapp/OsmAnd-resources/blob/16892d8b2fc00dd422abfb2fef967d5ccd05eeac/icons/svg/poi/sanitary_dump_station.svg" "https://github.com/osmandapp/OsmAnd-resources/blob/16892d8b2fc00dd422abfb2fef967d5ccd05eeac/icons/svg/poi/sanitary_dump_station.svg"
] ]
},
{
"path": "social_image.jpg",
"license": "CC-BY-SA 3.0",
"authors": [
"ES01"
],
"sources": [
"https://commons.wikimedia.org/wiki/File:Bar%C3%9Fel_Wohnmobilstellplatz.jpg"
]
} }
] ]

View file

Before

Width:  |  Height:  |  Size: 593 KiB

After

Width:  |  Height:  |  Size: 593 KiB

Before After
Before After

View file

@ -39,7 +39,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 1.5, "widenFactor": 1.5,
"socialImage": "",
"defaultBackgroundId": "CartoDB.Voyager", "defaultBackgroundId": "CartoDB.Voyager",
"layers": [ "layers": [
"charging_station" "charging_station"

View file

@ -41,7 +41,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 1.5, "widenFactor": 1.5,
"socialImage": "",
"layers": [ "layers": [
{ {
"id": "climbing_club", "id": "climbing_club",

View file

@ -33,7 +33,7 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 2, "widenFactor": 2,
"socialImage": "assets/themes/cyclofix/logo.svg", "socialImage": "./assets/themes/cyclofix/logo.svg",
"layers": [ "layers": [
"bike_cafe", "bike_cafe",
"bike_shop", "bike_shop",

View file

@ -32,7 +32,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 2, "widenFactor": 2,
"socialImage": "",
"clustering": { "clustering": {
"maxZoom": 14, "maxZoom": 14,
"minNeededElements": 250 "minNeededElements": 250

View file

@ -36,7 +36,6 @@
"startLon": 4.480705, "startLon": 4.480705,
"startZoom": 15, "startZoom": 15,
"widenFactor": 1.5, "widenFactor": 1.5,
"socialImage": "",
"layers": [ "layers": [
{ {
"id": "facadegardens", "id": "facadegardens",

View file

@ -20,7 +20,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 3, "widenFactor": 3,
"socialImage": "",
"layers": [ "layers": [
"food" "food"
] ]

View file

@ -16,7 +16,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 3, "widenFactor": 3,
"socialImage": "",
"layers": [ "layers": [
{ {
"builtin": "food", "builtin": "food",

View file

@ -16,7 +16,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 2, "widenFactor": 2,
"socialImage": "",
"hideFromOverview": true, "hideFromOverview": true,
"layers": [ "layers": [
{ {

View file

@ -11,14 +11,13 @@
"en": "This theme is an attempt to help automating the GRB import.", "en": "This theme is an attempt to help automating the GRB import.",
"hu": "Ez a sablon a flandriai GRB épületimportálás automatizlását kívánja megkönnyíteni." "hu": "Ez a sablon a flandriai GRB épületimportálás automatizlását kívánja megkönnyíteni."
}, },
"maintainer": "", "maintainer": "Pieter Vander Vennet",
"icon": "./assets/themes/grb_import/logo.svg", "icon": "./assets/themes/grb_import/logo.svg",
"version": "0", "version": "0",
"startLat": 51.0249, "startLat": 51.0249,
"startLon": 4.026489, "startLon": 4.026489,
"startZoom": 9, "startZoom": 9,
"widenFactor": 2, "widenFactor": 2,
"socialImage": "",
"clustering": { "clustering": {
"maxZoom": 15 "maxZoom": 15
}, },
@ -605,15 +604,14 @@
}, },
"iconSize": "50,50,center", "iconSize": "50,50,center",
"icon": { "icon": {
"render": "./assets/themes/grb_import/housenumber_blank.svg",
"mappings": [ "mappings": [
{ {
"if": "_intersects_with_other_features~*", "if": "_intersects_with_other_features~*",
"then": "./assets/themes/grb_import/warning.svg" "then": "./assets/themes/grb_import/warning.svg"
}, },
{ {
"if": "addr:housenumber=", "if": "addr:housenumber~*",
"then": "" "then": "./assets/themes/grb_import/housenumber_blank.svg"
} }
] ]
}, },

View file

@ -16,7 +16,6 @@
"startLon": 3.231, "startLon": 3.231,
"startZoom": 14, "startZoom": 14,
"widenFactor": 2, "widenFactor": 2,
"socialImage": "",
"clustering": { "clustering": {
"maxZoom": 15 "maxZoom": 15
}, },

View file

@ -16,7 +16,6 @@
"startLon": 4.026489, "startLon": 4.026489,
"startZoom": 9, "startZoom": 9,
"widenFactor": 2, "widenFactor": 2,
"socialImage": "",
"clustering": { "clustering": {
"maxZoom": 15 "maxZoom": 15
}, },

View file

@ -29,7 +29,6 @@
"startLon": 0, "startLon": 0,
"startZoom": 1, "startZoom": 1,
"widenFactor": 5, "widenFactor": 5,
"socialImage": "",
"layers": [ "layers": [
{ {
"id": "hackerspaces", "id": "hackerspaces",

View file

@ -37,7 +37,6 @@
"startLon": 121.6625, "startLon": 121.6625,
"startZoom": 6, "startZoom": 6,
"widenFactor": 3, "widenFactor": 3,
"socialImage": "",
"layers": [ "layers": [
"hydrant", "hydrant",
"extinguisher", "extinguisher",

View file

@ -299,6 +299,14 @@
"if": "theme=uk_addresses", "if": "theme=uk_addresses",
"then": "./assets/themes/uk_addresses/housenumber_unknown.svg" "then": "./assets/themes/uk_addresses/housenumber_unknown.svg"
}, },
{
"if": "theme=waste",
"then": "./assets/layers/recycling/recycling-14.svg"
},
{
"if": "theme=waste_assen",
"then": "./assets/layers/recycling/recycling-14.svg"
},
{ {
"if": "theme=waste_basket", "if": "theme=waste_basket",
"then": "./assets/themes/waste_basket/waste_basket.svg" "then": "./assets/themes/waste_basket/waste_basket.svg"

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