diff --git a/Logic/FeatureSource/Sources/TouchesBboxFeatureSource.ts b/Logic/FeatureSource/Sources/TouchesBboxFeatureSource.ts index 3a6c6ce49..31613fee0 100644 --- a/Logic/FeatureSource/Sources/TouchesBboxFeatureSource.ts +++ b/Logic/FeatureSource/Sources/TouchesBboxFeatureSource.ts @@ -1,28 +1,40 @@ -import {FeatureSource, FeatureSourceForLayer } from "../FeatureSource" +import { FeatureSource, FeatureSourceForLayer } from "../FeatureSource" import StaticFeatureSource from "./StaticFeatureSource" -import { GeoOperations } from "../../GeoOperations" import { BBox } from "../../BBox" import FilteredLayer from "../../../Models/FilteredLayer" +import { Store } from "../../UIEventSource" /** * Results in a feature source which has all the elements that touch the given features */ export default class BBoxFeatureSource extends StaticFeatureSource { - constructor(features: FeatureSource, mustTouch: BBox) { - const bbox = mustTouch.asGeoJson({}) + constructor(features: FeatureSource, mustTouch: Store) { super( - features.features.mapD((features) => - features.filter((feature) => GeoOperations.intersect(feature, bbox) !== undefined) + features.features.mapD( + (features) => { + if (mustTouch.data === undefined) { + return features + } + console.log("UPdating touching bbox") + const box = mustTouch.data + return features.filter((feature) => { + if (feature.geometry.type === "Point") { + return box.contains(<[number, number]>feature.geometry.coordinates) + } + return box.overlapsWith(BBox.get(feature)) + }) + }, + [mustTouch] ) ) } } export class BBoxFeatureSourceForLayer extends BBoxFeatureSource implements FeatureSourceForLayer { - constructor(features: FeatureSourceForLayer, mustTouch: BBox) { + readonly layer: FilteredLayer + + constructor(features: FeatureSourceForLayer, mustTouch: Store) { super(features, mustTouch) this.layer = features.layer } - - readonly layer: FilteredLayer } diff --git a/Models/ThemeViewState.ts b/Models/ThemeViewState.ts index 659683d2c..95d81d4bd 100644 --- a/Models/ThemeViewState.ts +++ b/Models/ThemeViewState.ts @@ -49,6 +49,7 @@ import { EliCategory } from "./RasterLayerProperties" import BackgroundLayerResetter from "../Logic/Actors/BackgroundLayerResetter" import SaveFeatureSourceToLocalStorage from "../Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage" import Hash from "../Logic/Web/Hash" +import BBoxFeatureSource from "../Logic/FeatureSource/Sources/TouchesBboxFeatureSource" /** * @@ -79,6 +80,7 @@ export default class ThemeViewState implements SpecialVisualizationState { readonly historicalUserLocations: WritableFeatureSource> readonly indexedFeatures: IndexedFeatureSource & LayoutSource + readonly featuresInView: FeatureSource readonly newFeatures: WritableFeatureSource readonly layerState: LayerState readonly perLayer: ReadonlyMap @@ -167,6 +169,7 @@ export default class ThemeViewState implements SpecialVisualizationState { (id) => self.layerState.filteredLayers.get(id).isDisplayed ) this.indexedFeatures = layoutSource + this.featuresInView = new BBoxFeatureSource(layoutSource, this.mapProperties.bounds) this.dataIsLoading = layoutSource.isLoading const indexedElements = this.indexedFeatures @@ -252,7 +255,7 @@ export default class ThemeViewState implements SpecialVisualizationState { }) }) - this.floors = this.indexedFeatures.features.stabilized(500).map((features) => { + this.floors = this.featuresInView.features.stabilized(500).map((features) => { if (!features) { return [] } diff --git a/UI/BigComponents/LevelSelector.svelte b/UI/BigComponents/LevelSelector.svelte index 68b29a71b..9734cd9a0 100644 --- a/UI/BigComponents/LevelSelector.svelte +++ b/UI/BigComponents/LevelSelector.svelte @@ -22,7 +22,7 @@ layerState.setLevelFilter(floor) } }, [floors, zoom]) - + {#if $zoom >= maxZoom} diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts index a9d62655b..e7daccd83 100644 --- a/UI/SpecialVisualizations.ts +++ b/UI/SpecialVisualizations.ts @@ -1188,7 +1188,7 @@ export default class SpecialVisualizations { .map( (l) => { const fs = state.perLayer.get(l.id) - const bbox = state.mapProperties.bounds.data + const bbox = state.mapProperties.bounds const fsBboxed = new BBoxFeatureSourceForLayer(fs, bbox) return new StatisticsPanel(fsBboxed) }, diff --git a/UI/ThemeViewGUI.svelte b/UI/ThemeViewGUI.svelte index d032edcbc..5c6b33e13 100644 --- a/UI/ThemeViewGUI.svelte +++ b/UI/ThemeViewGUI.svelte @@ -79,14 +79,14 @@
state.guistate.themeIsOpened.setData(true)}>
- +
state.guistate.menuIsOpened.setData(true)}> - + @@ -108,15 +108,15 @@
mapproperties.zoom.update(z => z+1)}> - + mapproperties.zoom.update(z => z-1)}> - + + construct={new GeolocationControl(state.geolocation, mapproperties).SetClass("block w-8 h-8")}>