53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
import { FeatureSource, FeatureSourceForLayer } from "../FeatureSource"
|
|
import { Feature } from "geojson"
|
|
import { BBox } from "../../BBox"
|
|
import { GeoOperations } from "../../GeoOperations"
|
|
import { Store } from "../../UIEventSource"
|
|
import FilteredLayer from "../../../Models/FilteredLayer"
|
|
|
|
/**
|
|
* Allows the retrieval of all features in the requested BBox; useful for one-shot queries;
|
|
*
|
|
* Use a ClippedFeatureSource for a continuously updating featuresource
|
|
*/
|
|
export default class GeoIndexedStore implements FeatureSource {
|
|
public features: Store<Feature[]>
|
|
|
|
constructor(features: FeatureSource | Store<Feature[]>) {
|
|
this.features = features["features"] ?? features
|
|
}
|
|
|
|
/**
|
|
* Gets the current features within the given bbox.
|
|
*
|
|
* @param bbox
|
|
* @constructor
|
|
*/
|
|
public GetFeaturesWithin(bbox: BBox): Feature[] {
|
|
const bboxFeature = bbox.asGeojsonCached()
|
|
return this.features.data.filter((f) => {
|
|
if (f.geometry.type === "Point") {
|
|
return bbox.contains(<[number, number]>f.geometry.coordinates)
|
|
}
|
|
if (f.geometry.type === "LineString") {
|
|
const intersection = GeoOperations.intersect(
|
|
BBox.get(f).asGeojsonCached(),
|
|
bboxFeature
|
|
)
|
|
return intersection !== undefined
|
|
}
|
|
if (f.geometry.type === "Polygon" || f.geometry.type === "MultiPolygon") {
|
|
return GeoOperations.intersect(f, bboxFeature) !== undefined
|
|
}
|
|
return GeoOperations.intersect(f, bboxFeature) !== undefined
|
|
})
|
|
}
|
|
}
|
|
|
|
export class GeoIndexedStoreForLayer extends GeoIndexedStore implements FeatureSourceForLayer {
|
|
readonly layer: FilteredLayer
|
|
constructor(features: FeatureSource | Store<Feature[]>, layer: FilteredLayer) {
|
|
super(features)
|
|
this.layer = layer
|
|
}
|
|
}
|