diff --git a/.vscode/settings.json b/.vscode/settings.json index e975a613f1c..0eedd13233f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,41 @@ { "fileMatch": ["/assets/themes/*/*.json", "!/assets/themes/*/license_info.json"], "url": "./Docs/Schemas/LayoutConfigJson.schema.json" + }, + { + "fileMatch": ["/assets/themes/*/license_info.json", "/assets/layers/*/license_info.json"], + "schema": { + "type": "array", + "title": "License Info", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "Path to the file" + }, + "authors": { + "type": "array", + "description": "Authors of the file", + "items": { + "type": "string" + } + }, + "license": { + "type": "string", + "description": "License of the file" + }, + "sources": { + "type": "array", + "description": "Sources of the file", + "items": { + "type": "string" + } + } + }, + "required": ["path", "authors", "license", "sources"] + } + } } ], "editor.tabSize": 2, diff --git a/assets/layers/elongated_coin/elongated_coin.json b/assets/layers/elongated_coin/elongated_coin.json index 41e2e5b87b0..398b7921f05 100644 --- a/assets/layers/elongated_coin/elongated_coin.json +++ b/assets/layers/elongated_coin/elongated_coin.json @@ -18,7 +18,7 @@ "osmTags": { "and": [ "amenity=vending_machine", - "vending=elongated_coin" + "vending~.*elongated_coin.*" ] } }, @@ -440,8 +440,5 @@ "accepts_credit_cards" ], "deletion": true, - "allowMove": { - "enableImproveAccuracy": true, - "enableRelocation": true - } -} + "allowMove": true +} \ No newline at end of file diff --git a/assets/layers/item_with_image/camera.svg b/assets/layers/item_with_image/camera.svg new file mode 100644 index 00000000000..a29853276fb --- /dev/null +++ b/assets/layers/item_with_image/camera.svg @@ -0,0 +1,64 @@ + + + Adwaita Icon Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/layers/item_with_image/camera.svg.license b/assets/layers/item_with_image/camera.svg.license new file mode 100644 index 00000000000..0d0e69f2ede --- /dev/null +++ b/assets/layers/item_with_image/camera.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: https://gitlab.gnome.org/jimmac +SPDX-License-Identifier: GPL3 \ No newline at end of file diff --git a/assets/layers/item_with_image/item_with_image.json b/assets/layers/item_with_image/item_with_image.json new file mode 100644 index 00000000000..27c6ac1b3ed --- /dev/null +++ b/assets/layers/item_with_image/item_with_image.json @@ -0,0 +1,47 @@ +{ + "id": "item_with_image", + "description": "All items with an image. All alone, not a layer which is relevant for any MapComplete theme, as it is a random collection of items. However, when put into the databank, this allows to quickly fetch (the URL of) pictures nearby a different object, to quickly link this", + "minzoom": 14, + "source": { + "osmTags": { + "or": [ + "image~*", + "image:0~*", + "image:1~*", + "image:2~*", + "image:3~*", + "image:4~*", + "image:5~*" + ] + } + }, + "tagRenderings": [ + "images" + ], + "title": { + "render": { + "en": "POI with image" + }, + "mappings": [{ + "if": "name~*", + "then": {"*": "name"} + }] + }, + "name": { + "en": "Items with at least one image" + }, + "lineRendering": [], + "pointRendering": [ + { + "marker": [ + { + "icon": "./assets/layers/item_with_image/camera.svg" + } + ], + "location": [ + "centroid", + "point" + ] + } + ] +} diff --git a/assets/layers/item_with_image/license_info.json b/assets/layers/item_with_image/license_info.json new file mode 100644 index 00000000000..a5dbb520441 --- /dev/null +++ b/assets/layers/item_with_image/license_info.json @@ -0,0 +1,12 @@ +[ + { + "path": "camera.svg", + "license": "GPL3", + "authors": [ + "https://gitlab.gnome.org/jimmac" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:GNOME_Photos_icon_2018.svg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/playground_equipment/DeimosXL1.jpg b/assets/layers/playground_equipment/DeimosXL1.jpg new file mode 100644 index 00000000000..c4317cdfc40 Binary files /dev/null and b/assets/layers/playground_equipment/DeimosXL1.jpg differ diff --git a/assets/layers/playground_equipment/DeimosXL1.jpg.license b/assets/layers/playground_equipment/DeimosXL1.jpg.license new file mode 100644 index 00000000000..b5361dfb234 --- /dev/null +++ b/assets/layers/playground_equipment/DeimosXL1.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Damian stawowy +SPDX-License-Identifier: CC-BY-SA 4.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Funnel_ball.jpg b/assets/layers/playground_equipment/Funnel_ball.jpg new file mode 100644 index 00000000000..68f75544487 Binary files /dev/null and b/assets/layers/playground_equipment/Funnel_ball.jpg differ diff --git a/assets/layers/playground_equipment/Funnel_ball.jpg.license b/assets/layers/playground_equipment/Funnel_ball.jpg.license new file mode 100644 index 00000000000..f7f6dc6353f --- /dev/null +++ b/assets/layers/playground_equipment/Funnel_ball.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Pavtron (talk) +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg b/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg new file mode 100644 index 00000000000..073112d0779 Binary files /dev/null and b/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg differ diff --git a/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg.license b/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg.license new file mode 100644 index 00000000000..1c486234674 --- /dev/null +++ b/assets/layers/playground_equipment/Hinkelbaan_tegels.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: M.Minderhoud +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Hupfkissen.jpg b/assets/layers/playground_equipment/Hupfkissen.jpg new file mode 100644 index 00000000000..194e215c5fc Binary files /dev/null and b/assets/layers/playground_equipment/Hupfkissen.jpg differ diff --git a/assets/layers/playground_equipment/Hupfkissen.jpg.license b/assets/layers/playground_equipment/Hupfkissen.jpg.license new file mode 100644 index 00000000000..1ebe81d5987 --- /dev/null +++ b/assets/layers/playground_equipment/Hupfkissen.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Peter Wanders +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG b/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG new file mode 100644 index 00000000000..0eaaddf0d75 Binary files /dev/null and b/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG differ diff --git a/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG.license b/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG.license new file mode 100644 index 00000000000..20e81e6eb53 --- /dev/null +++ b/assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Reda Kerbouche +SPDX-License-Identifier: CC-BY-SA 4.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg b/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg new file mode 100644 index 00000000000..82dd923be90 Binary files /dev/null and b/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg differ diff --git a/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg.license b/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg.license new file mode 100644 index 00000000000..2fedec78381 --- /dev/null +++ b/assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Jleedev +SPDX-License-Identifier: CC-BY-SA 4.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playground_climbingwall.jpg b/assets/layers/playground_equipment/Playground_climbingwall.jpg new file mode 100644 index 00000000000..5cbc109db56 Binary files /dev/null and b/assets/layers/playground_equipment/Playground_climbingwall.jpg differ diff --git a/assets/layers/playground_equipment/Playground_climbingwall.jpg.license b/assets/layers/playground_equipment/Playground_climbingwall.jpg.license new file mode 100644 index 00000000000..7bceb516ad2 --- /dev/null +++ b/assets/layers/playground_equipment/Playground_climbingwall.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Mktravel +SPDX-License-Identifier: Public Domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg b/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg new file mode 100644 index 00000000000..409f54d62dd Binary files /dev/null and b/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg differ diff --git a/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg.license b/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg.license new file mode 100644 index 00000000000..26950d9bd80 --- /dev/null +++ b/assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Roger Kidd +SPDX-License-Identifier: CC-BY-SA 2.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playground_swing_03.jpg b/assets/layers/playground_equipment/Playground_swing_03.jpg new file mode 100644 index 00000000000..65faea83847 Binary files /dev/null and b/assets/layers/playground_equipment/Playground_swing_03.jpg differ diff --git a/assets/layers/playground_equipment/Playground_swing_03.jpg.license b/assets/layers/playground_equipment/Playground_swing_03.jpg.license new file mode 100644 index 00000000000..6e28763e543 --- /dev/null +++ b/assets/layers/playground_equipment/Playground_swing_03.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Kritzolina +SPDX-License-Identifier: CC-BY-SA 4.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Playhouse.jpg b/assets/layers/playground_equipment/Playhouse.jpg new file mode 100644 index 00000000000..8382d5c7ec3 Binary files /dev/null and b/assets/layers/playground_equipment/Playhouse.jpg differ diff --git a/assets/layers/playground_equipment/Playhouse.jpg.license b/assets/layers/playground_equipment/Playhouse.jpg.license new file mode 100644 index 00000000000..f669d50ad35 --- /dev/null +++ b/assets/layers/playground_equipment/Playhouse.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Saku +SPDX-License-Identifier: CC-BY-SA 3.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Rekstok.JPG b/assets/layers/playground_equipment/Rekstok.JPG new file mode 100644 index 00000000000..393a739683c Binary files /dev/null and b/assets/layers/playground_equipment/Rekstok.JPG differ diff --git a/assets/layers/playground_equipment/Rekstok.JPG.license b/assets/layers/playground_equipment/Rekstok.JPG.license new file mode 100644 index 00000000000..c537adb0487 --- /dev/null +++ b/assets/layers/playground_equipment/Rekstok.JPG.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: self +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Seesaw-aa.jpg b/assets/layers/playground_equipment/Seesaw-aa.jpg new file mode 100644 index 00000000000..8c85458ec11 Binary files /dev/null and b/assets/layers/playground_equipment/Seesaw-aa.jpg differ diff --git a/assets/layers/playground_equipment/Seesaw-aa.jpg.license b/assets/layers/playground_equipment/Seesaw-aa.jpg.license new file mode 100644 index 00000000000..5d722d6d1fb --- /dev/null +++ b/assets/layers/playground_equipment/Seesaw-aa.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Itsmine +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Spinning_circle.jpg b/assets/layers/playground_equipment/Spinning_circle.jpg new file mode 100644 index 00000000000..d951bfaa328 Binary files /dev/null and b/assets/layers/playground_equipment/Spinning_circle.jpg differ diff --git a/assets/layers/playground_equipment/Spinning_circle.jpg.license b/assets/layers/playground_equipment/Spinning_circle.jpg.license new file mode 100644 index 00000000000..5116519247a --- /dev/null +++ b/assets/layers/playground_equipment/Spinning_circle.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Jose1711 +SPDX-License-Identifier: CC0 1.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg b/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg new file mode 100644 index 00000000000..b9f8cda85e3 Binary files /dev/null and b/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg differ diff --git a/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg.license b/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg.license new file mode 100644 index 00000000000..9f8c82b3b9b --- /dev/null +++ b/assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Mc on avon +SPDX-License-Identifier: Public domain \ No newline at end of file diff --git a/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg b/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg new file mode 100644 index 00000000000..fcf36bc56d9 Binary files /dev/null and b/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg differ diff --git a/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg.license b/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg.license new file mode 100644 index 00000000000..4cb29632356 --- /dev/null +++ b/assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Pece +SPDX-License-Identifier: CC-BY 3.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg b/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg new file mode 100644 index 00000000000..890bbca14ab Binary files /dev/null and b/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg differ diff --git a/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg.license b/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg.license new file mode 100644 index 00000000000..45f44de245e --- /dev/null +++ b/assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Phil Champion +SPDX-License-Identifier: CC-BY-SA 2.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg b/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg new file mode 100644 index 00000000000..94fc56557d8 Binary files /dev/null and b/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg differ diff --git a/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg.license b/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg.license new file mode 100644 index 00000000000..1bf123f8f0a --- /dev/null +++ b/assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Glogger +SPDX-License-Identifier: CC-BY-SA 3.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/Zandbakw.jpg b/assets/layers/playground_equipment/Zandbakw.jpg new file mode 100644 index 00000000000..9609d866994 Binary files /dev/null and b/assets/layers/playground_equipment/Zandbakw.jpg differ diff --git a/assets/layers/playground_equipment/Zandbakw.jpg.license b/assets/layers/playground_equipment/Zandbakw.jpg.license new file mode 100644 index 00000000000..74127363550 --- /dev/null +++ b/assets/layers/playground_equipment/Zandbakw.jpg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Waerth +SPDX-License-Identifier: CC-BY-SA 3.0 \ No newline at end of file diff --git a/assets/layers/playground_equipment/license_info.json b/assets/layers/playground_equipment/license_info.json new file mode 100644 index 00000000000..c16a117c141 --- /dev/null +++ b/assets/layers/playground_equipment/license_info.json @@ -0,0 +1,182 @@ +[ + { + "path": "DeimosXL1.jpg", + "license": "CC-BY-SA 4.0", + "authors": [ + "Damian stawowy" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:DeimosXL1.jpg" + ] + }, + { + "path": "Funnel_ball.jpg", + "license": "Public domain", + "authors": [ + "Pavtron (talk)" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Funnel_ball.jpg" + ] + }, + { + "path": "Hinkelbaan_tegels.jpg", + "license": "Public domain", + "authors": [ + "M.Minderhoud" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Hinkelbaan_tegels.jpg" + ] + }, + { + "path": "Hupfkissen.jpg", + "license": "Public domain", + "authors": [ + "Peter Wanders" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:H%C3%BCpfkissen.jpg" + ] + }, + { + "path": "Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG", + "license": "CC-BY-SA 4.0", + "authors": [ + "Reda Kerbouche" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG" + ] + }, + { + "path": "Playground_Map,_Washington_Elementary.jpg", + "license": "CC-BY-SA 4.0", + "authors": [ + "Jleedev" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Playground_Map,_Washington_Elementary.jpg" + ] + }, + { + "path": "Playground_climbingwall.jpg", + "license": "Public Domain", + "authors": [ + "Mktravel" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Playground_climbingwall.jpg" + ] + }, + { + "path": "Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg", + "license": "CC-BY-SA 2.0", + "authors": [ + "Roger Kidd" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg" + ] + }, + { + "path": "Playground_swing_03.jpg", + "license": "CC-BY-SA 4.0", + "authors": [ + "Kritzolina" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Playground_swing_03.jpg" + ] + }, + { + "path": "Playhouse.jpg", + "license": "CC-BY-SA 3.0", + "authors": [ + "Saku" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Playhouse.jpg" + ] + }, + { + "path": "Rekstok.JPG", + "license": "Public domain", + "authors": [ + "self" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Rekstok.JPG" + ] + }, + { + "path": "Seesaw-aa.jpg", + "license": "Public domain", + "authors": [ + "Itsmine" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Seesaw-aa.jpg" + ] + }, + { + "path": "Spinning_circle.jpg", + "license": "CC0 1.0", + "authors": [ + "Jose1711" + ], + "sources": [ + "https://wiki.openstreetmap.org/wiki/File:Spinning_circle.jpg" + ] + }, + { + "path": "SunwardCohousingPlayStructure2005.jpg", + "license": "Public domain", + "authors": [ + "Mc on avon" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:SunwardCohousingPlayStructure2005.jpg" + ] + }, + { + "path": "Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg", + "license": "CC-BY 3.0", + "authors": [ + "Pece" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Szwedy_-_plac_zabaw_-_k%C3%B3%C5%82ko_i_krzy%C5%BCyk.jpg" + ] + }, + { + "path": "Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg", + "license": "CC-BY-SA 2.0", + "authors": [ + "Phil Champion" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg" + ] + }, + { + "path": "Urbeach-high-park-splashpad.jpg", + "license": "CC-BY-SA 3.0", + "authors": [ + "Glogger" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Urbeach-high-park-splashpad.jpg" + ] + }, + { + "path": "Zandbakw.jpg", + "license": "CC-BY-SA 3.0", + "authors": [ + "Waerth" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Zandbakw.jpg" + ] + } +] \ No newline at end of file diff --git a/assets/layers/playground_equipment/playground_equipment.json b/assets/layers/playground_equipment/playground_equipment.json new file mode 100644 index 00000000000..9ee9450e4c6 --- /dev/null +++ b/assets/layers/playground_equipment/playground_equipment.json @@ -0,0 +1,337 @@ +{ + "minzoom": 18, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "circle", + "color": "white" + }, + { + "icon": "./assets/themes/playgrounds/playground.svg" + } + ], + "iconSize": "20,20" + } + ], + "tagRenderings": [ + "images", + { + "render": { + "en": "This is a {playground}" + }, + "id": "type", + "freeform": { + "key": "playground", + "placeholder": { + "en": "Type of device" + }, + "addExtraTags": [ + "fixme=Freeform input used" + ] + }, + "question": { + "en": "What kind of device is this?", + "nl": "Wat voor speeltoestel is dit?" + }, + "invalidValues": "playground=yes", + "mappings": [ + { + "if": "playground=swing", + "then": { + "en": "This is a swing", + "nl": "Dit is een schommel" + } + }, + { + "if": "playground=structure", + "then": { + "en": "This is a structure consisting of several connected playground devices" + }, + "icon": { + "path": "./assets/layers/playground_equipment/SunwardCohousingPlayStructure2005.jpg", + "class": "large" + } + }, + { + "if": "playground=slide", + "then": { + "en": "This is a slide" + } + }, + { + "if": "playground=sandpit", + "then": { + "en": "This is a sand pit", + "nl": "Dit is een zandbak" + }, + "searchTerms": { + "en": [ + "sandbox" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/Zandbakw.jpg", + "class": "large" + } + }, + { + "if": "playground=springy", + "then": { + "en": "This is a spring rider", + "nl": "Dit is een veertoestel" + }, + "searchTerms": { + "en": [ + "springy" + ], + "nl": [ + "wipkip" + ] + } + }, + { + "if": "playground=climbingframe", + "then": { + "en": "This is a climbing frame", + "nl": "Dit is een klimrek" + }, + "searchTerms": { + "en": [ + "jungle gym", + "rope spider" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/DeimosXL1.jpg", + "class": "large" + } + }, + { + "if": "playground=seesaw", + "then": { + "en": "This is a seesaw", + "nl": "Dit is een wipwap" + }, + "searchTerms": { + "en": [ + "teeter-totter", + "teeterboard" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/Seesaw-aa.jpg", + "class": "large" + } + }, + { + "if": "playground=playhouse", + "then": { + "en": "This is a playhouse" + }, + "searchTerms": { + "en": [ + "Wendyhouse" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playhouse.jpg", + "class": "large" + } + }, + { + "if": "playground=roundabout", + "then": { + "en": "This is a roundabout" + }, + "searchTerms": { + "en": [ + "merry-go-round" + ] + }, + "icon": { + "path": "./assets/layers/playground_equipment/Manually_powered_carousel_on_a_playground_in_Saint-Petersburg.JPG", + "class": "large" + } + }, + { + "if": "playground=basketswing", + "then": { + "en": "This is a basket swing" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playground_swing_03.jpg", + "class": "large" + } + }, + { + "if": "playground=zipwire", + "then": { + "en": "This is a zip wire" + } + }, + { + "if": "playground=horizontal_bar", + "then": { + "en": "This is a horizontal bar", + "nl": "Dit is een rekstok" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Rekstok.JPG", + "class": "large" + } + }, + { + "if": "playground=hopscotch", + "then": { + "en": "This is a hopscotch" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Hinkelbaan_tegels.jpg", + "class": "large" + } + }, + { + "if": "playground=splash_pad", + "then": { + "en": "This is a splash pad" + }, + "searchTerms": { + "en": "spray pool" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Urbeach-high-park-splashpad.jpg", + "class": "large" + } + }, + { + "if": "playground=climbingwall", + "then": { + "en": "This is a climbing wall" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playground_climbingwall.jpg", + "class": "large" + } + }, + { + "if": "playground=map", + "then": { + "en": "This is a map" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playground_Map,_Washington_Elementary.jpg", + "class": "large" + } + }, + { + "if": "playground=bridge", + "then": { + "en": "This is a bridge (either as a standalone device or as part of a larger structure)" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Playground_in_Muchall_Park,_Wolverhampton_-_geograph.org.uk_-_2735437.jpg", + "class": "large" + } + }, + { + "if": "playground=cushion", + "then": { + "en": "This is a bouncy cushion" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Hupfkissen.jpg", + "class": "large" + } + }, + { + "if": "playground=activitypanel", + "then": { + "en": "This is an activity panel" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Szwedy_-_plac_zabaw_-_kotko_i_krzyzyk.jpg", + "class": "large" + } + }, + { + "if": "playground=teenshelter", + "then": { + "en": "This is a teen shelter" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Teen_shelter_near_former_coastguard_lookout,_Watchet_-_geograph.org.uk_-_1714960.jpg", + "class": "large" + } + }, + { + "if": "playground=funnel_ball", + "then": { + "en": "This is a funnel used to play with funnel ball" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Funnel_ball.jpg", + "class": "large" + } + }, + { + "if": "playground=spinning_circle", + "then": { + "en": "This is a spinning circle" + }, + "icon": { + "path": "./assets/layers/playground_equipment/Spinning_circle.jpg", + "class": "large" + } + } + ] + }, + { + "builtin": "wheelchair-access", + "override": { + "question": { + "en": "Is this device accessible by wheelchair?" + } + } + } + ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "id": "playground_equipment", + "name": { + "en": "Playground equipment" + }, + "description": { + "en": "Layer showing playground equipment" + }, + "source": { + "osmTags": "playground~*" + }, + "title": { + "render": { + "en": "Playground device" + } + }, + "allowMove": true, + "presets": [ + { + "tags": [ + "playground=yes" + ], + "title": { + "en": "a playground device" + }, + "description": { + "en": "An exact type is asked later" + } + } + ] +} \ No newline at end of file diff --git a/assets/layers/postoffices/postoffices.json b/assets/layers/postoffices/postoffices.json index 826b68ca296..69eb6e9f093 100644 --- a/assets/layers/postoffices/postoffices.json +++ b/assets/layers/postoffices/postoffices.json @@ -552,6 +552,86 @@ } ], "filter": [ - "open_now" + "open_now", + { + "id": "letter_from", + "options": [ + { + "question": { + "en": "Offers letter posting" + }, + "osmTags": { + "and": [ + "post_office:letter_from~*", + "post_office:letter_from!~i~no" + ] + } + } + ] + }, + { + "id": "parcel_from", + "options": [ + { + "question": { + "en": "Offers parcel posting" + }, + "osmTags": { + "and": [ + "post_office:parcel_from~*", + "post_office:parcel_from!~i~no" + ] + } + } + ] + }, + { + "id": "parcel_pickup", + "options": [ + { + "question": { + "en": "Offers pickup of missed parcels" + }, + "osmTags": { + "and": [ + "post_office:parcel_pickup~*", + "post_office:parcel_pickup!~i~no" + ] + } + } + ] + }, + { + "id": "parcel_to", + "options": [ + { + "question": { + "en": "Accepts pickup of parcels sent here" + }, + "osmTags": { + "and": [ + "post_office:parcel_to~*", + "post_office:parcel_to!~i~no" + ] + } + } + ] + }, + { + "id": "stamps", + "options": [ + { + "question": { + "en": "Sells stamps" + }, + "osmTags": { + "and": [ + "post_office:stamps~*", + "post_office:stamps!~i~no" + ] + } + } + ] + } ] -} +} \ No newline at end of file diff --git a/assets/layers/souvenir_coin/license_info.json b/assets/layers/souvenir_coin/license_info.json new file mode 100644 index 00000000000..81c6e8d3e48 --- /dev/null +++ b/assets/layers/souvenir_coin/license_info.json @@ -0,0 +1,10 @@ +[ + { + "path": "souvenir_coin.svg", + "license": "CC0-1.0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/souvenir_coin/souvenir_coin.json b/assets/layers/souvenir_coin/souvenir_coin.json new file mode 100644 index 00000000000..ee563903944 --- /dev/null +++ b/assets/layers/souvenir_coin/souvenir_coin.json @@ -0,0 +1,160 @@ +{ + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "marker": [ + { + "icon": "circle", + "color": "#FFFFFF00" + }, + { + "icon": "./assets/layers/souvenir_coin/souvenir_coin.svg" + } + ] + } + ], + "tagRenderings": [ + "images", + "opening_hours_24_7", + { + "builtin": "elongated_coin.designs", + "id": "designs", + "override": { + "render": { + "en": "This machine has {coin:design_count} designs available" + }, + "mappings": [ + { + "if": "coin:design_count=1", + "then": { + "en": "This machine has one design available" + } + }, + { + "if": "coin:design_count=2", + "then": { + "en": "This machine has two designs available" + } + }, + { + "if": "coin:design_count=3", + "then": { + "en": "This machine has three designs available" + } + }, + { + "if": "coin:design_count=4", + "then": { + "en": "This machine has four designs available" + } + } + ] + } + }, + "payment-options-split", + "website", + { + "question": { + "en": "How much does a souvenir coin cost?" + }, + "id": "charge", + "render": { + "en": "A souvenir coins costs {charge}" + }, + "freeform": { + "key": "charge", + "placeholder": { + "en": "Cost (e.g. 2 EUR)" + } + }, + "mappings": [ + { + "if": "charge=2 EUR", + "then": { + "en": "A souvenir coin costs 2 euro" + }, + "hideInAnswer": "_currency!~.*EUR.*" + } + ] + }, + "denominations-coins", + { + "question": { + "en": "Is this machine located indoors?" + }, + "id": "indoor", + "mappings": [ + { + "if": "indoor=yes", + "then": { + "en": "This machine is located indoors." + } + }, + { + "if": "indoor=no", + "then": { + "en": "This machine is located outdoors." + } + } + ] + }, + "level", + "check_date" + ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "id": "souvenir_coin", + "name": { + "en": "Souvenir Coin Machines" + }, + "description": { + "en": "Layer showing machines selling souvenir coins" + }, + "source": { + "osmTags": { + "and": [ + "amenity=vending_machine", + "vending~.*souvenir_coins.*" + ] + } + }, + "title": { + "render": { + "en": "Souvenir Coin Machine" + } + }, + "presets": [ + { + "title": { + "en": "a souvenir coin machine" + }, + "description": { + "en": "Add a machine selling souvenir coins" + }, + "tags": [ + "amenity=vending_machine", + "vending=souvenir_coins" + ] + } + ], + "filter": [ + "open_now", + "accepts_debit_cards", + "accepts_credit_cards" + ], + "deletion": true, + "allowMove": true +} \ No newline at end of file diff --git a/assets/layers/souvenir_coin/souvenir_coin.svg b/assets/layers/souvenir_coin/souvenir_coin.svg new file mode 100644 index 00000000000..9bf8075eef7 --- /dev/null +++ b/assets/layers/souvenir_coin/souvenir_coin.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/layers/souvenir_coin/souvenir_coin.svg.license b/assets/layers/souvenir_coin/souvenir_coin.svg.license new file mode 100644 index 00000000000..75299f88451 --- /dev/null +++ b/assets/layers/souvenir_coin/souvenir_coin.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Robin van der Linde +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/layers/souvenir_note/license_info.json b/assets/layers/souvenir_note/license_info.json new file mode 100644 index 00000000000..4693f12044d --- /dev/null +++ b/assets/layers/souvenir_note/license_info.json @@ -0,0 +1,10 @@ +[ + { + "path": "souvenir_note.svg", + "license": "CC0-1.0", + "authors": [ + "Robin van der Linde" + ], + "sources": [] + } +] \ No newline at end of file diff --git a/assets/layers/souvenir_note/souvenir_note.json b/assets/layers/souvenir_note/souvenir_note.json new file mode 100644 index 00000000000..df79f05855b --- /dev/null +++ b/assets/layers/souvenir_note/souvenir_note.json @@ -0,0 +1,178 @@ +{ + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "iconBadges": [ + { + "if": "opening_hours~*", + "then": "icons.isOpen" + } + ], + "marker": [ + { + "icon": "circle", + "color": "#FFFFFF00" + }, + { + "icon": "./assets/layers/souvenir_note/souvenir_note.svg" + } + ] + } + ], + "tagRenderings": [ + "images", + "opening_hours_24_7", + { + "id": "designs", + "question": { + "en": "How many designs are available?" + }, + "freeform": { + "key": "note:design_count", + "type": "pnat", + "placeholder": { + "en": "Number of designs (e.g. 5)", + "de": "Motivanzahl (z.B. 5)", + "es": "Número de diseños (por ejemplo, 5)", + "ca": "Nombre de dissenys (p. e. 5)", + "cs": "Počet vzorů (např. 5)" + } + }, + "render": { + "en": "This machine has {note:design_count} designs available." + }, + "mappings": [ + { + "if": "note:design_count=1", + "then": { + "en": "This machine has one design available." + } + }, + { + "if": "note:design_count=2", + "then": { + "en": "This machine has two designs available." + } + }, + { + "if": "note:design_count=3", + "then": { + "en": "This machine has three designs available." + } + }, + { + "if": "note:design_count=4", + "then": { + "en": "This machine has four designs available." + } + } + ] + }, + "payment-options-split", + "website", + { + "question": { + "en": "How much does a souvenir note cost?" + }, + "id": "charge", + "render": { + "en": "A souvenir note costs {charge}" + }, + "freeform": { + "key": "charge", + "placeholder": { + "en": "Cost (e.g. 2 EUR)" + } + }, + "mappings": [ + { + "if": "charge=2 EUR", + "then": { + "en": "A souvenir note costs 2 euro" + }, + "hideInAnswer": "_currency!~.*EUR.*" + }, + { + "if": "charge=3 EUR", + "then": { + "en": "A souvenir note costs 3 euro" + }, + "hideInAnswer": "_currency!~.*EUR.*" + } + ] + }, + "denominations-coins", + { + "question": { + "en": "Is this machine located indoors?" + }, + "id": "indoor", + "mappings": [ + { + "if": "indoor=yes", + "then": { + "en": "This machine is located indoors." + } + }, + { + "if": "indoor=no", + "then": { + "en": "This machine is located outdoors." + } + } + ] + }, + "level", + "check_date" + ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "id": "souvenir_note", + "name": { + "en": "Souvenir Banknote Machines" + }, + "description": { + "en": "Layer showing machines selling souvenir banknotes" + }, + "source": { + "osmTags": { + "and": [ + "amenity=vending_machine", + "vending~.*souvenir_notes.*" + ] + } + }, + "title": { + "render": { + "en": "Souvenir Banknote Machine" + } + }, + "presets": [ + { + "title": { + "en": "a souvenir banknote machine" + }, + "description": { + "en": "Add a machine selling souvenir banknotes" + }, + "tags": [ + "amenity=vending_machine", + "vending=souvenir_notes" + ] + } + ], + "filter": [ + "open_now", + "accepts_debit_cards", + "accepts_credit_cards" + ], + "deletion": true, + "allowMove": true +} \ No newline at end of file diff --git a/assets/layers/souvenir_note/souvenir_note.svg b/assets/layers/souvenir_note/souvenir_note.svg new file mode 100644 index 00000000000..a5f9ab9a10a --- /dev/null +++ b/assets/layers/souvenir_note/souvenir_note.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/layers/souvenir_note/souvenir_note.svg.license b/assets/layers/souvenir_note/souvenir_note.svg.license new file mode 100644 index 00000000000..75299f88451 --- /dev/null +++ b/assets/layers/souvenir_note/souvenir_note.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Robin van der Linde +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/themes/elongated_coin/elongated_coin.json b/assets/themes/elongated_coin/elongated_coin.json index d3e98e5d6be..49afe2f6530 100644 --- a/assets/themes/elongated_coin/elongated_coin.json +++ b/assets/themes/elongated_coin/elongated_coin.json @@ -21,6 +21,8 @@ "startLat": 53.0565, "startLon": 8.7492, "layers": [ - "elongated_coin" + "elongated_coin", + "souvenir_coin", + "souvenir_note" ] } \ No newline at end of file diff --git a/assets/themes/ghostsigns/ghostsigns.json b/assets/themes/ghostsigns/ghostsigns.json new file mode 100644 index 00000000000..21577bb77cb --- /dev/null +++ b/assets/themes/ghostsigns/ghostsigns.json @@ -0,0 +1,179 @@ +{ + "id": "ghostsigns", + "title": { + "en": "Ghost Signs" + }, + "description": { + "en": "A map showing disused signs on buildings" + }, + "icon": "./assets/themes/advertising/wall_painting.svg", + "layers": [ + { + "id": "ghostsigns", + "title": { + "render": { + "en": "Ghost Sign" + } + }, + "description": { + "en": "Layer showing disused signs on buildings" + }, + "name": { + "en": "Ghost Signs" + }, + "source": { + "osmTags": { + "and": [ + "historic~*", + "advertising=wall_painting" + ] + } + }, + "minzoom": 10, + "allowMove": { + "enableImproveAccuracy": true + }, + "tagRenderings": [ + { + "id": "historic", + "question": { + "en": "Is this a ghost sign?" + }, + "questionHint": { + "en": "Is this sign for a business that no longer exists or no longer being maintained?" + }, + "mappings": [ + { + "if": "historic=advertising", + "then": { + "en": "This is a ghost sign" + }, + "alsoShowIf": "historic=yes" + }, + { + "if": "historic=", + "then": { + "en": "This is not a ghost sign, answering this will hide the sign from the map" + } + } + ] + }, + "images", + { + "id": "name", + "condition": "name~*", + "render": { + "*": "{name}" + } + }, + { + "id": "inscription", + "question": { + "en": "What is the text on the sign?" + }, + "freeform": { + "key": "inscription", + "type": "string", + "placeholder": { + "en": "Text on the sign" + } + }, + "render": { + "en": "The text on the sign is: {inscription}" + } + }, + { + "id": "brand", + "question": { + "en": "For what business was this sign made?" + }, + "freeform": { + "key": "brand", + "type": "string", + "placeholder": { + "en": "Business name" + } + }, + "render": { + "en": "This sign was made for: {brand}" + } + } + ], + "lineRendering": [ + { + "color": "blue", + "width": 2 + } + ], + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "./assets/themes/advertising/wall_painting.svg" + } + ] + } + ], + "presets": [ + { + "tags": [ + "historic=advertising", + "advertising=wall_painting" + ], + "title": { + "en": "a ghost sign" + }, + "snapToLayer": [ + "walls_and_buildings" + ], + "maxSnapDistance": 5 + } + ] + }, + { + "builtin": "advertising", + "override": { + "source": { + "osmTags": "advertising=wall_painting" + }, + "minzoom": 18, + "+tagRenderings": [ + { + "id": "historic", + "question": { + "en": "Is this a ghost sign?" + }, + "questionHint": { + "en": "Is this sign for a business that no longer exists or no longer being maintained?" + }, + "mappings": [ + { + "if": "historic=advertising", + "then": { + "en": "This is a ghost sign" + }, + "alsoShowIf": "historic=yes" + }, + { + "if": "historic=", + "then": { + "en": "This is not a ghost sign" + } + } + ] + } + ], + "=presets": [], + "pointRendering": [ + { + "iconSize": "20,20" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/assets/themes/items_with_image/items_with_image.json b/assets/themes/items_with_image/items_with_image.json new file mode 100644 index 00000000000..17ca1a320f1 --- /dev/null +++ b/assets/themes/items_with_image/items_with_image.json @@ -0,0 +1,14 @@ +{ + "id": "items_with_image", + "hideFromOverview": true, + "title": { + "en": "All items with images" + }, + "description": { + "en": "A map showing all items on OSM which have an image. This theme is a very bad fit for MapComplete as someone is not able to directly add a picture. However, this theme is mostly here to include this all into the database, which'll allow this to quickly fetch images nearby for other features" + }, + "icon": "./assets/layers/item_with_image/camera.svg", + "layers": [ + "item_with_image" + ] +} diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index 2ff55d98043..3d4f5308203 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -286,6 +286,10 @@ "if": "theme=ghostbikes", "then": "./assets/themes/ghostbikes/logo.svg" }, + { + "if": "theme=ghostsigns", + "then": "./assets/themes/advertising/wall_painting.svg" + }, { "if": "theme=grb", "then": "./assets/themes/grb/logo.svg" @@ -318,6 +322,10 @@ "if": "theme=indoors", "then": "./assets/layers/entrance/entrance.svg" }, + { + "if": "theme=items_with_image", + "then": "./assets/layers/item_with_image/camera.svg" + }, { "if": "theme=kerbs_and_crossings", "then": "./assets/layers/kerbs/KerbIcon.svg" diff --git a/assets/themes/playgrounds/playgrounds.json b/assets/themes/playgrounds/playgrounds.json index 32c82105d0f..87db0468e5f 100644 --- a/assets/themes/playgrounds/playgrounds.json +++ b/assets/themes/playgrounds/playgrounds.json @@ -60,6 +60,7 @@ "startLon": 4.399, "layers": [ "playground", + "playground_equipment", { "builtin": [ "bench", diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json index 491d46d3c64..13ce50ff73e 100644 --- a/assets/themes/postboxes/postboxes.json +++ b/assets/themes/postboxes/postboxes.json @@ -54,7 +54,54 @@ "layers": [ "postboxes", "postoffices", - "parcel_lockers" + "parcel_lockers", + { + "builtin": "shops", + "override": { + "minzoom": 18, + "minzoomVisible": 18, + "description": { + "en": "Add a new post partner to the map in an existing shop" + }, + "+tagRenderings": [ + { + "id": "post_partner", + "question": { + "en": "Is this shop a post partner?" + }, + "mappings": [ + { + "if": "post_office=post_partner", + "then": { + "en": "This shop is a post partner" + } + }, + { + "if": "post_office=", + "then": { + "en": "This shop is not a post partner" + } + } + ] + } + ], + "shownByDefault": false, + "=presets": [ + { + "tags": [ + "shop=yes", + "post_office=post_partner" + ], + "title": { + "en": "a missing shop that is a post partner" + }, + "description": { + "en": "If a shop is not yet on the map and is a post partner, you can add it here." + } + } + ] + } + } ], "widenFactor": 1.5, "clustering": { diff --git a/langs/en.json b/langs/en.json index 16759ffab49..02f158baaab 100644 --- a/langs/en.json +++ b/langs/en.json @@ -27,6 +27,7 @@ "selectReason": "Please, select why this feature should be deleted", "softDelete": "This feature will be updated and hidden from this application. {reason}" }, + "isChanged": "This feature has been changed and no longer matches this layer", "isDeleted": "This feature is deleted", "isntAPoint": "Only nodes can be deleted, the selected feature is a way, area or relation.", "loading": "Inspecting properties to check if this feature can be deleted.", @@ -222,6 +223,10 @@ "example": "Example", "examples": "Examples", "fewChangesBefore": "Please, answer a few questions of existing features before adding a new feature.", + "filterPanel": { + "disableAll": "Disable all", + "enableAll": "Enable all" + }, "geopermissionDenied": "Using the geolocation was denied", "getStartedLogin": "Log in with OpenStreetMap to get started", "getStartedNewAccount": " or create a new account", diff --git a/scripts/downloadCommons.ts b/scripts/downloadCommons.ts index 78cb8e217cb..dad3013e675 100644 --- a/scripts/downloadCommons.ts +++ b/scripts/downloadCommons.ts @@ -69,6 +69,30 @@ interface CategoryQueryAPIResponse { } } +interface ImagesQueryAPIResponse { + continue: { + imcontinue: string + continue: string + } + query: { + normalized?: { + from: string + to: string + }[] + pages: { + [key: string]: { + pageid: number + ns: number + title: string + images?: { + ns: number + title: string + }[] + } + } + } +} + interface TemplateQueryAPIResponse { batchcomplete: string query: { @@ -96,13 +120,14 @@ const licenseMapping = {} // Map template names to license names const templateMapping = { "Template:PD": "Public Domain", + "Template:CC0": "CC0 1.0", } async function main(args: string[]) { if (args.length < 2) { console.log("Usage: downloadCommons.ts .. ") console.log( - "Example: npx vite-node downloadCommons.ts -- assets/svg https://commons.wikimedia.org/wiki/File:Example.jpg" + "Example: npx vite-node scripts/downloadCommons.ts -- assets/svg https://commons.wikimedia.org/wiki/File:Example.jpg" ) process.exit(1) } @@ -128,8 +153,24 @@ async function main(args: string[]) { for (const member of apiDetails.query.categorymembers) { await downloadImage(member.title, outputFolder, baseUrl) } - } else { + } else if (url.includes("File:")) { await downloadImage(commonsFileName, outputFolder, baseUrl) + } else { + // Probably a page url, try to get all images from the page + const apiUrl = `${baseUrl}/w/api.php?action=query&format=json&prop=images&titles=${commonsFileName}&imlimit=250` + const response = await fetch(apiUrl) + const apiDetails: ImagesQueryAPIResponse = await response.json() + const page = apiDetails.query.pages[Object.keys(apiDetails.query.pages)[0]] + if (page.images) { + for (const image of page.images) { + await downloadImage(image.title, outputFolder, baseUrl) + } + } else { + console.log( + "\x1b[31m%s\x1b[0m", + `URL ${url} doesn't seem to contain any images! Skipping...` + ) + } } } else { console.log( @@ -154,6 +195,12 @@ async function downloadImage(filename: string, outputFolder: string, baseUrl: st const apiDetails: ImageQueryAPIResponse = await response.json() const missingPage = apiDetails.query.pages["-1"] + // Check if the local file already exists, if it does, skip it + if (existsSync(`${outputFolder}/${filename}`)) { + console.log(`\x1b[33m%s\x1b[0m`, `${filename} already exists, skipping...`) + return + } + // Check if the file exists, locally or externally if (missingPage !== undefined) { // Image does not exist locally, check if it exists externally @@ -271,8 +318,8 @@ async function downloadImage(filename: string, outputFolder: string, baseUrl: st // Save the license information const licenseInfo: SmallLicense = { path: cleanFileName, - license: licenseMapping[license] || license, - authors: [author], + license: licenseMapping[license] || license.replace("CC BY", "CC-BY"), + authors: [removeLinks(author)], sources: [wikiUrl], } @@ -293,4 +340,9 @@ async function downloadImage(filename: string, outputFolder: string, baseUrl: st } } +function removeLinks(text: string): string { + // Remove tags + return text.replace(/(.*?)<\/a>/g, "$1") +} + main(process.argv.slice(2)) diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index dfcc2f03d86..fd62b8a2a37 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -5,7 +5,7 @@ import ScriptUtils from "./ScriptUtils" import Script from "./Script" const knownLanguages = ["en", "nl", "de", "fr", "es", "gl", "ca"] - +const ignoreTerms = ["searchTerms"] class TranslationPart { contents: Map = new Map() @@ -49,6 +49,7 @@ class TranslationPart { if (!translations.hasOwnProperty(translationsKey)) { continue } + const v = translations[translationsKey] if (typeof v != "string") { console.error( @@ -106,6 +107,9 @@ class TranslationPart { if (!object.hasOwnProperty(key)) { continue } + if (ignoreTerms.indexOf(key) >= 0) { + continue + } if (dontTranslateKeys?.indexOf(key) >= 0) { continue diff --git a/src/Logic/ImageProviders/AllImageProviders.ts b/src/Logic/ImageProviders/AllImageProviders.ts index 5fc9c1ec746..ae56d267bb3 100644 --- a/src/Logic/ImageProviders/AllImageProviders.ts +++ b/src/Logic/ImageProviders/AllImageProviders.ts @@ -10,6 +10,8 @@ import { WikidataImageProvider } from "./WikidataImageProvider" * A generic 'from the interwebz' image picker, without attribution */ export default class AllImageProviders { + private static dontLoadFromPrefixes = ["https://photos.app.goo.gl/"] + public static ImageAttributionSource: ImageProvider[] = [ Imgur.singleton, Mapillary.singleton, @@ -19,7 +21,8 @@ export default class AllImageProviders { [].concat( ...Imgur.defaultValuePrefix, ...WikimediaImageProvider.commonsPrefixes, - ...Mapillary.valuePrefixes + ...Mapillary.valuePrefixes, + ...AllImageProviders.dontLoadFromPrefixes ) ), ] diff --git a/src/Models/ThemeConfig/Conversion/Conversion.ts b/src/Models/ThemeConfig/Conversion/Conversion.ts index 7603e56850d..d9c4eeececf 100644 --- a/src/Models/ThemeConfig/Conversion/Conversion.ts +++ b/src/Models/ThemeConfig/Conversion/Conversion.ts @@ -156,7 +156,7 @@ export class On extends DesugaringStep { convert(json: T, context: ConversionContext): T { const key = this.key - const value: P = json[key] + const value: P = json?.[key] if (value === undefined || value === null) { return json } diff --git a/src/Models/ThemeConfig/Conversion/PrepareTheme.ts b/src/Models/ThemeConfig/Conversion/PrepareTheme.ts index 0eccdcf14bc..92585607d7d 100644 --- a/src/Models/ThemeConfig/Conversion/PrepareTheme.ts +++ b/src/Models/ThemeConfig/Conversion/PrepareTheme.ts @@ -366,7 +366,7 @@ class AddDependencyLayersToTheme extends DesugaringStep { themeId: string ): { config: LayerConfigJson; reason: string }[] { const dependenciesToAdd: { config: LayerConfigJson; reason: string }[] = [] - const loadedLayerIds: Set = new Set(alreadyLoaded.map((l) => l.id)) + const loadedLayerIds: Set = new Set(alreadyLoaded.map((l) => l?.id)) // Verify cross-dependencies let unmetDependencies: { diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index 8e255228278..911c4700d84 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -111,7 +111,6 @@ export default class ThemeViewState implements SpecialVisualizationState { readonly perLayerFiltered: ReadonlyMap readonly availableLayers: Store - readonly selectedLayer: UIEventSource readonly userRelatedState: UserRelatedState readonly geolocation: GeoLocationHandler readonly geolocationControl: GeolocationControlState @@ -732,7 +731,7 @@ export default class ThemeViewState implements SpecialVisualizationState { doShowLayer: flayer.isDisplayed, layer: flayer.layerDef, metaTags: this.userRelatedState.preferencesAsTags, - selectedElement: this.selectedElement + selectedElement: this.selectedElement, }) }) } diff --git a/src/UI/Base/Checkbox.svelte b/src/UI/Base/Checkbox.svelte index b2efcb57863..6580aeeb169 100644 --- a/src/UI/Base/Checkbox.svelte +++ b/src/UI/Base/Checkbox.svelte @@ -6,10 +6,14 @@ */ export let selected: UIEventSource let _c: boolean = selected.data ?? true + let id = `checkbox-input-${Math.round(Math.random()*100000000)}` $: selected.set(_c) + selected.addCallbackD(s => { + _c = s + }) diff --git a/src/UI/BigComponents/FilterPanel.svelte b/src/UI/BigComponents/FilterPanel.svelte index 456fcc2a56b..336297d591f 100644 --- a/src/UI/BigComponents/FilterPanel.svelte +++ b/src/UI/BigComponents/FilterPanel.svelte @@ -1,17 +1,49 @@
@@ -27,6 +59,15 @@ highlightedLayer={state.guistate.highlightedLayerInFilters} /> {/each} +
+ + +
+ {#each layout.tileLayerSources as tilesource} > = state.featureProperties.getStore( selectedElement.properties.id ) + + + let stillMatches = tags.map(tags => !layer?.source?.osmTags || layer.source.osmTags?.matchesProperties(tags)) let _metatags: Record onDestroy( @@ -35,7 +38,11 @@ ) -{#if $tags._deleted === "yes"} +{#if !$stillMatches} +
+ +
+{:else if $tags._deleted === "yes"}
diff --git a/src/UI/Map/MapLibreAdaptor.ts b/src/UI/Map/MapLibreAdaptor.ts index 8731d5acbdc..0b9886443a1 100644 --- a/src/UI/Map/MapLibreAdaptor.ts +++ b/src/UI/Map/MapLibreAdaptor.ts @@ -90,7 +90,7 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { this.lastClickLocation = lastClickLocation const self = this - const rasterLayerHandler = new RasterLayerHandler(this._maplibreMap, this.rasterLayer) + new RasterLayerHandler(this._maplibreMap, this.rasterLayer) function handleClick(e) { if (e.originalEvent["consumed"]) { @@ -114,7 +114,6 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { self.setMaxzoom(self.maxzoom.data) self.setBounds(self.bounds.data) self.setTerrain(self.useTerrain.data) - rasterLayerHandler.setBackground() this.updateStores(true) }) self.MoveMapToCurrentLoc(self.location.data) @@ -128,7 +127,6 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { self.setBounds(self.bounds.data) self.SetRotation(self.rotation.data) self.setTerrain(self.useTerrain.data) - rasterLayerHandler.setBackground() this.updateStores(true) map.on("moveend", () => this.updateStores()) map.on("click", (e) => { @@ -177,7 +175,6 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { }) }) - this.rasterLayer.addCallbackAndRun((_) => rasterLayerHandler.setBackground()) this.location.addCallbackAndRunD((loc) => { self.MoveMapToCurrentLoc(loc) }) diff --git a/src/UI/Map/OverlayMap.svelte b/src/UI/Map/OverlayMap.svelte index 72f7668e080..089b8f7ba6d 100644 --- a/src/UI/Map/OverlayMap.svelte +++ b/src/UI/Map/OverlayMap.svelte @@ -11,6 +11,7 @@ import type { MapProperties } from "../../Models/MapProperties" import { onDestroy } from "svelte" import type { RasterLayerPolygon } from "../../Models/RasterLayers" + import StyleLoadingIndicator from "./StyleLoadingIndicator.svelte" export let placedOverMapProperties: MapProperties export let placedOverMap: Store @@ -64,9 +65,13 @@ updateLocation() window.setTimeout(updateLocation, 150) window.setTimeout(updateLocation, 500) - }) + }), ) } +
+ +
diff --git a/src/UI/Map/RasterLayerHandler.ts b/src/UI/Map/RasterLayerHandler.ts index 28ec453bcf1..7123ca769cb 100644 --- a/src/UI/Map/RasterLayerHandler.ts +++ b/src/UI/Map/RasterLayerHandler.ts @@ -71,7 +71,7 @@ class SingleBackgroundHandler { this.fadeOut() } else { this._deactivationTime = undefined - this.enable() + await this.enable() this.fadeIn() } } @@ -85,10 +85,23 @@ class SingleBackgroundHandler { } } - private enable() { + private async enable(){ + let ttl = 15 + await this.awaitStyleIsLoaded() + while(!this.tryEnable() && ttl > 0){ + ttl --; + await Utils.waitFor(250) + } + } + + /** + * Returns 'false' if should be attempted again + * @private + */ + private tryEnable(): boolean { const map: MLMap = this._map.data if (!map) { - return + return true } const background = this._targetLayer.properties console.debug("Enabling", background.id) @@ -101,8 +114,7 @@ class SingleBackgroundHandler { try { map.addSource(background.id, RasterLayerHandler.prepareWmsSource(background)) } catch (e) { - console.error("Could not add source", e) - return + return false } } if (!map.getLayer(background.id)) { @@ -126,6 +138,7 @@ class SingleBackgroundHandler { map.setPaintProperty(background.id, "raster-opacity", o) }) } + return true } private fadeOut() { @@ -144,23 +157,15 @@ class SingleBackgroundHandler { } export default class RasterLayerHandler { - private _map: Store - private _background: UIEventSource private _singleLayerHandlers: Record = {} constructor(map: Store, background: UIEventSource) { - this._map = map - this._background = background background.addCallbackAndRunD((l) => { const key = l.properties.id if (!this._singleLayerHandlers[key]) { this._singleLayerHandlers[key] = new SingleBackgroundHandler(map, l, background) } }) - map.addCallback((map) => { - map.on("load", () => this.setBackground()) - this.setBackground() - }) } public static prepareWmsSource(layer: RasterLayerProperties): SourceSpecification { @@ -203,9 +208,4 @@ export default class RasterLayerHandler { return url } - - /** - * Performs all necessary updates - */ - public setBackground() {} } diff --git a/src/UI/Map/RasterLayerPicker.svelte b/src/UI/Map/RasterLayerPicker.svelte index 106de779050..a22d5e7d837 100644 --- a/src/UI/Map/RasterLayerPicker.svelte +++ b/src/UI/Map/RasterLayerPicker.svelte @@ -5,6 +5,7 @@ import { Store, UIEventSource } from "../../Logic/UIEventSource" import { Map as MlMap } from "maplibre-gl" import { createEventDispatcher, onDestroy } from "svelte" + import StyleLoadingIndicator from "./StyleLoadingIndicator.svelte" /*** * Chooses a background-layer out of available options @@ -78,7 +79,7 @@ {#if hasLayers}
{}}>