forked from MapComplete/MapComplete
Search: load the popup of the OSM-object when clicked on the map, also when zoomed out
This commit is contained in:
parent
a9d6aaa448
commit
48dc03b1e6
2 changed files with 34 additions and 7 deletions
|
@ -2,14 +2,14 @@ import { Store, UIEventSource } from "../../UIEventSource"
|
||||||
import { FeatureSource, IndexedFeatureSource, UpdatableFeatureSource } from "../FeatureSource"
|
import { FeatureSource, IndexedFeatureSource, UpdatableFeatureSource } from "../FeatureSource"
|
||||||
import { Feature } from "geojson"
|
import { Feature } from "geojson"
|
||||||
import { Utils } from "../../../Utils"
|
import { Utils } from "../../../Utils"
|
||||||
|
import { OsmFeature } from "../../../Models/OsmFeature"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The featureSourceMerger receives complete geometries from various sources.
|
* The featureSourceMerger receives complete geometries from various sources.
|
||||||
* If multiple sources contain the same object (as determined by 'id'), only one copy of them is retained
|
* If multiple sources contain the same object (as determined by 'id'), only one copy of them is retained
|
||||||
*/
|
*/
|
||||||
export default class FeatureSourceMerger<Src extends FeatureSource = FeatureSource>
|
export default class FeatureSourceMerger<Src extends FeatureSource = FeatureSource>
|
||||||
implements IndexedFeatureSource
|
implements IndexedFeatureSource {
|
||||||
{
|
|
||||||
public features: UIEventSource<Feature[]> = new UIEventSource([])
|
public features: UIEventSource<Feature[]> = new UIEventSource([])
|
||||||
public readonly featuresById: Store<Map<string, Feature>>
|
public readonly featuresById: Store<Map<string, Feature>>
|
||||||
protected readonly _featuresById: UIEventSource<Map<string, Feature>>
|
protected readonly _featuresById: UIEventSource<Map<string, Feature>>
|
||||||
|
@ -50,6 +50,24 @@ export default class FeatureSourceMerger<Src extends FeatureSource = FeatureSour
|
||||||
this.addData(sources.map((s) => s.features.data))
|
this.addData(sources.map((s) => s.features.data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the given feature if it isn't in the dictionary yet.
|
||||||
|
* Returns 'true' if this was a previously unseen item.
|
||||||
|
* If the item was already present, nothing will happen
|
||||||
|
*/
|
||||||
|
public addItem(f: OsmFeature): boolean {
|
||||||
|
const id = f.properties.id
|
||||||
|
|
||||||
|
const all = this._featuresById.data
|
||||||
|
if (!all.has(id)) {
|
||||||
|
all.set(id, f)
|
||||||
|
this._featuresById.ping()
|
||||||
|
this.features.data.push(f)
|
||||||
|
this.features.ping()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected addData(sources: Feature[][]) {
|
protected addData(sources: Feature[][]) {
|
||||||
sources = Utils.NoNull(sources)
|
sources = Utils.NoNull(sources)
|
||||||
let somethingChanged = false
|
let somethingChanged = false
|
||||||
|
@ -101,13 +119,13 @@ export default class FeatureSourceMerger<Src extends FeatureSource = FeatureSour
|
||||||
|
|
||||||
export class UpdatableFeatureSourceMerger<
|
export class UpdatableFeatureSourceMerger<
|
||||||
Src extends UpdatableFeatureSource = UpdatableFeatureSource
|
Src extends UpdatableFeatureSource = UpdatableFeatureSource
|
||||||
>
|
>
|
||||||
extends FeatureSourceMerger<Src>
|
extends FeatureSourceMerger<Src>
|
||||||
implements IndexedFeatureSource, UpdatableFeatureSource
|
implements IndexedFeatureSource, UpdatableFeatureSource {
|
||||||
{
|
|
||||||
constructor(...sources: Src[]) {
|
constructor(...sources: Src[]) {
|
||||||
super(...sources)
|
super(...sources)
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateAsync() {
|
async updateAsync() {
|
||||||
await Promise.all(this._sources.map((src) => src.updateAsync()))
|
await Promise.all(this._sources.map((src) => src.updateAsync()))
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,12 +135,21 @@ export default class SearchState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clickedOnMap(feature: Feature) {
|
async clickedOnMap(feature: Feature) {
|
||||||
const osmid = feature.properties.osm_id
|
const osmid = feature.properties.osm_id
|
||||||
const localElement = this.state.indexedFeatures.featuresById.data.get(osmid)
|
const localElement = this.state.indexedFeatures.featuresById.data.get(osmid)
|
||||||
if (localElement) {
|
if (localElement) {
|
||||||
this.state.selectedElement.set(localElement)
|
this.state.selectedElement.set(localElement)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// This feature might not be loaded because we zoomed out
|
||||||
|
const object = await this.state.osmObjectDownloader.DownloadObjectAsync(osmid)
|
||||||
|
if(object === "deleted"){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const f = object.asGeoJson()
|
||||||
|
this.state.indexedFeatures.addItem(f)
|
||||||
|
this.state.featureProperties.trackFeature(f)
|
||||||
|
this.state.selectedElement.set(f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue