diff --git a/assets/layers/aerialway/aerialway.json b/assets/layers/aerialway/aerialway.json index deaac93c03..3522f9556e 100644 --- a/assets/layers/aerialway/aerialway.json +++ b/assets/layers/aerialway/aerialway.json @@ -1,4 +1,28 @@ { + "id": "aerialway", + "name": { + "en": "Aerialways", + "de": "Seilbahnen" + }, + "description": { + "en": "Various forms of transport for passengers and goods that use wires, including cable cars, gondolas, chair lifts, drag lifts, and zip lines. ", + "de": "Alle Arten von seil- oder drahtgestütztem Personen- oder Gütertransport, wie Seilbahnen, Gondeln, Sessellifte, Schlepplifte. " + }, + "source": { + "osmTags": { + "and": [ + "aerialway~*", + "aerialway!=pylon", + "aerialway!=station" + ] + } + }, + "title": { + "render": { + "en": "Aerialway {name}", + "de": "Seilbahn {name}" + } + }, "pointRendering": [ { "location": [ @@ -27,6 +51,27 @@ "labelCssClasses": "bg-white px-2 py-1 no-weblate" } ], + "lineRendering": [ + { + "width": "4", + "color": "black", + "imageAlongWay": [ + { + "if": "oneway=no", + "then": "./assets/png/twoway.png" + }, + { + "if": { + "or": [ + "oneway=yes", + "oneway=" + ] + }, + "then": "./assets/png/oneway.png" + } + ] + } + ], "tagRenderings": [ "images", { @@ -183,50 +228,5 @@ "de": "Die Seilbahn hat eine Länge von {_length:km} km" } } - ], - "lineRendering": [ - { - "width": "4", - "color": "black", - "imageAlongWay": [ - { - "if": "oneway=no", - "then": "./assets/png/twoway.png" - }, - { - "if": { - "or": [ - "oneway=yes", - "oneway=" - ] - }, - "then": "./assets/png/oneway.png" - } - ] - } - ], - "id": "aerialway", - "name": { - "en": "Aerialways", - "de": "Seilbahnen" - }, - "description": { - "en": "Various forms of transport for passengers and goods that use wires, including cable cars, gondolas, chair lifts, drag lifts, and zip lines. ", - "de": "Alle Arten von seil- oder drahtgestütztem Personen- oder Gütertransport, wie Seilbahnen, Gondeln, Sessellifte, Schlepplifte. " - }, - "source": { - "osmTags": { - "and": [ - "aerialway~*", - "aerialway!=pylon", - "aerialway!=station" - ] - } - }, - "title": { - "render": { - "en": "Aerialway {name}", - "de": "Seilbahn {name}" - } - } + ] } diff --git a/assets/layers/assembly_point/assembly_point.json b/assets/layers/assembly_point/assembly_point.json index 974cdd01ea..80499210f6 100644 --- a/assets/layers/assembly_point/assembly_point.json +++ b/assets/layers/assembly_point/assembly_point.json @@ -1,8 +1,5 @@ { - "allowMove": { - "enableRelocation": false, - "enableImproveAccuracy": true - }, + "id": "assembly_point", "name": { "en": "Emergency assembly points", "it": "Punti di raccolta per emergenze", @@ -13,9 +10,6 @@ "it": "Questo livello contiene punti di raccolta e aree di attesa in cui tutti i dipendenti, i passeggeri o una grande folla si riuniscono in caso di emergenza.", "de": "Diese Ebene enthält Sammelplätze und Wartebereiche, in denen sich alle Mitarbeiter, Fahrgäste oder eine große Menschenmenge im Notfall versammeln." }, - "docs": "https://wiki.openstreetmap.org/wiki/Tag:emergency%3Dassembly_point", - "id": "assembly_point", - "minzoom": 10, "source": { "osmTags": { "and": [ @@ -23,6 +17,13 @@ ] } }, + "minzoom": 10, + "title": { + "render": { + "en": "Assembly point during emergencies", + "de": "Sammelplatz bei Notfällen" + } + }, "pointRendering": [ { "iconSize": "20,20", @@ -50,12 +51,6 @@ ] } ], - "title": { - "render": { - "en": "Assembly point during emergencies", - "de": "Sammelplatz bei Notfällen" - } - }, "tagRenderings": [ "images", { @@ -154,5 +149,10 @@ } ] } - ] + ], + "allowMove": { + "enableRelocation": false, + "enableImproveAccuracy": true + }, + "docs": "https://wiki.openstreetmap.org/wiki/Tag:emergency%3Dassembly_point" } diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index 5b75592164..62fc62992f 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -5,7 +5,12 @@ "nl": "Oplaadpunten", "de": "Ladestationen" }, - "minzoom": 10, + "description": { + "en": "A charging station", + "nl": "Oplaadpunten", + "ca": "Una estació de càrrega", + "de": "Eine Ladestation" + }, "source": { "osmTags": { "and": [ @@ -20,6 +25,7 @@ ] } }, + "minzoom": 10, "title": { "render": { "en": "Charging station", @@ -65,13 +71,103 @@ } ] }, - "description": { - "en": "A charging station", - "nl": "Oplaadpunten", - "ca": "Una estació de càrrega", - "de": "Eine Ladestation" - }, - "#": "no-question-hint-check", + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "pin", + "color": "#fff" + }, + { + "icon": { + "render": "./assets/themes/charging_stations/plug.svg", + "mappings": [ + { + "if": "bicycle=yes", + "then": "./assets/themes/charging_stations/bicycle.svg" + }, + { + "if": { + "or": [ + "car=yes", + "motorcar=yes" + ] + }, + "then": "./assets/themes/charging_stations/car.svg" + } + ] + } + } + ], + "iconBadges": [ + { + "if": { + "or": [ + "disused:amenity=charging_station", + "operational_status=broken" + ] + }, + "then": "close:#c22;" + }, + { + "if": { + "or": [ + "proposed:amenity=charging_station", + "planned:amenity=charging_station" + ] + }, + "then": "./assets/layers/charging_station/under_construction.svg" + }, + { + "if": { + "and": [ + "bicycle=yes", + { + "or": [ + "motorcar=yes", + "car=yes" + ] + } + ] + }, + "then": "circle:#fff;./assets/themes/charging_stations/car.svg" + } + ], + "anchor": "bottom", + "iconSize": "50,50" + } + ], + "lineRendering": [], + "presets": [ + { + "tags": [ + "amenity=charging_station", + "motorcar=no", + "bicycle=yes" + ], + "title": { + "en": "charging station for electrical bikes", + "nl": "oplaadpunt voor elektrische fietsen", + "de": "Ladestation für Elektrofahrräder" + } + }, + { + "tags": [ + "amenity=charging_station", + "motorcar=yes", + "bicycle=no" + ], + "title": { + "en": "charging station for cars", + "nl": "oplaadstation voor elektrische auto's", + "de": "Ladestation für Elektrofahrräder" + } + } + ], "tagRenderings": [ "images", { @@ -2316,103 +2412,6 @@ } } ], - "lineRendering": [], - "pointRendering": [ - { - "location": [ - "point", - "centroid" - ], - "marker": [ - { - "icon": "pin", - "color": "#fff" - }, - { - "icon": { - "render": "./assets/themes/charging_stations/plug.svg", - "mappings": [ - { - "if": "bicycle=yes", - "then": "./assets/themes/charging_stations/bicycle.svg" - }, - { - "if": { - "or": [ - "car=yes", - "motorcar=yes" - ] - }, - "then": "./assets/themes/charging_stations/car.svg" - } - ] - } - } - ], - "iconBadges": [ - { - "if": { - "or": [ - "disused:amenity=charging_station", - "operational_status=broken" - ] - }, - "then": "close:#c22;" - }, - { - "if": { - "or": [ - "proposed:amenity=charging_station", - "planned:amenity=charging_station" - ] - }, - "then": "./assets/layers/charging_station/under_construction.svg" - }, - { - "if": { - "and": [ - "bicycle=yes", - { - "or": [ - "motorcar=yes", - "car=yes" - ] - } - ] - }, - "then": "circle:#fff;./assets/themes/charging_stations/car.svg" - } - ], - "anchor": "bottom", - "iconSize": "50,50" - } - ], - "presets": [ - { - "tags": [ - "amenity=charging_station", - "motorcar=no", - "bicycle=yes" - ], - "title": { - "en": "charging station for electrical bikes", - "nl": "oplaadpunt voor elektrische fietsen", - "de": "Ladestation für Elektrofahrräder" - } - }, - { - "tags": [ - "amenity=charging_station", - "motorcar=yes", - "bicycle=no" - ], - "title": { - "en": "charging station for cars", - "nl": "oplaadstation voor elektrische auto's", - "de": "Ladestation für Elektrofahrräder" - } - } - ], "filter": [ { "id": "vehicle-type", @@ -2611,6 +2610,20 @@ ] } ], + "deletion": { + "softDeletionTags": { + "and": [ + "amenity=", + "disused:amenity=charging_station" + ] + }, + "neededChangesets": 10 + }, + "allowMove": { + "enableRelocation": false, + "enableImproveAccuracy": true + }, + "#": "no-question-hint-check", "units": [ { "maxstay": { @@ -2759,18 +2772,5 @@ ] } } - ], - "allowMove": { - "enableRelocation": false, - "enableImproveAccuracy": true - }, - "deletion": { - "softDeletionTags": { - "and": [ - "amenity=", - "disused:amenity=charging_station" - ] - }, - "neededChangesets": 10 - } -} \ No newline at end of file + ] +} diff --git a/assets/layers/climbing_opportunity/climbing_opportunity.json b/assets/layers/climbing_opportunity/climbing_opportunity.json index 974d1fe65c..447fda7788 100644 --- a/assets/layers/climbing_opportunity/climbing_opportunity.json +++ b/assets/layers/climbing_opportunity/climbing_opportunity.json @@ -35,7 +35,6 @@ } }, "minzoom": 19, - "doCount": false, "title": { "render": { "en": "Climbing opportunity?", @@ -148,5 +147,6 @@ } ] } - ] + ], + "doCount": false } diff --git a/assets/layers/crab_address/crab_address.json b/assets/layers/crab_address/crab_address.json index 86805c235a..9b364003e7 100644 --- a/assets/layers/crab_address/crab_address.json +++ b/assets/layers/crab_address/crab_address.json @@ -5,8 +5,7 @@ "source": { "osmTags": "HUISNR~*", "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/CRAB_2021_10_26/tile_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 18, - "maxCacheAge": 0 + "geoJsonZoomLevel": 18 }, "calculatedTags": [ "_HNRLABEL=(() => {const lbl = feat.properties.HNRLABEL?.split('-')?.map(l => Number(l))?.filter(i => !isNaN (i)) ;if(lbl?.length != 2) {return feat.properties.HNRLABEL}; const addresses = []; for(let i = lbl[0]; i <= lbl[1]; i += 1){addresses.push(''+i);}; return addresses.join(';') })()" diff --git a/assets/layers/disaster_response/disaster_response.json b/assets/layers/disaster_response/disaster_response.json index dfecff37fd..22fac818ea 100644 --- a/assets/layers/disaster_response/disaster_response.json +++ b/assets/layers/disaster_response/disaster_response.json @@ -1,12 +1,5 @@ { "id": "disaster_response", - "title": { - "render": { - "en": "Disaster response organization", - "it": "Organizzazione per la risposta ai disastri", - "de": "Katastrophenschutzorganisation" - } - }, "name": { "en": "Disaster response organizations", "de": "Katastrophenschutzorganisationen" @@ -16,8 +9,36 @@ "it": "Questo livello contiene organizzazioni che hanno come obiettivo principale quello di aiutare la popolazione civile durante e dopo disastri naturali o antropogenici, lavorando nell'area colpita.", "de": "Diese Ebene umfasst Organisationen, deren Hauptziel es ist, der Zivilbevölkerung während und nach Natur- oder anthropogenen Katastrophen zu helfen, indem sie in dem betroffenen Gebiet tätig sind." }, - "docs": "https://wiki.openstreetmap.org/wiki/Tag:emergency%3Ddisaster_response", + "source": { + "osmTags": { + "and": [ + "emergency=disaster_response" + ] + } + }, "minzoom": 10, + "title": { + "render": { + "en": "Disaster response organization", + "it": "Organizzazione per la risposta ai disastri", + "de": "Katastrophenschutzorganisation" + } + }, + "pointRendering": [ + { + "iconSize": "40,40", + "location": [ + "point", + "centroid" + ], + "anchor": "bottom", + "marker": [ + { + "icon": "./assets/themes/disaster_response/CivilDefence.svg" + } + ] + } + ], "lineRendering": [ { "color": "#6BC4F7", @@ -36,28 +57,6 @@ ] } ], - "source": { - "osmTags": { - "and": [ - "emergency=disaster_response" - ] - } - }, - "pointRendering": [ - { - "iconSize": "40,40", - "location": [ - "point", - "centroid" - ], - "anchor": "bottom", - "marker": [ - { - "icon": "./assets/themes/disaster_response/CivilDefence.svg" - } - ] - } - ], "tagRenderings": [ "images", "website", @@ -77,5 +76,6 @@ "de": "Diese Organisation heißt {name}" } } - ] + ], + "docs": "https://wiki.openstreetmap.org/wiki/Tag:emergency%3Ddisaster_response" } diff --git a/assets/layers/elongated_coin/elongated_coin.json b/assets/layers/elongated_coin/elongated_coin.json index 398b7921f0..d76da9ad76 100644 --- a/assets/layers/elongated_coin/elongated_coin.json +++ b/assets/layers/elongated_coin/elongated_coin.json @@ -441,4 +441,4 @@ ], "deletion": true, "allowMove": true -} \ No newline at end of file +} diff --git a/assets/layers/ice_cream/ice_cream.json b/assets/layers/ice_cream/ice_cream.json index 8b5ea0568f..afbb1a36c3 100644 --- a/assets/layers/ice_cream/ice_cream.json +++ b/assets/layers/ice_cream/ice_cream.json @@ -4,7 +4,6 @@ "en": "Ice cream parlors", "de": "Eisdielen" }, - "minzoom": 14, "description": { "en": "A place where ice cream is sold over the counter", "de": "Ein Ort, an dem Eiscreme an der Theke verkauft wird" @@ -12,6 +11,7 @@ "source": { "osmTags": "amenity=ice_cream" }, + "minzoom": 14, "title": { "render": { "en": "Ice cream parlor", diff --git a/assets/layers/item_with_image/item_with_image.json b/assets/layers/item_with_image/item_with_image.json index 8209d2cd12..f289ad7aae 100644 --- a/assets/layers/item_with_image/item_with_image.json +++ b/assets/layers/item_with_image/item_with_image.json @@ -1,7 +1,9 @@ { "id": "item_with_image", + "name": { + "en": "Items with at least one 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": [ @@ -15,9 +17,7 @@ ] } }, - "tagRenderings": [ - "images" - ], + "minzoom": 14, "title": { "render": { "en": "POI with image" @@ -31,10 +31,6 @@ } ] }, - "name": { - "en": "Items with at least one image" - }, - "lineRendering": [], "pointRendering": [ { "marker": [ @@ -47,5 +43,9 @@ "point" ] } + ], + "lineRendering": [], + "tagRenderings": [ + "images" ] } diff --git a/assets/layers/maproulette_challenge/maproulette_challenge.json b/assets/layers/maproulette_challenge/maproulette_challenge.json index 2f192ebd8c..d7b2fabd06 100644 --- a/assets/layers/maproulette_challenge/maproulette_challenge.json +++ b/assets/layers/maproulette_challenge/maproulette_challenge.json @@ -10,8 +10,7 @@ }, "source": { "osmTags": "mr_taskId~*", - "geoJson": "https://maproulette.org/api/v2/challenge/view/27971", - "isOsmCache": false + "geoJson": "https://maproulette.org/api/v2/challenge/view/27971" }, "title": { "render": { diff --git a/assets/layers/mountain_rescue/mountain_rescue.json b/assets/layers/mountain_rescue/mountain_rescue.json index 2a17c199fa..a1f25797d8 100644 --- a/assets/layers/mountain_rescue/mountain_rescue.json +++ b/assets/layers/mountain_rescue/mountain_rescue.json @@ -1,6 +1,23 @@ { - "credits": "Not logged in", + "id": "mountain_rescue", + "name": { + "en": "Mountain rescue stations", + "de": "Bergrettungsstationen" + }, + "description": { + "en": "A building where first aid responders store material and might be on watch", + "de": "Ein Gebäude, in dem die Ersthelfer Material lagern und möglicherweise Wache halten" + }, + "source": { + "osmTags": "emergency=mountain_rescue" + }, "minzoom": 10, + "title": { + "render": { + "en": "Mountain rescue station", + "de": "Bergrettungsstation" + } + }, "pointRendering": [ { "location": [ @@ -19,37 +36,12 @@ "rotation": "45" } ], - "tagRenderings": [ - "images" - ], "lineRendering": [ { "width": "3", "color": "#ed333b" } ], - "id": "mountain_rescue", - "name": { - "en": "Mountain rescue stations", - "de": "Bergrettungsstationen" - }, - "description": { - "en": "A building where first aid responders store material and might be on watch", - "de": "Ein Gebäude, in dem die Ersthelfer Material lagern und möglicherweise Wache halten" - }, - "source": { - "osmTags": "emergency=mountain_rescue" - }, - "title": { - "render": { - "en": "Mountain rescue station", - "de": "Bergrettungsstation" - } - }, - "deletion": true, - "allowMove": { - "enableRelocation": false - }, "presets": [ { "title": { @@ -60,5 +52,13 @@ "emergency=mountain_rescue" ] } - ] + ], + "tagRenderings": [ + "images" + ], + "deletion": true, + "allowMove": { + "enableRelocation": false + }, + "credits": "Not logged in" } diff --git a/assets/layers/note/note.json b/assets/layers/note/note.json index a39f53107d..a949307506 100644 --- a/assets/layers/note/note.json +++ b/assets/layers/note/note.json @@ -12,9 +12,7 @@ "source": { "osmTags": "date_created~*", "geoJson": "https://api.openstreetmap.org/api/0.6/notes.json?limit=10000&closed=7&bbox={x_min},{y_min},{x_max},{y_max}", - "geoJsonZoomLevel": 12, - "maxCacheAge": 0, - "isOsmCache": false + "geoJsonZoomLevel": 12 }, "calculatedTags": [ "_total_comments:=get(feat)('comments').length", diff --git a/assets/layers/osm_community_index/osm_community_index.json b/assets/layers/osm_community_index/osm_community_index.json index cde21addc2..54b074cc31 100644 --- a/assets/layers/osm_community_index/osm_community_index.json +++ b/assets/layers/osm_community_index/osm_community_index.json @@ -19,8 +19,7 @@ "source": { "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/community_index/tile_{z}_{x}_{y}.geojson", "geoJsonZoomLevel": 6, - "osmTags": "resources~*", - "isOsmCache": false + "osmTags": "resources~*" }, "calculatedTags": [ "_community_links=Object.values(JSON.parse(feat.properties.resources || '{}')).map(value =>{return value.resolved.nameHTML + '
 ' + value.resolved.descriptionHTML}).join('
')" diff --git a/assets/layers/playground_equipment/playground_equipment.json b/assets/layers/playground_equipment/playground_equipment.json index 9ee9450e4c..e2a40033d1 100644 --- a/assets/layers/playground_equipment/playground_equipment.json +++ b/assets/layers/playground_equipment/playground_equipment.json @@ -1,5 +1,20 @@ { + "id": "playground_equipment", + "name": { + "en": "Playground equipment" + }, + "description": { + "en": "Layer showing playground equipment" + }, + "source": { + "osmTags": "playground~*" + }, "minzoom": 18, + "title": { + "render": { + "en": "Playground device" + } + }, "pointRendering": [ { "location": [ @@ -18,6 +33,25 @@ "iconSize": "20,20" } ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "presets": [ + { + "tags": [ + "playground=yes" + ], + "title": { + "en": "a playground device" + }, + "description": { + "en": "An exact type is asked later" + } + } + ], "tagRenderings": [ "images", { @@ -299,39 +333,5 @@ } } ], - "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 + "allowMove": true +} diff --git a/assets/layers/postoffices/postoffices.json b/assets/layers/postoffices/postoffices.json index 69eb6e9f09..8924ebf300 100644 --- a/assets/layers/postoffices/postoffices.json +++ b/assets/layers/postoffices/postoffices.json @@ -634,4 +634,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/assets/layers/ski_piste/ski_piste.json b/assets/layers/ski_piste/ski_piste.json index 1f2d5ee305..5075610688 100644 --- a/assets/layers/ski_piste/ski_piste.json +++ b/assets/layers/ski_piste/ski_piste.json @@ -1,4 +1,32 @@ { + "id": "ski_piste", + "name": { + "en": "Ski and snowboard pistes", + "de": "Ski- und Snowboardpisten" + }, + "description": { + "en": "Ski and snowboard pistes", + "de": "Ski- und Snowboardpisten" + }, + "source": { + "osmTags": { + "and": [ + { + "or": [ + "piste:type=downhill", + "piste:type=connection" + ] + }, + "area!=yes" + ] + } + }, + "title": { + "render": { + "en": "Ski piste {name}", + "de": "Skipiste {name}" + } + }, "pointRendering": [ { "location": [ @@ -12,6 +40,40 @@ ] } ], + "lineRendering": [ + { + "width": "10", + "color": { + "mappings": [ + { + "then": "green", + "if": "piste:difficulty=novice" + }, + { + "if": "piste:difficulty=easy", + "then": "blue" + }, + { + "if": "piste:difficulty=intermediate", + "then": "red" + }, + { + "if": "piste:difficulty=advanced", + "then": "black" + }, + { + "if": "piste:difficulty=expert", + "then": "orange" + }, + { + "if": "piste:difficulty=", + "then": "gray" + } + ] + }, + "imageAlongWay": "./assets/png/oneway.png" + } + ], "tagRenderings": [ "images", { @@ -73,67 +135,5 @@ "de": "Dieser Teil der Skipiste hat eine Länge von {_length:km} km" } } - ], - "lineRendering": [ - { - "width": "10", - "color": { - "mappings": [ - { - "then": "green", - "if": "piste:difficulty=novice" - }, - { - "if": "piste:difficulty=easy", - "then": "blue" - }, - { - "if": "piste:difficulty=intermediate", - "then": "red" - }, - { - "if": "piste:difficulty=advanced", - "then": "black" - }, - { - "if": "piste:difficulty=expert", - "then": "orange" - }, - { - "if": "piste:difficulty=", - "then": "gray" - } - ] - }, - "imageAlongWay": "./assets/png/oneway.png" - } - ], - "id": "ski_piste", - "name": { - "en": "Ski and snowboard pistes", - "de": "Ski- und Snowboardpisten" - }, - "description": { - "en": "Ski and snowboard pistes", - "de": "Ski- und Snowboardpisten" - }, - "source": { - "osmTags": { - "and": [ - { - "or": [ - "piste:type=downhill", - "piste:type=connection" - ] - }, - "area!=yes" - ] - } - }, - "title": { - "render": { - "en": "Ski piste {name}", - "de": "Skipiste {name}" - } - } + ] } diff --git a/assets/layers/souvenir_coin/souvenir_coin.json b/assets/layers/souvenir_coin/souvenir_coin.json index ee56390394..601f7174e1 100644 --- a/assets/layers/souvenir_coin/souvenir_coin.json +++ b/assets/layers/souvenir_coin/souvenir_coin.json @@ -1,4 +1,24 @@ { + "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" + } + }, "pointRendering": [ { "location": [ @@ -22,6 +42,26 @@ ] } ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "presets": [ + { + "title": { + "en": "a souvenir coin machine" + }, + "description": { + "en": "Add a machine selling souvenir coins" + }, + "tags": [ + "amenity=vending_machine", + "vending=souvenir_coins" + ] + } + ], "tagRenderings": [ "images", "opening_hours_24_7", @@ -110,46 +150,6 @@ "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", @@ -157,4 +157,4 @@ ], "deletion": true, "allowMove": true -} \ No newline at end of file +} diff --git a/assets/layers/souvenir_note/souvenir_note.json b/assets/layers/souvenir_note/souvenir_note.json index df79f05855..da2750ea94 100644 --- a/assets/layers/souvenir_note/souvenir_note.json +++ b/assets/layers/souvenir_note/souvenir_note.json @@ -1,4 +1,24 @@ { + "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" + } + }, "pointRendering": [ { "location": [ @@ -22,6 +42,26 @@ ] } ], + "lineRendering": [ + { + "width": 1, + "color": "blue" + } + ], + "presets": [ + { + "title": { + "en": "a souvenir banknote machine" + }, + "description": { + "en": "Add a machine selling souvenir banknotes" + }, + "tags": [ + "amenity=vending_machine", + "vending=souvenir_notes" + ] + } + ], "tagRenderings": [ "images", "opening_hours_24_7", @@ -128,46 +168,6 @@ "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", @@ -175,4 +175,4 @@ ], "deletion": true, "allowMove": true -} \ No newline at end of file +} diff --git a/assets/layers/stripclub/stripclub.json b/assets/layers/stripclub/stripclub.json index 0b92c6c9f9..0484694028 100644 --- a/assets/layers/stripclub/stripclub.json +++ b/assets/layers/stripclub/stripclub.json @@ -9,8 +9,7 @@ "de": "Ein Ort, an dem erotische Tanz-, Striptease- oder Lapdances kommerziell durchgeführt werden. " }, "source": { - "osmTags": "amenity=stripclub", - "isOsmCache": false + "osmTags": "amenity=stripclub" }, "minzoom": 6, "title": { diff --git a/assets/layers/summary/summary.json b/assets/layers/summary/summary.json index deccd5e6ba..ce21243529 100644 --- a/assets/layers/summary/summary.json +++ b/assets/layers/summary/summary.json @@ -7,9 +7,6 @@ "en": "Summary" } }, - "tagRenderings": [ - "all_tags" - ], "pointRendering": [ { "location": [ @@ -17,11 +14,12 @@ "centroid" ], "iconSize": "40,40", - "label": { - "render": "{total_metric}" - }, + "label": "{total_metric}", "labelCss": "background: #ffffffbb", "labelCssClasses": "w-12 text-lg rounded-xl p-1 px-2" } + ], + "tagRenderings": [ + "all_tags" ] } diff --git a/assets/layers/trolley_bay/trolley_bay.json b/assets/layers/trolley_bay/trolley_bay.json index 657ac62616..0366ddcafb 100644 --- a/assets/layers/trolley_bay/trolley_bay.json +++ b/assets/layers/trolley_bay/trolley_bay.json @@ -8,19 +8,42 @@ "en": "Find trolley bays for shopping trolleys.", "de": "Finde Einkaufswagenbuchten für Einkaufswagen." }, - "title": { - "en": "Trolley Bay", - "de": "Einkaufswagenbucht" - }, "source": { "osmTags": "amenity=trolley_bay" }, "minzoom": 18, - "allowMove": { - "enableImproveAccuracy": true, - "enableRelocation": true + "title": { + "en": "Trolley Bay", + "de": "Einkaufswagenbucht" }, - "deletion": true, + "pointRendering": [ + { + "location": [ + "point", + "centroid" + ], + "marker": [ + { + "icon": "./assets/layers/trolley_bay/trolley_bay.svg" + } + ] + } + ], + "presets": [ + { + "title": { + "en": "a trolley bay", + "de": "eine Einkaufswagenbucht" + }, + "tags": [ + "amenity=trolley_bay" + ], + "description": { + "en": "A trolley bay for parking shopping carts.", + "de": "Ein Platz zum Abstellen von Einkaufswagen." + } + } + ], "tagRenderings": [ { "id": "covered", @@ -194,32 +217,9 @@ "id": "indoor" } ], - "presets": [ - { - "title": { - "en": "a trolley bay", - "de": "eine Einkaufswagenbucht" - }, - "tags": [ - "amenity=trolley_bay" - ], - "description": { - "en": "A trolley bay for parking shopping carts.", - "de": "Ein Platz zum Abstellen von Einkaufswagen." - } - } - ], - "pointRendering": [ - { - "location": [ - "point", - "centroid" - ], - "marker": [ - { - "icon": "./assets/layers/trolley_bay/trolley_bay.svg" - } - ] - } - ] -} \ No newline at end of file + "deletion": true, + "allowMove": { + "enableImproveAccuracy": true, + "enableRelocation": true + } +} diff --git a/assets/layers/walls_and_buildings/walls_and_buildings.json b/assets/layers/walls_and_buildings/walls_and_buildings.json index 53a482adc1..37da1936d9 100644 --- a/assets/layers/walls_and_buildings/walls_and_buildings.json +++ b/assets/layers/walls_and_buildings/walls_and_buildings.json @@ -31,7 +31,6 @@ ], "minzoom": 18, "shownByDefault": false, - "isCounted": false, "title": { "render": { "en": "Wall or building", @@ -122,6 +121,7 @@ "condition": "_biggest_width_id~*" } ], + "isCounted": false, "units": [ { "width": { diff --git a/assets/themes/bag/bag.json b/assets/themes/bag/bag.json index d9a70c5906..088c53015d 100644 --- a/assets/themes/bag/bag.json +++ b/assets/themes/bag/bag.json @@ -50,8 +50,7 @@ "title": "OSM Building", "description": "Layer showing buildings that are in OpenStreetMap", "source": { - "osmTags": "building~*", - "maxCacheAge": 0 + "osmTags": "building~*" }, "minzoom": 18, "doCount": false, @@ -161,8 +160,7 @@ "addr:postcode~*", "addr:street~*" ] - }, - "maxCacheAge": 0 + } }, "minzoom": 18, "doCount": false, @@ -204,8 +202,7 @@ "source": { "geoJson": "https://service.pdok.nl/lv/bag/wfs/v2_0?request=GetFeature&service=WFS&version=2.0.0&outputFormat=application%2Fjson%3B%20subtype%3Dgeojson&typeName=bag%3Apand&bbox={x_min}%2C{y_min}%2C{x_max}%2C{y_max}%2CCRS84&srsName=EPSG%3A4326", "geoJsonZoomLevel": 18, - "osmTags": "identificatie~*", - "maxCacheAge": 0 + "osmTags": "identificatie~*" }, "minzoom": 18, "calculatedTags": [ @@ -395,8 +392,7 @@ "source": { "geoJson": "https://service.pdok.nl/lv/bag/wfs/v2_0?request=GetFeature&service=WFS&version=2.0.0&outputFormat=application%2Fjson%3B%20subtype%3Dgeojson&typeName=bag%3Averblijfsobject&bbox={x_min}%2C{y_min}%2C{x_max}%2C{y_max}%2CCRS84&srsName=EPSG%3A4326", "geoJsonZoomLevel": 19, - "osmTags": "identificatie~*", - "maxCacheAge": 0 + "osmTags": "identificatie~*" }, "minzoom": 18, "calculatedTags": [ diff --git a/assets/themes/bicycle_parkings/bicycle_parkings.json b/assets/themes/bicycle_parkings/bicycle_parkings.json new file mode 100644 index 0000000000..d4d3f9f134 --- /dev/null +++ b/assets/themes/bicycle_parkings/bicycle_parkings.json @@ -0,0 +1,19 @@ +{ + "id": "bicycle_parkings", + "description": { + "en": "A map showing all types of bicycle parkings" + }, + "title": { + "en": "Bicycle parkings" + }, + "icon": "./assets/themes/bicycle_parkings/logo.svg", + "layers": [ + { + "builtin": + "bike_parking", + "override": { + "minzoom": 12 + } + } + ] +} diff --git a/assets/themes/bicycle_parkings/license_info.json b/assets/themes/bicycle_parkings/license_info.json new file mode 100644 index 0000000000..8f6e1f4247 --- /dev/null +++ b/assets/themes/bicycle_parkings/license_info.json @@ -0,0 +1,10 @@ +[ + { + "path": "logo.svg", + "license": "CC0-1.0", + "authors": [ + "Pieter Vander Vennet" + ], + "sources": [] + } +] \ No newline at end of file diff --git a/assets/themes/bicycle_parkings/logo.svg b/assets/themes/bicycle_parkings/logo.svg new file mode 100644 index 0000000000..9b14f87350 --- /dev/null +++ b/assets/themes/bicycle_parkings/logo.svg @@ -0,0 +1,45 @@ + + diff --git a/assets/themes/bicycle_parkings/logo.svg.license b/assets/themes/bicycle_parkings/logo.svg.license new file mode 100644 index 0000000000..ed02883002 --- /dev/null +++ b/assets/themes/bicycle_parkings/logo.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Pieter Vander Vennet +SPDX-License-Identifier: CC0-1.0 \ No newline at end of file diff --git a/assets/themes/disaster_response/disaster_response.json b/assets/themes/disaster_response/disaster_response.json index d7ba9d0b0a..0869c15789 100644 --- a/assets/themes/disaster_response/disaster_response.json +++ b/assets/themes/disaster_response/disaster_response.json @@ -1,23 +1,23 @@ { - "description": { - "en": "This map contains elements meant for disaster preparedness and response.", - "it": "Questa mappa contiene elementi pensati per la preparazione e risposta ai disastri.", - "de": "Diese Karte enthält Elemente, die der Katastrophenvorsorge und dem Katastrophenschutz dienen.", - "es": "Este mapa contiene elementos destinados a la preparación y respuesta ante desastres." - }, - "docs": "https://wiki.openstreetmap.org/wiki/Emergency_facilities_and_amenities", - "icon": "./assets/themes/disaster_response/CivilDefence.svg", "id": "disaster_response", - "socialImage": "./assets/themes/disaster_response/social.svg", "title": { "en": "Disaster response", "it": "Risposta ai disastri", "de": "Katastrophenschutz", "es": "Respuesta ante desastres" }, + "description": { + "en": "This map contains elements meant for disaster preparedness and response.", + "it": "Questa mappa contiene elementi pensati per la preparazione e risposta ai disastri.", + "de": "Diese Karte enthält Elemente, die der Katastrophenvorsorge und dem Katastrophenschutz dienen.", + "es": "Este mapa contiene elementos destinados a la preparación y respuesta ante desastres." + }, + "icon": "./assets/themes/disaster_response/CivilDefence.svg", + "socialImage": "./assets/themes/disaster_response/social.svg", "layers": [ "hospital", "assembly_point", "disaster_response" - ] + ], + "docs": "https://wiki.openstreetmap.org/wiki/Emergency_facilities_and_amenities" } \ No newline at end of file diff --git a/assets/themes/grb/grb.json b/assets/themes/grb/grb.json index 89461b7acf..8ed73d20b3 100644 --- a/assets/themes/grb/grb.json +++ b/assets/themes/grb/grb.json @@ -42,8 +42,7 @@ }, "building~*" ] - }, - "maxCacheAge": 0 + } }, "title": "OSM-gebouw", "tagRenderings": [ @@ -290,7 +289,6 @@ "geoJson": "https://betadata.grbosm.site/grb?bbox={x_min},{y_min},{x_max},{y_max}", "geoJsonZoomLevel": 18, "mercatorCrs": true, - "maxCacheAge": 0, "idKey": "osm_id" }, "name": "GRB geometries", @@ -587,8 +585,7 @@ ] } ] - }, - "maxCacheAge": 0 + } }, "title": { "render": { diff --git a/assets/themes/items_with_image/items_with_image.json b/assets/themes/items_with_image/items_with_image.json index 17ca1a320f..b96f05fe4b 100644 --- a/assets/themes/items_with_image/items_with_image.json +++ b/assets/themes/items_with_image/items_with_image.json @@ -1,6 +1,5 @@ { "id": "items_with_image", - "hideFromOverview": true, "title": { "en": "All items with images" }, @@ -8,6 +7,7 @@ "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", + "hideFromOverview": true, "layers": [ "item_with_image" ] diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index 591381bdf9..dc1134e94d 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -14,8 +14,6 @@ "startLat": 0, "startLon": 0, "startZoom": 1, - "widenFactor": 0.05, - "clustering": false, "layers": [ { "id": "mapcomplete-changes", @@ -26,8 +24,7 @@ "source": { "osmTags": "editor~*", "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/mapcomplete-changes/tile_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 8, - "maxCacheAge": 0 + "geoJsonZoomLevel": 8 }, "title": { "render": { @@ -152,6 +149,10 @@ "if": "theme=benches", "then": "./assets/themes/benches/bench_poi.svg" }, + { + "if": "theme=bicycle_parkings", + "then": "./assets/themes/bicycle_parkings/logo.svg" + }, { "if": "theme=bicycle_rental", "then": "./assets/themes/bicycle_rental/logo.svg" diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json index 95d0dc691f..4a55a1cf13 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json @@ -14,8 +14,6 @@ "startLat": 0, "startLon": 0, "startZoom": 1, - "widenFactor": 0.05, - "clustering": false, "layers": [ { "id": "mapcomplete-changes", @@ -26,8 +24,7 @@ "source": { "osmTags": "editor~*", "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/mapcomplete-changes/tile_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 8, - "maxCacheAge": 0 + "geoJsonZoomLevel": 8 }, "title": { "render": { diff --git a/assets/themes/notes/notes.json b/assets/themes/notes/notes.json index 925c4d670b..c27ee01958 100644 --- a/assets/themes/notes/notes.json +++ b/assets/themes/notes/notes.json @@ -32,6 +32,5 @@ "note", "fixme" ], - "enableDownload": true, - "clustering": false + "enableDownload": true } \ No newline at end of file diff --git a/assets/themes/openwindpowermap/openwindpowermap.json b/assets/themes/openwindpowermap/openwindpowermap.json index 8e87a1aa40..f84d0b4b25 100644 --- a/assets/themes/openwindpowermap/openwindpowermap.json +++ b/assets/themes/openwindpowermap/openwindpowermap.json @@ -41,8 +41,5 @@ ], "layers": [ "windturbine" - ], - "clustering": { - "maxZoom": 8 - } + ] } \ No newline at end of file diff --git a/assets/themes/osm_community_index/osm_community_index.json b/assets/themes/osm_community_index/osm_community_index.json index ee7c9a1e96..80cb4c890e 100644 --- a/assets/themes/osm_community_index/osm_community_index.json +++ b/assets/themes/osm_community_index/osm_community_index.json @@ -36,6 +36,5 @@ "startLon": 4.351697, "layers": [ "osm_community_index" - ], - "clustering": false + ] } \ No newline at end of file diff --git a/assets/themes/personal/personal.json b/assets/themes/personal/personal.json index 9909ee88c3..8095d3e718 100644 --- a/assets/themes/personal/personal.json +++ b/assets/themes/personal/personal.json @@ -44,8 +44,5 @@ "enableNoteImports": false, "widenFactor": 1.2, "overpassMaxZoom": 15, - "clustering": { - "maxZoom": 19 - }, "#note": "The 'overpassMaxZoom' should be exactly the same as or less then the minzzom in overrideAll" } \ No newline at end of file diff --git a/assets/themes/postal_codes/postal_codes.json b/assets/themes/postal_codes/postal_codes.json index 2ae872fe14..3345146ec1 100644 --- a/assets/themes/postal_codes/postal_codes.json +++ b/assets/themes/postal_codes/postal_codes.json @@ -231,6 +231,5 @@ } ], "overpassTimeout": 180, - "widenFactor": 0.05, - "clustering": false + "widenFactor": 0.05 } diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json index 13ce50ff73..38e9045ee2 100644 --- a/assets/themes/postboxes/postboxes.json +++ b/assets/themes/postboxes/postboxes.json @@ -103,9 +103,5 @@ } } ], - "widenFactor": 1.5, - "clustering": { - "maxZoom": 14, - "minNeededElements": 100 - } + "widenFactor": 1.5 } \ No newline at end of file diff --git a/assets/themes/ski/ski.json b/assets/themes/ski/ski.json index 6ce871f339..192ae35fe6 100644 --- a/assets/themes/ski/ski.json +++ b/assets/themes/ski/ski.json @@ -11,7 +11,6 @@ "es": "Todo lo que necesitas para esquiar" }, "icon": "./assets/layers/aerialway/chair_lift.svg", - "enableTerrain": true, "layers": [ "ski_piste", "aerialway", @@ -50,5 +49,6 @@ ] } } - ] + ], + "enableTerrain": true } diff --git a/assets/themes/speelplekken/speelplekken.json b/assets/themes/speelplekken/speelplekken.json index 7955d434aa..037199ffad 100644 --- a/assets/themes/speelplekken/speelplekken.json +++ b/assets/themes/speelplekken/speelplekken.json @@ -23,8 +23,7 @@ "title": null, "source": { "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete/master/assets/themes/speelplekken/shadow.geojson", - "osmTags": "shadow=yes", - "isOsmCache": false + "osmTags": "shadow=yes" }, "pointRendering": null, "lineRendering": [ @@ -37,11 +36,6 @@ { "builtin": "play_forest", "override": { - "source": { - "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 14, - "isOsmCache": true - }, "minzoom": 12, "calculatedTags": [ "_is_shadowed=overlapWith(feat)('shadow').length > 0 ? 'yes': ''", @@ -53,12 +47,6 @@ "builtin": "playground", "override": { "minzoom": 14, - "source": { - "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 14, - "isOsmCache": true - }, "calculatedTags": [ "_is_shadowed=overlapWith(feat)('shadow').length > 0 ? 'yes': ''", "_video:id=feat.properties.video === undefined ? undefined : new URL(feat.properties.video).searchParams.get('v')" @@ -69,12 +57,6 @@ "builtin": "village_green", "override": { "minzoom": 14, - "source": { - "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 14, - "isOsmCache": true - }, "calculatedTags": [ "_is_shadowed=overlapWith(feat)('shadow').length > 0 ? 'yes': ''", "_video:id=feat.properties.video === undefined ? undefined : new URL(feat.properties.video).searchParams.get('v')" @@ -85,12 +67,6 @@ "builtin": "sport_pitch", "override": { "minzoom": 15, - "source": { - "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 14, - "isOsmCache": true - }, "calculatedTags": [ "_is_shadowed=overlapWith(feat)('shadow').length > 0 ? 'yes': ''", "_video:id=feat.properties.video === undefined ? undefined : new URL(feat.properties.video).searchParams.get('v')" @@ -102,13 +78,7 @@ "override": { "calculatedTags": [ "_is_shadowed=overlapWith(feat)('shadow').length > 0 ? 'yes': ''" - ], - "source": { - "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 14, - "isOsmCache": true - } + ] } }, { @@ -124,10 +94,7 @@ "route=foot", "operator~[pP]rovincie Antwerpen" ] - }, - "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", - "geoJsonZoomLevel": 14, - "isOsmCache": true + } }, "title": { "render": "Wandeling {name}", @@ -260,9 +227,5 @@ 51.23978120350654 ] ], - "widenFactor": 1.2, - "clustering": { - "maxZoom": 6, - "minNeededElements": 100 - } + "widenFactor": 1.2 } diff --git a/assets/themes/street_lighting/street_lighting.json b/assets/themes/street_lighting/street_lighting.json index 98ff87cc2a..380c3a7ae9 100644 --- a/assets/themes/street_lighting/street_lighting.json +++ b/assets/themes/street_lighting/street_lighting.json @@ -358,6 +358,10 @@ { "if": "lit=no", "then": "#303030" + }, + { + "if": "lit=yes", + "then": "#ff0" } ] } diff --git a/assets/themes/street_lighting_assen/street_lighting_assen.json b/assets/themes/street_lighting_assen/street_lighting_assen.json index cc22208034..1cca1a0ad5 100644 --- a/assets/themes/street_lighting_assen/street_lighting_assen.json +++ b/assets/themes/street_lighting_assen/street_lighting_assen.json @@ -23,8 +23,7 @@ "osmTags": "Lichtmastnummer~*", "#geoJson": "https://opendata.arcgis.com/datasets/ba37cdb372064b3199c548b75d16a609_0.geojson", "geoJson": "https://robinlinde.github.io/tiles/assen_street_lighting/{z}/{x}/{y}.json", - "geoJsonZoomLevel": 16, - "isOsmCache": false + "geoJsonZoomLevel": 16 }, "calculatedTags": [ "_closest_osm_street_lamp=closest(feat)('street_lamps')?.properties?.id", diff --git a/assets/themes/trees/trees.json b/assets/themes/trees/trees.json index 256df236d2..88cb7c09a1 100644 --- a/assets/themes/trees/trees.json +++ b/assets/themes/trees/trees.json @@ -71,9 +71,5 @@ "tree_node" ], "widenFactor": 0.2, - "osmApiTileSize": 18, - "clustering": { - "maxZoom": 19, - "minNeededElements": 25 - } + "osmApiTileSize": 18 } diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json index 97bf12a81a..f86ae5f9d2 100644 --- a/assets/themes/uk_addresses/uk_addresses.json +++ b/assets/themes/uk_addresses/uk_addresses.json @@ -32,8 +32,7 @@ "source": { "geoJson": "https://osm-uk-addresses.russss.dev/inspire/{z}/{x}/{y}.json", "osmTags": "inspireid~*", - "geoJsonZoomLevel": 18, - "isOsmCache": false + "geoJsonZoomLevel": 18 }, "minzoom": 18, "calculatedTags": [ @@ -69,8 +68,7 @@ "id!~node/.*" ] }, - "geoJsonZoomLevel": 16, - "isOsmCache": false + "geoJsonZoomLevel": 16 }, "name": "Addresses to check", "minzoom": 18, @@ -703,9 +701,5 @@ ], "enableShareScreen": false, "enableMoreQuests": false, - "widenFactor": 1.01, - "clustering": { - "minNeededFeatures": 25, - "maxZoom": 16 - } + "widenFactor": 1.01 } diff --git a/assets/themes/velopark/velopark.json b/assets/themes/velopark/velopark.json index 2beb583057..c0a8f9aabc 100644 --- a/assets/themes/velopark/velopark.json +++ b/assets/themes/velopark/velopark.json @@ -3,45 +3,33 @@ "title": { "nl": "Velopark naar OpenStreetMap sync tool" }, - "shortDescription": { - "en": "A tool to import data from velopark.be into OpenStreetMap", - "nl": "Een hulpmiddel om data van velopark.be in OpenStreetMap in te laden" - }, + "mustHaveLanguage": [ + "nl" + ], "description": { "en": "

Velopark.be is a website collecting data about bicycle parkings in a semi-crowdsourced way. However, only 'authorized' instances are allowed to make changes there, in practice the operator of the bicycle parking such as SNCB, de Lijn or the municipality. They have now decided to synchronize their dataset with OpenStreetMap, and this MapComplete-instance is set up to help link and import their data into OpenStreetMap.

How to use: That's it! Thanks for helping to import this!", "nl": "

Velopark.be is een website die data verzamelt over fietsenstallingen in een semi-crowdsource manier. Hierbij kunnen enkel geautorizeerde gebruikers data bijdragen, in de praktijk de uitbaters van de fietsenstallingen zoals de bevoegde gemeentebesturen, de NMBS of de Lijn. Velopark.be heeft nu beslist om hun data met OpenStreetMap te synchronizeren. Deze website is de tool om van Velopark.be naar OpenStreetMap te gaan en hun data te importeren.

Hoe te gebruiken? Dat is het! Bedankt om mee te helpen!" }, + "shortDescription": { + "en": "A tool to import data from velopark.be into OpenStreetMap", + "nl": "Een hulpmiddel om data van velopark.be in OpenStreetMap in te laden" + }, "descriptionTail": { "*": "

Maintainer tools

" }, - "hideFromOverview": true, "icon": "./assets/themes/velopark/velopark.svg", - "mustHaveLanguage": [ - "nl" - ], - "lockLocation": [ - [ - 2.51357303225, - 49.5294835476 - ], - [ - 6.15665815596, - 51.4750237087 - ] - ], + "startZoom": 18, "startLat": 51.03753, "startLon": 3.71025, - "startZoom": 18, "defaultBackgroundId": "photo", - "enableNoteImports": false, + "hideFromOverview": true, "layers": [ { "id": "velopark_maproulette", "description": "Maproulette challenge containing velopark data", "source": { "osmTags": "mr_taskId~*", - "geoJson": "https://maproulette.org/api/v2/challenge/view/43282", - "isOsmCache": false + "geoJson": "https://maproulette.org/api/v2/challenge/view/43282" }, "title": { "render": "Velopark parking {mr_velopark_id}" @@ -348,5 +336,16 @@ } } ] - } + }, + "lockLocation": [ + [ + 2.51357303225, + 49.5294835476 + ], + [ + 6.15665815596, + 51.4750237087 + ] + ], + "enableNoteImports": false } diff --git a/assets/themes/waste_assen/waste_assen.json b/assets/themes/waste_assen/waste_assen.json index 51af77ecd5..2983968def 100644 --- a/assets/themes/waste_assen/waste_assen.json +++ b/assets/themes/waste_assen/waste_assen.json @@ -27,8 +27,7 @@ "description": "Laag op basis van externe data", "source": { "osmTags": "OBJECTID~*", - "geoJson": "https://opendata.arcgis.com/datasets/5b6953ac5a9d4616a7dc75ab0beeac2f_0.geojson", - "isOsmCache": false + "geoJson": "https://opendata.arcgis.com/datasets/5b6953ac5a9d4616a7dc75ab0beeac2f_0.geojson" }, "calculatedTags": [ "_closest_osm_waste_basket=closest(feat)('waste_basket')?.properties?.id", @@ -71,8 +70,7 @@ "description": "Laag op basis van externe data", "source": { "osmTags": "OBJECTID~*", - "geoJson": "https://opendata.arcgis.com/datasets/edb893998e27461b8ed82aad9854d27d_0.geojson", - "isOsmCache": false + "geoJson": "https://opendata.arcgis.com/datasets/edb893998e27461b8ed82aad9854d27d_0.geojson" }, "calculatedTags": [ "_closest_osm_recycling=closest(feat)('recycling')?.properties?.id", diff --git a/assets/themes/width/width.json b/assets/themes/width/width.json index 0e0f29a709..b8598267d4 100644 --- a/assets/themes/width/width.json +++ b/assets/themes/width/width.json @@ -275,6 +275,5 @@ "enableLayers": false, "enableSearch": false, "enableBackgroundLayerSelection": false, - "widenFactor": 0.05, - "clustering": false + "widenFactor": 0.05 } diff --git a/langs/layers/de.json b/langs/layers/de.json index 5c2f8a7f4f..bf77eb7cfe 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -35,6 +35,16 @@ "1": { "title": "eine freistehende Posterbox" }, + "10": { + "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", + "title": "ein Schild" + }, + "11": { + "title": "eine Skulptur" + }, + "12": { + "title": "eine Wandmalerei" + }, "2": { "title": "eine wandmontierte Posterbox" }, @@ -61,16 +71,6 @@ }, "9": { "title": "ein Totem" - }, - "10": { - "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", - "title": "ein Schild" - }, - "11": { - "title": "eine Skulptur" - }, - "12": { - "title": "eine Wandmalerei" } }, "tagRenderings": { @@ -165,6 +165,9 @@ "1": { "then": "Dies ist ein Brett" }, + "10": { + "then": "Dies ist eine Wandmalerei" + }, "2": { "then": "Dies ist eine Litfaßsäule" }, @@ -188,9 +191,6 @@ }, "9": { "then": "Dies ist ein Totem" - }, - "10": { - "then": "Dies ist eine Wandmalerei" } }, "question": "Welche Art von Werbung ist das?", @@ -205,6 +205,9 @@ "1": { "then": "Brett" }, + "10": { + "then": "Wandmalerei" + }, "2": { "then": "Posterbox" }, @@ -228,9 +231,6 @@ }, "9": { "then": "Totem" - }, - "10": { - "then": "Wandmalerei" } } } @@ -277,6 +277,9 @@ "1": { "then": "Es handelt sich um eine Seilbahn, bei der die Kabinen in ständigen Kreisen fahren" }, + "10": { + "then": "Eine Seilrutsche. (Eine Touristenattraktion, bei der abenteuerlustige Menschen mit hoher Geschwindigkeit hinunterfahren) " + }, "2": { "then": "Ein offener Sessellift mit Sitzgelegenheiten und Zugang zur Außenluft." }, @@ -300,9 +303,6 @@ }, "9": { "then": "Ein magic carpet (ein Förderband auf dem Boden)" - }, - "10": { - "then": "Eine Seilrutsche. (Eine Touristenattraktion, bei der abenteuerlustige Menschen mit hoher Geschwindigkeit hinunterfahren) " } }, "question": "Um welchen Seilbahntyp handelt es sich?" @@ -430,6 +430,15 @@ "1": { "then": "Wandbild" }, + "10": { + "then": "Azulejo (spanische dekorative Fliesenarbeit)" + }, + "11": { + "then": "Fliesenarbeit" + }, + "12": { + "then": "Holzschnitzerei" + }, "2": { "then": "Malerei" }, @@ -453,15 +462,6 @@ }, "9": { "then": "Relief" - }, - "10": { - "then": "Azulejo (spanische dekorative Fliesenarbeit)" - }, - "11": { - "then": "Fliesenarbeit" - }, - "12": { - "then": "Holzschnitzerei" } }, "question": "Um welche Art Kunstwerk handelt es sich?", @@ -2091,6 +2091,27 @@ "1": { "question": "Verfügt über einen
Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)
" }, + "10": { + "question": "Hat einen
Typ 2 (Mennekes)
Anschluss mit Kabel" + }, + "11": { + "question": "Hat einen
Tesla Supercharger CCS (Typ 2 CSS vonTesla)
Anschluss" + }, + "12": { + "question": "Hat einen
Tesla Supercharger (Destination)
Anschluss" + }, + "13": { + "question": "Hat einen
Tesla Supercharger (Destination) (Typ 2 von Tesla)
Anschluss mit Kabel" + }, + "14": { + "question": "Hat einen
USB-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten
" + }, + "15": { + "question": "Hat einen
Bosch Active Connect Anschluss mit 3 Pins
und Kabel" + }, + "16": { + "question": "Hat einen
Bosch Active Connect Anschluss mit 5 Pins
und Kabel" + }, "2": { "question": "Verfügt über einen
europäischen Netzstecker mit Erdungsstift (CEE7/4 Typ E)
Anschluss" }, @@ -2114,27 +2135,6 @@ }, "9": { "question": "Hat einen
Typ 2 CCS (Mennekes)
Anschluss" - }, - "10": { - "question": "Hat einen
Typ 2 (Mennekes)
Anschluss mit Kabel" - }, - "11": { - "question": "Hat einen
Tesla Supercharger CCS (Typ 2 CSS vonTesla)
Anschluss" - }, - "12": { - "question": "Hat einen
Tesla Supercharger (Destination)
Anschluss" - }, - "13": { - "question": "Hat einen
Tesla Supercharger (Destination) (Typ 2 von Tesla)
Anschluss mit Kabel" - }, - "14": { - "question": "Hat einen
USB-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten
" - }, - "15": { - "question": "Hat einen
Bosch Active Connect Anschluss mit 3 Pins
und Kabel" - }, - "16": { - "question": "Hat einen
Bosch Active Connect Anschluss mit 5 Pins
und Kabel" } } } @@ -2190,30 +2190,6 @@ "1": { "then": "Schuko-Stecker ohne Erdungsstift (CEE7/4 Typ F)" }, - "2": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, - "3": { - "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" - }, - "4": { - "then": "Chademo-Anschluss" - }, - "5": { - "then": "Chademo-Anschluss" - }, - "6": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "7": { - "then": "Typ 1 mit Kabel (J1772)" - }, - "8": { - "then": "Typ 1 ohne Kabel (J1772)" - }, - "9": { - "then": " Typ 1 ohne Kabel (J1772)" - }, "10": { "then": "Typ 1 CCS (Typ 1 Combo)" }, @@ -2244,6 +2220,9 @@ "19": { "then": "Typ 2 mit Kabel (mennekes)" }, + "2": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, "20": { "then": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" }, @@ -2274,11 +2253,32 @@ "29": { "then": " Bosch Active Connect mit 3 Pins und Kabel" }, + "3": { + "then": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" + }, "30": { "then": "Bosch Active Connect mit 5 Pins und Kabel" }, "31": { "then": " Bosch Active Connect mit 5 Pins und Kabel" + }, + "4": { + "then": "Chademo-Anschluss" + }, + "5": { + "then": "Chademo-Anschluss" + }, + "6": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "7": { + "then": "Typ 1 mit Kabel (J1772)" + }, + "8": { + "then": "Typ 1 ohne Kabel (J1772)" + }, + "9": { + "then": " Typ 1 ohne Kabel (J1772)" } }, "question": "Welche Ladeanschlüsse gibt es hier?" @@ -2472,6 +2472,24 @@ "1": { "2": "Europäischer Netzstecker mit Erdungsstift (CEE7/4 Typ E)" }, + "10": { + "2": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" + }, + "11": { + "2": "Tesla Supercharger (Destination)" + }, + "12": { + "2": "Tesla Supercharger (Destination) (Typ 2 mit Kabel von Tesla)" + }, + "13": { + "2": "USB zum Aufladen von Handys und kleinen Elektrogeräten" + }, + "14": { + "2": " Bosch Active Connect mit 3 Pins und Kabel" + }, + "15": { + "2": " Bosch Active Connect mit 5 Pins und Kabel" + }, "2": { "2": "Chademo-Stecker" }, @@ -2495,24 +2513,6 @@ }, "9": { "2": "Typ 2 mit Kabel (Mennekes)" - }, - "10": { - "2": "Tesla Supercharger CCS (Typ 2 CSS von Tesla)" - }, - "11": { - "2": "Tesla Supercharger (Destination)" - }, - "12": { - "2": "Tesla Supercharger (Destination) (Typ 2 mit Kabel von Tesla)" - }, - "13": { - "2": "USB zum Aufladen von Handys und kleinen Elektrogeräten" - }, - "14": { - "2": " Bosch Active Connect mit 3 Pins und Kabel" - }, - "15": { - "2": " Bosch Active Connect mit 5 Pins und Kabel" } } } @@ -3310,6 +3310,15 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3333,15 +3342,6 @@ }, "9": { "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieses Radwegs?", @@ -3390,6 +3390,15 @@ "1": { "then": "Dieser Radweg hat einen festen Belag" }, + "10": { + "then": "Dieser Radweg besteht aus feinem Schotter" + }, + "11": { + "then": "Der Radweg ist aus Kies" + }, + "12": { + "then": "Dieser Radweg besteht aus Rohboden" + }, "2": { "then": "Der Radweg ist aus Asphalt" }, @@ -3413,15 +3422,6 @@ }, "9": { "then": "Der Radweg ist aus Schotter" - }, - "10": { - "then": "Dieser Radweg besteht aus feinem Schotter" - }, - "11": { - "then": "Der Radweg ist aus Kies" - }, - "12": { - "then": "Dieser Radweg besteht aus Rohboden" } }, "question": "Was ist der Belag dieser Straße?", @@ -4394,6 +4394,54 @@ } } }, + "10": { + "options": { + "0": { + "question": "Keine Bevorzugung von Hunden" + }, + "1": { + "question": "Hunde erlaubt" + }, + "2": { + "question": "Keine Hunde erlaubt" + } + } + }, + "11": { + "options": { + "0": { + "question": "Internetzugang vorhanden" + } + } + }, + "12": { + "options": { + "0": { + "question": "Stromanschluss vorhanden" + } + } + }, + "13": { + "options": { + "0": { + "question": "Hat zuckerfreie Angebote" + } + } + }, + "14": { + "options": { + "0": { + "question": "Hat glutenfreie Angebote" + } + } + }, + "15": { + "options": { + "0": { + "question": "Hat laktosefreie Angebote" + } + } + }, "2": { "options": { "0": { @@ -4464,54 +4512,6 @@ "question": "Nutzung kostenlos" } } - }, - "10": { - "options": { - "0": { - "question": "Keine Bevorzugung von Hunden" - }, - "1": { - "question": "Hunde erlaubt" - }, - "2": { - "question": "Keine Hunde erlaubt" - } - } - }, - "11": { - "options": { - "0": { - "question": "Internetzugang vorhanden" - } - } - }, - "12": { - "options": { - "0": { - "question": "Stromanschluss vorhanden" - } - } - }, - "13": { - "options": { - "0": { - "question": "Hat zuckerfreie Angebote" - } - } - }, - "14": { - "options": { - "0": { - "question": "Hat glutenfreie Angebote" - } - } - }, - "15": { - "options": { - "0": { - "question": "Hat laktosefreie Angebote" - } - } } } }, @@ -4631,30 +4631,6 @@ "1": { "then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung." }, - "2": { - "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." - }, - "3": { - "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." - }, - "4": { - "then": "Die Fitness-Station hat Stangen zum Dehnen." - }, - "5": { - "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." - }, - "6": { - "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." - }, - "7": { - "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." - }, - "8": { - "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." - }, - "9": { - "then": "Die Fitness-Station hat Pfosten für Slalomübungen." - }, "10": { "then": "Die Fitness-Station hat Trittsteine." }, @@ -4685,6 +4661,9 @@ "19": { "then": "Die Fitness-Station hat Kampfseile (battle ropes)." }, + "2": { + "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." + }, "20": { "then": "Die Fitness-Station hat ein Fahrradergometer." }, @@ -4699,6 +4678,27 @@ }, "24": { "then": "Die Fitness-Station hat eine Slackline." + }, + "3": { + "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." + }, + "4": { + "then": "Die Fitness-Station hat Stangen zum Dehnen." + }, + "5": { + "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." + }, + "6": { + "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." + }, + "7": { + "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." + }, + "8": { + "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." + }, + "9": { + "then": "Die Fitness-Station hat Pfosten für Slalomübungen." } }, "question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?" @@ -4818,6 +4818,21 @@ "1": { "then": "Dies ist eine Pommesbude" }, + "10": { + "then": "Hier werden chinesische Gerichte serviert" + }, + "11": { + "then": "Hier werden griechische Gerichte serviert" + }, + "12": { + "then": "Hier werden indische Gerichte serviert" + }, + "13": { + "then": "Hier werden türkische Gerichte serviert" + }, + "14": { + "then": "Hier werden thailändische Gerichte serviert" + }, "2": { "then": "Bietet vorwiegend Pastagerichte an" }, @@ -4841,21 +4856,6 @@ }, "9": { "then": "Hier werden französische Gerichte serviert" - }, - "10": { - "then": "Hier werden chinesische Gerichte serviert" - }, - "11": { - "then": "Hier werden griechische Gerichte serviert" - }, - "12": { - "then": "Hier werden indische Gerichte serviert" - }, - "13": { - "then": "Hier werden türkische Gerichte serviert" - }, - "14": { - "then": "Hier werden thailändische Gerichte serviert" } }, "question": "Was für Essen gibt es hier?", @@ -5555,30 +5555,6 @@ "1": { "then": "Dies ist ein Auditorium" }, - "2": { - "then": "Dies ist ein Schlafzimmer" - }, - "3": { - "then": "Dies ist eine Kapelle" - }, - "4": { - "then": "Dies ist ein Klassenzimmer" - }, - "5": { - "then": "Dies ist ein Klassenzimmer" - }, - "6": { - "then": "Dies ist ein Computerraum" - }, - "7": { - "then": "Dies ist ein Konferenzraum" - }, - "8": { - "then": "Dies ist eine Krypta" - }, - "9": { - "then": "Dies ist eine Küche" - }, "10": { "then": "Dies ist ein Labor" }, @@ -5609,6 +5585,9 @@ "19": { "then": "Dies ist ein Lagerraum" }, + "2": { + "then": "Dies ist ein Schlafzimmer" + }, "20": { "then": "Dies ist ein Technikraum" }, @@ -5617,6 +5596,27 @@ }, "22": { "then": "Dies ist ein Wartezimmer" + }, + "3": { + "then": "Dies ist eine Kapelle" + }, + "4": { + "then": "Dies ist ein Klassenzimmer" + }, + "5": { + "then": "Dies ist ein Klassenzimmer" + }, + "6": { + "then": "Dies ist ein Computerraum" + }, + "7": { + "then": "Dies ist ein Konferenzraum" + }, + "8": { + "then": "Dies ist eine Krypta" + }, + "9": { + "then": "Dies ist eine Küche" } }, "question": "Wie wird dieser Raum genutzt?" @@ -5658,6 +5658,12 @@ "render": "Informationstafel" } }, + "item_with_image": { + "name": "Element mit mindestens einem Bild", + "title": { + "render": "POI mit Bild" + } + }, "kerbs": { "description": "Eine Ebene, die Bordsteine zeigt.", "filter": { @@ -6274,6 +6280,19 @@ } } }, + "10": { + "options": { + "0": { + "question": "Alle Notizen" + }, + "1": { + "question": "Importnotizen ausblenden" + }, + "2": { + "question": "Nur Importnotizen anzeigen" + } + } + }, "2": { "options": { "0": { @@ -6329,19 +6348,6 @@ "question": "Nur offene Notizen anzeigen" } } - }, - "10": { - "options": { - "0": { - "question": "Alle Notizen" - }, - "1": { - "question": "Importnotizen ausblenden" - }, - "2": { - "question": "Nur Importnotizen anzeigen" - } - } } }, "name": "OpenStreetMap-Hinweise", @@ -6666,6 +6672,18 @@ "1": { "then": "Dies ist ein normaler Stellplatz." }, + "10": { + "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." + }, + "11": { + "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." + }, + "12": { + "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." + }, + "13": { + "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." + }, "2": { "then": "Dies ist ein Behindertenstellplatz." }, @@ -6689,18 +6707,6 @@ }, "9": { "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." - }, - "10": { - "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." - }, - "11": { - "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." - }, - "12": { - "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." - }, - "13": { - "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." } }, "question": "Welche Art von Stellplatz ist dies?" @@ -6993,6 +6999,101 @@ "render": "Spielplatz" } }, + "playground_equipment": { + "description": "Ebene mit Spielplatzausrüstung", + "name": "Spielplatzausstattung", + "presets": { + "0": { + "description": "Ein genauer Typ wird später gefragt", + "title": "ein Spielgerät" + } + }, + "tagRenderings": { + "type": { + "freeform": { + "placeholder": "Art des Geräts" + }, + "mappings": { + "0": { + "then": "Das ist eine Schaukel" + }, + "1": { + "then": "Dies ist eine Struktur aus mehreren angeschlossenen Spielgeräten" + }, + "10": { + "then": "Dies ist ein Seilzug" + }, + "11": { + "then": "Dies ist ein horizontaler Balken" + }, + "12": { + "then": "Dies ist ein Hüpfspiel" + }, + "13": { + "then": "Dies ist ein Planschbecken" + }, + "14": { + "then": "Das ist eine Kletterwand" + }, + "15": { + "then": "Das ist eine Karte" + }, + "16": { + "then": "Dies ist eine Brücke (entweder als eigenständiges Gerät oder als Teil einer größeren Struktur)" + }, + "17": { + "then": "Das ist ein Hüpfkissen" + }, + "18": { + "then": "Dies ist ein Aktivitätspanel" + }, + "19": { + "then": "Dies ist eine Jugendherberge" + }, + "2": { + "then": "Das ist eine Rutsche" + }, + "20": { + "then": "Dies ist ein Trichter, mit dem man Trichterball spielen kann" + }, + "21": { + "then": "Dies ist ein sich drehender Kreis" + }, + "3": { + "then": "Dies ist ein Sandkasten" + }, + "4": { + "then": "Dies ist ein Springreiter" + }, + "5": { + "then": "Dies ist ein Kletterrahmen" + }, + "6": { + "then": "Dies ist eine Wippe" + }, + "7": { + "then": "Das ist ein Spielhaus" + }, + "8": { + "then": "Dies ist ein Karussell" + }, + "9": { + "then": "Dies ist eine Korbschaukel" + } + }, + "question": "Was ist das für ein Gerät?", + "render": "Das ist ein {playground}" + }, + "wheelchair-access": { + "override": { + "question": "Ist dieses Gerät mit Rollstuhl erreichbar?" + } + } + }, + "title": { + "render": "Spielplatzgerät" + } + }, "postboxes": { "description": "Die Ebene zeigt Briefkästen.", "name": "Briefkästen", @@ -7007,6 +7108,43 @@ }, "postoffices": { "description": "Eine Ebene mit Postämtern.", + "filter": { + "1": { + "options": { + "0": { + "question": "Bietet Briefpost an" + } + } + }, + "2": { + "options": { + "0": { + "question": "Bietet Paketaufgabe an" + } + } + }, + "3": { + "options": { + "0": { + "question": "Bietet die Abholung von verpassten Paketen an" + } + } + }, + "4": { + "options": { + "0": { + "question": "Akzeptiert die Abholung von Paketen, die hierher geschickt werden" + } + } + }, + "5": { + "options": { + "0": { + "question": "Verkauft Briefmarken" + } + } + } + }, "name": "Poststellen", "presets": { "0": { @@ -7301,6 +7439,21 @@ "1": { "then": "2-Cent-Münzen werden akzeptiert" }, + "10": { + "then": "20-Centime-Münzen werden akzeptiert" + }, + "11": { + "then": "½-Schweizer Franken-Münzen werden akzeptiert" + }, + "12": { + "then": "1-Schweizer Franken-Münzen werden akzeptiert" + }, + "13": { + "then": "2-Schweizer Franken-Münzen werden akzeptiert" + }, + "14": { + "then": "5-Schweizer Franken-Münzen werden akzeptiert" + }, "2": { "then": "5-Cent-Münzen werden akzeptiert" }, @@ -7324,21 +7477,6 @@ }, "9": { "then": "10-Centime-Münzen werden akzeptiert" - }, - "10": { - "then": "20-Centime-Münzen werden akzeptiert" - }, - "11": { - "then": "½-Schweizer Franken-Münzen werden akzeptiert" - }, - "12": { - "then": "1-Schweizer Franken-Münzen werden akzeptiert" - }, - "13": { - "then": "2-Schweizer Franken-Münzen werden akzeptiert" - }, - "14": { - "then": "5-Schweizer Franken-Münzen werden akzeptiert" } }, "question": "Mit welchen Münzen kann man hier bezahlen?" @@ -7351,6 +7489,15 @@ "1": { "then": "10-Euro-Scheine werden angenommen" }, + "10": { + "then": "100-Schweizer Franken-Scheine werden akzeptiert" + }, + "11": { + "then": "200-Schweizer Franken-Scheine werden akzeptiert" + }, + "12": { + "then": "1000-Schweizer Franken-Scheine werden akzeptiert" + }, "2": { "then": "20-Euro-Scheine werden angenommen" }, @@ -7374,15 +7521,6 @@ }, "9": { "then": "50-Schweizer Franken-Scheine werden akzeptiert" - }, - "10": { - "then": "100-Schweizer Franken-Scheine werden akzeptiert" - }, - "11": { - "then": "200-Schweizer Franken-Scheine werden akzeptiert" - }, - "12": { - "then": "1000-Schweizer Franken-Scheine werden akzeptiert" } }, "question": "Mit welchen Banknoten kann man hier bezahlen?" @@ -7836,30 +7974,6 @@ "1": { "question": "Recycling von Batterien" }, - "2": { - "question": "Recycling von Getränkekartons" - }, - "3": { - "question": "Recycling von Dosen" - }, - "4": { - "question": "Recycling von Kleidung" - }, - "5": { - "question": "Recycling von Speiseöl" - }, - "6": { - "question": "Recycling von Motoröl" - }, - "7": { - "question": "Recycling von Leuchtstoffröhren" - }, - "8": { - "question": "Recycling von Grünabfällen" - }, - "9": { - "question": "Recycling von Glasflaschen" - }, "10": { "question": "Recycling von Glas" }, @@ -7890,11 +8004,35 @@ "19": { "question": "Recycling von Restabfällen" }, + "2": { + "question": "Recycling von Getränkekartons" + }, "20": { "question": "Recycling von Druckerpatronen" }, "21": { "question": "Recycling von Fahrrädern" + }, + "3": { + "question": "Recycling von Dosen" + }, + "4": { + "question": "Recycling von Kleidung" + }, + "5": { + "question": "Recycling von Speiseöl" + }, + "6": { + "question": "Recycling von Motoröl" + }, + "7": { + "question": "Recycling von Leuchtstoffröhren" + }, + "8": { + "question": "Recycling von Grünabfällen" + }, + "9": { + "question": "Recycling von Glasflaschen" } } }, @@ -7962,30 +8100,6 @@ "1": { "then": "Getränkekartons können hier recycelt werden" }, - "2": { - "then": "Dosen können hier recycelt werden" - }, - "3": { - "then": "Kleidung kann hier recycelt werden" - }, - "4": { - "then": "Speiseöl kann hier recycelt werden" - }, - "5": { - "then": "Motoröl kann hier recycelt werden" - }, - "6": { - "then": "Hier können Leuchtstoffröhren recycelt werden" - }, - "7": { - "then": "Grünabfälle können hier recycelt werden" - }, - "8": { - "then": "Bio-Abfall kann hier recycelt werden" - }, - "9": { - "then": "Glasflaschen können hier recycelt werden" - }, "10": { "then": "Glas kann hier recycelt werden" }, @@ -8016,6 +8130,9 @@ "19": { "then": "Schuhe können hier recycelt werden" }, + "2": { + "then": "Dosen können hier recycelt werden" + }, "20": { "then": "Elektrokleingeräte können hier recycelt werden" }, @@ -8030,6 +8147,27 @@ }, "24": { "then": "Fahrräder können hier recycelt werden" + }, + "3": { + "then": "Kleidung kann hier recycelt werden" + }, + "4": { + "then": "Speiseöl kann hier recycelt werden" + }, + "5": { + "then": "Motoröl kann hier recycelt werden" + }, + "6": { + "then": "Hier können Leuchtstoffröhren recycelt werden" + }, + "7": { + "then": "Grünabfälle können hier recycelt werden" + }, + "8": { + "then": "Bio-Abfall kann hier recycelt werden" + }, + "9": { + "then": "Glasflaschen können hier recycelt werden" } }, "question": "Was kann hier recycelt werden?" @@ -8563,13 +8701,123 @@ "render": "Geschwindigkeitsreduzierte Straße" } }, - "souvenir_note": { + "souvenir_coin": { + "description": "Ebene mit Automaten, die Souvenir-Münzen verkaufen", + "name": "Souvenir-Münzautomaten", + "presets": { + "0": { + "description": "Hinzufügen eines Automaten für Souvenirmünzen", + "title": "ein Souvenir-Münzautomaten" + } + }, "tagRenderings": { + "charge": { + "freeform": { + "placeholder": "Kosten (z.B. 2 EUR)" + }, + "mappings": { + "0": { + "then": "Eine Souvenirmünze kostet 2 Euro" + } + }, + "question": "Wie viel kostet eine Souvenirmünze?", + "render": "Eine Souvenirmünze kostet {charge}" + }, + "designs": { + "override": { + "mappings": { + "0": { + "then": "Diese Maschine hat ein Design zur Verfügung" + }, + "1": { + "then": "Diese Maschine hat zwei Designs verfügbar" + }, + "2": { + "then": "Diese Maschine hat drei Designs verfügbar" + }, + "3": { + "then": "Diese Maschine hat vier Designs verfügbar" + } + }, + "render": "Diese Maschine hat {coin:design_count} Designs verfügbar" + } + }, + "indoor": { + "mappings": { + "0": { + "then": "Diese Maschine befindet sich im Innenbereich." + }, + "1": { + "then": "Diese Maschine befindet sich im Freien." + } + }, + "question": "Ist diese Maschine im Innenbereich?" + } + }, + "title": { + "render": "Souvenir-Münzautomat" + } + }, + "souvenir_note": { + "description": "Ebene zeigt Maschinen, die Souvenir-Banknoten verkaufen", + "name": "Souvenir Banknotenmaschinen", + "presets": { + "0": { + "description": "Hinzufügen eines Automaten, der Souvenir-Banknoten verkauft", + "title": "eine Souvenir-Banknotenmaschine" + } + }, + "tagRenderings": { + "charge": { + "freeform": { + "placeholder": "Kosten (z.B. 2 EUR)" + }, + "mappings": { + "0": { + "then": "Eine Souvenirnote kostet 2 Euro" + }, + "1": { + "then": "Eine Souvenirnote kostet 3 Euro" + } + }, + "question": "Wie viel kostet eine Souvenirnote?", + "render": "Eine Souvenirnote kostet {charge}" + }, "designs": { "freeform": { "placeholder": "Motivanzahl (z.B. 5)" - } + }, + "mappings": { + "0": { + "then": "Diese Maschine hat ein Design zur Verfügung." + }, + "1": { + "then": "Diese Maschine hat zwei Designs verfügbar." + }, + "2": { + "then": "Diese Maschine hat drei Designs verfügbar." + }, + "3": { + "then": "Diese Maschine hat vier Designs verfügbar." + } + }, + "question": "Wie viele Designs sind verfügbar?", + "render": "Diese Maschine verfügt über {note:design_count} Designs." + }, + "indoor": { + "mappings": { + "0": { + "then": "Diese Maschine befindet sich im Innenbereich." + }, + "1": { + "then": "Diese Maschine befindet sich im Freien." + } + }, + "question": "Ist diese Maschine im Innenbereich?" } + }, + "title": { + "render": "Souvenir-Banknotenautomat" } }, "speed_camera": { @@ -8981,6 +9229,12 @@ "1": { "then": "Diese Straßenlaterne verwendet LEDs" }, + "10": { + "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" + }, + "11": { + "then": "Diese Straßenlaterne wird mit Gas beleuchtet" + }, "2": { "then": "Diese Straßenlaterne verwendet Glühlampenlicht" }, @@ -9004,12 +9258,6 @@ }, "9": { "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" - }, - "10": { - "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" - }, - "11": { - "then": "Diese Straßenlaterne wird mit Gas beleuchtet" } }, "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" @@ -9072,6 +9320,11 @@ "render": "Stripclub" } }, + "summary": { + "title": { + "render": "Übersicht" + } + }, "surveillance_camera": { "description": "Diese Ebene zeigt die Überwachungskameras an und ermöglicht es, Informationen zu aktualisieren und neue Kameras hinzuzufügen", "name": "Überwachungskameras", @@ -10399,30 +10652,6 @@ "1": { "question": "Verkauf von Getränken" }, - "2": { - "question": "Verkauf von Süßigkeiten" - }, - "3": { - "question": "Verkauf von Lebensmitteln" - }, - "4": { - "question": "Verkauf von Zigaretten" - }, - "5": { - "question": "Verkauf von Kondomen" - }, - "6": { - "question": "Verkauf von Kaffee" - }, - "7": { - "question": "Verkauf von Trinkwasser" - }, - "8": { - "question": "Verkauf von Zeitungen" - }, - "9": { - "question": "Verkauf von Fahrradschläuchen" - }, "10": { "question": "Verkauf von Milch" }, @@ -10453,6 +10682,9 @@ "19": { "question": "Verkauf von Blumen" }, + "2": { + "question": "Verkauf von Süßigkeiten" + }, "20": { "question": "Verkauf von Parkscheinen" }, @@ -10476,6 +10708,27 @@ }, "27": { "question": "Verkauf von Fahrradschlössern" + }, + "3": { + "question": "Verkauf von Lebensmitteln" + }, + "4": { + "question": "Verkauf von Zigaretten" + }, + "5": { + "question": "Verkauf von Kondomen" + }, + "6": { + "question": "Verkauf von Kaffee" + }, + "7": { + "question": "Verkauf von Trinkwasser" + }, + "8": { + "question": "Verkauf von Zeitungen" + }, + "9": { + "question": "Verkauf von Fahrradschläuchen" } } } @@ -10522,30 +10775,6 @@ "1": { "then": "Süßigkeiten werden verkauft" }, - "2": { - "then": "Lebensmittel werden verkauft" - }, - "3": { - "then": "Zigaretten werden verkauft" - }, - "4": { - "then": "Kondome werden verkauft" - }, - "5": { - "then": "Kaffee wird verkauft" - }, - "6": { - "then": "Trinkwasser wird verkauft" - }, - "7": { - "then": "Zeitungen werden verkauft" - }, - "8": { - "then": "Fahrradschläuche werden verkauft" - }, - "9": { - "then": "Milch wird verkauft" - }, "10": { "then": "Brot wird verkauft" }, @@ -10576,6 +10805,9 @@ "19": { "then": "Parkscheine werden verkauft" }, + "2": { + "then": "Lebensmittel werden verkauft" + }, "20": { "then": "Souvenirmünzen werden verkauft" }, @@ -10596,6 +10828,27 @@ }, "26": { "then": "Fahrradschlösser werden verkauft" + }, + "3": { + "then": "Zigaretten werden verkauft" + }, + "4": { + "then": "Kondome werden verkauft" + }, + "5": { + "then": "Kaffee wird verkauft" + }, + "6": { + "then": "Trinkwasser wird verkauft" + }, + "7": { + "then": "Zeitungen werden verkauft" + }, + "8": { + "then": "Fahrradschläuche werden verkauft" + }, + "9": { + "then": "Milch wird verkauft" } }, "question": "Was wird in diesem Automaten verkauft?", @@ -10887,4 +11140,4 @@ "render": "Windrad" } } -} \ No newline at end of file +} diff --git a/langs/layers/fr.json b/langs/layers/fr.json index d9c150f98a..710d51ef2c 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -33,6 +33,16 @@ "1": { "title": "un panneau à affiches scellé au sol" }, + "10": { + "description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", + "title": "une enseigne" + }, + "11": { + "title": "une sculpture" + }, + "12": { + "title": "une peinture murale" + }, "2": { "title": "un panneau à affiches monté sur un mur" }, @@ -59,16 +69,6 @@ }, "9": { "title": "un totem" - }, - "10": { - "description": "Désigne une enseigne publicitaire, une enseigne néon, les logos ou des indications d'entrées", - "title": "une enseigne" - }, - "11": { - "title": "une sculpture" - }, - "12": { - "title": "une peinture murale" } }, "tagRenderings": { @@ -160,6 +160,9 @@ "1": { "then": "C'est un petit panneau" }, + "10": { + "then": "C'est une peinture murale" + }, "2": { "then": "C'est une colonne" }, @@ -183,9 +186,6 @@ }, "9": { "then": "C'est un totem" - }, - "10": { - "then": "C'est une peinture murale" } }, "question": "De quel type de dispositif publicitaire s'agit-il ?" @@ -196,6 +196,9 @@ "1": { "then": "Petit panneau" }, + "10": { + "then": "Peinture murale" + }, "3": { "then": "Colonne" }, @@ -216,9 +219,6 @@ }, "9": { "then": "Totem" - }, - "10": { - "then": "Peinture murale" } } } @@ -300,6 +300,15 @@ "1": { "then": "Peinture murale" }, + "10": { + "then": "Azulejo (faïence latine)" + }, + "11": { + "then": "Carrelage" + }, + "12": { + "then": "Sculpture sur bois" + }, "2": { "then": "Peinture" }, @@ -323,15 +332,6 @@ }, "9": { "then": "Relief" - }, - "10": { - "then": "Azulejo (faïence latine)" - }, - "11": { - "then": "Carrelage" - }, - "12": { - "then": "Sculpture sur bois" } }, "question": "Quel est le type de cette œuvre d'art ?", @@ -1644,7 +1644,7 @@ }, "2": { "description": "Un café pour prendre un thé, un café ou une boisson alcoolisée dans un environnement calme", - "title": "un café" + "title": "un café adama" }, "3": { "description": "Une boîte de nuit ou discothèque pour danser sur de la musique de DJ accompagnée de jeux de lumière et un bar pour prendre une boisson (alcoolisée)", @@ -2408,6 +2408,15 @@ "1": { "then": "Cette piste cyclable est goudronée" }, + "10": { + "then": "Cette piste cyclable est faite en graviers fins" + }, + "11": { + "then": "Cette piste cyclable est en cailloux" + }, + "12": { + "then": "Cette piste cyclable est faite en sol brut" + }, "2": { "then": "Cette piste cyclable est asphaltée" }, @@ -2431,15 +2440,6 @@ }, "9": { "then": "Cette piste cyclable est faite en graviers" - }, - "10": { - "then": "Cette piste cyclable est faite en graviers fins" - }, - "11": { - "then": "Cette piste cyclable est en cailloux" - }, - "12": { - "then": "Cette piste cyclable est faite en sol brut" } }, "question": "De quoi est faite la surface de la piste cyclable ?", @@ -2488,6 +2488,15 @@ "1": { "then": "Cette piste cyclable est pavée" }, + "10": { + "then": "Cette piste cyclable est faite en graviers fins" + }, + "11": { + "then": "Cette piste cyclable est en cailloux" + }, + "12": { + "then": "Cette piste cyclable est faite en sol brut" + }, "2": { "then": "Cette piste cyclable est asphaltée" }, @@ -2511,15 +2520,6 @@ }, "9": { "then": "Cette piste cyclable est faite en graviers" - }, - "10": { - "then": "Cette piste cyclable est faite en graviers fins" - }, - "11": { - "then": "Cette piste cyclable est en cailloux" - }, - "12": { - "then": "Cette piste cyclable est faite en sol brut" } }, "question": "De quel materiel est faite cette rue ?", @@ -3351,6 +3351,21 @@ "1": { "then": "C'est une friterie" }, + "10": { + "then": "Des plats chinois sont servis ici" + }, + "11": { + "then": "Des plats grecs sont servis ici" + }, + "12": { + "then": "Des plats indiens sont servis ici" + }, + "13": { + "then": "Des plats turcs sont servis ici" + }, + "14": { + "then": "Des plats thaïlandais sont servis ici" + }, "2": { "then": "Restaurant Italien" }, @@ -3374,21 +3389,6 @@ }, "9": { "then": "Des plats français sont servis ici" - }, - "10": { - "then": "Des plats chinois sont servis ici" - }, - "11": { - "then": "Des plats grecs sont servis ici" - }, - "12": { - "then": "Des plats indiens sont servis ici" - }, - "13": { - "then": "Des plats turcs sont servis ici" - }, - "14": { - "then": "Des plats thaïlandais sont servis ici" } }, "question": "Quelle type de nourriture est servie ici ?", @@ -4933,30 +4933,6 @@ "1": { "question": "Recyclage de piles et batteries domestiques" }, - "2": { - "question": "Recyclage d'emballage de boissons" - }, - "3": { - "question": "Recyclage de boites de conserve et de canettes" - }, - "4": { - "question": "Recyclage de vêtements" - }, - "5": { - "question": "Recyclage des huiles de friture" - }, - "6": { - "question": "Recyclage des huiles de moteur" - }, - "7": { - "question": "Recyclage des lampes fluorescentes" - }, - "8": { - "question": "Recyclage des déchets verts" - }, - "9": { - "question": "Recyclage des bouteilles en verre et des bocaux" - }, "10": { "question": "Recyclage de tout type de verre" }, @@ -4987,11 +4963,35 @@ "19": { "question": "Recyclage des autres déchets" }, + "2": { + "question": "Recyclage d'emballage de boissons" + }, "20": { "question": "Recyclage des cartouches d'imprimante" }, "21": { "question": "Recyclage des vélos" + }, + "3": { + "question": "Recyclage de boites de conserve et de canettes" + }, + "4": { + "question": "Recyclage de vêtements" + }, + "5": { + "question": "Recyclage des huiles de friture" + }, + "6": { + "question": "Recyclage des huiles de moteur" + }, + "7": { + "question": "Recyclage des lampes fluorescentes" + }, + "8": { + "question": "Recyclage des déchets verts" + }, + "9": { + "question": "Recyclage des bouteilles en verre et des bocaux" } } }, @@ -5054,30 +5054,6 @@ "1": { "then": "Les briques alimentaires en carton peuvent être recyclées ici" }, - "2": { - "then": "Les boites de conserve et canettes peuvent être recyclées ici" - }, - "3": { - "then": "Les vêtements peuvent être recyclés ici" - }, - "4": { - "then": "Les huiles de friture peuvent être recyclées ici" - }, - "5": { - "then": "Les huiles de moteur peuvent être recyclées ici" - }, - "6": { - "then": "Les lampes fluorescentes peuvent être recyclées ici" - }, - "7": { - "then": "Les déchets verts peuvent être recyclés ici" - }, - "8": { - "then": "Les déchets organiques peuvent être recyclés ici" - }, - "9": { - "then": "Les bouteilles en verre et bocaux peuvent être recyclés ici" - }, "10": { "then": "Tout type de verre peut être recyclé ici" }, @@ -5108,6 +5084,9 @@ "19": { "then": "Les chaussures peuvent être recyclées ici" }, + "2": { + "then": "Les boites de conserve et canettes peuvent être recyclées ici" + }, "20": { "then": "Les petits appareils électriques peuvent être recyclés ici" }, @@ -5122,6 +5101,27 @@ }, "24": { "then": "Les vélos peuvent être recyclés ici" + }, + "3": { + "then": "Les vêtements peuvent être recyclés ici" + }, + "4": { + "then": "Les huiles de friture peuvent être recyclées ici" + }, + "5": { + "then": "Les huiles de moteur peuvent être recyclées ici" + }, + "6": { + "then": "Les lampes fluorescentes peuvent être recyclées ici" + }, + "7": { + "then": "Les déchets verts peuvent être recyclés ici" + }, + "8": { + "then": "Les déchets organiques peuvent être recyclés ici" + }, + "9": { + "then": "Les bouteilles en verre et bocaux peuvent être recyclés ici" } }, "question": "Que peut-on recycler ici ?" @@ -6428,6 +6428,27 @@ "1": { "question": "Vente de boissons" }, + "10": { + "question": "Vente de lait" + }, + "11": { + "question": "Vente de pain" + }, + "12": { + "question": "Vente d'œufs" + }, + "13": { + "question": "Vente de fromage" + }, + "14": { + "question": "Vente de miel" + }, + "15": { + "question": "Vente de pommes de terre" + }, + "19": { + "question": "Vente de fleurs" + }, "2": { "question": "Ventre de confiseries" }, @@ -6451,27 +6472,6 @@ }, "9": { "question": "Vente de chambres à air pour vélo" - }, - "10": { - "question": "Vente de lait" - }, - "11": { - "question": "Vente de pain" - }, - "12": { - "question": "Vente d'œufs" - }, - "13": { - "question": "Vente de fromage" - }, - "14": { - "question": "Vente de miel" - }, - "15": { - "question": "Vente de pommes de terre" - }, - "19": { - "question": "Vente de fleurs" } } } @@ -6512,6 +6512,24 @@ "1": { "then": "Vent des confiseries" }, + "10": { + "then": "Vent du pain" + }, + "11": { + "then": "Vent des œufs" + }, + "12": { + "then": "Vent du fromage" + }, + "13": { + "then": "Vent du miel" + }, + "14": { + "then": "Vent des pommes de terre" + }, + "18": { + "then": "Vent des fleurs" + }, "2": { "then": "Vent de la nourriture" }, @@ -6535,24 +6553,6 @@ }, "9": { "then": "Vent du lait" - }, - "10": { - "then": "Vent du pain" - }, - "11": { - "then": "Vent des œufs" - }, - "12": { - "then": "Vent du fromage" - }, - "13": { - "then": "Vent du miel" - }, - "14": { - "then": "Vent des pommes de terre" - }, - "18": { - "then": "Vent des fleurs" } }, "question": "Que vent ce distributeur ?", @@ -6755,4 +6755,4 @@ "render": "éolienne" } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 8eec40b888..9038bcc870 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.40.0", + "version": "0.40.2", "repository": "https://github.com/pietervdvn/MapComplete", "description": "A small website to edit OSM easily", "bugs": "https://github.com/pietervdvn/MapComplete/issues", diff --git a/scripts/osm2pgsql/tilecountServer.ts b/scripts/osm2pgsql/tilecountServer.ts index 6f92f6e8e1..86aa8c4d73 100644 --- a/scripts/osm2pgsql/tilecountServer.ts +++ b/scripts/osm2pgsql/tilecountServer.ts @@ -162,7 +162,7 @@ class CachedSqlCount { const connectionString = "postgresql://user:password@localhost:5444/osm-poi" const tcs = new OsmPoiDatabase(connectionString) -const withCache = new CachedSqlCount(tcs, 60 * 60 * 24) +const withCache = new CachedSqlCount(tcs, 14 * 60 * 60 * 24) new Server(2345, { ignorePathPrefix: ["summary"] }, [ { mustMatch: "status.json", diff --git a/src/Logic/Actors/SelectedElementTagsUpdater.ts b/src/Logic/Actors/SelectedElementTagsUpdater.ts index 37297111d1..8954442105 100644 --- a/src/Logic/Actors/SelectedElementTagsUpdater.ts +++ b/src/Logic/Actors/SelectedElementTagsUpdater.ts @@ -1,26 +1,12 @@ /** * This actor will download the latest version of the selected element from OSM and update the tags if necessary. */ -import { UIEventSource } from "../UIEventSource" -import { Changes } from "../Osm/Changes" -import { OsmConnection } from "../Osm/OsmConnection" -import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig" import SimpleMetaTagger from "../SimpleMetaTagger" -import { Feature } from "geojson" import { OsmTags } from "../../Models/OsmFeature" -import OsmObjectDownloader from "../Osm/OsmObjectDownloader" -import { IndexedFeatureSource } from "../FeatureSource/FeatureSource" import { Utils } from "../../Utils" - -interface TagsUpdaterState { - selectedElement: UIEventSource - featureProperties: { getStore: (id: string) => UIEventSource> } - changes: Changes - osmConnection: OsmConnection - layout: LayoutConfig - osmObjectDownloader: OsmObjectDownloader - indexedFeatures: IndexedFeatureSource -} +import ThemeViewState from "../../Models/ThemeViewState" +import { BBox } from "../BBox" +import { Feature } from "geojson" export default class SelectedElementTagsUpdater { private static readonly metatags = new Set([ @@ -31,19 +17,21 @@ export default class SelectedElementTagsUpdater { "uid", "id", ]) + private readonly state: ThemeViewState - constructor(state: TagsUpdaterState) { + constructor(state: ThemeViewState) { + this.state = state state.osmConnection.isLoggedIn.addCallbackAndRun((isLoggedIn) => { if (!isLoggedIn && !Utils.runningFromConsole) { return } - this.installCallback(state) + this.installCallback() // We only have to do this once... return true }) } - public static applyUpdate(latestTags: OsmTags, id: string, state: TagsUpdaterState) { + public static applyUpdate(latestTags: OsmTags, id: string, state: ThemeViewState) { try { const leftRightSensitive = state.layout.isLeftRightSensitive() @@ -120,8 +108,13 @@ export default class SelectedElementTagsUpdater { console.error("Updating the tags of selected element ", id, "failed due to", e) } } - - private installCallback(state: TagsUpdaterState) { + private invalidateCache(s: Feature) { + const state = this.state + const wasPartOfLayer = state.layout.getMatchingLayer(s.properties) + state.toCacheSavers.get(wasPartOfLayer.id).invalidateCacheAround(BBox.get(s)) + } + private installCallback() { + const state = this.state state.selectedElement.addCallbackAndRunD(async (s) => { let id = s.properties?.id if (!id) { @@ -146,9 +139,9 @@ export default class SelectedElementTagsUpdater { const osmObject = await state.osmObjectDownloader.DownloadObjectAsync(id) if (osmObject === "deleted") { console.debug("The current selected element has been deleted upstream!", id) + this.invalidateCache(s) const currentTagsSource = state.featureProperties.getStore(id) currentTagsSource.data["_deleted"] = "yes" - currentTagsSource.addCallbackAndRun((tags) => console.trace("Tags are", tags)) currentTagsSource.ping() return } @@ -158,6 +151,7 @@ export default class SelectedElementTagsUpdater { const oldGeometry = oldFeature?.geometry if (oldGeometry !== undefined && !Utils.SameObject(newGeometry, oldGeometry)) { console.log("Detected a difference in geometry for ", id) + this.invalidateCache(s) oldFeature.geometry = newGeometry state.featureProperties.getStore(id)?.ping() } diff --git a/src/Logic/BBox.ts b/src/Logic/BBox.ts index e69499c7ae..fd5ef5e5b5 100644 --- a/src/Logic/BBox.ts +++ b/src/Logic/BBox.ts @@ -45,15 +45,16 @@ export class BBox { ]) } - static get(feature): BBox { - if (feature.bbox?.overlapsWith === undefined) { + static get(feature: Feature): BBox { + const f = feature + if (f.bbox?.overlapsWith === undefined) { const turfBbox: number[] = turf.bbox(feature) - feature.bbox = new BBox([ + f["bbox"] = new BBox([ [turfBbox[0], turfBbox[1]], [turfBbox[2], turfBbox[3]], ]) } - return feature.bbox + return f["bbox"] } static bboxAroundAll(bboxes: BBox[]): BBox { diff --git a/src/Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage.ts b/src/Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage.ts index fdfa4e21da..bc26ce3f56 100644 --- a/src/Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage.ts +++ b/src/Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage.ts @@ -5,6 +5,8 @@ import { GeoOperations } from "../../GeoOperations" import FeaturePropertiesStore from "./FeaturePropertiesStore" import { UIEventSource } from "../../UIEventSource" import { Utils } from "../../../Utils" +import { Tiles } from "../../../Models/TileRange" +import { BBox } from "../../BBox" class SingleTileSaver { private readonly _storage: UIEventSource @@ -54,6 +56,8 @@ class SingleTileSaver { * Also see the sibling class */ export default class SaveFeatureSourceToLocalStorage { + public readonly storage: TileLocalStorage + private zoomlevel: number constructor( backend: string, layername: string, @@ -62,7 +66,9 @@ export default class SaveFeatureSourceToLocalStorage { featureProperties: FeaturePropertiesStore, maxCacheAge: number ) { + this.zoomlevel = zoomlevel const storage = TileLocalStorage.construct(backend, layername, maxCacheAge) + this.storage = storage const singleTileSavers: Map = new Map() features.features.addCallbackAndRunD((features) => { const sliced = GeoOperations.slice(zoomlevel, features) @@ -80,4 +86,12 @@ export default class SaveFeatureSourceToLocalStorage { }) }) } + + public invalidateCacheAround(bbox: BBox) { + const range = Tiles.tileRangeFrom(bbox, this.zoomlevel) + Tiles.MapRange(range, (x, y) => { + const index = Tiles.tile_index(this.zoomlevel, x, y) + this.storage.invalidate(index) + }) + } } diff --git a/src/Logic/FeatureSource/Actors/TileLocalStorage.ts b/src/Logic/FeatureSource/Actors/TileLocalStorage.ts index a02f03e107..5bac139d49 100644 --- a/src/Logic/FeatureSource/Actors/TileLocalStorage.ts +++ b/src/Logic/FeatureSource/Actors/TileLocalStorage.ts @@ -1,5 +1,6 @@ import { IdbLocalStorage } from "../../Web/IdbLocalStorage" import { UIEventSource } from "../../UIEventSource" +import { Tiles } from "../../../Models/TileRange" /** * A class which allows to read/write a tile to local storage. @@ -91,9 +92,17 @@ export default class TileLocalStorage { await IdbLocalStorage.GetDirectly(this._layername + "_" + tileIndex + "_date") ) const maxAge = this._maxAgeSeconds - const timeDiff = Date.now() - date + const timeDiff = (Date.now() - date) / 1000 if (timeDiff >= maxAge) { - console.debug("Dropping cache for", this._layername, tileIndex, "out of date") + console.debug( + "Dropping cache for", + this._layername, + tileIndex, + "out of date. Max allowed age is", + maxAge, + "current age is", + timeDiff + ) await IdbLocalStorage.SetDirectly(this._layername + "_" + tileIndex, undefined) return undefined @@ -102,7 +111,8 @@ export default class TileLocalStorage { return data } - invalidate(zoomlevel: number, tileIndex) { + public invalidate(tileIndex: number) { + console.log("Invalidated tile", tileIndex) this.getTileSource(tileIndex).setData(undefined) } } diff --git a/src/Logic/FeatureSource/Sources/LayoutSource.ts b/src/Logic/FeatureSource/Sources/LayoutSource.ts index dcb19e089f..36f1baef8e 100644 --- a/src/Logic/FeatureSource/Sources/LayoutSource.ts +++ b/src/Logic/FeatureSource/Sources/LayoutSource.ts @@ -26,6 +26,8 @@ export default class LayoutSource extends FeatureSourceMerger { private readonly supportsForceDownload: UpdatableFeatureSource[] + private readonly fromCache: Map + public static readonly fromCacheZoomLevel = 15 constructor( layers: LayerConfig[], featureSwitches: FeatureSwitchState, @@ -43,13 +45,21 @@ export default class LayoutSource extends FeatureSourceMerger { const geojsonlayers = layers.filter((layer) => layer.source.geojsonSource !== undefined) const osmLayers = layers.filter((layer) => layer.source.geojsonSource === undefined) - const fromCache = osmLayers.map( - (l) => - new LocalStorageFeatureSource(backend, l, 15, mapProperties, { - isActive: isDisplayed(l.id), - maxAge: l.maxAgeOfCache, - }) - ) + const fromCache = new Map() + for (const layer of osmLayers) { + const src = new LocalStorageFeatureSource( + backend, + layer, + LayoutSource.fromCacheZoomLevel, + mapProperties, + { + isActive: isDisplayed(layer.id), + maxAge: layer.maxAgeOfCache, + } + ) + fromCache.set(layer.id, src) + } + const mvtSources: UpdatableFeatureSource[] = osmLayers .filter((f) => mvtAvailableLayers.has(f.id)) .map((l) => LayoutSource.setupMvtSource(l, mapProperties, isDisplayed(l.id))) @@ -92,9 +102,10 @@ export default class LayoutSource extends FeatureSourceMerger { LayoutSource.setupGeojsonSource(l, mapProperties, isDisplayed(l.id)) ) - super(...geojsonSources, ...fromCache, ...mvtSources, ...nonMvtSources) + super(...geojsonSources, ...Array.from(fromCache.values()), ...mvtSources, ...nonMvtSources) this.isLoading = isLoading + this.fromCache = fromCache supportsForceDownload.push(...geojsonSources) supportsForceDownload.push(...mvtSources) // Non-mvt sources are handled by overpass this.supportsForceDownload = supportsForceDownload diff --git a/src/Logic/FeatureSource/TiledFeatureSource/LocalStorageFeatureSource.ts b/src/Logic/FeatureSource/TiledFeatureSource/LocalStorageFeatureSource.ts index 11ce410809..5efb4c5528 100644 --- a/src/Logic/FeatureSource/TiledFeatureSource/LocalStorageFeatureSource.ts +++ b/src/Logic/FeatureSource/TiledFeatureSource/LocalStorageFeatureSource.ts @@ -27,14 +27,14 @@ export default class LocalStorageFeatureSource extends DynamicTileSource { options?.maxAge ?? 24 * 60 * 60 ) super( - new ImmutableStore(zoomlevel), + new ImmutableStore(zoomlevel), layer.minzoom, (tileIndex) => new StaticFeatureSource( storage.getTileSource(tileIndex).mapD((features) => { if (features.length === undefined) { console.trace("These are not features:", features) - storage.invalidate(zoomlevel, tileIndex) + storage.invalidate(tileIndex) return [] } return features.filter((f) => !f.properties.id.match(/(node|way)\/-[0-9]+/)) diff --git a/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts b/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts index 05c95e6188..9a8d59cb23 100644 --- a/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts +++ b/src/Models/ThemeConfig/Conversion/CreateNoteImportLayer.ts @@ -92,7 +92,6 @@ export default class CreateNoteImportLayer extends Conversion = new UIEventSource(false) + public readonly toCacheSavers: ReadonlyMap constructor(layout: LayoutConfig, mvtAvailableLayers: Set) { Utils.initDomPurify() @@ -295,16 +296,6 @@ export default class ThemeViewState implements SpecialVisualizationState { ) this.perLayer = perLayer.perLayer } - this.perLayer.forEach((fs) => { - new SaveFeatureSourceToLocalStorage( - this.osmConnection.Backend(), - fs.layer.layerDef.id, - 15, - fs, - this.featureProperties, - fs.layer.layerDef.maxAgeOfCache - ) - }) this.floors = this.featuresInView.features.stabilized(500).map((features) => { if (!features) { @@ -366,6 +357,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.favourites = new FavouritesFeatureSource(this) this.featureSummary = this.setupSummaryLayer() + this.toCacheSavers = this.initSaveToLocalStorage() this.initActors() this.drawSpecialLayers() this.initHotkeys() @@ -391,6 +383,25 @@ export default class ThemeViewState implements SpecialVisualizationState { }) } + public initSaveToLocalStorage() { + const toLocalStorage = new Map() + this.perLayer.forEach((fs, layerId) => { + if (fs.layer.layerDef.source.geojsonSource !== undefined) { + return // We don't cache external data layers + } + console.log("Setting up a local store feature sink for", layerId) + const storage = new SaveFeatureSourceToLocalStorage( + this.osmConnection.Backend(), + fs.layer.layerDef.id, + LayoutSource.fromCacheZoomLevel, + fs, + this.featureProperties, + fs.layer.layerDef.maxAgeOfCache + ) + toLocalStorage.set(layerId, storage) + }) + return toLocalStorage + } public showNormalDataOn(map: Store): ReadonlyMap { const filteringFeatureSource = new Map() this.perLayer.forEach((fs, layerName) => { diff --git a/src/UI/BigComponents/SelectedElementTitle.svelte b/src/UI/BigComponents/SelectedElementTitle.svelte index be5aeaf32c..084f5e725f 100644 --- a/src/UI/BigComponents/SelectedElementTitle.svelte +++ b/src/UI/BigComponents/SelectedElementTitle.svelte @@ -13,12 +13,15 @@ export let layer: LayerConfig export let selectedElement: Feature let tags: UIEventSource> = state.featureProperties.getStore( - selectedElement.properties.id + selectedElement.properties.id, ) $: { tags = state.featureProperties.getStore(selectedElement.properties.id) } + let isTesting = state.featureSwitchIsTesting + let isDebugging = state.featureSwitches.featureSwitchIsDebugging + let metatags: Store> = state.userRelatedState.preferencesAsTags @@ -39,7 +42,7 @@ class="no-weblate title-icons links-as-button mr-2 flex flex-row flex-wrap items-center gap-x-0.5 pt-0.5 sm:pt-1" > {#each layer.titleIcons as titleIconConfig} - {#if (titleIconConfig.condition?.matchesProperties($tags) ?? true) && (titleIconConfig.metacondition?.matchesProperties( { ...$metatags, ...$tags } ) ?? true) && titleIconConfig.IsKnown($tags)} + {#if (titleIconConfig.condition?.matchesProperties($tags) ?? true) && (titleIconConfig.metacondition?.matchesProperties({ ...$metatags, ...$tags }) ?? true) && titleIconConfig.IsKnown($tags)}
{/if} {/each} + + {#if $isTesting || $isDebugging} + {layer.id} + {/if}
@@ -68,7 +75,7 @@ {/if} diff --git a/src/UI/BigComponents/ShareScreen.svelte b/src/UI/BigComponents/ShareScreen.svelte index 16633d63ec..fb90ed12a4 100644 --- a/src/UI/BigComponents/ShareScreen.svelte +++ b/src/UI/BigComponents/ShareScreen.svelte @@ -11,10 +11,11 @@ import Tr from "../Base/Tr.svelte" import Translations from "../i18n/Translations" import { Utils } from "../../Utils" - import Svg from "../../Svg" - import ToSvelte from "../Base/ToSvelte.svelte" import { DocumentDuplicateIcon } from "@rgossiaux/svelte-heroicons/outline" import Share from "../../assets/svg/Share.svelte" + import ToSvelte from "../Base/ToSvelte.svelte" + import Img from "../Base/Img" + import Qr from "../../Utils/Qr" export let state: ThemeViewState const tr = Translations.t.general.sharescreen @@ -69,22 +70,32 @@ } -
- -
- {#if typeof navigator?.share === "function"} - - {/if} - {#if navigator.clipboard !== undefined} - - {/if} -
Utils.selectTextIn(e.target)}> - {linkToShare} +
+
+ +
+ + +
+ {#if typeof navigator?.share === "function"} + + {/if} + {#if navigator.clipboard !== undefined} + + {/if} +
Utils.selectTextIn(e.target)}> + {linkToShare} +
+
+ + new Img(new Qr(linkToShare).toImageElement(125)).SetStyle( + "width: 125px" + )} />
@@ -95,29 +106,31 @@ - diff --git a/src/UI/Map/ShowDataLayer.ts b/src/UI/Map/ShowDataLayer.ts index 295d1fac1f..255df6676c 100644 --- a/src/UI/Map/ShowDataLayer.ts +++ b/src/UI/Map/ShowDataLayer.ts @@ -276,7 +276,6 @@ class LineRenderingLayer { }, } const filter = img.if?.asMapboxExpression() - console.log(">>>", this._layername, imgId, img.if, "-->", filter) if (filter) { spec.filter = filter } @@ -552,14 +551,13 @@ export default class ShowDataLayer { } private initDrawFeatures(map: MlMap) { - let { features, doShowLayer, fetchStore, selectedElement, selectedLayer } = this._options + let { features, doShowLayer, fetchStore, selectedElement } = this._options const onClick = this._options.onClick ?? (this._options.layer.title === undefined ? undefined : (feature: Feature) => { selectedElement?.setData(feature) - selectedLayer?.setData(this._options.layer) }) if (this._options.drawLines !== false) { for (let i = 0; i < this._options.layer.lineRendering.length; i++) { diff --git a/test/Logic/OSM/Actions/ReplaceGeometryAction.spec.ts b/test/Logic/OSM/Actions/ReplaceGeometryAction.spec.ts index f617d0de04..6e2fb73a89 100644 --- a/test/Logic/OSM/Actions/ReplaceGeometryAction.spec.ts +++ b/test/Logic/OSM/Actions/ReplaceGeometryAction.spec.ts @@ -62,7 +62,6 @@ describe("ReplaceGeometryAction", () => { name: "All OSM-buildings", source: { osmTags: "building~*", - maxCacheAge: 0, }, calculatedTags: ["_surface:strict:=feat.get('_surface')"], lineRendering: [ @@ -269,7 +268,6 @@ describe("ReplaceGeometryAction", () => { "https://betadata.grbosm.site/grb?bbox={x_min},{y_min},{x_max},{y_max}", geoJsonZoomLevel: 18, mercatorCrs: true, - maxCacheAge: 0, }, name: "GRB geometries", title: "GRB outline",