diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 12b9494f4b..4795462f8f 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/.vscode/settings.json b/.vscode/settings.json
index b607ae0fc3..a0e2c3e545 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -60,5 +60,10 @@
"type": "Gitea",
"name": "MapComplete Forgejo"
}
- ]
+ ],
+ "explorer.fileNesting.enabled": true,
+ "explorer.fileNesting.patterns": {
+ "*": "${capture}.license"
+ },
+ "explorer.fileNesting.expand": false
}
diff --git a/assets/layers/pipeline/pipeline.json b/assets/layers/pipeline/pipeline.json
new file mode 100644
index 0000000000..aa623a245e
--- /dev/null
+++ b/assets/layers/pipeline/pipeline.json
@@ -0,0 +1,52 @@
+{
+ "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"
+ ],
+ "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 0000000000..162376edad
--- /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 0000000000..5ebc807002
--- /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 0000000000..6bdaf470cf
--- /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 0000000000..5ebc807002
--- /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 0000000000..cbd5a10b1c
--- /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 0000000000..5ebc807002
--- /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 0000000000..f90075130b
--- /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 0000000000..5ebc807002
--- /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 0000000000..5b4257160f
--- /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 0000000000..5ebc807002
--- /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 0000000000..5cc2afa1f0
--- /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 0000000000..102c9f2ff2
--- /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 0000000000..5ebc807002
--- /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 0000000000..daa78d0b94
--- /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 0000000000..5ebc807002
--- /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 0000000000..2e955efdb9
--- /dev/null
+++ b/assets/layers/power_generator/power_generator.json
@@ -0,0 +1,344 @@
+{
+ "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": "lightning",
+ "color": "#ffcc00"
+ }
+ ],
+ "location": [
+ "point",
+ "centroid"
+ ]
+ }
+ ],
+ "lineRendering": [
+ {
+ "color": "#ffcc00",
+ "width": 4,
+ "fillColor": "#ffcc00ac"
+ }
+ ],
+ "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"
+ },
+ {
+ "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"
+ ]
+ }
+ }
+ ],
+ "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 0000000000..03f10cd7e4
--- /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 0000000000..5ebc807002
--- /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 0000000000..c189988867
--- /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 0000000000..5ebc807002
--- /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 0000000000..3dcbed9f01
--- /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 0000000000..5ebc807002
--- /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 0000000000..d5e882b809
--- /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 0000000000..5ebc807002
--- /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 0000000000..b2a8ce50cf
--- /dev/null
+++ b/assets/layers/power_line/power_line.json
@@ -0,0 +1,132 @@
+{
+ "id": "power_line",
+ "name": {
+ "en": "Power Lines",
+ "nl": "Elektriciteitsleidingen"
+ },
+ "description": {
+ "en": "Layer showing high-voltage power lines.",
+ "nl": "Laag met hoogspanningsleidingen"
+ },
+ "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": [
+ {
+ "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_pole/license_info.json b/assets/layers/power_pole/license_info.json
new file mode 100644
index 0000000000..de8264125a
--- /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 0000000000..e1a8365ada
--- /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 0000000000..eb070a3ccc
--- /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 0000000000..61df2a1b47
--- /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 0000000000..27447ca250
--- /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 0000000000..61df2a1b47
--- /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 0000000000..3e8c90e5eb
--- /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 0000000000..61df2a1b47
--- /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 0000000000..f26c156cdc
--- /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 0000000000..61df2a1b47
--- /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 0000000000..703177670d
--- /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 0000000000..61df2a1b47
--- /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 0000000000..3bd75ab4c4
--- /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 0000000000..61df2a1b47
--- /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 0000000000..189f1d6c89
--- /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 0000000000..61df2a1b47
--- /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 0000000000..653db19da1
--- /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 0000000000..61df2a1b47
--- /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 0000000000..8d0eb81afb
--- /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 0000000000..61df2a1b47
--- /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 0000000000..704842fc05
--- /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 0000000000..61df2a1b47
--- /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 0000000000..ad46855ef8
--- /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 0000000000..9189d58af9
--- /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 0000000000..f3cee997e2
--- /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 0000000000..61df2a1b47
--- /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 0000000000..296ee3b0f3
--- /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 0000000000..61df2a1b47
--- /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 0000000000..d19516dd8f
--- /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 0000000000..61df2a1b47
--- /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 0000000000..cea32a0b26
--- /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 0000000000..61df2a1b47
--- /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 0000000000..e22dc4a715
--- /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 0000000000..61df2a1b47
--- /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 0000000000..eb340d2eb4
--- /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 0000000000..61df2a1b47
--- /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 0000000000..a43704bf16
--- /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 0000000000..61df2a1b47
--- /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 0000000000..546f04d93c
--- /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 0000000000..61df2a1b47
--- /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 0000000000..ad587721f3
--- /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 0000000000..61df2a1b47
--- /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 0000000000..e5a6e0b094
--- /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 0000000000..61df2a1b47
--- /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 0000000000..e1d11e7f82
--- /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 0000000000..61df2a1b47
--- /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 0000000000..65ef7d1384
--- /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 0000000000..61df2a1b47
--- /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 0000000000..449ef72327
--- /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 0000000000..61df2a1b47
--- /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 0000000000..5e2761a173
--- /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 0000000000..61df2a1b47
--- /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 0000000000..f086630a76
--- /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 0000000000..61df2a1b47
--- /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 0000000000..eb8b280b02
--- /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 0000000000..61df2a1b47
--- /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 0000000000..665826083d
--- /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 0000000000..61df2a1b47
--- /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 0000000000..a2facddc2d
--- /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 0000000000..61df2a1b47
--- /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 0000000000..01a8e24bd6
--- /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 0000000000..61df2a1b47
--- /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 0000000000..6cca19e100
--- /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 0000000000..61df2a1b47
--- /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 0000000000..f60c57e4f0
--- /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 0000000000..61df2a1b47
--- /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 0000000000..af56e2bdf9
--- /dev/null
+++ b/assets/layers/street_cabinet/license_info.json
@@ -0,0 +1,17 @@
+[
+ {
+ "path": "street_cabinet.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"
+ ]
+ }
+]
\ 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 0000000000..963edf4485
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet.json
@@ -0,0 +1,153 @@
+{
+ "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": "./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="
+ ]
+ },
+ {
+ "if": "utility=telecom",
+ "then": {
+ "en": "This street cabinet is for telecommunications."
+ },
+ "addExtraTags": [
+ "street_cabinet="
+ ]
+ },
+ {
+ "if": "utility=gas",
+ "then": {
+ "en": "This street cabinet is for gas utilities."
+ },
+ "addExtraTags": [
+ "street_cabinet="
+ ]
+ },
+ {
+ "if": "utility=street_lighting",
+ "then": {
+ "en": "This street cabinet is for street lighting."
+ },
+ "addExtraTags": [
+ "street_cabinet="
+ ]
+ },
+ {
+ "if": "street_cabinet=traffic_control",
+ "then": {
+ "en": "This street cabinet is for traffic control systems like traffic signals or movable barriers."
+ },
+ "addExtraTags": [
+ "utility="
+ ]
+ },
+ {
+ "if": "street_cabinet=traffic_monitoring",
+ "then": {
+ "en": "This street cabinet is for traffic monitoring systems."
+ },
+ "addExtraTags": [
+ "utility="
+ ]
+ },
+ {
+ "if": "street_cabinet=postal_service",
+ "then": {
+ "en": "This street cabinet is used for storing pending mail before local delivery."
+ },
+ "addExtraTags": [
+ "utility="
+ ]
+ }
+ ]
+ },
+ {
+ "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 0000000000..a3f24264b3
--- /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 0000000000..535ad03804
--- /dev/null
+++ b/assets/layers/street_cabinet/street_cabinet.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/telecom/license_info.json b/assets/layers/telecom/license_info.json
new file mode 100644
index 0000000000..11b85d6447
--- /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 0000000000..f15947a874
--- /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 0000000000..561e5ad4bc
--- /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 0000000000..9cf0273546
--- /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 d5c2cf72bb..3967dbf757 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 9ecb69183f..0c3b2aad83 100644
--- a/assets/svg/license_info.json
+++ b/assets/svg/license_info.json
@@ -466,6 +466,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 0000000000..c085a87a66
--- /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 0000000000..e0b474620a
--- /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 0000000000..a9e1d32ecb
--- /dev/null
+++ b/assets/themes/infrastructure/infrastructure.json
@@ -0,0 +1,36 @@
+{
+ "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.svg",
+ "layers": [
+ "telecom",
+ "power_tower",
+ "power_pole",
+ "power_line",
+ {
+ "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 80382fd51d..c9b2797211 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/assets/themes/zhv/zhv.json b/assets/themes/zhv/zhv.json
index e6807a0373..2629288f40 100644
--- a/assets/themes/zhv/zhv.json
+++ b/assets/themes/zhv/zhv.json
@@ -49,7 +49,7 @@
"render": {
"special": {
"type": "import_button",
- "targetLayer": "transit_stops",
+ "targetLayer": "all_transit_stops",
"tags": "_tags",
"text": {
"en": "Add this stop"
diff --git a/scripts/generateNsiStats.ts b/scripts/generateNsiStats.ts
index 720eac34d8..abe1378aef 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"
@@ -188,6 +188,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 4b627d7a99..7595ef69db 100644
--- a/src/Models/Constants.ts
+++ b/src/Models/Constants.ts
@@ -249,6 +249,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 0160f431c5..9683d3be82 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"
@@ -113,6 +115,8 @@
{:else if icon === "key"}
+ {:else if icon === "lightning"}
+
{:else if icon === "link"}
{:else if icon === "location_empty"}
@@ -147,6 +151,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 a90c8b1747..453a4f6a30 100644
--- a/src/UI/Popup/AllTagsPanel/TagLink.svelte
+++ b/src/UI/Popup/AllTagsPanel/TagLink.svelte
@@ -5,6 +5,8 @@
export let tags: UIEventSource>
export let key: string
+ const values = $tags[key].split(";").map((v) => v.trim())
+
const tag2linkData = tag2link as Tag2LinkElement[]
interface Tag2LinkElement {
@@ -33,14 +35,14 @@
{#if url}
-
- {$tags[key]}
-
+ {#each values as value, index}
+
+ {#if index > 0}; {/if}
+
+ {value}
+
+
+ {/each}
{:else}
{$tags[key]}
{/if}
diff --git a/src/assets/svg/Lightning.svelte b/src/assets/svg/Lightning.svelte
new file mode 100644
index 0000000000..90134c7afa
--- /dev/null
+++ b/src/assets/svg/Lightning.svelte
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file