Performance: lazily download ELI when needed instead of bundling this in the download
This commit is contained in:
parent
8c779fe09b
commit
68f8432db7
14 changed files with 257 additions and 183 deletions
|
@ -1,17 +1,33 @@
|
|||
import { Feature, Polygon } from "geojson"
|
||||
import * as editorlayerindex from "../assets/editor-layer-index.json"
|
||||
import * as globallayers from "../assets/global-raster-layers.json"
|
||||
import * as bingJson from "../assets/editor-layer-index.bing.json"
|
||||
|
||||
import { BBox } from "../Logic/BBox"
|
||||
import { Store, Stores } from "../Logic/UIEventSource"
|
||||
import { Store, Stores, UIEventSource } from "../Logic/UIEventSource"
|
||||
import { GeoOperations } from "../Logic/GeoOperations"
|
||||
import { RasterLayerProperties } from "./RasterLayerProperties"
|
||||
import Constants from "./Constants"
|
||||
import { Utils } from "../Utils"
|
||||
|
||||
export type EditorLayerIndex = (Feature<Polygon, EditorLayerIndexProperties> &
|
||||
RasterLayerPolygon)[]
|
||||
|
||||
export class AvailableRasterLayers {
|
||||
public static EditorLayerIndex: (Feature<Polygon, EditorLayerIndexProperties> &
|
||||
RasterLayerPolygon)[] = (<any>editorlayerindex.features).filter(
|
||||
(l) => l.properties.id !== "Bing"
|
||||
)
|
||||
private static _editorLayerIndex: EditorLayerIndex = undefined
|
||||
private static _editorLayerIndexStore: UIEventSource<EditorLayerIndex> = new UIEventSource<EditorLayerIndex>(undefined)
|
||||
|
||||
public static async editorLayerIndex(): Promise<EditorLayerIndex> {
|
||||
if(AvailableRasterLayers._editorLayerIndex !== undefined){
|
||||
return AvailableRasterLayers._editorLayerIndex
|
||||
}
|
||||
console.debug("Downloading ELI")
|
||||
const eli = await Utils.downloadJson<{ features: EditorLayerIndex }>("./src/assets/editor-layer-index.json")
|
||||
this._editorLayerIndex = eli.features.filter(l => l.properties.id !== "Bing")
|
||||
this._editorLayerIndexStore.set(this._editorLayerIndex)
|
||||
return this._editorLayerIndex
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static globalLayers: RasterLayerPolygon[] = globallayers.layers
|
||||
.filter(
|
||||
(properties) =>
|
||||
|
@ -25,9 +41,7 @@ export class AvailableRasterLayers {
|
|||
geometry: BBox.global.asGeometry(),
|
||||
}
|
||||
)
|
||||
public static bing: RasterLayerPolygon = (<any>editorlayerindex.features).find(
|
||||
(l) => l.properties.id === "Bing"
|
||||
)
|
||||
public static bing = <RasterLayerPolygon> bingJson
|
||||
public static readonly osmCartoProperties: RasterLayerProperties = {
|
||||
id: "osm",
|
||||
name: "OpenStreetMap",
|
||||
|
@ -56,17 +70,30 @@ export class AvailableRasterLayers {
|
|||
return l.properties.id === "protomaps.sunny"
|
||||
})
|
||||
|
||||
public static layersAvailableAt(
|
||||
public static layersAvailableAt( location: Store<{ lon: number; lat: number }>,
|
||||
enableBing?: Store<boolean>): {store: Store<RasterLayerPolygon[]> } {
|
||||
const store = {store: undefined}
|
||||
Utils.AddLazyProperty(store, "store", () => AvailableRasterLayers._layersAvailableAt(location, enableBing))
|
||||
return store
|
||||
}
|
||||
|
||||
private static _layersAvailableAt(
|
||||
location: Store<{ lon: number; lat: number }>,
|
||||
enableBing?: Store<boolean>
|
||||
): Store<RasterLayerPolygon[]> {
|
||||
|
||||
this.editorLayerIndex() // start the download
|
||||
const availableLayersBboxes = Stores.ListStabilized(
|
||||
location.mapD((loc) => {
|
||||
const eli = AvailableRasterLayers._editorLayerIndexStore.data
|
||||
if(!eli){
|
||||
return []
|
||||
}
|
||||
const lonlat: [number, number] = [loc.lon, loc.lat]
|
||||
return AvailableRasterLayers.EditorLayerIndex.filter((eliPolygon) =>
|
||||
return eli.filter((eliPolygon) =>
|
||||
BBox.get(eliPolygon).contains(lonlat)
|
||||
)
|
||||
})
|
||||
}, [AvailableRasterLayers._editorLayerIndexStore])
|
||||
)
|
||||
return Stores.ListStabilized(
|
||||
availableLayersBboxes.map(
|
||||
|
@ -100,14 +127,6 @@ export class AvailableRasterLayers {
|
|||
)
|
||||
}
|
||||
|
||||
public static allIds(): Set<string> {
|
||||
const all: string[] = []
|
||||
all.push(...AvailableRasterLayers.globalLayers.map((l) => l.properties.id))
|
||||
all.push(...AvailableRasterLayers.EditorLayerIndex.map((l) => l.properties.id))
|
||||
all.push(this.osmCarto.properties.id)
|
||||
all.push(this.defaultBackgroundLayer.properties.id)
|
||||
return new Set<string>(all)
|
||||
}
|
||||
}
|
||||
|
||||
export class RasterLayerUtils {
|
||||
|
|
|
@ -8,7 +8,6 @@ import { Utils } from "../../../Utils"
|
|||
import { DetectDuplicatePresets, DoesImageExist, ValidateLanguageCompleteness } from "./Validation"
|
||||
|
||||
export class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
|
||||
private static readonly _availableLayers = AvailableRasterLayers.allIds()
|
||||
/**
|
||||
* The paths where this layer is originally saved. Triggers some extra checks
|
||||
* @private
|
||||
|
@ -150,6 +149,8 @@ export class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
|
|||
}
|
||||
|
||||
if (json.defaultBackgroundId) {
|
||||
/*
|
||||
TODO re-enable this check
|
||||
const backgroundId = json.defaultBackgroundId
|
||||
|
||||
const isCategory =
|
||||
|
@ -165,7 +166,7 @@ export class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
|
|||
.slice(0, 5)
|
||||
.join(", ")}`,
|
||||
)
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
for (let i = 0; i < theme.layers.length; i++) {
|
||||
|
|
|
@ -19,8 +19,6 @@ import { Utils } from "../../Utils"
|
|||
import { TagsFilter } from "../../Logic/Tags/TagsFilter"
|
||||
import FilterConfigJson from "./Json/FilterConfigJson"
|
||||
import { Overpass } from "../../Logic/Osm/Overpass"
|
||||
import { ImmutableStore } from "../../Logic/UIEventSource"
|
||||
import { OsmTags } from "../OsmFeature"
|
||||
import Constants from "../Constants"
|
||||
import { QuestionableTagRenderingConfigJson } from "./Json/QuestionableTagRenderingConfigJson"
|
||||
import MarkdownUtils from "../../Utils/MarkdownUtils"
|
||||
|
|
|
@ -2,11 +2,7 @@ import LayoutConfig from "./ThemeConfig/LayoutConfig"
|
|||
import { SpecialVisualizationState } from "../UI/SpecialVisualization"
|
||||
import { Changes } from "../Logic/Osm/Changes"
|
||||
import { Store, UIEventSource } from "../Logic/UIEventSource"
|
||||
import {
|
||||
FeatureSource,
|
||||
IndexedFeatureSource,
|
||||
WritableFeatureSource,
|
||||
} from "../Logic/FeatureSource/FeatureSource"
|
||||
import { FeatureSource, IndexedFeatureSource, WritableFeatureSource } from "../Logic/FeatureSource/FeatureSource"
|
||||
import { OsmConnection } from "../Logic/Osm/OsmConnection"
|
||||
import { ExportableMap, MapProperties } from "./MapProperties"
|
||||
import LayerState from "../Logic/State/LayerState"
|
||||
|
@ -50,9 +46,7 @@ import BackgroundLayerResetter from "../Logic/Actors/BackgroundLayerResetter"
|
|||
import SaveFeatureSourceToLocalStorage from "../Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage"
|
||||
import BBoxFeatureSource from "../Logic/FeatureSource/Sources/TouchesBboxFeatureSource"
|
||||
import ThemeViewStateHashActor from "../Logic/Web/ThemeViewStateHashActor"
|
||||
import NoElementsInViewDetector, {
|
||||
FeatureViewState,
|
||||
} from "../Logic/Actors/NoElementsInViewDetector"
|
||||
import NoElementsInViewDetector, { FeatureViewState } from "../Logic/Actors/NoElementsInViewDetector"
|
||||
import FilteredLayer from "./FilteredLayer"
|
||||
import { PreferredRasterLayerSelector } from "../Logic/Actors/PreferredRasterLayerSelector"
|
||||
import { ImageUploadManager } from "../Logic/ImageProviders/ImageUploadManager"
|
||||
|
@ -122,7 +116,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
readonly perLayer: ReadonlyMap<string, GeoIndexedStoreForLayer>
|
||||
readonly perLayerFiltered: ReadonlyMap<string, FilteringFeatureSource>
|
||||
|
||||
readonly availableLayers: Store<RasterLayerPolygon[]>
|
||||
readonly availableLayers: {store: Store<RasterLayerPolygon[]>}
|
||||
readonly userRelatedState: UserRelatedState
|
||||
readonly geolocation: GeoLocationHandler
|
||||
readonly geolocationControl: GeolocationControlState
|
||||
|
@ -153,7 +147,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
public readonly visualFeedback: UIEventSource<boolean> = new UIEventSource<boolean>(false)
|
||||
public readonly toCacheSavers: ReadonlyMap<string, SaveFeatureSourceToLocalStorage>
|
||||
|
||||
public readonly nearbyImageSearcher
|
||||
public readonly nearbyImageSearcher: CombinedFetcher
|
||||
|
||||
constructor(layout: LayoutConfig, mvtAvailableLayers: Set<string>) {
|
||||
Utils.initDomPurify()
|
||||
|
@ -375,9 +369,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
longAgo.setTime(new Date().getTime() - 5 * 365 * 24 * 60 * 60 * 1000)
|
||||
this.nearbyImageSearcher = new CombinedFetcher(50, longAgo, this.indexedFeatures)
|
||||
|
||||
this.featureSummary = this.setupSummaryLayer(
|
||||
new LayerConfig(<LayerConfigJson>summaryLayer, "summaryLayer", true)
|
||||
)
|
||||
this.featureSummary = this.setupSummaryLayer()
|
||||
this.toCacheSavers = layout.enableCache ? this.initSaveToLocalStorage() : undefined
|
||||
this.initActors()
|
||||
this.drawSpecialLayers()
|
||||
|
@ -647,7 +639,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
}
|
||||
)
|
||||
const setLayerCategory = (category: EliCategory) => {
|
||||
const available = this.availableLayers.data
|
||||
const available = this.availableLayers.store.data
|
||||
const current = this.mapProperties.rasterLayer
|
||||
const best = RasterLayerUtils.SelectBestLayerAccordingTo(
|
||||
available,
|
||||
|
@ -696,7 +688,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
)
|
||||
}
|
||||
|
||||
private setupSummaryLayer(summaryLayerConfig: LayerConfig): SummaryTileSourceRewriter {
|
||||
private setupSummaryLayer(): SummaryTileSourceRewriter {
|
||||
/**
|
||||
* MaxZoom for the summary layer
|
||||
*/
|
||||
|
@ -723,8 +715,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
}
|
||||
)
|
||||
|
||||
const src = new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers)
|
||||
return src
|
||||
return new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue