diff --git a/src/Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage.ts b/src/Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage.ts index d9505822b..c9cb4b04c 100644 --- a/src/Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage.ts +++ b/src/Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage.ts @@ -76,7 +76,7 @@ export default class SaveFeatureSourceToLocalStorage { const storage = TileLocalStorage.construct(backend, layername, maxCacheAge) this.storage = storage const singleTileSavers: Map = new Map() - features.features.addCallbackAndRunD((features) => { + features.features.stabilized(5000).addCallbackAndRunD((features) => { if ( features.some((f) => { let totalPoints = 0 @@ -116,7 +116,7 @@ export default class SaveFeatureSourceToLocalStorage { tileSaver = new SingleTileSaver(src, featureProperties) singleTileSavers.set(tileIndex, tileSaver) } - // Don't cache not-uploaded features yet - they'll be cached when the receive their id + // Don't cache not-uploaded features yet - they'll be cached when they receive their id features = features.filter((f) => !f.properties.id.match(/(node|way)\/-[0-9]+/)) tileSaver.saveFeatures(features) }) diff --git a/src/Models/RasterLayers.ts b/src/Models/RasterLayers.ts index 0e0cb0e79..de192084d 100644 --- a/src/Models/RasterLayers.ts +++ b/src/Models/RasterLayers.ts @@ -116,7 +116,7 @@ export class AvailableRasterLayers { availableLayersBboxes.map( (eliPolygons) => { const loc = location.data - const lonlat: [number, number] = [loc.lon, loc.lat] + const lonlat: [number, number] = [loc?.lon ?? 0, loc?.lat ?? 0] const matching: RasterLayerPolygon[] = eliPolygons.filter((eliPolygon) => { if (eliPolygon.geometry === null) { return true // global ELI-layer diff --git a/src/UI/Map/MapLibreAdaptor.ts b/src/UI/Map/MapLibreAdaptor.ts index da43a4b0d..9973beaaf 100644 --- a/src/UI/Map/MapLibreAdaptor.ts +++ b/src/UI/Map/MapLibreAdaptor.ts @@ -24,13 +24,13 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { "dragRotate", "dragPan", "keyboard", - "touchZoomRotate", + "touchZoomRotate" ] private static maplibre_zoom_handlers = [ "scrollZoom", "boxZoom", "doubleClickZoom", - "touchZoomRotate", + "touchZoomRotate" ] readonly location: UIEventSource<{ lon: number; lat: number }> private readonly isFlying = new UIEventSource(false) @@ -44,14 +44,14 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { readonly lastClickLocation: Store< | undefined | { - lon: number - lat: number - mode: "left" | "right" | "middle" - /** - * The nearest feature from a MapComplete layer - */ - nearestFeature?: Feature - } + lon: number + lat: number + mode: "left" | "right" | "middle" + /** + * The nearest feature from a MapComplete layer + */ + nearestFeature?: Feature + } > readonly minzoom: UIEventSource readonly maxzoom: UIEventSource @@ -141,7 +141,7 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { const features = map .queryRenderedFeatures([ [point.x - buffer, point.y - buffer], - [point.x + buffer, point.y + buffer], + [point.x + buffer, point.y + buffer] ]) .filter((f) => f.source.startsWith("mapcomplete_")) if (features.length === 1) { @@ -281,9 +281,9 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { return { map: mlmap, ui: new SvelteUIElement(MaplibreMap, { - map: mlmap, + map: mlmap }), - mapproperties: new MapLibreAdaptor(mlmap), + mapproperties: new MapLibreAdaptor(mlmap) } } @@ -347,7 +347,7 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { ) { const event = { date: new Date(), - key: key, + key: key } for (let i = 0; i < this._onKeyNavigation.length; i++) { @@ -536,7 +536,7 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { const bounds = map.getBounds() const bbox = new BBox([ [bounds.getEast(), bounds.getNorth()], - [bounds.getWest(), bounds.getSouth()], + [bounds.getWest(), bounds.getSouth()] ]) if (this.bounds.data === undefined || !isSetup) { this.bounds.setData(bbox) @@ -611,8 +611,11 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { if (!map) { return } + console.log("Bounds are", bbox?.asGeometry()) if (bbox) { - map?.setMaxBounds(bbox.toLngLat()) + if (GeoOperations.surfaceAreaInSqMeters(bbox.asGeojsonCached()) > 1) { + map?.setMaxBounds(bbox.toLngLat()) + } } else { map?.setMaxBounds(null) } @@ -730,14 +733,14 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { type: "raster-dem", url: "https://api.maptiler.com/tiles/terrain-rgb/tiles.json?key=" + - Constants.maptilerApiKey, + Constants.maptilerApiKey }) try { while (!map?.isStyleLoaded()) { await Utils.waitFor(250) } map.setTerrain({ - source: id, + source: id }) } catch (e) { console.error(e) @@ -762,7 +765,7 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { if (this.scaleControl === undefined) { this.scaleControl = new ScaleControl({ maxWidth: 100, - unit: "metric", + unit: "metric" }) } if (!map.hasControl(this.scaleControl)) { @@ -775,7 +778,7 @@ export class MapLibreAdaptor implements MapProperties, ExportableMap { window.requestAnimationFrame(() => { this._maplibreMap.data?.flyTo({ zoom, - center: [lon, lat], + center: [lon, lat] }) }) } diff --git a/src/UI/Map/ShowDataLayer.ts b/src/UI/Map/ShowDataLayer.ts index 710891da7..588007c3a 100644 --- a/src/UI/Map/ShowDataLayer.ts +++ b/src/UI/Map/ShowDataLayer.ts @@ -590,7 +590,11 @@ export default class ShowDataLayer { } const bbox = BBox.bboxAroundAll(features.map(BBox.get)) window.requestAnimationFrame(() => { - map.resize() + try { + map.resize() + } catch (e) { + console.error("Could not resize the map in preparation of zoomToCurrentFeatures; the error is:", e) + } map.fitBounds(bbox.toLngLat(), { padding: { top: 10, bottom: 10, left: 10, right: 10 }, animate: false,