forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import FeatureSource, {FeatureSourceForLayer, Tiled} from "../FeatureSource"
 | 
						|
import {ImmutableStore, Store} from "../../UIEventSource"
 | 
						|
import FilteredLayer from "../../../Models/FilteredLayer"
 | 
						|
import {BBox} from "../../BBox"
 | 
						|
import {Feature} from "geojson";
 | 
						|
 | 
						|
/**
 | 
						|
 * 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)
 | 
						|
    }
 | 
						|
}
 |