Fix: don't save big objects to the cache, see #1919

This commit is contained in:
Pieter Vander Vennet 2025-02-03 02:32:06 +01:00
parent ab47919e17
commit 3cc7d05e03

View file

@ -13,6 +13,7 @@ class SingleTileSaver {
private readonly _registeredIds = new Set<string>() private readonly _registeredIds = new Set<string>()
private readonly _featureProperties: FeaturePropertiesStore private readonly _featureProperties: FeaturePropertiesStore
private readonly _isDirty = new UIEventSource(false) private readonly _isDirty = new UIEventSource(false)
constructor( constructor(
storage: UIEventSource<Feature[]> & { flush: () => void }, storage: UIEventSource<Feature[]> & { flush: () => void },
featureProperties: FeaturePropertiesStore featureProperties: FeaturePropertiesStore
@ -62,6 +63,7 @@ class SingleTileSaver {
export default class SaveFeatureSourceToLocalStorage { export default class SaveFeatureSourceToLocalStorage {
public readonly storage: TileLocalStorage<Feature[]> public readonly storage: TileLocalStorage<Feature[]>
private readonly zoomlevel: number private readonly zoomlevel: number
constructor( constructor(
backend: string, backend: string,
layername: string, layername: string,
@ -75,8 +77,25 @@ export default class SaveFeatureSourceToLocalStorage {
this.storage = storage this.storage = storage
const singleTileSavers: Map<number, SingleTileSaver> = new Map<number, SingleTileSaver>() const singleTileSavers: Map<number, SingleTileSaver> = new Map<number, SingleTileSaver>()
features.features.addCallbackAndRunD((features) => { features.features.addCallbackAndRunD((features) => {
if (features.some(f => {
let totalPoints = 0
if (f.geometry.type === "MultiPolygon") {
totalPoints = f.geometry.coordinates.map(rings => rings.map(ring => ring.length).reduce((a, b) => a + b)).reduce((a, b) => a + b)
} else if (f.geometry.type === "Polygon" || f.geometry.type === "MultiLineString") {
totalPoints = f.geometry.coordinates.map(ring => ring.length).reduce((a, b) => a + b)
} else if (f.geometry.type === "LineString") {
totalPoints = f.geometry.coordinates.length
}
if (totalPoints > 1000) {
console.warn(`Not caching tiles, detected a big object (${totalPoints} points for ${f.properties.id})`)
return true
}
return false
})) {
// Has big objects
return
}
const sliced = GeoOperations.spreadIntoBboxes(features, zoomlevel) const sliced = GeoOperations.spreadIntoBboxes(features, zoomlevel)
sliced.forEach((features, tileIndex) => { sliced.forEach((features, tileIndex) => {
let tileSaver = singleTileSavers.get(tileIndex) let tileSaver = singleTileSavers.get(tileIndex)
if (tileSaver === undefined) { if (tileSaver === undefined) {