diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 12b9494f4..4795462f8 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -6,6 +6,7 @@
"bradlc.vscode-tailwindcss",
"editorconfig.editorconfig",
"dbaeumer.vscode-eslint",
- "robin-van-der-linde.mapcompletevscode"
+ "robin-van-der-linde.mapcompletevscode",
+ "vitest.explorer"
]
}
diff --git a/assets/layers/pipeline/pipeline.json b/assets/layers/pipeline/pipeline.json
new file mode 100644
index 000000000..38e73e592
--- /dev/null
+++ b/assets/layers/pipeline/pipeline.json
@@ -0,0 +1,152 @@
+{
+ "id": "pipeline",
+ "name": {
+ "en": "Pipelines",
+ "nl": "Pijpleidingen"
+ },
+ "description": {
+ "en": "Layer showing pipelines for transport of various substances.",
+ "nl": "Laag die pijpleidingen toont voor het transport van verschillende stoffen."
+ },
+ "source": {
+ "osmTags": "man_made=pipeline"
+ },
+ "minzoom": 13,
+ "title": {
+ "render": {
+ "en": "Pipeline",
+ "nl": "Pijpleiding"
+ }
+ },
+ "pointRendering": [
+ {
+ "location": [
+ "point"
+ ],
+ "marker": [
+ {
+ "icon": "circle",
+ "color": "black"
+ }
+ ]
+ }
+ ],
+ "lineRendering": [
+ {
+ "width": 4,
+ "color": {
+ "render": "black",
+ "mappings": [
+ {
+ "if": "location=underground",
+ "then": "gray"
+ }
+ ]
+ }
+ }
+ ],
+ "tagRenderings": [
+ "images",
+ {
+ "id": "location",
+ "question": {
+ "en": "Where is this pipeline located?",
+ "nl": "Waar is deze pijpleiding gelegen?"
+ },
+ "mappings": [
+ {
+ "if": "location=underground",
+ "then": {
+ "en": "This pipeline is located underground.",
+ "nl": "Deze pijpleiding is ondergronds gelegen."
+ }
+ },
+ {
+ "if": "location=overground",
+ "then": {
+ "en": "This pipeline is located above ground.",
+ "nl": "Deze pijpleiding is bovengronds gelegen."
+ }
+ },
+ {
+ "if": "location=overhead",
+ "then": {
+ "en": "This pipeline is located overhead.",
+ "nl": "Deze pijpleiding ligt enkele meters boven de grond."
+ }
+ },
+ {
+ "if": "location=underwater",
+ "then": {
+ "en": "This pipeline is located underwater.",
+ "nl": "Deze pijpleiding ligt onder water."
+ }
+ }
+ ]
+ },
+ {
+ "id": "substance",
+ "question": {
+ "en": "What substance is transported in this pipeline?",
+ "nl": "Welke stof wordt in deze pijpleiding getransporteerd?"
+ },
+ "render": {
+ "en": "This pipeline transports {substance}",
+ "nl": "Deze pijpleiding transporteert {substance}"
+ },
+ "freeform": {
+ "key": "substance",
+ "type": "string",
+ "placeholder": {
+ "en": "Substance name",
+ "nl": "Naam van de stof"
+ }
+ },
+ "mappings": [
+ {
+ "if": "substance=gas",
+ "then": {
+ "en": "This pipeline transports gas.",
+ "nl": "Deze pijpleiding transporteert gas."
+ }
+ },
+ {
+ "if": "substance=oil",
+ "then": {
+ "en": "This pipeline transports oil.",
+ "nl": "Deze pijpleiding transporteert olie."
+ }
+ },
+ {
+ "if": "substance=water",
+ "then": {
+ "en": "This pipeline transports water.",
+ "nl": "Deze pijpleiding transporteert water."
+ }
+ },
+ {
+ "if": "substance=hot_water",
+ "then": {
+ "en": "This pipeline transports hot water.",
+ "nl": "Deze pijpleiding transporteert heet water."
+ }
+ },
+ {
+ "if": "substance=sewage",
+ "then": {
+ "en": "This pipeline transports sewage.",
+ "nl": "Deze pijpleiding transporteert rioolwater."
+ }
+ },
+ {
+ "if": "substance=rainwater",
+ "then": {
+ "en": "This pipeline transports rainwater.",
+ "nl": "Deze pijpleiding transporteert regenwater."
+ }
+ }
+ ]
+ }
+ ],
+ "allowMove": false
+}
\ No newline at end of file
diff --git a/assets/layers/power_cable/power_cable.json b/assets/layers/power_cable/power_cable.json
new file mode 100644
index 000000000..c524cfe9a
--- /dev/null
+++ b/assets/layers/power_cable/power_cable.json
@@ -0,0 +1,118 @@
+{
+ "id": "power_cable",
+ "name": {
+ "en": "Power Cables",
+ "nl": "Kabels"
+ },
+ "description": {
+ "en": "Power cables",
+ "nl": "Kabels"
+ },
+ "source": {
+ "osmTags": "power=cable"
+ },
+ "minzoom": 15,
+ "title": {
+ "render": {
+ "en": "Power Cable"
+ }
+ },
+ "pointRendering": [
+ {
+ "marker": [
+ {
+ "icon": "lightning",
+ "color": "#ffcc00"
+ }
+ ],
+ "location": [
+ "point"
+ ]
+ }
+ ],
+ "lineRendering": [
+ {
+ "color": "#ffcc00",
+ "width": 5,
+ "dashArray": "1 1"
+ }
+ ],
+ "tagRenderings": [
+ {
+ "builtin": "power_line.operator",
+ "override": {
+ "question": {
+ "en": "Who is the operator of this power cable?"
+ },
+ "render": {
+ "en": "The operator of this power cable is {operator}."
+ }
+ }
+ },
+ {
+ "builtin": "power_line.voltage",
+ "override": {
+ "question": {
+ "en": "What is the voltage of this power cable?"
+ },
+ "render": {
+ "en": "This power cable operates at {voltage} volts."
+ },
+ "=mappings": [
+ {
+ "if": "voltage=20000",
+ "then": {
+ "en": "The voltage of this power cable is 20 kV."
+ }
+ },
+ {
+ "if": "voltage=11000",
+ "then": {
+ "en": "The voltage of this power cable is 11 kV."
+ }
+ },
+ {
+ "if": "voltage=15000",
+ "then": {
+ "en": "The voltage of this power cable is 15 kV."
+ }
+ }
+ ]
+ }
+ },
+ {
+ "builtin": "power_line.cables",
+ "override": {
+ "question": {
+ "en": "How many cables are there in this power cable?"
+ },
+ "render": {
+ "en": "This power cable has {cables} cables."
+ }
+ }
+ },
+ {
+ "builtin": "power_line.frequency",
+ "override": {
+ "question": {
+ "en": "What is the frequency of this power cable?"
+ },
+ "render": {
+ "en": "This power cable operates at {frequency} Hz."
+ }
+ }
+ },
+ {
+ "builtin": "power_line.circuits",
+ "override": {
+ "question": {
+ "en": "How many circuits are there in this power cable?"
+ },
+ "render": {
+ "en": "This power cable has {circuits} circuits."
+ }
+ }
+ }
+ ],
+ "allowMove": false
+}
\ No newline at end of file
diff --git a/assets/layers/power_generator/battery.svg b/assets/layers/power_generator/battery.svg
new file mode 100644
index 000000000..162376eda
--- /dev/null
+++ b/assets/layers/power_generator/battery.svg
@@ -0,0 +1,46 @@
+
+
+
\ No newline at end of file
diff --git a/assets/layers/power_generator/battery.svg.license b/assets/layers/power_generator/battery.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/battery.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/biofuel.svg b/assets/layers/power_generator/biofuel.svg
new file mode 100644
index 000000000..6bdaf470c
--- /dev/null
+++ b/assets/layers/power_generator/biofuel.svg
@@ -0,0 +1,192 @@
+
+
+
diff --git a/assets/layers/power_generator/biofuel.svg.license b/assets/layers/power_generator/biofuel.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/biofuel.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/burn.svg b/assets/layers/power_generator/burn.svg
new file mode 100644
index 000000000..cbd5a10b1
--- /dev/null
+++ b/assets/layers/power_generator/burn.svg
@@ -0,0 +1,192 @@
+
+
+
diff --git a/assets/layers/power_generator/burn.svg.license b/assets/layers/power_generator/burn.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/burn.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/coal.svg b/assets/layers/power_generator/coal.svg
new file mode 100644
index 000000000..f90075130
--- /dev/null
+++ b/assets/layers/power_generator/coal.svg
@@ -0,0 +1,192 @@
+
+
+
diff --git a/assets/layers/power_generator/coal.svg.license b/assets/layers/power_generator/coal.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/coal.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/gas.svg b/assets/layers/power_generator/gas.svg
new file mode 100644
index 000000000..5b4257160
--- /dev/null
+++ b/assets/layers/power_generator/gas.svg
@@ -0,0 +1,192 @@
+
+
+
diff --git a/assets/layers/power_generator/gas.svg.license b/assets/layers/power_generator/gas.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/gas.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/license_info.json b/assets/layers/power_generator/license_info.json
new file mode 100644
index 000000000..5cc2afa1f
--- /dev/null
+++ b/assets/layers/power_generator/license_info.json
@@ -0,0 +1,90 @@
+[
+ {
+ "path": "battery.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:Hedaja-power_source-battery.svg"
+ ]
+ },
+ {
+ "path": "biofuel.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:Bahnpirat-power_source-biofuel.svg"
+ ]
+ },
+ {
+ "path": "burn.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:2020_stBN_powergensource_burn.svg"
+ ]
+ },
+ {
+ "path": "coal.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:Bahnpirat-power_source-coal.svg"
+ ]
+ },
+ {
+ "path": "gas.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:Bahnpirat-power_source-gas.svg"
+ ]
+ },
+ {
+ "path": "nuclear.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:2020_stBN_powergensource_nuclear.svg"
+ ]
+ },
+ {
+ "path": "oil.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:Bahnpirat-power_source-oil.svg"
+ ]
+ },
+ {
+ "path": "sun.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:2020_stBN_powergensource_sun.svg"
+ ]
+ },
+ {
+ "path": "waste.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:Bahnpirat-power_source-waste.svg"
+ ]
+ },
+ {
+ "path": "water.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:2020_stBN_powergensource_water.svg"
+ ]
+ },
+ {
+ "path": "wind.svg",
+ "license": "CC0 1.0",
+ "authors": [],
+ "sources": [
+ "https://wiki.openstreetmap.org/wiki/File:2020_stBN_powergensource_wind.svg"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/assets/layers/power_generator/nuclear.svg b/assets/layers/power_generator/nuclear.svg
new file mode 100644
index 000000000..102c9f2ff
--- /dev/null
+++ b/assets/layers/power_generator/nuclear.svg
@@ -0,0 +1,172 @@
+
+
+
diff --git a/assets/layers/power_generator/nuclear.svg.license b/assets/layers/power_generator/nuclear.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/nuclear.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/oil.svg b/assets/layers/power_generator/oil.svg
new file mode 100644
index 000000000..daa78d0b9
--- /dev/null
+++ b/assets/layers/power_generator/oil.svg
@@ -0,0 +1,192 @@
+
+
+
diff --git a/assets/layers/power_generator/oil.svg.license b/assets/layers/power_generator/oil.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/oil.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/power_generator.json b/assets/layers/power_generator/power_generator.json
new file mode 100644
index 000000000..9355a5188
--- /dev/null
+++ b/assets/layers/power_generator/power_generator.json
@@ -0,0 +1,490 @@
+{
+ "id": "power_generator",
+ "name": {
+ "en": "Power Generators",
+ "nl": "Stroomgeneratoren"
+ },
+ "description": {
+ "en": "Layer showing generators that produce electricity, such as solar panels, wind turbines, and other types of power generation.",
+ "nl": "Laag met generatoren die elektriciteit produceren, zoals zonnepanelen, windturbines en andere soorten energieopwekking."
+ },
+ "source": {
+ "osmTags": "power=generator"
+ },
+ "minzoom": 12,
+ "title": {
+ "render": {
+ "en": "Power Generator",
+ "nl": "Stroomgenerator"
+ }
+ },
+ "pointRendering": [
+ {
+ "marker": [
+ {
+ "icon": {
+ "render": "lightning",
+ "mappings": [
+ {
+ "if": "generator:source=solar",
+ "then": "./assets/layers/power_generator/sun.svg"
+ },
+ {
+ "if": "generator:source=wind",
+ "then": "./assets/layers/power_generator/wind.svg"
+ },
+ {
+ "if": "generator:source=gas",
+ "then": "./assets/layers/power_generator/gas.svg"
+ },
+ {
+ "if": "generator:source=hydro",
+ "then": "./assets/layers/power_generator/water.svg"
+ },
+ {
+ "if": "generator:source=oil",
+ "then": "./assets/layers/power_generator/oil.svg"
+ },
+ {
+ "if": "generator:source=biomass",
+ "then": "./assets/layers/power_generator/biofuel.svg"
+ },
+ {
+ "if": "generator:source=coal",
+ "then": "./assets/layers/power_generator/coal.svg"
+ },
+ {
+ "if": "generator:source=diesel",
+ "then": "./assets/layers/power_generator/oil.svg"
+ },
+ {
+ "if": "generator:source=biogas",
+ "then": "./assets/layers/power_generator/biofuel.svg"
+ },
+ {
+ "if": "generator:source=battery",
+ "then": "./assets/layers/power_generator/battery.svg"
+ },
+ {
+ "if": "generator:source=nuclear",
+ "then": "./assets/layers/power_generator/nuclear.svg"
+ }
+ ]
+ },
+ "color": "#ffcc00"
+ }
+ ],
+ "location": [
+ "point",
+ "centroid"
+ ]
+ }
+ ],
+ "lineRendering": [
+ {
+ "color": "#ffcc00",
+ "width": 4,
+ "fillColor": "#ffcc00ac"
+ }
+ ],
+ "presets": [
+ {
+ "tags": [
+ "power=generator"
+ ],
+ "title": {
+ "en": "a power generator",
+ "nl": "een stroomgenerator"
+ },
+ "description": {
+ "en": "Add a power generator that produces electricity, such as a solar panel, wind turbine, or other type of power generation.",
+ "nl": "Voeg een stroomgenerator toe die elektriciteit produceert, zoals een zonnepaneel, windturbine of ander type energieopwekking."
+ }
+ }
+ ],
+ "tagRenderings": [
+ {
+ "id": "source",
+ "question": {
+ "en": "What source of energy does this generator use?",
+ "nl": "Welke energiebron gebruikt deze generator?"
+ },
+ "mappings": [
+ {
+ "if": "generator:source=solar",
+ "then": {
+ "en": "This generator uses solar energy.",
+ "nl": "Deze generator gebruikt zonne-energie."
+ },
+ "icon": "./assets/layers/power_generator/sun.svg"
+ },
+ {
+ "if": "generator:source=wind",
+ "then": {
+ "en": "This generator uses wind energy.",
+ "nl": "Deze generator gebruikt windenergie."
+ },
+ "icon": "./assets/layers/power_generator/wind.svg"
+ },
+ {
+ "if": "generator:source=gas",
+ "then": {
+ "en": "This generator uses gas as a fuel source.",
+ "nl": "Deze generator gebruikt gas als brandstof."
+ },
+ "icon": "./assets/layers/power_generator/gas.svg"
+ },
+ {
+ "if": "generator:source=hydro",
+ "then": {
+ "en": "This generator uses hydroelectric power.",
+ "nl": "Deze generator gebruikt waterkracht."
+ },
+ "icon": "./assets/layers/power_generator/water.svg"
+ },
+ {
+ "if": "generator:source=oil",
+ "then": {
+ "en": "This generator uses oil as a fuel source.",
+ "nl": "Deze generator gebruikt olie als brandstof."
+ },
+ "icon": "./assets/layers/power_generator/oil.svg"
+ },
+ {
+ "if": "generator:source=biomass",
+ "then": {
+ "en": "This generator uses biomass energy.",
+ "nl": "Deze generator gebruikt biomassa-energie."
+ },
+ "icon": "./assets/layers/power_generator/biofuel.svg"
+ },
+ {
+ "if": "generator:source=coal",
+ "then": {
+ "en": "This generator uses coal as a fuel source.",
+ "nl": "Deze generator gebruikt kolen als brandstof."
+ },
+ "icon": "./assets/layers/power_generator/coal.svg"
+ },
+ {
+ "if": "generator:source=diesel",
+ "then": {
+ "en": "This generator uses diesel as a fuel source.",
+ "nl": "Deze generator gebruikt diesel als brandstof."
+ },
+ "icon": "./assets/layers/power_generator/oil.svg"
+ },
+ {
+ "if": "generator:source=biogas",
+ "then": {
+ "en": "This generator uses biogas as a fuel source.",
+ "nl": "Deze generator gebruikt biogas als brandstof."
+ },
+ "icon": "./assets/layers/power_generator/biofuel.svg"
+ },
+ {
+ "if": "generator:source=battery",
+ "then": {
+ "en": "This generator uses battery storage.",
+ "nl": "Deze generator gebruikt batterijopslag."
+ },
+ "icon": "./assets/layers/power_generator/battery.svg"
+ },
+ {
+ "if": "generator:source=nuclear",
+ "then": {
+ "en": "This generator uses nuclear energy.",
+ "nl": "Deze generator gebruikt kernenergie."
+ },
+ "icon": "./assets/layers/power_generator/nuclear.svg"
+ },
+ {
+ "if": "generator:source=gasoline",
+ "then": {
+ "en": "This generator uses gasoline as a fuel source.",
+ "nl": "Deze generator gebruikt benzine als brandstof."
+ },
+ "icon": "./assets/layers/power_generator/oil.svg"
+ },
+ {
+ "if": "generator:source=geothermal",
+ "then": {
+ "en": "This generator uses geothermal energy.",
+ "nl": "Deze generator gebruikt geothermische energie."
+ },
+ "icon": "./assets/layers/power_generator/water.svg"
+ },
+ {
+ "if": "generator:source=waste",
+ "then": {
+ "en": "This generator uses waste as a fuel source.",
+ "nl": "Deze generator gebruikt afval als brandstof."
+ },
+ "icon": "./assets/layers/power_generator/waste.svg"
+ },
+ {
+ "if": "generator:source=biofuel",
+ "then": {
+ "en": "This generator uses biofuel as a fuel source.",
+ "nl": "Deze generator gebruikt biobrandstof als brandstof."
+ },
+ "icon": "./assets/layers/power_generator/biofuel.svg"
+ },
+ {
+ "if": "generator:source=electricity",
+ "then": {
+ "en": "This generator converts electricity into another form of energy.",
+ "nl": "Deze generator zet elektriciteit om in een andere vorm van energie."
+ }
+ },
+ {
+ "if": "generator:source=tidal",
+ "then": {
+ "en": "This generator uses tidal energy.",
+ "nl": "Deze generator gebruikt getijdenenergie."
+ },
+ "icon": "./assets/layers/power_generator/water.svg"
+ },
+ {
+ "if": "generator:source=wave",
+ "then": {
+ "en": "This generator uses wave power.",
+ "nl": "Deze generator gebruikt golfenergie."
+ },
+ "icon": "./assets/layers/power_generator/water.svg"
+ },
+ {
+ "if": "generator:source=osmotic",
+ "then": {
+ "en": "This generator uses osmotic power (blue energy).",
+ "nl": "Deze generator gebruikt osmose-energie (blauwe energie)."
+ }
+ }
+ ]
+ },
+ {
+ "id": "method",
+ "question": {
+ "en": "What method does this generator use to produce electricity?",
+ "nl": "Welke methode gebruikt deze generator om elektriciteit te produceren?"
+ },
+ "mappings": [
+ {
+ "if": "generator:method=fission",
+ "then": {
+ "en": "This generator uses nuclear fission to produce electricity.",
+ "nl": "Deze generator gebruikt kernsplijting om elektriciteit te produceren."
+ },
+ "hideInAnswer": "generator:source!=nuclear"
+ },
+ {
+ "if": "generator:method=fusion",
+ "then": {
+ "en": "This generator uses nuclear fusion to produce electricity.",
+ "nl": "Deze generator gebruikt kernfusie om elektriciteit te produceren."
+ },
+ "hideInAnswer": "generator:source!=nuclear"
+ },
+ {
+ "if": "generator:method=wind_turbine",
+ "then": {
+ "en": "This generator uses a wind turbine to produce electricity.",
+ "nl": "Deze generator gebruikt een windturbine om elektriciteit te produceren."
+ },
+ "hideInAnswer": "generator:source!=wind"
+ },
+ {
+ "if": "generator:method=water-storage",
+ "then": {
+ "en": "This generator uses water storage behind a dam to produce electricity.",
+ "nl": "Deze generator gebruikt wateropslag achter een dam om elektriciteit te produceren."
+ },
+ "hideInAnswer": "generator:source!=hydro"
+ },
+ {
+ "if": "generator:method=water-pumped-storage",
+ "then": {
+ "en": "This generator uses water storage behind a dam to produce electricity, but it can also pump water back to the reservoir for later use.",
+ "nl": "Deze generator gebruikt wateropslag achter een dam om elektriciteit te produceren, maar kan ook water terugpompen naar het reservoir voor later gebruik."
+ },
+ "hideInAnswer": "generator:source!=hydro"
+ },
+ {
+ "if": "generator:method=run-of-the-river",
+ "then": {
+ "en": "This generator uses the flow of a river to produce electricity without significant water storage.",
+ "nl": "Deze generator gebruikt de stroming van een rivier om elektriciteit te produceren zonder aanzienlijke wateropslag."
+ },
+ "hideInAnswer": "generator:source!=hydro"
+ },
+ {
+ "if": "generator:method=barrage",
+ "then": {
+ "en": "This generator uses a tidal barrage to produce electricity.",
+ "nl": "Deze generator bestaat uit een getijdencentale met een dam en turbines om elektriciteit te produceren."
+ },
+ "hideInAnswer": "generator:source!=tidal"
+ },
+ {
+ "if": "generator:method=stream",
+ "then": {
+ "en": "This generator consists of a tidal stream generator that uses the flow of water to produce electricity.",
+ "nl": "Deze generator bestaat uit een turbine die de stroming van water gebruikt om elektriciteit te produceren."
+ },
+ "hideInAnswer": "generator:source!=tidal"
+ },
+ {
+ "if": "generator:method=thermal",
+ "then": {
+ "en": "This generator uses steam or heated water to produce electricity.",
+ "nl": "Deze generator gebruikt stoom of verwarmd water om elektriciteit te produceren."
+ },
+ "hideInAnswer": "generator:source!=solar"
+ },
+ {
+ "if": "generator:method=photovoltaic",
+ "then": {
+ "en": "This generator uses photovoltaic cells to convert sunlight directly into electricity.",
+ "nl": "Deze generator gebruikt fotovoltaïsche cellen om zonlicht direct om te zetten in elektriciteit."
+ },
+ "hideInAnswer": "generator:source!=solar",
+ "addExtraTags": [
+ "generator:type=solar_photovoltaic_panel"
+ ]
+ },
+ {
+ "if": "generator:method=combustion",
+ "then": {
+ "en": "This generator uses combustion to produce electricity.",
+ "nl": "Deze generator gebruikt verbranding om elektriciteit te produceren."
+ },
+ "hideInAnswer": {
+ "and": [
+ "generator:source!=coal",
+ "generator:source!=gas",
+ "generator:source!=biomass",
+ "generator:source!=biofuel",
+ "generator:source!=biogas",
+ "generator:source!=oil",
+ "generator:source!=diesel",
+ "generator:source!=gasoline",
+ "generator:source!=waste"
+ ]
+ }
+ },
+ {
+ "if": "generator:method=gasification",
+ "then": {
+ "en": "This generator uses gasification to convert solid or liquid fuel into a gas.",
+ "nl": "Deze generator gebruikt vergassing om vaste of vloeibare brandstof om te zetten in gas."
+ },
+ "hideInAnswer": {
+ "and": [
+ "generator:source!=biomass",
+ "generator:source!=waste"
+ ]
+ }
+ },
+ {
+ "if": "generator:method=anaerobic_digestion",
+ "then": {
+ "en": "This generator uses anaerobic digestion to produce biogas from organic matter.",
+ "nl": "Deze generator gebruikt vergisting om biogas te produceren uit organisch materiaal."
+ },
+ "hideInAnswer": "generator:source!=biogas"
+ }
+ ],
+ "condition": {
+ "and": [
+ "generator:source~*",
+ "generator:source!=wave",
+ "generator:source!=geothermal"
+ ]
+ }
+ },
+ {
+ "id": "generator_type",
+ "question": {
+ "en": "What type of generator is this?",
+ "nl": "Wat voor soort generator is dit?"
+ },
+ "render": {
+ "en": "This is a {generator:type}.",
+ "nl": "Dit is een {generator:type}."
+ },
+ "freeform": {
+ "key": "generator:type",
+ "type": "string",
+ "placeholder": {
+ "en": "Generator type",
+ "nl": "Generator type"
+ }
+ },
+ "mappings": [
+ {
+ "if": "generator:type=horizontal_axis",
+ "then": {
+ "en": "This is a horizontal axis wind turbine."
+ },
+ "hideInAnswer": "generator:method!=wind_turbine"
+ },
+ {
+ "if": "generator:type=vertical_axis",
+ "then": {
+ "en": "This is a vertical axis wind turbine."
+ },
+ "hideInAnswer": "generator:method!=wind_turbine"
+ },
+ {
+ "if": "generator:type=steam_turbine",
+ "then": {
+ "en": "This is a steam turbine."
+ },
+ "hideInAnswer": {
+ "and": [
+ "generator:source!=thermal",
+ "generator:source!=geothermal",
+ "generator:method!=thermal",
+ "generator:method!=combustion"
+ ]
+ }
+ },
+ {
+ "if": "generator:type=solar_thermal_collector",
+ "then": {
+ "en": "This is a solar thermal collector."
+ },
+ "hideInAnswer": {
+ "or": [
+ "generator:source!=solar",
+ "generator:method!=thermal"
+ ]
+ }
+ },
+ {
+ "if": "generator:type=solar_photovoltaic_panel",
+ "then": {
+ "en": "This is a solar photovoltaic (PV) panel."
+ },
+ "hideInAnswer": {
+ "or": [
+ "generator:source!=solar",
+ "generator:method!=photovoltaic"
+ ]
+ }
+ }
+ ],
+ "condition": {
+ "and": [
+ "generator:source~*",
+ "generator:method~*",
+ "generator:source!=wave"
+ ]
+ }
+ }
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
+}
\ No newline at end of file
diff --git a/assets/layers/power_generator/sun.svg b/assets/layers/power_generator/sun.svg
new file mode 100644
index 000000000..03f10cd7e
--- /dev/null
+++ b/assets/layers/power_generator/sun.svg
@@ -0,0 +1,214 @@
+
+
+
diff --git a/assets/layers/power_generator/sun.svg.license b/assets/layers/power_generator/sun.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/sun.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/waste.svg b/assets/layers/power_generator/waste.svg
new file mode 100644
index 000000000..c18998886
--- /dev/null
+++ b/assets/layers/power_generator/waste.svg
@@ -0,0 +1,192 @@
+
+
+
diff --git a/assets/layers/power_generator/waste.svg.license b/assets/layers/power_generator/waste.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/waste.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/water.svg b/assets/layers/power_generator/water.svg
new file mode 100644
index 000000000..3dcbed9f0
--- /dev/null
+++ b/assets/layers/power_generator/water.svg
@@ -0,0 +1,164 @@
+
+
+
diff --git a/assets/layers/power_generator/water.svg.license b/assets/layers/power_generator/water.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/water.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_generator/wind.svg b/assets/layers/power_generator/wind.svg
new file mode 100644
index 000000000..d5e882b80
--- /dev/null
+++ b/assets/layers/power_generator/wind.svg
@@ -0,0 +1,178 @@
+
+
+
diff --git a/assets/layers/power_generator/wind.svg.license b/assets/layers/power_generator/wind.svg.license
new file mode 100644
index 000000000..5ebc80700
--- /dev/null
+++ b/assets/layers/power_generator/wind.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText:
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/power_line/power_line.json b/assets/layers/power_line/power_line.json
new file mode 100644
index 000000000..953152512
--- /dev/null
+++ b/assets/layers/power_line/power_line.json
@@ -0,0 +1,133 @@
+{
+ "id": "power_line",
+ "name": {
+ "en": "Power Lines",
+ "nl": "Elektriciteitsleidingen"
+ },
+ "description": {
+ "en": "High-voltage power lines, often carried by towers or pylons.",
+ "nl": "Hoogspanningsleidingen, vaak gedragen door hoogspanningsmasten."
+ },
+ "source": {
+ "osmTags": "power=line"
+ },
+ "minzoom": 11,
+ "title": {
+ "render": {
+ "en": "Power Line"
+ }
+ },
+ "pointRendering": [
+ {
+ "marker": [
+ {
+ "icon": "lightning",
+ "color": "#ffcc00"
+ }
+ ],
+ "location": [
+ "point"
+ ]
+ }
+ ],
+ "lineRendering": [
+ {
+ "color": "#ffcc00",
+ "width": 6,
+ "dashArray": "5 5"
+ }
+ ],
+ "tagRenderings": [
+ {
+ "id": "operator",
+ "builtin": "operator",
+ "override": {
+ "question": {
+ "en": "Who operates this power line?"
+ },
+ "render": {
+ "en": "This power line is operated by {operator}."
+ }
+ }
+ },
+ {
+ "id": "voltage",
+ "question": {
+ "en": "What is the voltage of this power line?"
+ },
+ "render": {
+ "en": "This power line operates at {voltage} volts."
+ },
+ "freeform": {
+ "key": "voltage",
+ "type": "pnat",
+ "placeholder": {
+ "en": "e.g., 110000"
+ }
+ },
+ "mappings": [
+ {
+ "if": "voltage=110000",
+ "then": {
+ "en": "The voltage of this power line is 110 kV."
+ }
+ },
+ {
+ "if": "voltage=220000",
+ "then": {
+ "en": "The voltage of this power line is 220 kV."
+ }
+ }
+ ]
+ },
+ {
+ "id": "cables",
+ "question": {
+ "en": "How many cables does this power line have?"
+ },
+ "render": {
+ "en": "This power line has {cables} cables."
+ },
+ "freeform": {
+ "key": "cables",
+ "type": "pnat",
+ "placeholder": {
+ "en": "e.g., 3"
+ }
+ }
+ },
+ {
+ "id": "frequency",
+ "question": {
+ "en": "What is the frequency of this power line?"
+ },
+ "render": {
+ "en": "This power line operates at a frequency of {frequency} Hz."
+ },
+ "freeform": {
+ "key": "frequency",
+ "type": "pnat",
+ "placeholder": {
+ "en": "e.g., 50"
+ }
+ }
+ },
+ {
+ "id": "circuits",
+ "question": {
+ "en": "How many circuits does this power line have?"
+ },
+ "render": {
+ "en": "This power line has {circuits} circuits."
+ },
+ "freeform": {
+ "key": "circuits",
+ "type": "pnat",
+ "placeholder": {
+ "en": "e.g., 2"
+ }
+ }
+ }
+ ],
+ "allowMove": false
+}
\ No newline at end of file
diff --git a/assets/layers/power_minor_line/power_minor_line.json b/assets/layers/power_minor_line/power_minor_line.json
new file mode 100644
index 000000000..3995fa7d2
--- /dev/null
+++ b/assets/layers/power_minor_line/power_minor_line.json
@@ -0,0 +1,72 @@
+{
+ "id": "power_minor_line",
+ "name": {
+ "en": "Minor Power Lines",
+ "nl": "Elektriciteitsleidingen"
+ },
+ "description": {
+ "en": "Minor power lines, usually carried by smaller poles.",
+ "nl": "Kleinere elektriciteitsleidingen, meestal gedragen door kleinere palen."
+ },
+ "source": {
+ "osmTags": "power=minor_line"
+ },
+ "minzoom": 13,
+ "title": {
+ "render": {
+ "en": "Minor Power Line"
+ }
+ },
+ "pointRendering": [
+ {
+ "marker": [
+ {
+ "icon": "lightning",
+ "color": "#ffcc00"
+ }
+ ],
+ "location": [
+ "point"
+ ]
+ }
+ ],
+ "lineRendering": [
+ {
+ "color": "#ffcc00",
+ "width": 5,
+ "dashArray": "3 3"
+ }
+ ],
+ "tagRenderings": [
+ "power_line.operator",
+ {
+ "builtin": "power_line.voltage",
+ "override": {
+ "=mappings": [
+ {
+ "if": "voltage=20000",
+ "then": {
+ "en": "The voltage of this power line is 20 kV."
+ }
+ },
+ {
+ "if": "voltage=11000",
+ "then": {
+ "en": "The voltage of this power line is 11 kV."
+ }
+ },
+ {
+ "if": "voltage=22000",
+ "then": {
+ "en": "The voltage of this power line is 22 kV."
+ }
+ }
+ ]
+ }
+ },
+ "power_line.cables",
+ "power_line.frequency",
+ "power_line.circuits"
+ ],
+ "allowMove": false
+}
\ No newline at end of file
diff --git a/assets/layers/power_pole/license_info.json b/assets/layers/power_pole/license_info.json
new file mode 100644
index 000000000..de8264125
--- /dev/null
+++ b/assets/layers/power_pole/license_info.json
@@ -0,0 +1,102 @@
+[
+ {
+ "path": "power_pole_1_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_2_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_3_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_4_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_asymmetric.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_asymmetric_armless.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_delta.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_flag.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_triangle.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_pole_triangle_armless.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole.json b/assets/layers/power_pole/power_pole.json
new file mode 100644
index 000000000..e1a8365ad
--- /dev/null
+++ b/assets/layers/power_pole/power_pole.json
@@ -0,0 +1,265 @@
+{
+ "id": "power_pole",
+ "name": {
+ "en": "Power Poles",
+ "nl": "Elektriciteitspalen"
+ },
+ "description": {
+ "en": "Layer showing power poles.",
+ "nl": "Laag die elektriciteitspalen toont."
+ },
+ "source": {
+ "osmTags": "power=pole"
+ },
+ "minzoom": 16,
+ "title": {
+ "render": {
+ "en": "Power Pole"
+ }
+ },
+ "pointRendering": [
+ {
+ "marker": [
+ {
+ "icon": {
+ "render": "./assets/layers/power_pole/power_pole_1_level.svg",
+ "mappings": [
+ {
+ "if": "design=two-level",
+ "then": "./assets/layers/power_pole/power_pole_2_level.svg"
+ },
+ {
+ "if": "design=three-level",
+ "then": "./assets/layers/power_pole/power_pole_3_level.svg"
+ },
+ {
+ "if": "design=four-level",
+ "then": "./assets/layers/power_pole/power_pole_4_level.svg"
+ },
+ {
+ "if": "design=asymmetric",
+ "then": "./assets/layers/power_pole/power_pole_asymmetric.svg"
+ },
+ {
+ "if": "design=triangle",
+ "then": "./assets/layers/power_pole/power_pole_triangle.svg"
+ },
+ {
+ "if": "design=armless_triangle",
+ "then": "./assets/layers/power_pole/power_pole_triangle_armless.svg"
+ },
+ {
+ "if": "design=flag",
+ "then": "./assets/layers/power_pole/power_pole_flag.svg"
+ },
+ {
+ "if": {
+ "or": [
+ "design=delta",
+ "design=delta_two_level",
+ "design=delta_three_level"
+ ]
+ },
+ "then": "./assets/layers/power_pole/power_pole_delta.svg"
+ }
+ ]
+ }
+ }
+ ],
+ "location": [
+ "point",
+ "centroid"
+ ]
+ }
+ ],
+ "tagRenderings": [
+ {
+ "id": "material",
+ "question": {
+ "en": "What material is this power pole made of?"
+ },
+ "render": {
+ "en": "This power pole is made of {material}."
+ },
+ "freeform": {
+ "key": "material",
+ "type": "string",
+ "placeholder": {
+ "en": "e.g. wood, concrete, steel"
+ }
+ },
+ "mappings": [
+ {
+ "if": "material=wood",
+ "then": {
+ "en": "This power pole is made of wood."
+ }
+ },
+ {
+ "if": "material=concrete",
+ "then": {
+ "en": "This power pole is made of concrete."
+ }
+ },
+ {
+ "if": "material=steel",
+ "then": {
+ "en": "This power pole is made of steel."
+ }
+ },
+ {
+ "if": "material=reinforced_concrete",
+ "then": {
+ "en": "This power pole is made of reinforced concrete."
+ }
+ },
+ {
+ "if": "material=metal",
+ "then": {
+ "en": "This power pole is made of metal."
+ }
+ }
+ ]
+ },
+ {
+ "id": "design",
+ "question": {
+ "en": "What is the design of this power pole?"
+ },
+ "render": {
+ "en": "This power pole has the design {design}."
+ },
+ "freeform": {
+ "key": "design",
+ "type": "string",
+ "placeholder": {
+ "en": "e.g., delta, asymmetric, triangle"
+ }
+ },
+ "mappings": [
+ {
+ "if": "design=one-level",
+ "then": {
+ "en": "This power pole has a one-level design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_1_level.svg"
+ }
+ },
+ {
+ "if": "design=two-level",
+ "then": {
+ "en": "This power pole has a two-level design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_2_level.svg"
+ }
+ },
+ {
+ "if": "design=three-level",
+ "then": {
+ "en": "This power pole has a three-level design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_3_level.svg"
+ }
+ },
+ {
+ "if": "design=four-level",
+ "then": {
+ "en": "This power pole has a four-level design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_4_level.svg"
+ }
+ },
+ {
+ "if": "design=asymmetric",
+ "then": {
+ "en": "This power pole has an asymmetric design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_asymmetric.svg"
+ }
+ },
+ {
+ "if": "design=triangle",
+ "then": {
+ "en": "This power pole has a triangle design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_triangle.svg"
+ }
+ },
+ {
+ "if": "design=armless_triangle",
+ "then": {
+ "en": "This power pole has an armless triangle design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_triangle_armless.svg"
+ }
+ },
+ {
+ "if": "design=flag",
+ "then": {
+ "en": "This power pole has a flag design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_flag.svg"
+ }
+ },
+ {
+ "if": "design=delta",
+ "then": {
+ "en": "This power pole has a delta design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_delta.svg"
+ }
+ },
+ {
+ "if": "design=delta_two_level",
+ "then": {
+ "en": "This power pole has a two-level delta design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_delta.svg"
+ }
+ },
+ {
+ "if": "design=delta_three_level",
+ "then": {
+ "en": "This power pole has a three-level delta design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_pole/power_pole_delta.svg"
+ }
+ }
+ ]
+ },
+ {
+ "builtin": "ref",
+ "override": {
+ "question": {
+ "en": "What is the reference number of this power pole?"
+ },
+ "render": {
+ "en": "This power pole has the reference number {ref}."
+ }
+ }
+ },
+ {
+ "builtin": "operator",
+ "override": {
+ "question": {
+ "en": "Who operates this power pole?"
+ },
+ "render": {
+ "en": "This power pole is operated by {operator}."
+ }
+ }
+ }
+ ],
+ "allowMove": false
+}
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_1_level.svg b/assets/layers/power_pole/power_pole_1_level.svg
new file mode 100644
index 000000000..eb070a3cc
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_1_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_1_level.svg.license b/assets/layers/power_pole/power_pole_1_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_1_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_2_level.svg b/assets/layers/power_pole/power_pole_2_level.svg
new file mode 100644
index 000000000..27447ca25
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_2_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_2_level.svg.license b/assets/layers/power_pole/power_pole_2_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_2_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_3_level.svg b/assets/layers/power_pole/power_pole_3_level.svg
new file mode 100644
index 000000000..3e8c90e5e
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_3_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_3_level.svg.license b/assets/layers/power_pole/power_pole_3_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_3_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_4_level.svg b/assets/layers/power_pole/power_pole_4_level.svg
new file mode 100644
index 000000000..f26c156cd
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_4_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_4_level.svg.license b/assets/layers/power_pole/power_pole_4_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_4_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_asymmetric.svg b/assets/layers/power_pole/power_pole_asymmetric.svg
new file mode 100644
index 000000000..703177670
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_asymmetric.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_asymmetric.svg.license b/assets/layers/power_pole/power_pole_asymmetric.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_asymmetric.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_asymmetric_armless.svg b/assets/layers/power_pole/power_pole_asymmetric_armless.svg
new file mode 100644
index 000000000..3bd75ab4c
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_asymmetric_armless.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_asymmetric_armless.svg.license b/assets/layers/power_pole/power_pole_asymmetric_armless.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_asymmetric_armless.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_delta.svg b/assets/layers/power_pole/power_pole_delta.svg
new file mode 100644
index 000000000..189f1d6c8
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_delta.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_delta.svg.license b/assets/layers/power_pole/power_pole_delta.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_delta.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_flag.svg b/assets/layers/power_pole/power_pole_flag.svg
new file mode 100644
index 000000000..653db19da
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_flag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_flag.svg.license b/assets/layers/power_pole/power_pole_flag.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_flag.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_triangle.svg b/assets/layers/power_pole/power_pole_triangle.svg
new file mode 100644
index 000000000..8d0eb81af
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_triangle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_triangle.svg.license b/assets/layers/power_pole/power_pole_triangle.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_triangle.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_triangle_armless.svg b/assets/layers/power_pole/power_pole_triangle_armless.svg
new file mode 100644
index 000000000..704842fc0
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_triangle_armless.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_pole/power_pole_triangle_armless.svg.license b/assets/layers/power_pole/power_pole_triangle_armless.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_pole/power_pole_triangle_armless.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/license_info.json b/assets/layers/power_tower/license_info.json
new file mode 100644
index 000000000..ad46855ef
--- /dev/null
+++ b/assets/layers/power_tower/license_info.json
@@ -0,0 +1,212 @@
+[
+ {
+ "path": "power_tower_1_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_2_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_3_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_4_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_asymmetric.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_barrel.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_delta.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_delta_2_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_delta_3_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_donau.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_donau_inverse.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_flag.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_guyed_h_frame.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_h_frame.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_h_frame_2_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_portal.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_portal_2_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_portal_3_level.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_triangle.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_x_frame.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ },
+ {
+ "path": "power_tower_y_frame.svg",
+ "license": "CC-BY-SA-4.0",
+ "authors": [
+ "Sergey Vartanov"
+ ],
+ "sources": [
+ "https://enzet.ru/roentgen/"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower.json b/assets/layers/power_tower/power_tower.json
new file mode 100644
index 000000000..9189d58af
--- /dev/null
+++ b/assets/layers/power_tower/power_tower.json
@@ -0,0 +1,384 @@
+{
+ "id": "power_tower",
+ "name": {
+ "en": "Power Towers",
+ "nl": "Elektriciteitsmasten"
+ },
+ "description": {
+ "en": "Layer showing power towers.",
+ "nl": "Laag die elektriciteitsmasten toont."
+ },
+ "source": {
+ "osmTags": "power=tower"
+ },
+ "minzoom": 14,
+ "title": {
+ "render": {
+ "en": "Power Tower"
+ }
+ },
+ "pointRendering": [
+ {
+ "marker": [
+ {
+ "icon": {
+ "render": "./assets/layers/power_tower/power_tower_1_level.svg",
+ "mappings": [
+ {
+ "if": "design=two-level",
+ "then": "./assets/layers/power_tower/power_tower_2_level.svg"
+ },
+ {
+ "if": "design=three-level",
+ "then": "./assets/layers/power_tower/power_tower_3_level.svg"
+ },
+ {
+ "if": "design=four-level",
+ "then": "./assets/layers/power_tower/power_tower_4_level.svg"
+ },
+ {
+ "if": "design=asymmetric",
+ "then": "./assets/layers/power_tower/power_tower_asymmetric.svg"
+ },
+ {
+ "if": "design=triangle",
+ "then": "./assets/layers/power_tower/power_tower_triangle.svg"
+ },
+ {
+ "if": "design=flag",
+ "then": "./assets/layers/power_tower/power_tower_flag.svg"
+ },
+ {
+ "if": "design=delta",
+ "then": "./assets/layers/power_tower/power_tower_delta.svg"
+ },
+ {
+ "if": "design=delta_two_level",
+ "then": "./assets/layers/power_tower/power_tower_delta_2_level.svg"
+ },
+ {
+ "if": "design=delta_three_level",
+ "then": "./assets/layers/power_tower/power_tower_delta_3_level.svg"
+ },
+ {
+ "if": "design=donau",
+ "then": "./assets/layers/power_tower/power_tower_donau.svg"
+ },
+ {
+ "if": "design=donau_inverse",
+ "then": "./assets/layers/power_tower/power_tower_donau_inverse.svg"
+ },
+ {
+ "if": "design=barrel",
+ "then": "./assets/layers/power_tower/power_tower_barrel.svg"
+ },
+ {
+ "if": "design=y-frame",
+ "then": "./assets/layers/power_tower/power_tower_y_frame.svg"
+ },
+ {
+ "if": "design=x-frame",
+ "then": "./assets/layers/power_tower/power_tower_x_frame.svg"
+ },
+ {
+ "if": "design=h-frame",
+ "then": "./assets/layers/power_tower/power_tower_h_frame.svg"
+ },
+ {
+ "if": "design=guyed_h_frame",
+ "then": "./assets/layers/power_tower/power_tower_guyed_h_frame.svg"
+ },
+ {
+ "if": "design=portal",
+ "then": "./assets/layers/power_tower/power_tower_portal.svg"
+ },
+ {
+ "if": "design=portal-two-level",
+ "then": "./assets/layers/power_tower/power_tower_portal_2_level.svg"
+ },
+ {
+ "if": "design=portal-three-level",
+ "then": "./assets/layers/power_tower/power_tower_portal_3_level.svg"
+ }
+ ]
+ }
+ }
+ ],
+ "location": [
+ "point",
+ "centroid"
+ ]
+ }
+ ],
+ "tagRenderings": [
+ {
+ "id": "material",
+ "question": {
+ "en": "What material is this power tower made of?"
+ },
+ "render": {
+ "en": "This power tower is made of {material}."
+ },
+ "freeform": {
+ "key": "material",
+ "type": "string",
+ "placeholder": {
+ "en": "e.g. wood, concrete, steel"
+ }
+ },
+ "mappings": [
+ {
+ "if": "material=steel",
+ "then": {
+ "en": "This power tower is made of steel."
+ }
+ },
+ {
+ "if": "material=wood",
+ "then": {
+ "en": "This power tower is made of wood."
+ }
+ },
+ {
+ "if": "material=metal",
+ "then": {
+ "en": "This power tower is made of metal."
+ }
+ },
+ {
+ "if": "material=concrete",
+ "then": {
+ "en": "This power tower is made of concrete."
+ }
+ },
+ {
+ "if": "material=reinforced_concrete",
+ "then": {
+ "en": "This power tower is made of reinforced concrete."
+ }
+ }
+ ]
+ },
+ {
+ "id": "design",
+ "question": {
+ "en": "What is the design of this power tower?"
+ },
+ "render": {
+ "en": "This power tower has the design {design}."
+ },
+ "freeform": {
+ "key": "design",
+ "type": "string",
+ "placeholder": {
+ "en": "e.g., delta, donau, h-frame"
+ }
+ },
+ "mappings": [
+ {
+ "if": "design=one-level",
+ "then": {
+ "en": "This power tower has a one-level design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_1_level.svg"
+ }
+ },
+ {
+ "if": "design=two-level",
+ "then": {
+ "en": "This power tower has a two-level design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_2_level.svg"
+ }
+ },
+ {
+ "if": "design=three-level",
+ "then": {
+ "en": "This power tower has a three-level design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_3_level.svg"
+ }
+ },
+ {
+ "if": "design=four-level",
+ "then": {
+ "en": "This power tower has a four-level design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_4_level.svg"
+ }
+ },
+ {
+ "if": "design=asymmetric",
+ "then": {
+ "en": "This power tower has an asymmetric design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_asymmetric.svg"
+ }
+ },
+ {
+ "if": "design=triangle",
+ "then": {
+ "en": "This power tower has a triangle design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_triangle.svg"
+ }
+ },
+ {
+ "if": "design=flag",
+ "then": {
+ "en": "This power tower has a flag design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_flag.svg"
+ }
+ },
+ {
+ "if": "design=delta",
+ "then": {
+ "en": "This power tower has a delta design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_delta.svg"
+ }
+ },
+ {
+ "if": "design=delta_two_level",
+ "then": {
+ "en": "This power tower has a two-level delta design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_delta_2_level.svg"
+ }
+ },
+ {
+ "if": "design=delta_three_level",
+ "then": {
+ "en": "This power tower has a three-level delta design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_delta_3_level.svg"
+ }
+ },
+ {
+ "if": "design=donau",
+ "then": {
+ "en": "This power tower has a Donau design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_donau.svg"
+ }
+ },
+ {
+ "if": "design=donau_inverse",
+ "then": {
+ "en": "This power tower has an inverse Donau design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_donau_inverse.svg"
+ }
+ },
+ {
+ "if": "design=barrel",
+ "then": {
+ "en": "This power tower has a barrel design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_barrel.svg"
+ }
+ },
+ {
+ "if": "design=y-frame",
+ "then": {
+ "en": "This power tower has a Y-frame design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_y_frame.svg"
+ }
+ },
+ {
+ "if": "design=x-frame",
+ "then": {
+ "en": "This power tower has an X-frame design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_x_frame.svg"
+ }
+ },
+ {
+ "if": "design=h-frame",
+ "then": {
+ "en": "This power tower has an H-frame design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_h_frame.svg"
+ }
+ },
+ {
+ "if": "design=guyed_h-frame",
+ "then": {
+ "en": "This power tower has a guyed H-frame design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_guyed_h_frame.svg"
+ }
+ },
+ {
+ "if": "design=portal",
+ "then": {
+ "en": "This power tower has a portal design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_portal.svg"
+ }
+ },
+ {
+ "if": "design=portal-two-level",
+ "then": {
+ "en": "This power tower has a two-level portal design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_portal_2_level.svg"
+ }
+ },
+ {
+ "if": "design=portal-three-level",
+ "then": {
+ "en": "This power tower has a three-level portal design."
+ },
+ "icon": {
+ "path": "./assets/layers/power_tower/power_tower_portal_3_level.svg"
+ }
+ }
+ ]
+ },
+ {
+ "builtin": "ref",
+ "override": {
+ "question": {
+ "en": "What is the reference number of this power tower?"
+ },
+ "render": {
+ "en": "This power tower has the reference number {ref}."
+ }
+ }
+ },
+ {
+ "builtin": "operator",
+ "override": {
+ "question": {
+ "en": "Who operates this power tower?"
+ },
+ "render": {
+ "en": "This power tower is operated by {operator}."
+ }
+ }
+ }
+ ],
+ "allowMove": false
+}
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_1_level.svg b/assets/layers/power_tower/power_tower_1_level.svg
new file mode 100644
index 000000000..f3cee997e
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_1_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_1_level.svg.license b/assets/layers/power_tower/power_tower_1_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_1_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_2_level.svg b/assets/layers/power_tower/power_tower_2_level.svg
new file mode 100644
index 000000000..296ee3b0f
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_2_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_2_level.svg.license b/assets/layers/power_tower/power_tower_2_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_2_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_3_level.svg b/assets/layers/power_tower/power_tower_3_level.svg
new file mode 100644
index 000000000..d19516dd8
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_3_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_3_level.svg.license b/assets/layers/power_tower/power_tower_3_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_3_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_4_level.svg b/assets/layers/power_tower/power_tower_4_level.svg
new file mode 100644
index 000000000..cea32a0b2
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_4_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_4_level.svg.license b/assets/layers/power_tower/power_tower_4_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_4_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_asymmetric.svg b/assets/layers/power_tower/power_tower_asymmetric.svg
new file mode 100644
index 000000000..e22dc4a71
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_asymmetric.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_asymmetric.svg.license b/assets/layers/power_tower/power_tower_asymmetric.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_asymmetric.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_barrel.svg b/assets/layers/power_tower/power_tower_barrel.svg
new file mode 100644
index 000000000..eb340d2eb
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_barrel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_barrel.svg.license b/assets/layers/power_tower/power_tower_barrel.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_barrel.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_delta.svg b/assets/layers/power_tower/power_tower_delta.svg
new file mode 100644
index 000000000..a43704bf1
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_delta.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_delta.svg.license b/assets/layers/power_tower/power_tower_delta.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_delta.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_delta_2_level.svg b/assets/layers/power_tower/power_tower_delta_2_level.svg
new file mode 100644
index 000000000..546f04d93
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_delta_2_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_delta_2_level.svg.license b/assets/layers/power_tower/power_tower_delta_2_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_delta_2_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_delta_3_level.svg b/assets/layers/power_tower/power_tower_delta_3_level.svg
new file mode 100644
index 000000000..ad587721f
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_delta_3_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_delta_3_level.svg.license b/assets/layers/power_tower/power_tower_delta_3_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_delta_3_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_donau.svg b/assets/layers/power_tower/power_tower_donau.svg
new file mode 100644
index 000000000..e5a6e0b09
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_donau.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_donau.svg.license b/assets/layers/power_tower/power_tower_donau.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_donau.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_donau_inverse.svg b/assets/layers/power_tower/power_tower_donau_inverse.svg
new file mode 100644
index 000000000..e1d11e7f8
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_donau_inverse.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_donau_inverse.svg.license b/assets/layers/power_tower/power_tower_donau_inverse.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_donau_inverse.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_flag.svg b/assets/layers/power_tower/power_tower_flag.svg
new file mode 100644
index 000000000..65ef7d138
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_flag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_flag.svg.license b/assets/layers/power_tower/power_tower_flag.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_flag.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_guyed_h_frame.svg b/assets/layers/power_tower/power_tower_guyed_h_frame.svg
new file mode 100644
index 000000000..449ef7232
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_guyed_h_frame.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_guyed_h_frame.svg.license b/assets/layers/power_tower/power_tower_guyed_h_frame.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_guyed_h_frame.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_h_frame.svg b/assets/layers/power_tower/power_tower_h_frame.svg
new file mode 100644
index 000000000..5e2761a17
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_h_frame.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_h_frame.svg.license b/assets/layers/power_tower/power_tower_h_frame.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_h_frame.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_h_frame_2_level.svg b/assets/layers/power_tower/power_tower_h_frame_2_level.svg
new file mode 100644
index 000000000..f086630a7
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_h_frame_2_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_h_frame_2_level.svg.license b/assets/layers/power_tower/power_tower_h_frame_2_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_h_frame_2_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_portal.svg b/assets/layers/power_tower/power_tower_portal.svg
new file mode 100644
index 000000000..eb8b280b0
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_portal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_portal.svg.license b/assets/layers/power_tower/power_tower_portal.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_portal.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_portal_2_level.svg b/assets/layers/power_tower/power_tower_portal_2_level.svg
new file mode 100644
index 000000000..665826083
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_portal_2_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_portal_2_level.svg.license b/assets/layers/power_tower/power_tower_portal_2_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_portal_2_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_portal_3_level.svg b/assets/layers/power_tower/power_tower_portal_3_level.svg
new file mode 100644
index 000000000..a2facddc2
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_portal_3_level.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_portal_3_level.svg.license b/assets/layers/power_tower/power_tower_portal_3_level.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_portal_3_level.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_triangle.svg b/assets/layers/power_tower/power_tower_triangle.svg
new file mode 100644
index 000000000..01a8e24bd
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_triangle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_triangle.svg.license b/assets/layers/power_tower/power_tower_triangle.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_triangle.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_x_frame.svg b/assets/layers/power_tower/power_tower_x_frame.svg
new file mode 100644
index 000000000..6cca19e10
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_x_frame.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_x_frame.svg.license b/assets/layers/power_tower/power_tower_x_frame.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_x_frame.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_y_frame.svg b/assets/layers/power_tower/power_tower_y_frame.svg
new file mode 100644
index 000000000..f60c57e4f
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_y_frame.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/power_tower/power_tower_y_frame.svg.license b/assets/layers/power_tower/power_tower_y_frame.svg.license
new file mode 100644
index 000000000..61df2a1b4
--- /dev/null
+++ b/assets/layers/power_tower/power_tower_y_frame.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Sergey Vartanov
+SPDX-License-Identifier: CC-BY-SA-4.0
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/license_info.json b/assets/layers/street_cabinet/license_info.json
new file mode 100644
index 000000000..25ceef59e
--- /dev/null
+++ b/assets/layers/street_cabinet/license_info.json
@@ -0,0 +1,83 @@
+[
+ {
+ "path": "street_cabinet.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "Robin van der Linde"
+ ],
+ "sources": []
+ },
+ {
+ "path": "street_cabinet_gas.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "Robin van der Linde",
+ "OpenClipArt"
+ ],
+ "sources": [
+ "https://openclipart.org/detail/305651/flame"
+ ]
+ },
+ {
+ "path": "street_cabinet_generic.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "Abu Badali",
+ "FontAwesome",
+ "Pieter Vander Vennet",
+ "Robin van der Linde"
+ ],
+ "sources": [
+ "https://commons.wikimedia.org/wiki/File:Phoneicon.svg",
+ "https://commons.wikimedia.org/wiki/File:Power-lightning_icon-icons.com_74466.svg",
+ "https://source.mapcomplete.org/MapComplete/MapComplete/src/branch/develop/assets/svg/teardrop.svg"
+ ]
+ },
+ {
+ "path": "street_cabinet_power.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "FontAwesome",
+ "Robin van der Linde"
+ ],
+ "sources": [
+ "https://commons.wikimedia.org/wiki/File:Power-lightning_icon-icons.com_74466.svg",
+ "https://source.mapcomplete.org/MapComplete/MapComplete/src/branch/develop/assets/svg/teardrop.svg"
+ ]
+ },
+ {
+ "path": "street_cabinet_street_lighting.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "Robin van der Linde",
+ "Yohan Boniface"
+ ],
+ "sources": [
+ "https://github.com/hotosm/HDM-CartoCSS/blob/master/icons/poi/street_lamp.svg"
+ ]
+ },
+ {
+ "path": "street_cabinet_telecom.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "Abu Badali",
+ "Robin van der Linde"
+ ],
+ "sources": [
+ "https://commons.wikimedia.org/wiki/File:Phoneicon.svg",
+ "https://source.mapcomplete.org/MapComplete/MapComplete/src/branch/develop/assets/svg/teardrop.svg"
+ ]
+ },
+ {
+ "path": "street_cabinet_water.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "Pieter Vander Vennet",
+ "Robin van der Linde"
+ ],
+ "sources": [
+ "https://commons.wikimedia.org/wiki/File:Water_drop_icon-icons.com_74468.svg",
+ "https://source.mapcomplete.org/MapComplete/MapComplete/src/branch/develop/assets/svg/teardrop.svg"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet.json b/assets/layers/street_cabinet/street_cabinet.json
new file mode 100644
index 000000000..6a158a335
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet.json
@@ -0,0 +1,220 @@
+{
+ "id": "street_cabinet",
+ "name": {
+ "en": "Street Cabinets"
+ },
+ "description": {
+ "en": "Layer showing street cabinets for various utilities."
+ },
+ "source": {
+ "osmTags": "man_made=street_cabinet"
+ },
+ "minzoom": 15,
+ "title": {
+ "render": {
+ "en": "Street Cabinet"
+ }
+ },
+ "pointRendering": [
+ {
+ "marker": [
+ {
+ "icon": {
+ "render": "./assets/layers/street_cabinet/street_cabinet_generic.svg",
+ "mappings": [
+ {
+ "if": "utility=power",
+ "then": "./assets/layers/street_cabinet/street_cabinet_power.svg"
+ },
+ {
+ "if": "utility=telecom",
+ "then": "./assets/layers/street_cabinet/street_cabinet_telecom.svg"
+ },
+ {
+ "if": "utility=water",
+ "then": "./assets/layers/street_cabinet/street_cabinet_water.svg"
+ },
+ {
+ "if": "utility=street_lighting",
+ "then": "./assets/layers/street_cabinet/street_cabinet_street_lighting.svg"
+ },
+ {
+ "if": "utility=gas",
+ "then": "./assets/layers/street_cabinet/street_cabinet_gas.svg"
+ },
+ {
+ "if": {
+ "or": [
+ "street_cabinet=traffic_control",
+ "street_cabinet=traffic_monitoring",
+ "street_cabinet=postal_service"
+ ]
+ },
+ "then": "./assets/layers/street_cabinet/street_cabinet.svg"
+ }
+ ]
+ }
+ }
+ ],
+ "location": [
+ "point",
+ "centroid"
+ ],
+ "anchor": "bottom"
+ }
+ ],
+ "lineRendering": [
+ {
+ "color": "#3c3c3c",
+ "fillColor": "#3c3c3c6a"
+ }
+ ],
+ "presets": [
+ {
+ "title": {
+ "en": "a street cabinet"
+ },
+ "tags": [
+ "man_made=street_cabinet"
+ ]
+ }
+ ],
+ "tagRenderings": [
+ "images",
+ {
+ "id": "utility",
+ "question": {
+ "en": "What type of utility is this street cabinet for?"
+ },
+ "mappings": [
+ {
+ "if": "utility=power",
+ "then": {
+ "en": "This street cabinet is for power distribution."
+ },
+ "addExtraTags": [
+ "street_cabinet="
+ ],
+ "icon": {
+ "path": "./assets/layers/street_cabinet/street_cabinet_power.svg"
+ }
+ },
+ {
+ "if": "utility=telecom",
+ "then": {
+ "en": "This street cabinet is for telecommunications."
+ },
+ "addExtraTags": [
+ "street_cabinet=telecom"
+ ],
+ "icon": {
+ "path": "./assets/layers/street_cabinet/street_cabinet_telecom.svg"
+ }
+ },
+ {
+ "if": "utility=gas",
+ "then": {
+ "en": "This street cabinet is for gas utilities."
+ },
+ "addExtraTags": [
+ "street_cabinet="
+ ],
+ "icon": {
+ "path": "./assets/layers/street_cabinet/street_cabinet_gas.svg"
+ }
+ },
+ {
+ "if": "utility=water",
+ "then": {
+ "en": "This street cabinet is for water utilities."
+ },
+ "addExtraTags": [
+ "street_cabinet="
+ ],
+ "icon": {
+ "path": "./assets/layers/street_cabinet/street_cabinet_water.svg"
+ }
+ },
+ {
+ "if": "utility=street_lighting",
+ "then": {
+ "en": "This street cabinet is for street lighting."
+ },
+ "addExtraTags": [
+ "street_cabinet="
+ ],
+ "icon": {
+ "path": "./assets/layers/street_cabinet/street_cabinet_street_lighting.svg"
+ }
+ },
+ {
+ "if": "street_cabinet=traffic_control",
+ "then": {
+ "en": "This street cabinet is for traffic control systems like traffic signals or movable barriers."
+ },
+ "addExtraTags": [
+ "utility="
+ ],
+ "icon": {
+ "path": "./assets/layers/street_cabinet/street_cabinet.svg"
+ }
+ },
+ {
+ "if": "street_cabinet=traffic_monitoring",
+ "then": {
+ "en": "This street cabinet is for traffic monitoring systems."
+ },
+ "addExtraTags": [
+ "utility="
+ ],
+ "icon": {
+ "path": "./assets/layers/street_cabinet/street_cabinet.svg"
+ }
+ },
+ {
+ "if": "street_cabinet=postal_service",
+ "then": {
+ "en": "This street cabinet is used for storing pending mail before local delivery."
+ },
+ "addExtraTags": [
+ "utility="
+ ],
+ "icon": {
+ "path": "./assets/layers/street_cabinet/street_cabinet.svg"
+ }
+ }
+ ]
+ },
+ {
+ "builtin": "ref",
+ "override": {
+ "question": {
+ "en": "What is the reference number of this street cabinet?"
+ },
+ "render": {
+ "en": "The reference number of this street cabinet is {ref}."
+ }
+ }
+ },
+ {
+ "id": "operator",
+ "question": {
+ "en": "Who is the operator of this street cabinet?"
+ },
+ "render": {
+ "en": "This street cabinet is operated by {operator}."
+ },
+ "freeform": {
+ "key": "operator",
+ "type": "string",
+ "placeholder": {
+ "en": "Operator name"
+ }
+ }
+ }
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
+}
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet.svg b/assets/layers/street_cabinet/street_cabinet.svg
new file mode 100644
index 000000000..2cd42ea54
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet.svg.license b/assets/layers/street_cabinet/street_cabinet.svg.license
new file mode 100644
index 000000000..75299f884
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Robin van der Linde
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_gas.svg b/assets/layers/street_cabinet/street_cabinet_gas.svg
new file mode 100644
index 000000000..a89344686
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_gas.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_gas.svg.license b/assets/layers/street_cabinet/street_cabinet_gas.svg.license
new file mode 100644
index 000000000..c180ab275
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_gas.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Robin van der Linde; OpenClipArt
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_generic.svg b/assets/layers/street_cabinet/street_cabinet_generic.svg
new file mode 100644
index 000000000..a3f24264b
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_generic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_generic.svg.license b/assets/layers/street_cabinet/street_cabinet_generic.svg.license
new file mode 100644
index 000000000..535ad0380
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_generic.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Abu Badali; FontAwesome; Pieter Vander Vennet; Robin van der Linde
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_power.svg b/assets/layers/street_cabinet/street_cabinet_power.svg
new file mode 100644
index 000000000..d5ab3e92a
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_power.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_power.svg.license b/assets/layers/street_cabinet/street_cabinet_power.svg.license
new file mode 100644
index 000000000..035fabcf6
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_power.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: FontAwesome; Robin van der Linde
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_street_lighting.svg b/assets/layers/street_cabinet/street_cabinet_street_lighting.svg
new file mode 100644
index 000000000..f9c5dfe61
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_street_lighting.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_street_lighting.svg.license b/assets/layers/street_cabinet/street_cabinet_street_lighting.svg.license
new file mode 100644
index 000000000..03bfd49bc
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_street_lighting.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Robin van der Linde; Yohan Boniface
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_telecom.svg b/assets/layers/street_cabinet/street_cabinet_telecom.svg
new file mode 100644
index 000000000..805143332
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_telecom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_telecom.svg.license b/assets/layers/street_cabinet/street_cabinet_telecom.svg.license
new file mode 100644
index 000000000..7cc246e6e
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_telecom.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Abu Badali; Robin van der Linde
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_water.svg b/assets/layers/street_cabinet/street_cabinet_water.svg
new file mode 100644
index 000000000..14a69bd35
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_water.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/street_cabinet/street_cabinet_water.svg.license b/assets/layers/street_cabinet/street_cabinet_water.svg.license
new file mode 100644
index 000000000..91b9cbc0f
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet_water.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Pieter Vander Vennet; Robin van der Linde
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/telecom/license_info.json b/assets/layers/telecom/license_info.json
new file mode 100644
index 000000000..11b85d644
--- /dev/null
+++ b/assets/layers/telecom/license_info.json
@@ -0,0 +1,15 @@
+[
+ {
+ "path": "telecom_exchange.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "Abu Badali",
+ "Sarang",
+ "Robin van der Linde"
+ ],
+ "sources": [
+ "https://commons.wikimedia.org/wiki/File:Phoneicon.svg",
+ "https://commons.wikimedia.org/wiki/File:Globe_icon.svg"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/assets/layers/telecom/telecom.json b/assets/layers/telecom/telecom.json
new file mode 100644
index 000000000..f15947a87
--- /dev/null
+++ b/assets/layers/telecom/telecom.json
@@ -0,0 +1,162 @@
+{
+ "id": "telecom",
+ "name": {
+ "en": "Telecom"
+ },
+ "description": {
+ "en": "Layer showing telecom exchanges and other related features like connection points and distribution points."
+ },
+ "source": {
+ "osmTags": {
+ "or": [
+ "telecom=exchange",
+ "telecom=distribution_point",
+ "telecom=connection_point"
+ ]
+ }
+ },
+ "minzoom": 9,
+ "title": {
+ "render": {
+ "en": "Telecom Exchange"
+ },
+ "mappings": [
+ {
+ "if": "telecom=connection_point",
+ "then": {
+ "en": "Telecom Connection Point"
+ }
+ },
+ {
+ "if": "telecom=distribution_point",
+ "then": {
+ "en": "Telecom Distribution Point"
+ }
+ }
+ ]
+ },
+ "pointRendering": [
+ {
+ "marker": [
+ {
+ "icon": "./assets/layers/telecom/telecom_exchange.svg"
+ }
+ ],
+ "location": [
+ "point",
+ "centroid"
+ ]
+ }
+ ],
+ "lineRendering": [
+ {
+ "color": "#3c3c3c",
+ "fillColor": "#3c3c3c6a"
+ }
+ ],
+ "presets": [
+ {
+ "title": {
+ "en": "a telecom exchange"
+ },
+ "tags": [
+ "telecom=exchange",
+ "utility=telecom"
+ ]
+ },
+ {
+ "title": {
+ "en": "a telecom connection point"
+ },
+ "tags": [
+ "telecom=connection_point",
+ "utility=telecom"
+ ]
+ },
+ {
+ "title": {
+ "en": "a telecom distribution point"
+ },
+ "tags": [
+ "telecom=distribution_point",
+ "utility=telecom"
+ ]
+ }
+ ],
+ "tagRenderings": [
+ {
+ "id": "located_in",
+ "question": {
+ "en": "Where is this feature located?"
+ },
+ "mappings": [
+ {
+ "if": "building~*",
+ "then": {
+ "en": "This feature is located in a building."
+ },
+ "hideInAnswer": true
+ },
+ {
+ "if": "man_made=street_cabinet",
+ "then": {
+ "en": "This feature is located in a street cabinet."
+ }
+ },
+ {
+ "if": {
+ "and": [
+ "man_made=",
+ "building="
+ ]
+ },
+ "then": {
+ "en": "This feature is most likely located in a building."
+ },
+ "hideInAnswer": true
+ }
+ ]
+ },
+ {
+ "builtin": "operator",
+ "override": {
+ "question": {
+ "en": "What is the operator of this telecom point?"
+ },
+ "render": {
+ "en": "This telecom point is operated by {operator}."
+ }
+ }
+ },
+ {
+ "id": "medium",
+ "question": {
+ "en": "What is the medium used by this telecom point?"
+ },
+ "mappings": [
+ {
+ "if": "telecom:medium=copper",
+ "then": {
+ "en": "The landlines connected to this telecom point use copper wiring."
+ }
+ },
+ {
+ "if": "telecom:medium=fibre",
+ "then": {
+ "en": "The landlines connected to this telecom point use fibre optics."
+ }
+ },
+ {
+ "if": "telecom:medium=coaxial",
+ "then": {
+ "en": "The landlines connected to this telecom point use coaxial cable."
+ }
+ }
+ ]
+ }
+ ],
+ "allowMove": {
+ "enableImproveAccuracy": true,
+ "enableRelocation": false
+ }
+}
\ No newline at end of file
diff --git a/assets/layers/telecom/telecom_exchange.svg b/assets/layers/telecom/telecom_exchange.svg
new file mode 100644
index 000000000..561e5ad4b
--- /dev/null
+++ b/assets/layers/telecom/telecom_exchange.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/layers/telecom/telecom_exchange.svg.license b/assets/layers/telecom/telecom_exchange.svg.license
new file mode 100644
index 000000000..9cf027354
--- /dev/null
+++ b/assets/layers/telecom/telecom_exchange.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Abu Badali; Sarang; Robin van der Linde
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/utility_pole/utility_pole.json b/assets/layers/utility_pole/utility_pole.json
index d5c2cf72b..3967dbf75 100644
--- a/assets/layers/utility_pole/utility_pole.json
+++ b/assets/layers/utility_pole/utility_pole.json
@@ -70,10 +70,74 @@
}
}
]
+ },
+ {
+ "id": "utility",
+ "question": {
+ "en": "What type of utility is this pole used for?"
+ },
+ "mappings": [
+ {
+ "if": "utility=power",
+ "then": {
+ "en": "This utility pole carries power lines."
+ }
+ },
+ {
+ "if": "utility=telecom",
+ "then": {
+ "en": "This utility pole carries telecommunications lines."
+ }
+ },
+ {
+ "if": "utility=street_lighting",
+ "then": {
+ "en": "This utility pole is used for street lighting."
+ }
+ }
+ ],
+ "multiAnswer": true
+ },
+ {
+ "id": "material",
+ "question": {
+ "en": "What material is this utility pole made of?"
+ },
+ "render": {
+ "en": "This utility pole is made of {material}."
+ },
+ "freeform": {
+ "key": "material",
+ "type": "text",
+ "placeholder": {
+ "en": "Material type"
+ },
+ "inline": true
+ },
+ "mappings": [
+ {
+ "if": "material=wood",
+ "then": {
+ "en": "This utility pole is made of wood."
+ }
+ },
+ {
+ "if": "material=steel",
+ "then": {
+ "en": "This utility pole is made of steel."
+ }
+ },
+ {
+ "if": "material=concrete",
+ "then": {
+ "en": "This utility pole is made of concrete."
+ }
+ }
+ ]
}
],
"allowMove": {
"enableImproveAccuracy": true,
"enableRelocation": false
}
-}
+}
\ No newline at end of file
diff --git a/assets/svg/license_info.json b/assets/svg/license_info.json
index 46a338688..c7c115e17 100644
--- a/assets/svg/license_info.json
+++ b/assets/svg/license_info.json
@@ -478,6 +478,16 @@
"https://liberapay.com/"
]
},
+ {
+ "path": "lightning.svg",
+ "license": "CC0-1.0",
+ "authors": [
+ "FontAwesome"
+ ],
+ "sources": [
+ "https://commons.wikimedia.org/wiki/File:Power-lightning_icon-icons.com_74466.svg"
+ ]
+ },
{
"path": "loading.svg",
"license": "TRIVIAL",
diff --git a/assets/svg/lightning.svg b/assets/svg/lightning.svg
new file mode 100644
index 000000000..c085a87a6
--- /dev/null
+++ b/assets/svg/lightning.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/assets/svg/lightning.svg.license b/assets/svg/lightning.svg.license
new file mode 100644
index 000000000..e0b474620
--- /dev/null
+++ b/assets/svg/lightning.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: FontAwesome
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/themes/infrastructure/infrastructure.json b/assets/themes/infrastructure/infrastructure.json
new file mode 100644
index 000000000..2c837fc54
--- /dev/null
+++ b/assets/themes/infrastructure/infrastructure.json
@@ -0,0 +1,38 @@
+{
+ "id": "infrastructure",
+ "title": {
+ "en": "Infrastructure",
+ "nl": "Infrastructuur"
+ },
+ "description": {
+ "en": "Map showing all kinds of infrastructure like cables, pipelines, and other utilities.",
+ "nl": "Kaart met alle soorten infrastructuur zoals kabels, leidingen en andere nutsvoorzieningen."
+ },
+ "icon": "./assets/layers/street_cabinet/street_cabinet_generic.svg",
+ "layers": [
+ "telecom",
+ "power_tower",
+ "power_pole",
+ "power_line",
+ "power_minor_line",
+ "power_cable",
+ {
+ "builtin": "windturbine",
+ "override": {
+ "minzoom": 14,
+ "+tagRenderings": [
+ "power_generator.source"
+ ]
+ }
+ },
+ "power_generator",
+ "pipeline",
+ "street_cabinet",
+ {
+ "builtin": "utility_pole",
+ "override": {
+ "minzoom": 17
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json
index 80382fd51..c9b279721 100644
--- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json
+++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json
@@ -489,6 +489,10 @@
"if": "theme=indoors",
"then": "./assets/layers/entrance/entrance.svg"
},
+ {
+ "if": "theme=infrastructure",
+ "then": "./assets/layers/street_cabinet/street_cabinet.svg"
+ },
{
"if": "theme=insects",
"then": "./assets/layers/insect_hotel/insect_hotel.svg"
diff --git a/scripts/generateNsiStats.ts b/scripts/generateNsiStats.ts
index 714445a4e..dc3750c9d 100644
--- a/scripts/generateNsiStats.ts
+++ b/scripts/generateNsiStats.ts
@@ -2,7 +2,7 @@ import known_layers from "../src/assets/generated/known_layers.json"
import { LayerConfigJson } from "../src/Models/ThemeConfig/Json/LayerConfigJson"
import { TagUtils } from "../src/Logic/Tags/TagUtils"
import { Utils } from "../src/Utils"
-import { copyFileSync, existsSync, readFileSync, writeFileSync } from "fs"
+import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"
import ScriptUtils from "./ScriptUtils"
import TagRenderingConfig from "../src/Models/ThemeConfig/TagRenderingConfig"
import { And } from "../src/Logic/Tags/And"
@@ -189,6 +189,12 @@ class GenerateNsiStats extends Script {
const src = "./node_modules/name-suggestion-index/dist/"
const files = ["featureCollection.min.json", "nsi.min.json", "wikidata.min.json"]
console.log(process.cwd())
+
+ // Ensure the target directory exists
+ if (!existsSync(target + "stats")) {
+ mkdirSync(target + "stats", { recursive: true })
+ }
+
for (const file of files) {
console.log("Copying ", src + file, target + "/" + file)
copyFileSync(src + file, target + file)
diff --git a/src/Models/Constants.ts b/src/Models/Constants.ts
index 1699a7666..2a34ffab2 100644
--- a/src/Models/Constants.ts
+++ b/src/Models/Constants.ts
@@ -251,6 +251,7 @@ export default class Constants {
"key",
"invalid",
"invalid",
+ "lightning",
"link",
"location",
"location_empty",
diff --git a/src/UI/Map/Icon.svelte b/src/UI/Map/Icon.svelte
index 5fbba23c6..3b107ca67 100644
--- a/src/UI/Map/Icon.svelte
+++ b/src/UI/Map/Icon.svelte
@@ -9,6 +9,7 @@
import Help from "../../assets/svg/Help.svelte"
import Home from "../../assets/svg/Home.svelte"
import Invalid from "../../assets/svg/Invalid.svelte"
+ import Lightning from "../../assets/svg/Lightning.svelte"
import Location from "../../assets/svg/Location.svelte"
import Location_empty from "../../assets/svg/Location_empty.svelte"
import Location_locked from "../../assets/svg/Location_locked.svelte"
@@ -16,6 +17,7 @@
import Resolved from "../../assets/svg/Resolved.svelte"
import Ring from "../../assets/svg/Ring.svelte"
import Scissors from "../../assets/svg/Scissors.svelte"
+ import Snowflake from "../../assets/svg/Snowflake.svelte"
import Teardrop from "../../assets/svg/Teardrop.svelte"
import Teardrop_with_hole_green from "../../assets/svg/Teardrop_with_hole_green.svelte"
import Triangle from "../../assets/svg/Triangle.svelte"
@@ -114,6 +116,8 @@
{:else if icon === "key"}
+ {:else if icon === "lightning"}
+
{:else if icon === "link"}
{:else if icon === "location_empty"}
@@ -148,6 +152,8 @@
{:else if icon === "snap"}
+ {:else if icon === "snowflake"}
+
{:else if icon === "square_rounded"}
{:else if icon === "square"}
diff --git a/src/UI/Popup/AllTagsPanel/TagLink.svelte b/src/UI/Popup/AllTagsPanel/TagLink.svelte
index bc41ddb1b..82fcf3d23 100644
--- a/src/UI/Popup/AllTagsPanel/TagLink.svelte
+++ b/src/UI/Popup/AllTagsPanel/TagLink.svelte
@@ -31,7 +31,7 @@
const url = tag2linkData.find((item) => item.key === `Key:${key}`)?.url
- const values: string[] =
+ let values: string[] =
typeof $tags[key] === "string" ? $tags[key].split(";").map((v: string) => v.trim()) : []
diff --git a/src/assets/svg/Lightning.svelte b/src/assets/svg/Lightning.svelte
new file mode 100644
index 000000000..90134c7af
--- /dev/null
+++ b/src/assets/svg/Lightning.svelte
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file