deletions natuurpunt thema

This commit is contained in:
Ward 2021-07-28 14:50:22 +02:00
parent 6c6794e587
commit 40717af859
3 changed files with 307 additions and 258 deletions

View file

@ -1,21 +1,21 @@
import {FixedUiElement} from "./UI/Base/FixedUiElement"; import { FixedUiElement } from "./UI/Base/FixedUiElement";
import Toggle from "./UI/Input/Toggle"; import Toggle from "./UI/Input/Toggle";
import {Basemap} from "./UI/BigComponents/Basemap"; import { Basemap } from "./UI/BigComponents/Basemap";
import State from "./State"; import State from "./State";
import LoadFromOverpass from "./Logic/Actors/OverpassFeatureSource"; import LoadFromOverpass from "./Logic/Actors/OverpassFeatureSource";
import {UIEventSource} from "./Logic/UIEventSource"; import { UIEventSource } from "./Logic/UIEventSource";
import {QueryParameters} from "./Logic/Web/QueryParameters"; import { QueryParameters } from "./Logic/Web/QueryParameters";
import StrayClickHandler from "./Logic/Actors/StrayClickHandler"; import StrayClickHandler from "./Logic/Actors/StrayClickHandler";
import SimpleAddUI from "./UI/BigComponents/SimpleAddUI"; import SimpleAddUI from "./UI/BigComponents/SimpleAddUI";
import CenterMessageBox from "./UI/CenterMessageBox"; import CenterMessageBox from "./UI/CenterMessageBox";
import UserBadge from "./UI/BigComponents/UserBadge"; import UserBadge from "./UI/BigComponents/UserBadge";
import SearchAndGo from "./UI/BigComponents/SearchAndGo"; import SearchAndGo from "./UI/BigComponents/SearchAndGo";
import GeoLocationHandler from "./Logic/Actors/GeoLocationHandler"; import GeoLocationHandler from "./Logic/Actors/GeoLocationHandler";
import {LocalStorageSource} from "./Logic/Web/LocalStorageSource"; import { LocalStorageSource } from "./Logic/Web/LocalStorageSource";
import {Utils} from "./Utils"; import { Utils } from "./Utils";
import Svg from "./Svg"; import Svg from "./Svg";
import Link from "./UI/Base/Link"; import Link from "./UI/Base/Link";
import * as personal from "./assets/themes/personal/personal.json" import * as personal from "./assets/themes/personal/personal.json";
import LayoutConfig from "./Customizations/JSON/LayoutConfig"; import LayoutConfig from "./Customizations/JSON/LayoutConfig";
import * as L from "leaflet"; import * as L from "leaflet";
import Img from "./UI/Base/Img"; import Img from "./UI/Base/Img";
@ -33,14 +33,14 @@ import MapControlButton from "./UI/MapControlButton";
import Combine from "./UI/Base/Combine"; import Combine from "./UI/Base/Combine";
import SelectedFeatureHandler from "./Logic/Actors/SelectedFeatureHandler"; import SelectedFeatureHandler from "./Logic/Actors/SelectedFeatureHandler";
import LZString from "lz-string"; import LZString from "lz-string";
import {LayoutConfigJson} from "./Customizations/JSON/LayoutConfigJson"; import { LayoutConfigJson } from "./Customizations/JSON/LayoutConfigJson";
import AttributionPanel from "./UI/BigComponents/AttributionPanel"; import AttributionPanel from "./UI/BigComponents/AttributionPanel";
import ContributorCount from "./Logic/ContributorCount"; import ContributorCount from "./Logic/ContributorCount";
import FeatureSource from "./Logic/FeatureSource/FeatureSource"; import FeatureSource from "./Logic/FeatureSource/FeatureSource";
import AllKnownLayers from "./Customizations/AllKnownLayers"; import AllKnownLayers from "./Customizations/AllKnownLayers";
import LayerConfig from "./Customizations/JSON/LayerConfig"; import LayerConfig from "./Customizations/JSON/LayerConfig";
import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers"; import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers";
import {TagsFilter} from "./Logic/Tags/TagsFilter"; import { TagsFilter } from "./Logic/Tags/TagsFilter";
import FilterView from "./UI/BigComponents/FilterView"; import FilterView from "./UI/BigComponents/FilterView";
export class InitUiElements { export class InitUiElements {
@ -57,8 +57,7 @@ export class InitUiElements {
`Error: incorrect layout <i>${layoutName}</i><br/><a href='https://${window.location.host}/'>Go back</a>` `Error: incorrect layout <i>${layoutName}</i><br/><a href='https://${window.location.host}/'>Go back</a>`
) )
.AttachTo("centermessage") .AttachTo("centermessage")
.onClick(() => { .onClick(() => {});
});
throw "Incorrect layout"; throw "Incorrect layout";
} }
@ -158,16 +157,13 @@ export class InitUiElements {
InitUiElements.InitWelcomeMessage(); InitUiElements.InitWelcomeMessage();
}); });
if ( if (State.state.featureSwitchIframe.data) {
(window != window.top && !State.state.featureSwitchWelcomeMessage.data) ||
State.state.featureSwitchIframe.data
) {
const currentLocation = State.state.locationControl; const currentLocation = State.state.locationControl;
const url = `${window.location.origin}${window.location.pathname}?z=${ const url = `${window.location.origin}${
currentLocation.data.zoom ?? 0 window.location.pathname
}&lat=${currentLocation.data.lat ?? 0}&lon=${ }?z=${currentLocation.data.zoom ?? 0}&lat=${
currentLocation.data.lon ?? 0 currentLocation.data.lat ?? 0
}`; }&lon=${currentLocation.data.lon ?? 0}`;
new MapControlButton( new MapControlButton(
new Link(Svg.pop_out_img, url, true).SetClass( new Link(Svg.pop_out_img, url, true).SetClass(
"block w-full h-full p-1.5" "block w-full h-full p-1.5"
@ -182,11 +178,13 @@ export class InitUiElements {
"--subtle-detail-color" "--subtle-detail-color"
); );
const icon = L.icon({ const icon = L.icon({
iconUrl: Img.AsData(Svg.home_white_bg.replace(/#ffffff/g, color)), iconUrl: Img.AsData(
Svg.home_white_bg.replace(/#ffffff/g, color)
),
iconSize: [30, 30], iconSize: [30, 30],
iconAnchor: [15, 15], iconAnchor: [15, 15],
}); });
const marker = L.marker([home.lat, home.lon], {icon: icon}); const marker = L.marker([home.lat, home.lon], { icon: icon });
marker.addTo(State.state.leafletMap.data); marker.addTo(State.state.leafletMap.data);
}); });
@ -196,31 +194,26 @@ export class InitUiElements {
State.state.currentGPSLocation, State.state.currentGPSLocation,
State.state.leafletMap, State.state.leafletMap,
State.state.layoutToUse State.state.layoutToUse
), { ),
dontStyle : true {
dontStyle: true,
} }
), ),
undefined, undefined,
State.state.featureSwitchGeolocation State.state.featureSwitchGeolocation
); );
const plus = new MapControlButton( const plus = new MapControlButton(Svg.plus_zoom_svg()).onClick(() => {
Svg.plus_zoom_svg()
).onClick(() => {
State.state.locationControl.data.zoom++; State.state.locationControl.data.zoom++;
State.state.locationControl.ping(); State.state.locationControl.ping();
}); });
const min = new MapControlButton( const min = new MapControlButton(Svg.min_zoom_svg()).onClick(() => {
Svg.min_zoom_svg()
).onClick(() => {
State.state.locationControl.data.zoom--; State.state.locationControl.data.zoom--;
State.state.locationControl.ping(); State.state.locationControl.ping();
}); });
new Combine( new Combine([plus, min, geolocationButton])
[plus, min, geolocationButton]
)
.SetClass("flex flex-col") .SetClass("flex flex-col")
.AttachTo("bottom-right"); .AttachTo("bottom-right");
@ -262,7 +255,9 @@ export class InitUiElements {
"last-loaded-user-layout" "last-loaded-user-layout"
); );
if (hash.length < 10) { if (hash.length < 10) {
hash = dedicatedHashFromLocalStorage.data ?? hashFromLocalStorage.data; hash =
dedicatedHashFromLocalStorage.data ??
hashFromLocalStorage.data;
} else { } else {
console.log("Saving hash to local storage"); console.log("Saving hash to local storage");
hashFromLocalStorage.setData(hash); hashFromLocalStorage.setData(hash);
@ -309,9 +304,11 @@ export class InitUiElements {
// ?-Button on Desktop, opens panel with close-X. // ?-Button on Desktop, opens panel with close-X.
const help = new MapControlButton(Svg.help_svg()); const help = new MapControlButton(Svg.help_svg());
help.onClick(() => isOpened.setData(true)); help.onClick(() => isOpened.setData(true));
new Toggle(fullOptions.SetClass("welcomeMessage"), help, isOpened).AttachTo( new Toggle(
"messagesbox" fullOptions.SetClass("welcomeMessage"),
); help,
isOpened
).AttachTo("messagesbox");
const openedTime = new Date().getTime(); const openedTime = new Date().getTime();
State.state.locationControl.addCallback(() => { State.state.locationControl.addCallback(() => {
if (new Date().getTime() - openedTime < 15 * 1000) { if (new Date().getTime() - openedTime < 15 * 1000) {
@ -326,8 +323,8 @@ export class InitUiElements {
}); });
isOpened.setData( isOpened.setData(
Hash.hash.data === undefined || Hash.hash.data === undefined ||
Hash.hash.data === "" || Hash.hash.data === "" ||
Hash.hash.data == "welcome" Hash.hash.data == "welcome"
); );
} }
@ -366,23 +363,18 @@ export class InitUiElements {
State.state.featureSwitchLayers State.state.featureSwitchLayers
); );
const filterView = new ScrollableFullScreen(
const filterView = () => Translations.t.general.layerSelection.title.Clone(),
new ScrollableFullScreen( () =>
() => Translations.t.general.layerSelection.title.Clone(), new FilterView(State.state.filteredLayers).SetClass(
() => "block p-1 rounded-full"
new FilterView(State.state.filteredLayers).SetClass( ),
"block p-1 rounded-full" undefined,
), State.state.filterIsOpened
undefined,
State.state.filterIsOpened
);
const filterMapControlButton = new MapControlButton(
Svg.filter_svg()
); );
const filterMapControlButton = new MapControlButton(Svg.filter_svg());
const filterButton = new Toggle( const filterButton = new Toggle(
filterView, filterView,
filterMapControlButton, filterMapControlButton,
@ -497,7 +489,7 @@ export class InitUiElements {
const flayer = { const flayer = {
isDisplayed: isDisplayed, isDisplayed: isDisplayed,
layerDef: layer, layerDef: layer,
appliedFilters: new UIEventSource<TagsFilter>(undefined) appliedFilters: new UIEventSource<TagsFilter>(undefined),
}; };
flayers.push(flayer); flayers.push(flayer);
} }
@ -534,7 +526,9 @@ export class InitUiElements {
source, source,
State.state.osmApiFeatureSource State.state.osmApiFeatureSource
); );
selectedFeatureHandler.zoomToSelectedFeature(State.state.locationControl); selectedFeatureHandler.zoomToSelectedFeature(
State.state.locationControl
);
return source; return source;
} }

View file

@ -1,192 +1,170 @@
{ {
"id": "parking", "id": "parking",
"name": { "name": {
"nl": "parking" "nl": "Parking"
},
"minzoom": 12,
"source": {
"osmTags": {
"and": [
{
"or": [
"amenity=parking",
"amenity=motorcycle_parking",
"amenity=bicycle_parking"
]
}
]
}
},
"title": {
"render": {
"nl": "Parking"
}, },
"mappings": [ "minzoom": 12,
{ "source": {
"if": "amenity=parking", "osmTags": {
"then": { "and": [
"nl": "{name:nl}" {
"or": [
"amenity=parking",
"amenity=motorcycle_parking",
"amenity=bicycle_parking"
]
}
]
} }
}, },
{ "title": {
"if": "amenity=motorcycle_parking", "render": {
"then": { "nl": "Parking"
"nl": "{name}" },
"mappings": [
{
"if": "amenity=parking",
"then": {
"nl": "{name:nl}"
}
},
{
"if": "amenity=motorcycle_parking",
"then": {
"nl": "{name}"
}
},
{
"if": "amenity=bicycle_parking",
"then": {
"nl": "Fietsenstalling"
}
}
]
},
"icon": {
"render": "./assets/layers/parking/parking.svg"
},
"description": {
"nl": "Parking"
},
"tagRenderings": [
"images",
{
"#": "Access tag",
"render": {
"nl": "De toegankelijkheid van dit gebied is: {access:description}"
},
"question": {
"nl": "Is dit gebied toegankelijk?"
},
"freeform": {
"key": "access:description"
},
"mappings": [
{
"if": {
"and": ["access=yes", "fee="]
},
"then": {
"nl": "Vrij toegankelijk"
}
},
{
"if": {
"and": ["access=no", "fee="]
},
"then": {
"nl": "Niet toegankelijk"
}
},
{
"if": {
"and": ["access=private", "fee="]
},
"then": {
"nl": "Niet toegankelijk, want privégebied"
}
},
{
"if": {
"and": ["access=permissive", "fee="]
},
"then": {
"nl": "Toegankelijk, ondanks dat het privegebied is"
}
},
{
"if": {
"and": ["access=guided", "fee="]
},
"then": {
"nl": "Enkel toegankelijk met een gids of tijdens een activiteit"
}
},
{
"if": {
"and": ["access=yes", "fee=yes"]
},
"then": {
"nl": "Toegankelijk mits betaling"
}
}
]
},
{
"#": "Operator tag",
"render": {
"nl": "Beheer door {operator}"
},
"question": {
"nl": "Wie beheert dit pad?"
},
"freeform": {
"key": "operator"
},
"mappings": [
{
"if": {
"and": ["operator=Natuurpunt"]
},
"then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door Natuurpunt"
}
},
{
"if": {
"and": ["operator~(n|N)atuurpunt.*"]
},
"then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door {operator}"
},
"hideInAnswer": true
}
]
} }
}, ],
{ "wayHandling": 1,
"if": "amenity=bicycle_parking", "iconSize": {
"then": { "render": "36,36,center"
"nl": "Fietsenstalling" },
"color": {
"render": "#E1AD01"
},
"presets": [
{
"tags": [
"amenity=parking",
"amenity=motorcycle_parking",
"amenity=bicycle_parking",
"fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen"
],
"title": {
"nl": "Paden"
},
"description": {
"nl": "Voeg een ontbrekend, erkend pad toe."
}
} }
}
] ]
}, }
"icon": {
"render": "./assets/layers/parking/parking.svg"
},
"description": {
"nl": "Parking"
},
"tagRenderings": [
"images",
{
"#": "Access tag",
"render": {
"nl": "De toegankelijkheid van dit gebied is: {access:description}"
},
"question": {
"nl": "Is dit gebied toegankelijk?"
},
"freeform": {
"key": "access:description"
},
"mappings": [
{
"if": {
"and": [
"access=yes",
"fee="
]
},
"then": {
"nl": "Vrij toegankelijk"
}
},
{
"if": {
"and": [
"access=no",
"fee="
]
},
"then": {
"nl": "Niet toegankelijk"
}
},
{
"if": {
"and": [
"access=private",
"fee="
]
},
"then": {
"nl": "Niet toegankelijk, want privégebied"
}
},
{
"if": {
"and": [
"access=permissive",
"fee="
]
},
"then": {
"nl": "Toegankelijk, ondanks dat het privegebied is"
}
},
{
"if": {
"and": [
"access=guided",
"fee="
]
},
"then": {
"nl": "Enkel toegankelijk met een gids of tijdens een activiteit"
}
},
{
"if": {
"and": [
"access=yes",
"fee=yes"
]
},
"then": {
"nl": "Toegankelijk mits betaling"
}
}
]
},
{
"#": "Operator tag",
"render": {
"nl": "Beheer door {operator}"
},
"question": {
"nl": "Wie beheert dit pad?"
},
"freeform": {
"key": "operator"
},
"mappings": [
{
"if": {
"and": [
"operator=Natuurpunt"
]
},
"then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door Natuurpunt"
}
},
{
"if": {
"and": [
"operator~(n|N)atuurpunt.*"
]
},
"then": {
"nl": "<img src=\"./assets/themes/buurtnatuur/Natuurpunt.jpg\" style=\"width:1.5em\">Dit gebied wordt beheerd door {operator}"
},
"hideInAnswer": true
}
]
}
],
"wayHandling": 1,
"iconSize": {
"render": "36,36,center"
},
"color": {
"render": "#E1AD01"
},
"presets": [
{
"tags": [
"amenity=parking",
"amenity=motorcycle_parking",
"amenity=bicycle_parking",
"fixme=Toegevoegd met MapComplete, geometry nog uit te tekenen"
],
"title": {
"nl": "Paden"
},
"description": {
"nl": "Voeg een ontbrekend, erkend pad toe."
}
}
]
}

View file

@ -26,8 +26,7 @@
"widenFactor": 0.05, "widenFactor": 0.05,
"socialImage": "", "socialImage": "",
"defaultBackgroundId": "CartoDB.Positron", "defaultBackgroundId": "CartoDB.Positron",
"layers": [ "layers": [{
{
"#": "Nature reserve with geometry, z>=13", "#": "Nature reserve with geometry, z>=13",
"builtin": "nature_reserve", "builtin": "nature_reserve",
"override": { "override": {
@ -46,6 +45,14 @@
"minzoomVisible": 0, "minzoomVisible": 0,
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg" "render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg"
},
"deletion": {
"hardDeletionTags": {
"and": [
"leisure=nature_reserve",
"boundary=protected_area"
]
}
} }
} }
}, },
@ -65,6 +72,14 @@
"minzoom": 1, "minzoom": 1,
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg" "render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg"
},
"deletion": {
"hardDeletionTags": {
"and": [
"leisure=nature_reserve",
"boundary=protected_area"
]
}
} }
} }
}, },
@ -84,6 +99,14 @@
"minzoom": "10", "minzoom": "10",
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/information.svg" "render": "circle:#FE6F32;./assets/themes/natuurpunt/information.svg"
},
"deletion": {
"hardDeletionTags": {
"and": [
"information=visitor_centre",
"information=office"
]
}
} }
} }
}, },
@ -103,8 +126,7 @@
"minzoom": "13", "minzoom": "13",
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/trail.svg", "render": "circle:#FE6F32;./assets/themes/natuurpunt/trail.svg",
"mappings": [ "mappings": [{
{
"if": "wheelchair=yes", "if": "wheelchair=yes",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/walk_wheelchair.svg" "then": "circle:#FE6F32;./assets/themes/natuurpunt/walk_wheelchair.svg"
}, },
@ -113,6 +135,15 @@
"then": "circle:#FE6F32;./assets/themes/natuurpunt/pushchair.svg" "then": "circle:#FE6F32;./assets/themes/natuurpunt/pushchair.svg"
} }
] ]
},
"deletion": {
"hardDeletionTags": {
"and": [
"route=hiking",
"route=bycicle",
"route=horse"
]
}
} }
} }
}, },
@ -127,8 +158,7 @@
}, },
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/toilets.svg", "render": "circle:#FE6F32;./assets/themes/natuurpunt/toilets.svg",
"mappings": [ "mappings": [{
{
"if": "wheelchair=yes", "if": "wheelchair=yes",
"then": "circle:#FE6F32;./assets/themes/natuurpunt/wheelchair.svg" "then": "circle:#FE6F32;./assets/themes/natuurpunt/wheelchair.svg"
}, },
@ -137,6 +167,9 @@
"then": "circle:#FE6F32;./assets/themes/natuurpunt/urinal.svg" "then": "circle:#FE6F32;./assets/themes/natuurpunt/urinal.svg"
} }
] ]
},
"deletion": {
"hardDeletionTags": "amenity=toilets"
} }
} }
}, },
@ -152,7 +185,30 @@
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/birdhide.svg", "render": "circle:#FE6F32;./assets/themes/natuurpunt/birdhide.svg",
"mappings": null "mappings": null
} },
"deletion": [{
"if": "leisure=bird_hide",
"then": {
"hardDeletionTags": "leisure=bird_hide"
}
}, {
"if": {
"or": [
"building=yes",
"shelter=yes",
"amenity=shelter"
]
},
"then": {
"hardDeletionTags": {
"and": [
"building=yes",
"shelter=yes",
"amenity=shelter"
]
}
}
}]
} }
}, },
{ {
@ -166,6 +222,9 @@
}, },
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/picnic_table.svg" "render": "circle:#FE6F32;./assets/themes/natuurpunt/picnic_table.svg"
},
"deletion": {
"hardDeletionTags": "leisure=picnic_table"
} }
} }
}, },
@ -180,6 +239,9 @@
}, },
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/drips.svg" "render": "circle:#FE6F32;./assets/themes/natuurpunt/drips.svg"
},
"deletion": {
"hardDeletionTags": "amenity=drinking_water"
} }
} }
}, },
@ -189,15 +251,12 @@
"minzoom": "16", "minzoom": "16",
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/parking.svg", "render": "circle:#FE6F32;./assets/themes/natuurpunt/parking.svg",
"mappings": [ "mappings": [{
{ "if": "amenity=bicycle_parking",
"if": "amenity=bicycle_parking", "then": "circle:#FE6F32;./assets/themes/natuurpunt/parkingbike.svg"
"then": "circle:#FE6F32;./assets/themes/natuurpunt/parkingbike.svg" }]
}
]
}, },
"iconOverlays": [ "iconOverlays": [{
{
"if": "amenity=motorcycle_parking", "if": "amenity=motorcycle_parking",
"then": "circle:#335D9F;./assets/themes/natuurpunt/parkingmotor.svg", "then": "circle:#335D9F;./assets/themes/natuurpunt/parkingmotor.svg",
"badge": true "badge": true
@ -207,7 +266,16 @@
"then": "circle:#335D9F;./assets/themes/natuurpunt/parkingwheels.svg", "then": "circle:#335D9F;./assets/themes/natuurpunt/parkingwheels.svg",
"badge": true "badge": true
} }
] ],
"deletion": {
"hardDeletionTags": {
"and": [
"amenity=parking",
"amenity=motorcycle_parking",
"amenity=bicycle_parking"
]
}
}
} }
}, },
{ {
@ -221,6 +289,9 @@
}, },
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/information_board.svg" "render": "circle:#FE6F32;./assets/themes/natuurpunt/information_board.svg"
},
"deletion": {
"hardDeletionTags": "information=board"
} }
} }
}, },
@ -235,6 +306,9 @@
}, },
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/bench.svg" "render": "circle:#FE6F32;./assets/themes/natuurpunt/bench.svg"
},
"deletion": {
"hardDeletionTags": "amenity=bench"
} }
} }
}, },
@ -249,6 +323,9 @@
}, },
"icon": { "icon": {
"render": "circle:#FE6F32;./assets/themes/natuurpunt/watermill.svg" "render": "circle:#FE6F32;./assets/themes/natuurpunt/watermill.svg"
},
"deletion": {
"hardDeletionTags": "man_made=watermill"
} }
} }
} }