forked from MapComplete/MapComplete
Fix: don't save big objects to the cache, see #1919
This commit is contained in:
parent
ab47919e17
commit
3cc7d05e03
1 changed files with 20 additions and 1 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue