forked from MapComplete/MapComplete
The overpassfeaturesource now only fetches layers that must be updated, fix #599
This commit is contained in:
parent
9b88478804
commit
00e5ce0b02
7 changed files with 56 additions and 10 deletions
|
@ -11,6 +11,8 @@ import {BBox} from "../BBox";
|
|||
import Loc from "../../Models/Loc";
|
||||
import LayerConfig from "../../Models/ThemeConfig/LayerConfig";
|
||||
import Constants from "../../Models/Constants";
|
||||
import TileFreshnessCalculator from "../FeatureSource/TileFreshnessCalculator";
|
||||
import {Tiles} from "../../Models/TileRange";
|
||||
|
||||
|
||||
export default class OverpassFeatureSource implements FeatureSource {
|
||||
|
@ -38,9 +40,18 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
readonly overpassTimeout: UIEventSource<number>;
|
||||
readonly currentBounds: UIEventSource<BBox>
|
||||
}
|
||||
private readonly _isActive: UIEventSource<boolean>;
|
||||
private readonly _isActive: UIEventSource<boolean>
|
||||
/**
|
||||
* Callback to handle all the data
|
||||
*/
|
||||
private readonly onBboxLoaded: (bbox: BBox, date: Date, layers: LayerConfig[], zoomlevel: number) => void;
|
||||
|
||||
/**
|
||||
* Keeps track of how fresh the data is
|
||||
* @private
|
||||
*/
|
||||
private readonly freshnesses: Map<string, TileFreshnessCalculator>;
|
||||
|
||||
constructor(
|
||||
state: {
|
||||
readonly locationControl: UIEventSource<Loc>,
|
||||
|
@ -54,13 +65,15 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
padToTiles: UIEventSource<number>,
|
||||
isActive?: UIEventSource<boolean>,
|
||||
relationTracker: RelationsTracker,
|
||||
onBboxLoaded?: (bbox: BBox, date: Date, layers: LayerConfig[], zoomlevel: number) => void
|
||||
onBboxLoaded?: (bbox: BBox, date: Date, layers: LayerConfig[], zoomlevel: number) => void,
|
||||
freshnesses?: Map<string, TileFreshnessCalculator>
|
||||
}) {
|
||||
|
||||
this.state = state
|
||||
this._isActive = options.isActive;
|
||||
this.onBboxLoaded = options.onBboxLoaded
|
||||
this.relationsTracker = options.relationTracker
|
||||
this.freshnesses = options.freshnesses
|
||||
const self = this;
|
||||
state.currentBounds.addCallback(_ => {
|
||||
self.update(options.padToTiles.data)
|
||||
|
@ -117,12 +130,13 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
|
||||
|
||||
const layersToDownload = []
|
||||
const neededTiles = this.state.currentBounds.data.expandToTileBounds(padToZoomLevel).containingTileRange(padToZoomLevel)
|
||||
for (const layer of this.state.layoutToUse.layers) {
|
||||
|
||||
if (typeof (layer) === "string") {
|
||||
throw "A layer was not expanded!"
|
||||
}
|
||||
if(Constants.priviliged_layers.indexOf(layer.id) >= 0){
|
||||
if (Constants.priviliged_layers.indexOf(layer.id) >= 0) {
|
||||
continue
|
||||
}
|
||||
if (this.state.locationControl.data.zoom < layer.minzoom) {
|
||||
|
@ -135,9 +149,32 @@ export default class OverpassFeatureSource implements FeatureSource {
|
|||
// Not our responsibility to download this layer!
|
||||
continue;
|
||||
}
|
||||
const freshness = this.freshnesses?.get(layer.id)
|
||||
if (freshness !== undefined) {
|
||||
const oldestDataDate = Math.min(...Tiles.MapRange(neededTiles, (x, y) => {
|
||||
const date = freshness.freshnessFor(padToZoomLevel, x, y);
|
||||
if (date === undefined) {
|
||||
return 0
|
||||
}
|
||||
return date.getTime()
|
||||
})) / 1000;
|
||||
const now = new Date().getTime()
|
||||
const minRequiredAge = (now / 1000) - layer.maxAgeOfCache
|
||||
if (oldestDataDate >= minRequiredAge) {
|
||||
// still fresh enough - not updating
|
||||
continue
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
layersToDownload.push(layer)
|
||||
}
|
||||
|
||||
if (layersToDownload.length == 0) {
|
||||
console.debug("Not updating - no layers needed")
|
||||
return;
|
||||
}
|
||||
|
||||
const self = this;
|
||||
const overpassUrls = self.state.overpassUrl.data
|
||||
let bounds: BBox
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue