From fc255c1a8b03a54cfa89df32f668cfcc7592e977 Mon Sep 17 00:00:00 2001 From: SC Date: Wed, 6 Oct 2021 15:21:34 +0000 Subject: [PATCH 01/18] Translated using Weblate (Portuguese) Currently translated at 100.0% (25 of 25 strings) Translation: MapComplete/shared-questions Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/pt/ --- langs/shared-questions/pt.json | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/langs/shared-questions/pt.json b/langs/shared-questions/pt.json index 9524e139d..a1622b21a 100644 --- a/langs/shared-questions/pt.json +++ b/langs/shared-questions/pt.json @@ -61,6 +61,23 @@ } }, "question": "Este lugar é acessível a utilizadores de cadeiras de rodas?" + }, + "dog-access": { + "mappings": { + "0": { + "then": "Os cães são permitidos" + }, + "1": { + "then": "Os cães não são permitidos" + }, + "2": { + "then": "Os cães são permitidos, mas têm de ser presos pela trela" + }, + "3": { + "then": "Os cães são permitidos e podem correr livremente" + } + }, + "question": "Os cães são permitidos neste estabelecimento?" } } -} \ No newline at end of file +} From cee8eafb83e1e0c3fc553bbc48965f55b8fec6ca Mon Sep 17 00:00:00 2001 From: SC Date: Wed, 6 Oct 2021 15:23:37 +0000 Subject: [PATCH 02/18] Translated using Weblate (Portuguese) Currently translated at 30.4% (60 of 197 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/pt/ --- langs/pt.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/langs/pt.json b/langs/pt.json index 577ee0f20..f489838b8 100644 --- a/langs/pt.json +++ b/langs/pt.json @@ -20,5 +20,9 @@ "uploadingMultiple": "A enviar {count} imagens…", "uploadingPicture": "A enviar a sua imagem…", "addPicture": "Adicionar imagem" + }, + "index": { + "#": "Estes textos são mostrados acima dos botões do tema quando nenhum tema é carregado", + "title": "Bem-vindo(a) ao MapComplete" } } From 0dd483baf5a2fad5cb42e0dd647037be5272ffd4 Mon Sep 17 00:00:00 2001 From: SC Date: Thu, 7 Oct 2021 17:41:58 +0000 Subject: [PATCH 03/18] Translated using Weblate (Portuguese) Currently translated at 32.9% (65 of 197 strings) Translation: MapComplete/Core Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/pt/ --- langs/pt.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/langs/pt.json b/langs/pt.json index f489838b8..92db819cb 100644 --- a/langs/pt.json +++ b/langs/pt.json @@ -23,6 +23,17 @@ }, "index": { "#": "Estes textos são mostrados acima dos botões do tema quando nenhum tema é carregado", - "title": "Bem-vindo(a) ao MapComplete" + "title": "Bem-vindo(a) ao MapComplete", + "intro": "O MapComplete é um visualizador e editor do OpenStreetMap, que mostra informações sobre um tema específico.", + "pickTheme": "Escolha um tema abaixo para começar." + }, + "delete": { + "reasons": { + "notFound": "Não foi possível encontrar este elemento" + }, + "explanations": { + "selectReason": "Por favor, selecione a razão porque este elemento deve ser eliminado", + "hardDelete": "Este ponto será eliminado no OpenStreetMap. Pode ser recuperado por um contribuidor com experiência" + } } } From 72e42c1e1db6defcb50c1573b2e1713054e6190c Mon Sep 17 00:00:00 2001 From: nicole_s <15011784+nicolelaine@users.noreply.github.com> Date: Sun, 10 Oct 2021 13:57:37 +0200 Subject: [PATCH 04/18] Added postboxes_postoffices theme and components --- .../postboxes_postoffices/license_info.json | 15 ++ .../postboxes_postoffices/post_office.svg | 1 + .../themes/postboxes_postoffices/postbox.svg | 143 ++++++++++++++++++ .../postboxes_postoffices.json | 138 +++++++++++++++++ 4 files changed, 297 insertions(+) create mode 100644 assets/themes/postboxes_postoffices/license_info.json create mode 100644 assets/themes/postboxes_postoffices/post_office.svg create mode 100644 assets/themes/postboxes_postoffices/postbox.svg create mode 100644 assets/themes/postboxes_postoffices/postboxes_postoffices.json diff --git a/assets/themes/postboxes_postoffices/license_info.json b/assets/themes/postboxes_postoffices/license_info.json new file mode 100644 index 000000000..869dda32c --- /dev/null +++ b/assets/themes/postboxes_postoffices/license_info.json @@ -0,0 +1,15 @@ +[ + { + "path": "postbox.svg", + "license": "CC BY 4.0", + "authors": ["Vincent Le Moign","https://twitter.com/webalys"], + "sources": ["https://upload.wikimedia.org/wikipedia/commons/6/6d/726-postbox.svg", "http://emoji.streamlineicons.com"] + }, + + { + "path": "post_office.svg", + "license": "CC BY-SA 4.0", + "authors": ["https://github.com/emojione/emojione/graphs/contributors"], + "sources": ["https://commons.wikimedia.org/wiki/File:Emojione_BW_1F3E4.svg", "https://github.com/emojione/emojione/blob/2.2.7/assets/svg_bw/1f3e4.svg"] + } + ] \ No newline at end of file diff --git a/assets/themes/postboxes_postoffices/post_office.svg b/assets/themes/postboxes_postoffices/post_office.svg new file mode 100644 index 000000000..ebdd76b49 --- /dev/null +++ b/assets/themes/postboxes_postoffices/post_office.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/themes/postboxes_postoffices/postbox.svg b/assets/themes/postboxes_postoffices/postbox.svg new file mode 100644 index 000000000..05e6d95d4 --- /dev/null +++ b/assets/themes/postboxes_postoffices/postbox.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/themes/postboxes_postoffices/postboxes_postoffices.json b/assets/themes/postboxes_postoffices/postboxes_postoffices.json new file mode 100644 index 000000000..8d7aa81ed --- /dev/null +++ b/assets/themes/postboxes_postoffices/postboxes_postoffices.json @@ -0,0 +1,138 @@ +{ + "id": "postboxes", + "title": { + "en": "Postbox and Post Office Map" + }, + "shortDescription": { + "en": "A map showing postboxes and post offices" + }, + "description": { + "en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :) " + }, + "language": [ + "en" + ], + "maintainer": "", + "icon": "./assets/themes/postboxes_postoffices/postbox.svg", + "version": "0", + "startLat": 53.5511, + "startLon": 9.9937, + "startZoom": 13, + "widenFactor": 0.05, + "socialImage": "", + "layers": [{ + "id": "postboxes", + "name": { + "en": "Postbox" + }, + "minzoom": 12, + "overpassTags": { + "and": [ + "amenity=post_box" + ] + }, + "title": { + "render": { + "en": "Postbox" + } + }, + "description": { + "en": "The layer showing postboxes." + }, + "tagRenderings": [ + "images", + { + "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" + } + ], + "icon": { + "render": "./assets/themes/postboxes_postoffices/postbox.svg" + }, + "width": { + "render": "1" + }, + "iconSize": { + "render": "40,40,bottom" + }, + "color": { + "render": "#DADADA" + }, + "presets": [{ + "tags": [ + "amenity=post_box" + ], + "title": { + "en": "Postbox" + } + }], + "wayHandling": "both outline and center" + }, + { + "id": "postoffices", + "name": { + "en": "A layer containing post offices" + }, + "minzoom": 12, + "overpassTags": { + "and": [ + "amenity=post_office" + ] + }, + "title": { + "render": { + "en": "Post Office" + } + }, + "description": { + "en": "A layer showing post offices." + }, + "tagRenderings": [ + "images", + { + "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" + }, + { + "#": "OH", + "render": { + "en": "Opening Hours: {opening_hours}" + }, + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "question": { + "en": "What are the opening hours for this post office?" + }, + "mappings": [{ + "if": "opening_hours=24/7", + "then": { + "en": "24/7 opened (including holidays)" + } + }] + } + ], + "icon": { + "render": "./assets/themes/postboxes_postoffices/post_office.svg" + }, + "width": { + "render": "1" + }, + "iconSize": { + "render": "40,40,bottom" + }, + "color": { + "render": "#DADADA" + }, + "presets": [{ + "tags": [ + "amenity=post_office" + ], + "title": { + "en": "Post Office" + } + }], + "wayHandling": 2 + } + ], + "roamingRenderings": [] +} \ No newline at end of file From 950b979d835feef05c3157ced58bebee46306903 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Sun, 10 Oct 2021 23:57:32 +0200 Subject: [PATCH 05/18] Fix uk_addresses theme --- assets/themes/uk_addresses/uk_addresses.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json index 2114beac2..296c12516 100644 --- a/assets/themes/uk_addresses/uk_addresses.json +++ b/assets/themes/uk_addresses/uk_addresses.json @@ -151,7 +151,7 @@ }, "freeform": { "key": "addr:housenumber", - "addExtraTags": "nohousenumber=" + "addExtraTags": ["nohousenumber="] }, "mappings": [ { From afc8bc86448504d7f68d505b602f31ef09d99ecf Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 00:55:13 +0200 Subject: [PATCH 06/18] Translation reset --- langs/themes/en.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/langs/themes/en.json b/langs/themes/en.json index 9dcb4b54a..e1d8f6724 100644 --- a/langs/themes/en.json +++ b/langs/themes/en.json @@ -1362,11 +1362,6 @@ "title": { "render": "Known address" } - }, - "2": { - "title": { - "render": "{name}" - } } }, "shortDescription": "Help to build an open dataset of UK addresses", From 4f4203f670fba799bbf15ac82e7dfbc13f532e20 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 12:51:54 +0200 Subject: [PATCH 07/18] Add minzoom for charging stations --- Models/ThemeConfig/LayoutConfig.ts | 2 +- assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Models/ThemeConfig/LayoutConfig.ts b/Models/ThemeConfig/LayoutConfig.ts index 51cf19d75..9add1c7f9 100644 --- a/Models/ThemeConfig/LayoutConfig.ts +++ b/Models/ThemeConfig/LayoutConfig.ts @@ -92,7 +92,7 @@ export default class LayoutConfig { throw "Widenfactor too small" }else{ // Unofficial themes get away with this - console.warn("Detected a very small widenfactor, bumping this above 1.") + console.warn("Detected a very small widenfactor for theme ", this.id ,", bumping this above 1.") json.widenFactor = json.widenFactor + 1 } } diff --git a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json index 2b303ea14..0a2eaa9e2 100644 --- a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json +++ b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json @@ -31,7 +31,12 @@ "minzoom": 16 } }, - "charging_station", + { + "builtin": "charging_station", + "override": { + "minzoom": 16 + } + }, "toilet", "bench", "waste_basket", From 7576f7069bd7462e5179e10aa374e863a3d7d374 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 13:28:12 +0200 Subject: [PATCH 08/18] Fix broken layer selection --- .gitignore | 4 +++- InitUiElements.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 5d39c4885..b2ad34580 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,6 @@ Docs/Tools/stats.csv missing_translations.txt *.swp .DS_Store -Svg.ts \ No newline at end of file +Svg.ts +data/ +Folder.DotSettings.user diff --git a/InitUiElements.ts b/InitUiElements.ts index 8fafd7677..dfd5b4439 100644 --- a/InitUiElements.ts +++ b/InitUiElements.ts @@ -489,7 +489,7 @@ export class InitUiElements { } return true - }, [State.state.currentBounds] + }, [State.state.currentBounds, source.layer.isDisplayed] ) new ShowDataLayer( From c010fb5271cc944b37ec9e6b07bd34a1234677c1 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 21:23:14 +0200 Subject: [PATCH 09/18] Change padding method, add max bounds, fix zoomlevels on toerisme vlaanderen theme --- Logic/Actors/OverpassFeatureSource.ts | 11 ++++-- Logic/BBox.ts | 17 ++++---- Logic/FeatureSource/FeaturePipeline.ts | 7 ++-- UI/BigComponents/ThemeIntroductionPanel.ts | 10 ++--- .../toerisme_vlaanderen.json | 39 ++++++++++++++----- 5 files changed, 53 insertions(+), 31 deletions(-) diff --git a/Logic/Actors/OverpassFeatureSource.ts b/Logic/Actors/OverpassFeatureSource.ts index 4f4f7a77f..e27e0665d 100644 --- a/Logic/Actors/OverpassFeatureSource.ts +++ b/Logic/Actors/OverpassFeatureSource.ts @@ -39,7 +39,7 @@ export default class OverpassFeatureSource implements FeatureSource { } private readonly _isActive: UIEventSource; private readonly onBboxLoaded: (bbox: BBox, date: Date, layers: LayerConfig[]) => void; - + private readonly padToTiles : number constructor( state: { readonly locationControl: UIEventSource, @@ -49,7 +49,8 @@ export default class OverpassFeatureSource implements FeatureSource { readonly overpassMaxZoom: UIEventSource, readonly currentBounds: UIEventSource }, - options?: { + options: { + padToTiles: number, isActive?: UIEventSource, relationTracker: RelationsTracker, onBboxLoaded?: (bbox: BBox, date: Date, layers: LayerConfig[]) => void @@ -57,6 +58,7 @@ export default class OverpassFeatureSource implements FeatureSource { this.state = state this._isActive = options.isActive; + this.padToTiles = options.padToTiles; this.onBboxLoaded = options.onBboxLoaded this.relationsTracker = options.relationTracker const self = this; @@ -109,11 +111,14 @@ export default class OverpassFeatureSource implements FeatureSource { return undefined; } - const bounds = this.state.currentBounds.data?.pad(this.state.layoutToUse.widenFactor)?.expandToTileBounds(14); + const bounds = this.state.currentBounds.data?.pad(this.state.layoutToUse.widenFactor)?.expandToTileBounds(this.padToTiles); if (bounds === undefined) { return undefined; } + console.log("Current bounds are", this.state.currentBounds.data," padded with",this.state.layoutToUse.widenFactor+":", + this.state.currentBounds.data.pad(this.state.layoutToUse.widenFactor), + "Tileexpanded: ",this.state.currentBounds.data?.pad(this.state.layoutToUse.widenFactor)?.expandToTileBounds(this.padToTiles) ) const self = this; diff --git a/Logic/BBox.ts b/Logic/BBox.ts index a6f350cf8..0205b1533 100644 --- a/Logic/BBox.ts +++ b/Logic/BBox.ts @@ -116,16 +116,15 @@ export class BBox { return this.minLat } - pad(factor: number): BBox { - const latDiff = this.maxLat - this.minLat - const lat = (this.maxLat + this.minLat) / 2 - const lonDiff = this.maxLon - this.minLon - const lon = (this.maxLon + this.minLon) / 2 + pad(factor: number, maxIncrease = 2): BBox { + + const latDiff = Math.min(maxIncrease / 2, Math.abs(this.maxLat - this.minLat) * factor) + const lonDiff =Math.min(maxIncrease / 2, Math.abs(this.maxLon - this.minLon) * factor) return new BBox([[ - lon - lonDiff * factor, - lat - latDiff * factor - ], [lon + lonDiff * factor, - lat + latDiff * factor]]) + this.minLon - lonDiff, + this.minLat - latDiff + ], [this.maxLon + lonDiff, + this.maxLat + latDiff]]) } toLeaflet() { diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts index 3aa0af356..ea33827f6 100644 --- a/Logic/FeatureSource/FeaturePipeline.ts +++ b/Logic/FeatureSource/FeaturePipeline.ts @@ -58,7 +58,7 @@ export default class FeaturePipeline { private readonly freshnesses = new Map(); private readonly oldestAllowedDate: Date = new Date(new Date().getTime() - 60 * 60 * 24 * 30 * 1000); - private readonly osmSourceZoomLevel = 14 + private readonly osmSourceZoomLevel = 15 constructor( handleFeatureSource: (source: FeatureSourceForLayer & Tiled) => void, @@ -147,7 +147,7 @@ export default class FeaturePipeline { // We split them up into tiles anyway as it is an OSM source TiledFeatureSource.createHierarchy(src, { layer: src.layer, - minZoomLevel: 14, + minZoomLevel: this.osmSourceZoomLevel, dontEnforceMinZoom: true, registerTile: (tile) => { new RegisteringAllFromFeatureSourceActor(tile) @@ -200,7 +200,7 @@ export default class FeaturePipeline { new PerLayerFeatureSourceSplitter(state.filteredLayers, (source) => TiledFeatureSource.createHierarchy(source, { layer: source.layer, - minZoomLevel: 14, + minZoomLevel: this.osmSourceZoomLevel, dontEnforceMinZoom: true, maxFeatureCount: state.layoutToUse.clustering.minNeededElements, maxZoomLevel: state.layoutToUse.clustering.maxZoom, @@ -333,6 +333,7 @@ export default class FeaturePipeline { const self = this; const updater = new OverpassFeatureSource(state, { + padToTiles: this.osmSourceZoomLevel, relationTracker: this.relationTracker, isActive: useOsmApi.map(b => !b && overpassIsActive.data, [overpassIsActive]), onBboxLoaded: ((bbox, date, downloadedLayers) => { diff --git a/UI/BigComponents/ThemeIntroductionPanel.ts b/UI/BigComponents/ThemeIntroductionPanel.ts index fec58bb29..c7c096421 100644 --- a/UI/BigComponents/ThemeIntroductionPanel.ts +++ b/UI/BigComponents/ThemeIntroductionPanel.ts @@ -50,13 +50,11 @@ export default class ThemeIntroductionPanel extends Combine { ) super([ - layout.description.Clone(), - "

", + layout.description.Clone().SetClass("blcok mb-4"), toTheMap, - loginStatus, - layout.descriptionTail?.Clone(), - "
", - languagePicker, + loginStatus.SetClass("block"), + layout.descriptionTail?.Clone().SetClass("block mt-4"), + languagePicker.SetClass("block mt-4"), ...layout.CustomCodeSnippets() ]) diff --git a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json index 0a2eaa9e2..7a401b0ab 100644 --- a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json +++ b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json @@ -14,7 +14,10 @@ "nl": "Een kaart om toeristisch relevante info op aan te duiden" }, "description": { - "nl": "Op deze kaart kan je info zien die relevant is voor toerisme, zoals:
  • Eetgelegenheden
  • Cafés en bars
  • (Fiets)oplaadpunten
  • Fietspompen, fietserverhuur en fietswinkels
  • Uitkijktorens
  • ...
Zie je fouten op de kaart? Dan kan je zelf makkelijk aanpasingen maken, die zichtbaar zijn voor iedereen. Hiervoor dien je een gratis OpenStreetMap account voor te maken.

Met de steun van Toerisme Vlaanderen" + "nl": "Op deze kaart kan je info zien die relevant is voor toerisme, zoals:
  • Eetgelegenheden
  • Cafés en bars
  • (Fiets)oplaadpunten
  • Fietspompen, fietserverhuur en fietswinkels
  • Uitkijktorens
  • ...
Zie je fouten op de kaart? Dan kan je zelf makkelijk aanpasingen maken, die zichtbaar zijn voor iedereen. Hiervoor dien je een gratis OpenStreetMap account voor te maken." + }, + "descriptionTail": { + "nl": "Met de steun van Toerisme Vlaanderen" }, "icon": "./assets/svg/star.svg", "startZoom": 8, @@ -28,21 +31,37 @@ "cafe_pub" ], "override": { - "minzoom": 16 + "minzoom": 17 } }, { - "builtin": "charging_station", + "builtin": [ + "bench", + "waste_basket" + ], "override": { - "minzoom": 16 + "minzoom": 19 } }, - "toilet", - "bench", - "waste_basket", - "bike_repair_station", - "binocular", - "observation_tower" + { + "builtin": [ + "charging_station", + "toilet", + "bike_repair_station" + ], + "override": { + "minzoom": 14 + } + }, + { + "builtin": [ + "binocular", + "observation_tower" + ], + "override": { + "minzoom": 10 + } + } ], "hideFromOverview": true } \ No newline at end of file From 3157c35c62268ec54f4492fcf010ce47929937ed Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 21:23:31 +0200 Subject: [PATCH 10/18] Version bump --- Models/Constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Models/Constants.ts b/Models/Constants.ts index a45d19e9e..2b266f4ad 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -2,7 +2,7 @@ import {Utils} from "../Utils"; export default class Constants { - public static vNumber = "0.10.3"; + public static vNumber = "0.10.4"; public static ImgurApiKey = '7070e7167f0a25a' public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2' public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" From 178cefceb41c854196356bad856d70eb728de2d7 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 22:30:22 +0200 Subject: [PATCH 11/18] Fix bounds and loading with overpass --- Logic/Actors/OverpassFeatureSource.ts | 23 ++-- .../Actors/SaveTileToLocalStorageActor.ts | 4 +- Logic/FeatureSource/FeaturePipeline.ts | 30 ++--- .../TiledFromLocalStorageSource.ts | 119 ++++++++---------- Models/Constants.ts | 2 +- Models/TileRange.ts | 2 +- .../toerisme_vlaanderen.json | 1 + 7 files changed, 78 insertions(+), 103 deletions(-) diff --git a/Logic/Actors/OverpassFeatureSource.ts b/Logic/Actors/OverpassFeatureSource.ts index e27e0665d..62cf79998 100644 --- a/Logic/Actors/OverpassFeatureSource.ts +++ b/Logic/Actors/OverpassFeatureSource.ts @@ -38,8 +38,7 @@ export default class OverpassFeatureSource implements FeatureSource { readonly currentBounds: UIEventSource } private readonly _isActive: UIEventSource; - private readonly onBboxLoaded: (bbox: BBox, date: Date, layers: LayerConfig[]) => void; - private readonly padToTiles : number + private readonly onBboxLoaded: (bbox: BBox, date: Date, layers: LayerConfig[], zoomlevel: number) => void; constructor( state: { readonly locationControl: UIEventSource, @@ -50,20 +49,19 @@ export default class OverpassFeatureSource implements FeatureSource { readonly currentBounds: UIEventSource }, options: { - padToTiles: number, + padToTiles: UIEventSource, isActive?: UIEventSource, relationTracker: RelationsTracker, - onBboxLoaded?: (bbox: BBox, date: Date, layers: LayerConfig[]) => void + onBboxLoaded?: (bbox: BBox, date: Date, layers: LayerConfig[], zoomlevel: number) => void }) { this.state = state this._isActive = options.isActive; - this.padToTiles = options.padToTiles; this.onBboxLoaded = options.onBboxLoaded this.relationsTracker = options.relationTracker const self = this; state.currentBounds.addCallback(_ => { - self.update() + self.update(options.padToTiles.data) }) } @@ -86,21 +84,21 @@ export default class OverpassFeatureSource implements FeatureSource { return new Overpass(new Or(filters), extraScripts, interpreterUrl, this.state.overpassTimeout, this.relationsTracker); } - private update() { + private update(paddedZoomLevel: number) { if (!this._isActive.data) { return; } const self = this; - this.updateAsync().then(bboxDate => { + this.updateAsync(paddedZoomLevel).then(bboxDate => { if(bboxDate === undefined || self.onBboxLoaded === undefined){ return; } const [bbox, date, layers] = bboxDate - self.onBboxLoaded(bbox, date, layers) + self.onBboxLoaded(bbox, date, layers, paddedZoomLevel) }) } - private async updateAsync(): Promise<[BBox, Date, LayerConfig[]]> { + private async updateAsync(padToZoomLevel: number): Promise<[BBox, Date, LayerConfig[]]> { if (this.runningQuery.data) { console.log("Still running a query, not updating"); return undefined; @@ -111,14 +109,11 @@ export default class OverpassFeatureSource implements FeatureSource { return undefined; } - const bounds = this.state.currentBounds.data?.pad(this.state.layoutToUse.widenFactor)?.expandToTileBounds(this.padToTiles); + const bounds = this.state.currentBounds.data?.pad(this.state.layoutToUse.widenFactor)?.expandToTileBounds(padToZoomLevel); if (bounds === undefined) { return undefined; } - console.log("Current bounds are", this.state.currentBounds.data," padded with",this.state.layoutToUse.widenFactor+":", - this.state.currentBounds.data.pad(this.state.layoutToUse.widenFactor), - "Tileexpanded: ",this.state.currentBounds.data?.pad(this.state.layoutToUse.widenFactor)?.expandToTileBounds(this.padToTiles) ) const self = this; diff --git a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts index 2894d56b8..96e9938aa 100644 --- a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts +++ b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts @@ -7,7 +7,7 @@ import {FeatureSourceForLayer} from "../FeatureSource"; export default class SaveTileToLocalStorageActor { public static readonly storageKey: string = "cached-features"; - public static readonly formatVersion: string = "1" + public static readonly formatVersion: string = "2" constructor(source: FeatureSourceForLayer, tileIndex: number) { source.features.addCallbackAndRunD(features => { @@ -31,6 +31,6 @@ export default class SaveTileToLocalStorageActor { const key = `${SaveTileToLocalStorageActor.storageKey}-${layerId}-${tileId}` localStorage.setItem(key + "-time", JSON.stringify(freshness.getTime())) localStorage.setItem(key + "-format", SaveTileToLocalStorageActor.formatVersion) - + console.log("Marked ", key, "as visited") } } \ No newline at end of file diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts index ea33827f6..6df7b87f4 100644 --- a/Logic/FeatureSource/FeaturePipeline.ts +++ b/Logic/FeatureSource/FeaturePipeline.ts @@ -155,7 +155,7 @@ export default class FeaturePipeline { tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) } }) - }else{ + } else { new RegisteringAllFromFeatureSourceActor(src) perLayerHierarchy.get(id).registerTile(src) src.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(src)) @@ -200,7 +200,7 @@ export default class FeaturePipeline { new PerLayerFeatureSourceSplitter(state.filteredLayers, (source) => TiledFeatureSource.createHierarchy(source, { layer: source.layer, - minZoomLevel: this.osmSourceZoomLevel, + minZoomLevel: source.layer.layerDef.minzoom, dontEnforceMinZoom: true, maxFeatureCount: state.layoutToUse.clustering.minNeededElements, maxZoomLevel: state.layoutToUse.clustering.maxZoom, @@ -233,7 +233,7 @@ export default class FeaturePipeline { // Whenever fresh data comes in, we need to update the metatagging - self.newDataLoadedSignal.stabilized(1000).addCallback(src => { + self.newDataLoadedSignal.stabilized(1000).addCallback(_ => { self.updateAllMetaTagging() }) @@ -270,15 +270,15 @@ export default class FeaturePipeline { const self = this return this.state.currentBounds.map(bbox => { if (bbox === undefined) { - return + return undefined } if (!isSufficientlyZoomed.data) { - return; + return undefined; } const osmSourceZoomLevel = self.osmSourceZoomLevel const range = bbox.containingTileRange(osmSourceZoomLevel) const tileIndexes = [] - if (range.total > 100) { + if (range.total >= 100) { // Too much tiles! return [] } @@ -288,7 +288,7 @@ export default class FeaturePipeline { if (oldestDate !== undefined && oldestDate > this.oldestAllowedDate) { console.debug("Skipping tile", osmSourceZoomLevel, x, y, "as a decently fresh one is available") // The cached tiles contain decently fresh data - return; + return undefined; } tileIndexes.push(i) }) @@ -321,29 +321,30 @@ export default class FeaturePipeline { } const range = bbox.containingTileRange(zoom) - if (range.total > 100) { + if (range.total >= 5000) { return false } const self = this; const allFreshnesses = Tiles.MapRange(range, (x, y) => self.freshnessForVisibleLayers(zoom, x, y)) return allFreshnesses.some(freshness => freshness === undefined || freshness < this.oldestAllowedDate) - }, [state.locationControl]) const self = this; const updater = new OverpassFeatureSource(state, { - padToTiles: this.osmSourceZoomLevel, + padToTiles: state.locationControl.map(l => Math.min(15, l.zoom + 1)), relationTracker: this.relationTracker, isActive: useOsmApi.map(b => !b && overpassIsActive.data, [overpassIsActive]), - onBboxLoaded: ((bbox, date, downloadedLayers) => { - Tiles.MapRange(bbox.containingTileRange(self.osmSourceZoomLevel), (x, y) => { + onBboxLoaded: (bbox, date, downloadedLayers, paddedToZoomLevel) => { + Tiles.MapRange(bbox.containingTileRange(paddedToZoomLevel), (x, y) => { + const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y) downloadedLayers.forEach(layer => { - SaveTileToLocalStorageActor.MarkVisited(layer.id, Tiles.tile_index(this.osmSourceZoomLevel, x, y), date) + self.freshnesses.get(layer.id).addTileLoad(tileIndex, date) + SaveTileToLocalStorageActor.MarkVisited(layer.id, tileIndex, date) }) }) - }) + } }); @@ -379,7 +380,6 @@ export default class FeaturePipeline { private updateAllMetaTagging() { const self = this; - console.log("Reupdating all metatagging") this.perLayerHierarchy.forEach(hierarchy => { hierarchy.loadedTiles.forEach(src => { self.applyMetaTags(src) diff --git a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts index 6f815f48d..a2cd50be0 100644 --- a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts +++ b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts @@ -1,14 +1,16 @@ import FilteredLayer from "../../../Models/FilteredLayer"; import {FeatureSourceForLayer, Tiled} from "../FeatureSource"; import {UIEventSource} from "../../UIEventSource"; -import Loc from "../../../Models/Loc"; import TileHierarchy from "./TileHierarchy"; import SaveTileToLocalStorageActor from "../Actors/SaveTileToLocalStorageActor"; import {Tiles} from "../../../Models/TileRange"; import {BBox} from "../../BBox"; export default class TiledFromLocalStorageSource implements TileHierarchy { - public loadedTiles: Map = new Map(); + public readonly loadedTiles: Map = new Map(); + private readonly layer: FilteredLayer; + private readonly handleFeatureSource: (src: FeatureSourceForLayer & Tiled, index: number) => void; + private readonly undefinedTiles: Set; public static GetFreshnesses(layerId: string): Map { const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layerId + "-" @@ -29,14 +31,15 @@ export default class TiledFromLocalStorageSource implements TileHierarchy void, state: { - locationControl: UIEventSource - leafletMap: any + currentBounds: UIEventSource }) { + this.layer = layer; + this.handleFeatureSource = handleFeatureSource; - const undefinedTiles = new Set() + + this.undefinedTiles = new Set() const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.layerDef.id + "-" - // @ts-ignore - const indexes: number[] = Object.keys(localStorage) + const knownTiles: number[] = Object.keys(localStorage) .filter(key => { return key.startsWith(prefix) && !key.endsWith("-time") && !key.endsWith("-format"); }) @@ -45,8 +48,8 @@ export default class TiledFromLocalStorageSource implements TileHierarchy !isNaN(i)) - console.debug("Layer", layer.layerDef.id, "has following tiles in available in localstorage", indexes.map(i => Tiles.tile_from_index(i).join("/")).join(", ")) - for (const index of indexes) { + console.debug("Layer", layer.layerDef.id, "has following tiles in available in localstorage", knownTiles.map(i => Tiles.tile_from_index(i).join("/")).join(", ")) + for (const index of knownTiles) { const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.layerDef.id + "-" + index; const version = localStorage.getItem(prefix + "-format") @@ -55,78 +58,54 @@ export default class TiledFromLocalStorageSource implements TileHierarchy i % 100) - const indexesSet = new Set(indexes) - const maxZoom = Math.max(...zLevels) - const minZoom = Math.min(...zLevels) - const self = this; + const self = this + state.currentBounds.map(bounds => { - const neededTiles = state.locationControl.map( - location => { - if (!layer.isDisplayed.data) { - // No need to download! - the layer is disabled - return undefined; - } - - if (location.zoom < layer.layerDef.minzoom) { - // No need to download! - the layer is disabled - return undefined; - } - - // Yup, this is cheating to just get the bounds here - const bounds = state.leafletMap.data?.getBounds() - if (bounds === undefined) { - // We'll retry later - return undefined - } - - const needed = [] - for (let z = minZoom; z <= maxZoom; z++) { - - const tileRange = Tiles.TileRangeBetween(z, bounds.getNorth(), bounds.getEast(), bounds.getSouth(), bounds.getWest()) - const neededZ = Tiles.MapRange(tileRange, (x, y) => Tiles.tile_index(z, x, y)) - .filter(i => !self.loadedTiles.has(i) && !undefinedTiles.has(i) && indexesSet.has(i)) - needed.push(...neededZ) - } - - if (needed.length === 0) { - return undefined - } - return needed + if(bounds === undefined){ + return; } - , [layer.isDisplayed, state.leafletMap]).stabilized(50); - - neededTiles.addCallbackAndRunD(neededIndexes => { - for (const neededIndex of neededIndexes) { - // We load the features from localStorage - try { - const key = SaveTileToLocalStorageActor.storageKey + "-" + layer.layerDef.id + "-" + neededIndex - const data = localStorage.getItem(key) - const features = JSON.parse(data) - const src = { - layer: layer, - features: new UIEventSource<{ feature: any; freshness: Date }[]>(features), - name: "FromLocalStorage(" + key + ")", - tileIndex: neededIndex, - bbox: BBox.fromTileIndex(neededIndex) - } - handleFeatureSource(src, neededIndex) - self.loadedTiles.set(neededIndex, src) - } catch (e) { - console.error("Could not load data tile from local storage due to", e) - undefinedTiles.add(neededIndex) + for (const knownTile of knownTiles) { + + if(this.loadedTiles.has(knownTile)){ + continue; } + if(this.undefinedTiles.has(knownTile)){ + continue; + } + + if(!bounds.overlapsWith(BBox.fromTileIndex(knownTile))){ + continue; + } + self.loadTile(knownTile) } - - }) } + + private loadTile( neededIndex: number){ + try { + const key = SaveTileToLocalStorageActor.storageKey + "-" + this.layer.layerDef.id + "-" + neededIndex + const data = localStorage.getItem(key) + const features = JSON.parse(data) + const src = { + layer: this.layer, + features: new UIEventSource<{ feature: any; freshness: Date }[]>(features), + name: "FromLocalStorage(" + key + ")", + tileIndex: neededIndex, + bbox: BBox.fromTileIndex(neededIndex) + } + this.handleFeatureSource(src, neededIndex) + this.loadedTiles.set(neededIndex, src) + } catch (e) { + console.error("Could not load data tile from local storage due to", e) + this.undefinedTiles.add(neededIndex) + } + } } \ No newline at end of file diff --git a/Models/Constants.ts b/Models/Constants.ts index 2b266f4ad..c79773971 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -2,7 +2,7 @@ import {Utils} from "../Utils"; export default class Constants { - public static vNumber = "0.10.4"; + public static vNumber = "0.10.5"; public static ImgurApiKey = '7070e7167f0a25a' public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2' public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" diff --git a/Models/TileRange.ts b/Models/TileRange.ts index 7a542a213..cccfe1964 100644 --- a/Models/TileRange.ts +++ b/Models/TileRange.ts @@ -15,7 +15,7 @@ export class Tiles { public static MapRange(tileRange: TileRange, f: (x: number, y: number) => T): T[] { const result: T[] = [] const total = tileRange.total - if(total > 5000){ + if(total > 100000){ throw "Tilerange too big" } for (let x = tileRange.xstart; x <= tileRange.xend; x++) { diff --git a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json index 7a401b0ab..489c36ed7 100644 --- a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json +++ b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json @@ -37,6 +37,7 @@ { "builtin": [ "bench", + "picnic_table", "waste_basket" ], "override": { From 6f0b951b3ac706bb5bd515dada20b6e919b044c6 Mon Sep 17 00:00:00 2001 From: Ahen Purwakarta Date: Fri, 8 Oct 2021 17:37:49 +0000 Subject: [PATCH 12/18] Translated using Weblate (Indonesian) Currently translated at 32.0% (8 of 25 strings) Translation: MapComplete/shared-questions Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/id/ --- langs/shared-questions/id.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/langs/shared-questions/id.json b/langs/shared-questions/id.json index 2af2d36dd..3dc8ebac3 100644 --- a/langs/shared-questions/id.json +++ b/langs/shared-questions/id.json @@ -8,6 +8,17 @@ }, "website": { "question": "Apa situs web dari {name}?" + }, + "payment-options": { + "mappings": { + "1": { + "then": "Disini menerima pembayaran dengan kartu" + }, + "0": { + "then": "Disini menerima pembayaran tunai" + } + }, + "question": "Metode pembayaran manakah yang di terima disini?" } } -} \ No newline at end of file +} From af197d58f83f22f57c3487602586ac4f73690fb6 Mon Sep 17 00:00:00 2001 From: Andre Fajar N Date: Sat, 9 Oct 2021 09:41:06 +0000 Subject: [PATCH 13/18] Translated using Weblate (Indonesian) Currently translated at 32.0% (8 of 25 strings) Translation: MapComplete/shared-questions Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/id/ --- langs/shared-questions/id.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/langs/shared-questions/id.json b/langs/shared-questions/id.json index 3dc8ebac3..ba2382719 100644 --- a/langs/shared-questions/id.json +++ b/langs/shared-questions/id.json @@ -19,6 +19,14 @@ } }, "question": "Metode pembayaran manakah yang di terima disini?" + }, + "level": { + "question": "Pada tingkat apa fitur ini diletakkan?", + "mappings": { + "3": { + "then": "Berlokasi di lantai pertama" + } + } } } } From 2d8b9a94810177ebae6337165e43e76ff20798b5 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 22:32:25 +0200 Subject: [PATCH 14/18] Linting of the postboxes theme --- .../Actors/SaveTileToLocalStorageActor.ts | 1 - .../postboxes_postoffices.json | 279 +++++++++--------- assets/themes/uk_addresses/uk_addresses.json | 4 +- 3 files changed, 146 insertions(+), 138 deletions(-) diff --git a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts index 29086c966..092c1a402 100644 --- a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts +++ b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts @@ -4,7 +4,6 @@ * Technically, more an Actor then a featuresource, but it fits more neatly this ay */ import {FeatureSourceForLayer} from "../FeatureSource"; -import SimpleMetaTagger from "../../SimpleMetaTagger"; export default class SaveTileToLocalStorageActor { public static readonly storageKey: string = "cached-features"; diff --git a/assets/themes/postboxes_postoffices/postboxes_postoffices.json b/assets/themes/postboxes_postoffices/postboxes_postoffices.json index 8d7aa81ed..7e9f6c823 100644 --- a/assets/themes/postboxes_postoffices/postboxes_postoffices.json +++ b/assets/themes/postboxes_postoffices/postboxes_postoffices.json @@ -1,138 +1,145 @@ { - "id": "postboxes", - "title": { - "en": "Postbox and Post Office Map" - }, - "shortDescription": { - "en": "A map showing postboxes and post offices" - }, - "description": { - "en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :) " - }, - "language": [ - "en" - ], - "maintainer": "", - "icon": "./assets/themes/postboxes_postoffices/postbox.svg", - "version": "0", - "startLat": 53.5511, - "startLon": 9.9937, - "startZoom": 13, - "widenFactor": 0.05, - "socialImage": "", - "layers": [{ - "id": "postboxes", - "name": { - "en": "Postbox" - }, - "minzoom": 12, - "overpassTags": { - "and": [ - "amenity=post_box" - ] - }, - "title": { - "render": { - "en": "Postbox" - } - }, - "description": { - "en": "The layer showing postboxes." - }, - "tagRenderings": [ - "images", - { - "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" - } - ], - "icon": { - "render": "./assets/themes/postboxes_postoffices/postbox.svg" - }, - "width": { - "render": "1" - }, - "iconSize": { - "render": "40,40,bottom" - }, - "color": { - "render": "#DADADA" - }, - "presets": [{ - "tags": [ - "amenity=post_box" - ], - "title": { - "en": "Postbox" - } - }], - "wayHandling": "both outline and center" - }, - { - "id": "postoffices", - "name": { - "en": "A layer containing post offices" - }, - "minzoom": 12, - "overpassTags": { - "and": [ - "amenity=post_office" - ] - }, - "title": { - "render": { - "en": "Post Office" - } - }, - "description": { - "en": "A layer showing post offices." - }, - "tagRenderings": [ - "images", - { - "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" - }, - { - "#": "OH", - "render": { - "en": "Opening Hours: {opening_hours}" - }, - "freeform": { - "key": "opening_hours", - "type": "opening_hours" - }, - "question": { - "en": "What are the opening hours for this post office?" - }, - "mappings": [{ - "if": "opening_hours=24/7", - "then": { - "en": "24/7 opened (including holidays)" - } - }] - } - ], - "icon": { - "render": "./assets/themes/postboxes_postoffices/post_office.svg" - }, - "width": { - "render": "1" - }, - "iconSize": { - "render": "40,40,bottom" - }, - "color": { - "render": "#DADADA" - }, - "presets": [{ - "tags": [ - "amenity=post_office" - ], - "title": { - "en": "Post Office" - } - }], - "wayHandling": 2 - } - ], - "roamingRenderings": [] + "id": "postboxes", + "title": { + "en": "Postbox and Post Office Map" + }, + "shortDescription": { + "en": "A map showing postboxes and post offices" + }, + "description": { + "en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :) " + }, + "language": [ + "en" + ], + "maintainer": "", + "icon": "./assets/themes/postboxes_postoffices/postbox.svg", + "version": "0", + "startLat": 53.5511, + "startLon": 9.9937, + "startZoom": 13, + "widenFactor": 0.05, + "socialImage": "", + "layers": [ + { + "id": "postboxes", + "name": { + "en": "Postbox" + }, + "minzoom": 12, + "overpassTags": { + "and": [ + "amenity=post_box" + ] + }, + "title": { + "render": { + "en": "Postbox" + } + }, + "description": { + "en": "The layer showing postboxes." + }, + "tagRenderings": [ + "images", + { + "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" + } + ], + "icon": { + "render": "./assets/themes/postboxes_postoffices/postbox.svg" + }, + "width": { + "render": "1" + }, + "iconSize": { + "render": "40,40,bottom" + }, + "color": { + "render": "#DADADA" + }, + "presets": [ + { + "tags": [ + "amenity=post_box" + ], + "title": { + "en": "Postbox" + } + } + ], + "wayHandling": "both outline and center" + }, + { + "id": "postoffices", + "name": { + "en": "A layer containing post offices" + }, + "minzoom": 12, + "overpassTags": { + "and": [ + "amenity=post_office" + ] + }, + "title": { + "render": { + "en": "Post Office" + } + }, + "description": { + "en": "A layer showing post offices." + }, + "tagRenderings": [ + "images", + { + "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" + }, + { + "render": { + "en": "Opening Hours: {opening_hours}" + }, + "freeform": { + "key": "opening_hours", + "type": "opening_hours" + }, + "question": { + "en": "What are the opening hours for this post office?" + }, + "mappings": [ + { + "if": "opening_hours=24/7", + "then": { + "en": "24/7 opened (including holidays)" + } + } + ], + "id": "OH" + } + ], + "icon": { + "render": "./assets/themes/postboxes_postoffices/post_office.svg" + }, + "width": { + "render": "1" + }, + "iconSize": { + "render": "40,40,bottom" + }, + "color": { + "render": "#DADADA" + }, + "presets": [ + { + "tags": [ + "amenity=post_office" + ], + "title": { + "en": "Post Office" + } + } + ], + "wayHandling": 2 + } + ], + "roamingRenderings": [] } \ No newline at end of file diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json index 296c12516..67cf0c600 100644 --- a/assets/themes/uk_addresses/uk_addresses.json +++ b/assets/themes/uk_addresses/uk_addresses.json @@ -151,7 +151,9 @@ }, "freeform": { "key": "addr:housenumber", - "addExtraTags": ["nohousenumber="] + "addExtraTags": [ + "nohousenumber=" + ] }, "mappings": [ { From aa7a581faafa5fc6017f2b5aa36a8e75c072bdaa Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 22:43:32 +0200 Subject: [PATCH 15/18] Rename postboxes theme, small fixes to postboxes theme --- assets/themes/postboxes/license_info.json | 25 +++++++++++++ .../post_office.svg | 0 .../postbox.svg | 0 .../postboxes.json} | 35 ++++++++++--------- .../postboxes_postoffices/license_info.json | 15 -------- 5 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 assets/themes/postboxes/license_info.json rename assets/themes/{postboxes_postoffices => postboxes}/post_office.svg (100%) rename assets/themes/{postboxes_postoffices => postboxes}/postbox.svg (100%) rename assets/themes/{postboxes_postoffices/postboxes_postoffices.json => postboxes/postboxes.json} (82%) delete mode 100644 assets/themes/postboxes_postoffices/license_info.json diff --git a/assets/themes/postboxes/license_info.json b/assets/themes/postboxes/license_info.json new file mode 100644 index 000000000..0c50f7040 --- /dev/null +++ b/assets/themes/postboxes/license_info.json @@ -0,0 +1,25 @@ +[ + { + "path": "post_office.svg", + "license": "CC BY-SA 4.0", + "authors": [ + "https://github.com/emojione/emojione/graphs/contributors" + ], + "sources": [ + "https://commons.wikimedia.org/wiki/File:Emojione_BW_1F3E4.svg", + "https://github.com/emojione/emojione/blob/2.2.7/assets/svg_bw/1f3e4.svg" + ] + }, + { + "path": "postbox.svg", + "license": "CC BY 4.0", + "authors": [ + "Vincent Le Moign", + "https://twitter.com/webalys" + ], + "sources": [ + "https://upload.wikimedia.org/wikipedia/commons/6/6d/726-postbox.svg", + "http://emoji.streamlineicons.com" + ] + } +] \ No newline at end of file diff --git a/assets/themes/postboxes_postoffices/post_office.svg b/assets/themes/postboxes/post_office.svg similarity index 100% rename from assets/themes/postboxes_postoffices/post_office.svg rename to assets/themes/postboxes/post_office.svg diff --git a/assets/themes/postboxes_postoffices/postbox.svg b/assets/themes/postboxes/postbox.svg similarity index 100% rename from assets/themes/postboxes_postoffices/postbox.svg rename to assets/themes/postboxes/postbox.svg diff --git a/assets/themes/postboxes_postoffices/postboxes_postoffices.json b/assets/themes/postboxes/postboxes.json similarity index 82% rename from assets/themes/postboxes_postoffices/postboxes_postoffices.json rename to assets/themes/postboxes/postboxes.json index 7e9f6c823..69425a32e 100644 --- a/assets/themes/postboxes_postoffices/postboxes_postoffices.json +++ b/assets/themes/postboxes/postboxes.json @@ -13,13 +13,17 @@ "en" ], "maintainer": "", - "icon": "./assets/themes/postboxes_postoffices/postbox.svg", + "icon": "./assets/themes/postboxes/postbox.svg", "version": "0", "startLat": 53.5511, "startLon": 9.9937, "startZoom": 13, - "widenFactor": 0.05, + "widenFactor": 1.0, "socialImage": "", + "clustering": { + "minNeededFeatures": 100, + "maxZoom": 14 + }, "layers": [ { "id": "postboxes", @@ -27,10 +31,8 @@ "en": "Postbox" }, "minzoom": 12, - "overpassTags": { - "and": [ - "amenity=post_box" - ] + "source": { + "osmTags": "amenity=post_box" }, "title": { "render": { @@ -43,11 +45,12 @@ "tagRenderings": [ "images", { + "id": "minimap", "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" } ], "icon": { - "render": "./assets/themes/postboxes_postoffices/postbox.svg" + "render": "./assets/themes/postboxes/postbox.svg" }, "width": { "render": "1" @@ -64,11 +67,11 @@ "amenity=post_box" ], "title": { - "en": "Postbox" + "en": "postbox" } } ], - "wayHandling": "both outline and center" + "wayHandling": 2 }, { "id": "postoffices", @@ -76,10 +79,8 @@ "en": "A layer containing post offices" }, "minzoom": 12, - "overpassTags": { - "and": [ - "amenity=post_office" - ] + "source": { + "osmTags": "amenity=post_office" }, "title": { "render": { @@ -92,11 +93,12 @@ "tagRenderings": [ "images", { + "id": "minimap", "render": "{minimap(18): height: 5rem; overflow: hidden; border-radius:3rem; }" }, { "render": { - "en": "Opening Hours: {opening_hours}" + "en": "Opening Hours: {opening_hours_table()}" }, "freeform": { "key": "opening_hours", @@ -117,7 +119,7 @@ } ], "icon": { - "render": "./assets/themes/postboxes_postoffices/post_office.svg" + "render": "./assets/themes/postboxes/post_office.svg" }, "width": { "render": "1" @@ -140,6 +142,5 @@ ], "wayHandling": 2 } - ], - "roamingRenderings": [] + ] } \ No newline at end of file diff --git a/assets/themes/postboxes_postoffices/license_info.json b/assets/themes/postboxes_postoffices/license_info.json deleted file mode 100644 index 869dda32c..000000000 --- a/assets/themes/postboxes_postoffices/license_info.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "path": "postbox.svg", - "license": "CC BY 4.0", - "authors": ["Vincent Le Moign","https://twitter.com/webalys"], - "sources": ["https://upload.wikimedia.org/wikipedia/commons/6/6d/726-postbox.svg", "http://emoji.streamlineicons.com"] - }, - - { - "path": "post_office.svg", - "license": "CC BY-SA 4.0", - "authors": ["https://github.com/emojione/emojione/graphs/contributors"], - "sources": ["https://commons.wikimedia.org/wiki/File:Emojione_BW_1F3E4.svg", "https://github.com/emojione/emojione/blob/2.2.7/assets/svg_bw/1f3e4.svg"] - } - ] \ No newline at end of file From 92bbfa2279ea5a1eab065b62e60ccb7b2924801d Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 22:55:11 +0200 Subject: [PATCH 16/18] Small tweaks to the postboxes theme --- assets/themes/postboxes/postboxes.json | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json index 69425a32e..ba7543274 100644 --- a/assets/themes/postboxes/postboxes.json +++ b/assets/themes/postboxes/postboxes.json @@ -19,16 +19,16 @@ "startLon": 9.9937, "startZoom": 13, "widenFactor": 1.0, - "socialImage": "", + "defaultBackgroundId": "CartoDB.Voyager", "clustering": { - "minNeededFeatures": 100, - "maxZoom": 14 + "maxZoom": 14, + "minNeededObjects": 100 }, "layers": [ { "id": "postboxes", "name": { - "en": "Postbox" + "en": "Postboxes" }, "minzoom": 12, "source": { @@ -71,12 +71,20 @@ } } ], - "wayHandling": 2 + "wayHandling": 2, + "deletion": { + "softDeletion": { + "and": [ + "amenity=", + "razed:amenity=post_box" + ] + } + } }, { "id": "postoffices", "name": { - "en": "A layer containing post offices" + "en": "Post offices" }, "minzoom": 12, "source": { From f897022ba00a8d4677671fd01486f39ebd41841b Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 23:09:50 +0200 Subject: [PATCH 17/18] Add isOpen badge and filter, add square background to post offices --- assets/themes/postboxes/postboxes.json | 30 +++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json index ba7543274..f19df492e 100644 --- a/assets/themes/postboxes/postboxes.json +++ b/assets/themes/postboxes/postboxes.json @@ -7,7 +7,7 @@ "en": "A map showing postboxes and post offices" }, "description": { - "en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :) " + "en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :)
Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account. " }, "language": [ "en" @@ -18,11 +18,11 @@ "startLat": 53.5511, "startLon": 9.9937, "startZoom": 13, - "widenFactor": 1.0, + "widenFactor": 1.5, "defaultBackgroundId": "CartoDB.Voyager", "clustering": { "maxZoom": 14, - "minNeededObjects": 100 + "minNeededElements": 100 }, "layers": [ { @@ -127,8 +127,15 @@ } ], "icon": { - "render": "./assets/themes/postboxes/post_office.svg" + "render": "square:white;./assets/themes/postboxes/post_office.svg" }, + "iconOverlays": [ + { + "if": "opening_hours~*", + "then": "isOpen", + "badge": true + } + ], "width": { "render": "1" }, @@ -148,7 +155,20 @@ } } ], - "wayHandling": 2 + "wayHandling": 2, + "filter": [ + { + "id": "is_open", + "options": [ + { + "question": { + "en": "Currently open" + }, + "osmTags": "_isOpen=yes" + } + ] + } + ] } ] } \ No newline at end of file From a38ab81356c28d34648cf2ac9fa1dce659a5d941 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Mon, 11 Oct 2021 23:28:51 +0200 Subject: [PATCH 18/18] Fix metatag _isOpen, fix clustering zoom behaviour --- InitUiElements.ts | 2 +- Logic/SimpleMetaTagger.ts | 7 ++++--- UI/SpecialVisualizations.ts | 6 +++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/InitUiElements.ts b/InitUiElements.ts index dfd5b4439..e7113e2d6 100644 --- a/InitUiElements.ts +++ b/InitUiElements.ts @@ -454,7 +454,7 @@ export class InitUiElements { return false; } - if (z >= clustering.maxZoom) { + if (z > clustering.maxZoom) { return true } diff --git a/Logic/SimpleMetaTagger.ts b/Logic/SimpleMetaTagger.ts index 4cf5a8c47..b0e4d50bf 100644 --- a/Logic/SimpleMetaTagger.ts +++ b/Logic/SimpleMetaTagger.ts @@ -209,7 +209,7 @@ export default class SimpleMetaTagger { configurable: true, get: () => { delete feature.properties._isOpen - feature.properties._isOpen = "" + feature.properties._isOpen = undefined const tagsSource = State.state.allElements.getEventSourceById(feature.properties.id); tagsSource.addCallbackAndRunD(tags => { if (tags.opening_hours === undefined || tags._country === undefined) { @@ -230,7 +230,8 @@ export default class SimpleMetaTagger { const oldNextChange = tags["_isOpen:nextTrigger"] ?? 0; if (oldNextChange > (new Date()).getTime() && - tags["_isOpen:oldvalue"] === tags["opening_hours"]) { + tags["_isOpen:oldvalue"] === tags["opening_hours"] + && tags["_isOpen"] !== undefined) { // Already calculated and should not yet be triggered return false; } @@ -267,7 +268,7 @@ export default class SimpleMetaTagger { } }) - return feature.properties["_isOpen"] + return undefined } }) diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts index bc41f916c..9cdadec04 100644 --- a/UI/SpecialVisualizations.ts +++ b/UI/SpecialVisualizations.ts @@ -55,7 +55,11 @@ export default class SpecialVisualizations { if (!tags.hasOwnProperty(key)) { continue } - parts.push([key, tags[key] ?? "undefined"]); + let v = tags[key] + if(v === ""){ + v = "empty string" + } + parts.push([key, v ?? "undefined"]); } for(const key of calculatedTags){