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)
 | |
|     }
 | |
| }
 |