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": {
"$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": [
@ -602,11 +612,32 @@
]
},
"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": {
"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": {
"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": {
"$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": [
@ -600,11 +610,32 @@ export default {
]
},
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"$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": [

View file

@ -454,11 +454,32 @@ export default {
]
},
"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": {
"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": {
"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": {
"$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": [

View file

@ -256,11 +256,32 @@
]
},
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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": {
"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)
result.push([vhist[0], clone])
})
result.reverse()
result.reverse(/* Changes in place, safe copy*/)
return result
}

View file

@ -239,7 +239,7 @@ export default class AvailableBaseLayersImplementation implements AvailableBaseL
prefered = preferedCategory.data;
}
prefered.reverse();
prefered.reverse(/*New list, inplace reverse is fine*/);
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
available.sort((a, b) => {

View file

@ -75,7 +75,7 @@ export default class FeaturePipeline {
this.state = state;
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.osmSourceZoomLevel = state.osmApiTileSize.data;
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
const change = changesForFeature[changesForFeature.length - 1]
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)
}
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.source.geojsonSource === undefined || layer.source.isOsmCacheLayer)
this.allowedTags = new Or(neededLayers.map(l => l.source.osmTags))

View file

@ -81,7 +81,7 @@ export class ChangeDescriptionTools {
case "way":
const w = new OsmWay(change.id)
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
case "relation":
const r = new OsmRelation(change.id)

View file

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

View file

@ -112,16 +112,25 @@ export default class CreateNewNodeAction extends OsmCreateAction {
const geojson = this._snapOnto.asGeoJson()
const projected = GeoOperations.nearestPoint(geojson, [this._lon, this._lat])
const projectedCoor= <[number, number]>projected.geometry.coordinates
const index = projected.properties.index
// We check that it isn't close to an already existing point
let reusedPointId = undefined;
const prev = <[number, number]>geojson.geometry.coordinates[index]
if (GeoOperations.distanceBetween(prev, <[number, number]>projected.geometry.coordinates) < this._reusePointDistance) {
let outerring : [number,number][];
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!
reusedPointId = this._snapOnto.nodes[index]
}
const next = <[number, number]>geojson.geometry.coordinates[index + 1]
if (GeoOperations.distanceBetween(next, <[number, number]>projected.geometry.coordinates) < this._reusePointDistance) {
const next = outerring[index + 1]
if (GeoOperations.distanceBetween(next, projectedCoor) < this._reusePointDistance) {
// We reuse this point instead!
reusedPointId = this._snapOnto.nodes[index + 1]
}
@ -135,8 +144,7 @@ export default class CreateNewNodeAction extends OsmCreateAction {
}]
}
const locations = [...this._snapOnto.coordinates]
locations.forEach(coor => coor.reverse())
const locations = [...this._snapOnto.coordinates.map(([lat, lon]) =><[number,number]> [lon, lat])]
const ids = [...this._snapOnto.nodes]
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.
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
console.warn("Skipping a node in createWay to avoid a duplicate node:", coordinate,"\nThe previous coordinates are: ", this.coordinates)
continue

View file

@ -186,7 +186,7 @@ export default class CreateWayWithPointReuseAction extends OsmCreateAction {
}
public async CreateChangeDescriptions(changes: Changes): Promise<ChangeDescription[]> {
const theme = this._state.layoutToUse.id
const theme = this._state?.layoutToUse?.id
const allChanges: ChangeDescription[] = []
const nodeIdsToUse: { lat: number, lon: number, nodeId?: number }[] = []
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 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))
// 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.
* 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][];
/**
@ -540,8 +541,6 @@ export default class ReplaceGeometryAction extends OsmChangeAction {
id: nodeId,
})
})
}
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
}
private static createChangesetFor(csId: string,
allChanges: {
static createChangesetFor(csId: string,
allChanges: {
modifiedObjects: OsmObject[],
newObjects: OsmObject[],
deletedObjects: OsmObject[]

View file

@ -207,27 +207,36 @@ export abstract class OsmObject {
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 {
for (const tagsKey in tags) {
if (!tags.hasOwnProperty(tagsKey)) {
continue
}
const polyGuide = OsmObject.polygonFeatures.get(tagsKey)
const polyGuide : { values: Set<string>; blacklist: boolean } = OsmObject.polygonFeatures.get(tagsKey)
if (polyGuide === undefined) {
continue
}
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
}
// is the key contained?
return polyGuide.values.has(tags[tagsKey])
// is the key contained? Then we have a match if the value is contained
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 }> {
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;
if (polygonFeature.polygon === "all") {
@ -381,7 +390,7 @@ export class OsmWay extends OsmObject {
}
if (element.nodes === undefined) {
console.log("PANIC")
console.error("PANIC: no nodes!")
}
for (const nodeId of element.nodes) {
@ -417,7 +426,9 @@ export class OsmWay extends OsmObject {
}
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 OsmObject.isPolygon(this.tags)

View file

@ -25,7 +25,7 @@ export default class FeaturePipelineState extends MapState {
constructor(layoutToUse: LayoutConfig) {
super(layoutToUse);
const clustering = layoutToUse.clustering
const clustering = layoutToUse?.clustering
this.featureAggregator = TileHierarchyAggregator.createHierarchy(this);
const clusterCounter = this.featureAggregator
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,
isDisplayed: QueryParameters.GetBooleanQueryParameter("overlay-" + c.id, c.defaultState, "Wether or not the overlay " + c.id + " is shown")
}))
})) ?? []
this.filteredLayers = this.InitializeFilteredLayers()
@ -142,7 +144,7 @@ export default class MapState extends UserRelatedState {
initialized.add(overlayToggle.config)
}
for (const tileLayerSource of this.layoutToUse.tileLayerSources) {
for (const tileLayerSource of this.layoutToUse?.tileLayerSources ?? []) {
if (initialized.has(tileLayerSource)) {
continue
}
@ -153,28 +155,14 @@ export default class MapState extends UserRelatedState {
private lockBounds() {
const layout = this.layoutToUse;
if (layout.lockLocation) {
if (layout.lockLocation === true) {
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
)
if (!layout?.lockLocation) {
return;
}
console.warn("Locking the bounds to ", layout.lockLocation);
this.mainMapObject.installBounds(
new BBox(layout.lockLocation),
this.featureSwitchIsTesting.data
)
}
private initCurrentView() {
@ -364,8 +352,10 @@ export default class MapState extends UserRelatedState {
}
private InitializeFilteredLayers() {
const layoutToUse = this.layoutToUse;
if(layoutToUse === undefined){
return new UIEventSource<FilteredLayer[]>([])
}
const flayers: FilteredLayer[] = [];
for (const layer of layoutToUse.layers) {
let isDisplayed: UIEventSource<boolean>

View file

@ -61,7 +61,7 @@ export default class Constants {
* For every bin, the totals are uploaded as metadata
*/
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 {
if (Utils.runningFromConsole) {

View file

@ -6,51 +6,70 @@ import * as tagrenderingmetapaths from "../../../assets/tagrenderingconfigmeta.j
export class ExtractImages extends Conversion<LayoutConfigJson, string[]> {
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");
this._isOfficial = isOfficial;
this._sharedTagRenderings = sharedTagRenderings;
}
convert(json: LayoutConfigJson, context: string): { result: string[], errors: string[], warnings: string[] } {
const paths = metapaths["default"] ?? metapaths
const trpaths = tagrenderingmetapaths["default"] ?? tagrenderingmetapaths
const allFoundImages = []
const allFoundImages : string[] = []
const errors = []
const warnings = []
for (const metapath of paths) {
if (metapath.typeHint === undefined) {
continue
}
if (metapath.typeHint !== "image" && metapath.typeHint !== "icon") {
continue
}
for (const metapath of ExtractImages.layoutMetaPaths) {
const mightBeTr = Array.isArray(metapath.type) && metapath.type.some(t => t["$ref"] == "#/definitions/TagRenderingConfigJson")
const found = Utils.CollectPath(metapath.path, json)
if (mightBeTr) {
// 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(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)
} else{
// This is a tagRendering where every rendered value might be an icon!
for (const trpath of trpaths) {
if (trpath.typeHint !== "rendered") {
continue
}
for (const trpath of ExtractImages.tagRenderingMetaPaths) {
const fromPath = Utils.CollectPath(trpath.path, foundImage)
for (const img of fromPath) {
if (typeof img !== "string") {
(this._isOfficial ? errors: warnings).push(context+": found an image path that is not a path at " + context + "." + metapath.path.join(".") + ": " + JSON.stringify(img))
if (typeof img.leaf !== "string") {
(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 {
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.split(";")))
.map(img => img.split(":")[0])
.filter(img => img !== "")
return {result: Utils.Dedup(splitParts), errors, warnings};
}
@ -108,7 +128,7 @@ export class FixImages extends DesugaringStep<LayoutConfigJson> {
continue
}
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") {
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[] } {
const oldThemeConfig = {...json}
if(oldThemeConfig.socialImage === ""){
delete oldThemeConfig.socialImage
}
if (oldThemeConfig["roamingRenderings"] !== undefined) {
if (oldThemeConfig["roamingRenderings"].length == 0) {

View file

@ -75,14 +75,14 @@ class ExpandTagRendering extends Conversion<string | TagRenderingConfigJson | {
if (typeof tr === "string") {
const lookup = this.lookup(tr);
if (lookup !== undefined) {
return lookup
if (lookup === undefined) {
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 [{
render: tr,
id: tr.replace(/![a-zA-Z0-9]/g, "")
}]
return lookup
}
if (tr["builtin"] !== undefined) {
@ -122,7 +122,7 @@ class ExpandTagRendering extends Conversion<string | TagRenderingConfigJson | {
const result = []
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)")
result.push(...stable)
} else {

View file

@ -432,8 +432,12 @@ export class PrepareTheme extends Fuse<LayoutConfigJson> {
new PreparePersonalTheme(state),
new OnEveryConcat("layers", new SubstituteLayer(state)),
new SetDefault("socialImage", "assets/SocialImage.png", true),
// We expand all tagrenderings first...
new OnEvery("layers", new PrepareLayer(state)),
// Then we apply the override all
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 AddDependencyLayersToTheme(state),
new AddImportLayers(),

View file

@ -12,6 +12,7 @@ import {ExtractImages} from "./FixImages";
import ScriptUtils from "../../../scripts/ScriptUtils";
import {And} from "../../../Logic/Tags/And";
import Translations from "../../../UI/i18n/Translations";
import Svg from "../../../Svg";
class ValidateLanguageCompleteness extends DesugaringStep<any> {
@ -50,12 +51,14 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
private readonly _path?: string;
private readonly knownImagePaths: Set<string>;
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");
this.knownImagePaths = knownImagePaths;
this._path = path;
this._isBuiltin = isBuiltin;
this._sharedTagRenderings = sharedTagRenderings;
}
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, ...
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)
for (const remoteImage of remoteImages) {
errors.push("Found a remote image: " + remoteImage + " in theme " + json.id + ", please download it.")
@ -93,8 +96,11 @@ class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
continue
}
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)) {
@ -163,10 +169,10 @@ class ValidateTheme extends DesugaringStep<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",
new ValidateTheme(knownImagePaths, path, isBuiltin),
new OnEvery("layers", new ValidateLayer(knownImagePaths, undefined, false))
new ValidateTheme(knownImagePaths, path, isBuiltin, sharedTagRenderings),
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> {
constructor() {
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) {
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++) {
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
}
const keyValues = parsedConditions[i].asChange({});
const properties = []
const properties = {}
keyValues.forEach(({k, v}) => {
properties[k] = v
})
for (let j = 0; j < i; j++) {
if(json.mappings[j].hideInAnswer === true){
continue
}
const doesMatch = parsedConditions[j].matchesProperties(properties)
if (doesMatch) {
// The current mapping is shadowed!
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, {})}.
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 {
errors,
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");
}
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 information = []
if (json.mappings === undefined || json.mappings.length === 0) {
return {result: json}
}
const ignoreToken = "ignore-image-in-then"
for (let i = 0; i < json.mappings.length; i++) {
const mapping = json.mappings[i]
const ignore = mapping["#"]?.indexOf(ignoreToken) >=0
const images = Utils.Dedup(Translations.T(mapping.then).ExtractImages())
const ctx = `${context}.mappings[${i}]`
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,
information,
result: json
};
}
@ -289,8 +337,7 @@ export class DetectMappingsWithImages extends DesugaringStep<TagRenderingConfigJ
export class ValidateTagRenderings extends Fuse<TagRenderingConfigJson> {
constructor() {
super("Various validation on tagRenderingConfigs",
// TODO enable these checks again
// new DetectShadowedMappings(),
new DetectShadowedMappings(),
new DetectMappingsWithImages()
);
}
@ -302,12 +349,10 @@ export class ValidateLayer extends DesugaringStep<LayerConfigJson> {
* @private
*/
private readonly _path?: string;
private readonly knownImagePaths?: Set<string>;
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");
this.knownImagePaths = knownImagePaths;
this._path = path;
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 not known yet, the user will be presented with `then` as an option
* type: rendered
* Type: rendered
*/
then: string | any,
/**

View file

@ -71,7 +71,7 @@ export default class LayoutConfig {
this.credits = json.credits;
this.version = json.version;
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") {
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
if (free !== undefined) {
return tags[free] !== undefined
const value = tags[free]
return value !== undefined && value !== ""
}
return false

View file

@ -93,7 +93,7 @@ export default class Histogram<T> extends VariableUiElement {
keys.sort()
break;
case "name-rev":
keys.sort().reverse()
keys.sort().reverse(/*Copy of array, inplace reverse if fine*/)
break;
case "count":
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
if (options?.feature !== undefined && options.feature.geometry.type !== "Point") {
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.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",
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",
@ -381,7 +381,7 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
}, {
name: "max_move_distance",
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",
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)
const args = this.parseArgs(argument, originalFeatureTags)
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 action = this.CreateAction(
const action = ImportWayButton.CreateAction(
feature,
args,
<FeaturePipelineState>state,
mergeConfigs,
coordinates
mergeConfigs
)
await state.changes.applyAction(action)
}
@ -455,18 +443,8 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
// 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);
let action = this.CreateAction(feature, args, state, mergeConfigs, coordinates);
let action = ImportWayButton.CreateAction(feature, args, state, mergeConfigs);
return this.createConfirmPanelForWay(
state,
args,
@ -508,14 +486,12 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
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 },
state: FeaturePipelineState,
mergeConfigs: any[],
coordinates: [number, number][]) {
mergeConfigs: any[]) {
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 inner = [...coors]
inner.splice(0, 1)
@ -531,7 +507,7 @@ export class ImportWayButton extends AbstractImportButton implements AutoAction
return new CreateWayWithPointReuseAction(
args.newTags.data,
coordinates,
coors,
state,
mergeConfigs
)

View file

@ -28,7 +28,6 @@ export class LoginToggle extends VariableUiElement {
const login = new LoginButton(text, state)
super(
state.osmConnection.loadingStatus.map(osmConnectionState => {
console.trace("Current osm state is ", osmConnectionState)
if(osmConnectionState === "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)
.map(p => p[1])
.sort((a, b) => a - b)
.reverse()
.reverse(/*Copy/derived list, inplace reverse is fine*/)
if (points.length > 0) {
for (const point of points) {
splitPoints.data.splice(point, 1)

View file

@ -45,6 +45,7 @@ import ImgurUploader from "../Logic/ImageProviders/ImgurUploader";
import FileSelectorButton from "./Input/FileSelectorButton";
import {LoginToggle} from "./Popup/LoginButton";
import {start} from "repl";
import {SubstitutedTranslation} from "./SubstitutedTranslation";
export interface SpecialVisualization {
funcName: string,
@ -865,13 +866,14 @@ export default class SpecialVisualizations {
args: [],
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`.",
constr: (state, tags, args, guistate) =>
new VariableUiElement(tags.map(tags => {
constr: (state, tagsSource, args, guistate) =>
new VariableUiElement(tagsSource.map(tags => {
const layer = state.layoutToUse.getMatchingLayer(tags)
console.log("Layer for tags", tags,"is", layer.id)
const title = layer?.title?.GetRenderValue(tags)
console.log("Title became: ", title)
return title
if(title === undefined){
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) {
return source
}
for (const key in source) {
if (!source.hasOwnProperty(key)) {
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
*/
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]
if (path.length === 1) {
// We have reached the leaf
const leaf = object[head];
if (leaf !== undefined) {
if(Array.isArray(leaf)){
object[head] = leaf.map(replaceLeaf)
}else{
object[head] = replaceLeaf(leaf)
if (Array.isArray(leaf)) {
object[head] = leaf.map(o => replaceLeaf(o, travelledPath))
} else {
object[head] = replaceLeaf(leaf, travelledPath)
}
}
return
@ -381,10 +381,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
return;
}
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;
}
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
*/
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) {
return collectedList;
}
const head = path[0]
travelledPath = [...travelledPath, head]
if (path.length === 1) {
// We have reached the leaf
const leaf = object[head];
if (leaf === undefined || leaf === null) {
return collectedList
}
if (Array.isArray(leaf)) {
collectedList.push(...leaf)
} else {
collectedList.push(leaf)
}
if (Array.isArray(leaf)) {
for (let i = 0; i < (<any[]>leaf).length; i++){
const l = (<any[]>leaf)[i];
collectedList.push({leaf: l, path: [...travelledPath, ""+i]})
}
} else {
collectedList.push({leaf, path: travelledPath})
}
return collectedList
}
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)) {
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;
}
if (typeof sub !== "object") {
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)
}
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 }) {
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),
}
}
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"
]
},
{
"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",
"license": "CC-BY-SA 4.0",

View file

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

View file

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

View file

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

View file

@ -306,11 +306,15 @@
{
"if": "red_turn:right:bicycle=yes",
"then": {
"en": "A cyclist can turn right if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B22.svg' style='width: 3em'>",
"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'>",
"de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen <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",
"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",
@ -343,11 +347,15 @@
{
"if": "red_turn:straight:bicycle=yes",
"then": {
"en": "A cyclist can go straight on if the light is red <img src='./assets/layers/crossings/Belgian_road_sign_B23.svg' style='width: 3em'>",
"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'>",
"de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren <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",
"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",

View file

@ -32,16 +32,7 @@
"presets": [],
"mapRendering": [
{
"icon": {
"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)"
}
]
},
"icon": "direction_gradient:var(--catch-detail-color)",
"iconSize": "200,200,center",
"location": [
"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",
"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": {
"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": {
"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"

View file

@ -86,6 +86,14 @@
"nl": "Een vuilnisbak voor injectienaalden en andere scherpe voorwerpen",
"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",
"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": {
"softDeletionTags": {
"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": {
"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": {
"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"

View file

@ -485,6 +485,48 @@
"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"
},
{
@ -753,6 +795,48 @@
"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"
},
{
@ -1014,6 +1098,48 @@
"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"
},
{
@ -1291,6 +1417,50 @@
"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"
},
{
@ -1585,6 +1755,52 @@
"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"
},
{
@ -1852,6 +2068,50 @@
"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"
},
{
@ -2116,6 +2376,50 @@
"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"
},
{
@ -2380,6 +2684,50 @@
"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"
},
{
@ -2651,6 +2999,50 @@
"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"
},
{
@ -2918,6 +3310,50 @@
"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"
},
{
@ -3182,6 +3618,50 @@
"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"
},
{
@ -3446,6 +3926,50 @@
"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"
},
{
@ -3714,6 +4238,50 @@
"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"
},
{
@ -3978,6 +4546,50 @@
"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"
},
{
@ -4242,6 +4854,50 @@
"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"
},
{
@ -4625,6 +5281,48 @@
"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"
},
{
@ -4871,6 +5569,50 @@
"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"
},
{
@ -5160,6 +5902,13 @@
],
"type": "boolean"
},
{
"path": [
"layers",
"syncSelection"
],
"type": "string"
},
{
"path": [
"layers",

View file

@ -138,6 +138,44 @@
"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"
},
{

View file

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

View file

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

View file

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

View file

@ -504,7 +504,8 @@
]
},
"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": {
"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
},
@ -525,7 +527,8 @@
]
},
"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,
"startZoom": 1,
"widenFactor": 1.5,
"socialImage": "",
"layers": [
"cafe_pub"
]

View file

@ -42,7 +42,7 @@
"startLon": 3.14,
"startZoom": 14,
"widenFactor": 1.5,
"socialImage": "./assets/themes/campersite/Bar%C3%9Fel_Wohnmobilstellplatz.jpg",
"socialImage": "./assets/themes/campersite/social_image.jpg",
"layers": [
{
"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",
"license": "CC0",
@ -41,5 +31,15 @@
"https://github.com/osmandapp/Osmand/blob/master/LICENSE",
"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,
"startZoom": 1,
"widenFactor": 1.5,
"socialImage": "",
"defaultBackgroundId": "CartoDB.Voyager",
"layers": [
"charging_station"

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -11,14 +11,13 @@
"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."
},
"maintainer": "",
"maintainer": "Pieter Vander Vennet",
"icon": "./assets/themes/grb_import/logo.svg",
"version": "0",
"startLat": 51.0249,
"startLon": 4.026489,
"startZoom": 9,
"widenFactor": 2,
"socialImage": "",
"clustering": {
"maxZoom": 15
},
@ -605,15 +604,14 @@
},
"iconSize": "50,50,center",
"icon": {
"render": "./assets/themes/grb_import/housenumber_blank.svg",
"mappings": [
{
"if": "_intersects_with_other_features~*",
"then": "./assets/themes/grb_import/warning.svg"
},
{
"if": "addr:housenumber=",
"then": ""
"if": "addr:housenumber~*",
"then": "./assets/themes/grb_import/housenumber_blank.svg"
}
]
},

View file

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

View file

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

View file

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

View file

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

View file

@ -299,6 +299,14 @@
"if": "theme=uk_addresses",
"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",
"then": "./assets/themes/waste_basket/waste_basket.svg"

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