forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { Store, UIEventSource } from "../../Logic/UIEventSource"
 | 
						|
import { Map as MlMap } from "maplibre-gl"
 | 
						|
import { Utils } from "../../Utils"
 | 
						|
import { MapLibreAdaptor } from "./MapLibreAdaptor"
 | 
						|
import { RasterLayerProperties } from "../../Models/RasterLayerProperties"
 | 
						|
 | 
						|
export default class ShowOverlayRasterLayer {
 | 
						|
    private readonly _map: UIEventSource<MlMap>
 | 
						|
    private readonly _layer: RasterLayerProperties
 | 
						|
    private readonly _mapProperties?: { zoom: Store<number> }
 | 
						|
    private _mllayer
 | 
						|
    private readonly _isDisplayed?: Store<boolean>
 | 
						|
 | 
						|
    constructor(
 | 
						|
        layer: RasterLayerProperties,
 | 
						|
        map: UIEventSource<MlMap>,
 | 
						|
        mapProperties?: { zoom: Store<number> },
 | 
						|
        options?: {
 | 
						|
            isDisplayed?: Store<boolean>
 | 
						|
        }
 | 
						|
    ) {
 | 
						|
        this._mapProperties = mapProperties
 | 
						|
        this._layer = layer
 | 
						|
        this._map = map
 | 
						|
        this._isDisplayed = options?.isDisplayed
 | 
						|
        const self = this
 | 
						|
        map.addCallbackAndRunD((map) => {
 | 
						|
            self.addLayer()
 | 
						|
            map.on("load", () => {
 | 
						|
                self.addLayer()
 | 
						|
            })
 | 
						|
        })
 | 
						|
        this.addLayer()
 | 
						|
 | 
						|
        options?.isDisplayed?.addCallbackAndRun(() => {
 | 
						|
            self.setVisibility()
 | 
						|
        })
 | 
						|
 | 
						|
        mapProperties?.zoom?.addCallbackAndRun(() => {
 | 
						|
            self.setVisibility()
 | 
						|
        })
 | 
						|
    }
 | 
						|
 | 
						|
    private setVisibility() {
 | 
						|
        let zoom = this._mapProperties?.zoom?.data
 | 
						|
        let withinRange = zoom === undefined || zoom > this._layer.min_zoom
 | 
						|
        let isDisplayed = (this._isDisplayed?.data ?? true) && withinRange
 | 
						|
        this._map.data?.setLayoutProperty(
 | 
						|
            this._layer.id,
 | 
						|
            "visibility",
 | 
						|
            isDisplayed ? "visible" : "none"
 | 
						|
        )
 | 
						|
    }
 | 
						|
 | 
						|
    private async awaitStyleIsLoaded(): Promise<void> {
 | 
						|
        const map = this._map.data
 | 
						|
        if (map === undefined) {
 | 
						|
            return
 | 
						|
        }
 | 
						|
        while (!map?.isStyleLoaded()) {
 | 
						|
            await Utils.waitFor(250)
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    private async addLayer() {
 | 
						|
        const map = this._map.data
 | 
						|
        console.log("Attempting to add ", this._layer.id)
 | 
						|
        if (map === undefined) {
 | 
						|
            return
 | 
						|
        }
 | 
						|
        await this.awaitStyleIsLoaded()
 | 
						|
        if (this._mllayer) {
 | 
						|
            // Already initialized
 | 
						|
            return
 | 
						|
        }
 | 
						|
        const background: RasterLayerProperties = this._layer
 | 
						|
 | 
						|
        map.addSource(background.id, MapLibreAdaptor.prepareWmsSource(background))
 | 
						|
        this._mllayer = map.addLayer({
 | 
						|
            id: background.id,
 | 
						|
            type: "raster",
 | 
						|
            source: background.id,
 | 
						|
            paint: {},
 | 
						|
        })
 | 
						|
        map.setLayoutProperty(
 | 
						|
            this._layer.id,
 | 
						|
            "visibility",
 | 
						|
            this._isDisplayed?.data ?? true ? "visible" : "none"
 | 
						|
        )
 | 
						|
        this.setVisibility()
 | 
						|
    }
 | 
						|
}
 |