forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			90 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import FeatureSource, { FeatureSourceForLayer, Tiled } from "../FeatureSource"
 | 
						|
import { ImmutableStore, Store, UIEventSource } from "../../UIEventSource"
 | 
						|
import { stat } from "fs"
 | 
						|
import FilteredLayer from "../../../Models/FilteredLayer"
 | 
						|
import { BBox } from "../../BBox"
 | 
						|
import { Feature } from "@turf/turf"
 | 
						|
 | 
						|
/**
 | 
						|
 * A simple, read only feature store.
 | 
						|
 */
 | 
						|
export default class StaticFeatureSource implements FeatureSource {
 | 
						|
    public readonly features: Store<{ feature: any; freshness: Date }[]>
 | 
						|
    public readonly name: string
 | 
						|
 | 
						|
    constructor(
 | 
						|
        features: Store<{ feature: Feature; freshness: Date }[]>,
 | 
						|
        name = "StaticFeatureSource"
 | 
						|
    ) {
 | 
						|
        if (features === undefined) {
 | 
						|
            throw "Static feature source received undefined as source"
 | 
						|
        }
 | 
						|
        this.name = name
 | 
						|
        this.features = features
 | 
						|
    }
 | 
						|
 | 
						|
    public static fromGeojsonAndDate(
 | 
						|
        features: { feature: Feature; freshness: Date }[],
 | 
						|
        name = "StaticFeatureSourceFromGeojsonAndDate"
 | 
						|
    ): StaticFeatureSource {
 | 
						|
        return new StaticFeatureSource(new ImmutableStore(features), name)
 | 
						|
    }
 | 
						|
 | 
						|
    public static fromGeojson(
 | 
						|
        geojson: Feature[],
 | 
						|
        name = "StaticFeatureSourceFromGeojson"
 | 
						|
    ): StaticFeatureSource {
 | 
						|
        const now = new Date()
 | 
						|
        return StaticFeatureSource.fromGeojsonAndDate(
 | 
						|
            geojson.map((feature) => ({ feature, freshness: now })),
 | 
						|
            name
 | 
						|
        )
 | 
						|
    }
 | 
						|
 | 
						|
    public static fromGeojsonStore(
 | 
						|
        geojson: Store<Feature[]>,
 | 
						|
        name = "StaticFeatureSourceFromGeojson"
 | 
						|
    ): StaticFeatureSource {
 | 
						|
        const now = new Date()
 | 
						|
        const mapped: Store<{ feature: Feature; freshness: Date }[]> = geojson.map((features) =>
 | 
						|
            features.map((feature) => ({ feature, freshness: now }))
 | 
						|
        )
 | 
						|
        return new StaticFeatureSource(mapped, name)
 | 
						|
    }
 | 
						|
 | 
						|
    static fromDateless(
 | 
						|
        featureSource: Store<{ feature: Feature }[]>,
 | 
						|
        name = "StaticFeatureSourceFromDateless"
 | 
						|
    ) {
 | 
						|
        const now = new Date()
 | 
						|
        return new StaticFeatureSource(
 | 
						|
            featureSource.map((features) =>
 | 
						|
                features.map((feature) => ({
 | 
						|
                    feature: feature.feature,
 | 
						|
                    freshness: now,
 | 
						|
                }))
 | 
						|
            ),
 | 
						|
            name
 | 
						|
        )
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
export class TiledStaticFeatureSource
 | 
						|
    extends StaticFeatureSource
 | 
						|
    implements Tiled, FeatureSourceForLayer
 | 
						|
{
 | 
						|
    public readonly bbox: BBox = BBox.global
 | 
						|
    public readonly tileIndex: number
 | 
						|
    public readonly layer: FilteredLayer
 | 
						|
 | 
						|
    constructor(
 | 
						|
        features: Store<{ feature: any; freshness: Date }[]>,
 | 
						|
        layer: FilteredLayer,
 | 
						|
        tileIndex: number = 0
 | 
						|
    ) {
 | 
						|
        super(features)
 | 
						|
        this.tileIndex = tileIndex
 | 
						|
        this.layer = layer
 | 
						|
        this.bbox = BBox.fromTileIndex(this.tileIndex)
 | 
						|
    }
 | 
						|
}
 |