Use merged-source instead of way-handled-source when calculating contained objects in the meta-tagging

This commit is contained in:
Pieter Vander Vennet 2021-06-21 03:25:54 +02:00
parent fb0490ec27
commit f723349e40
3 changed files with 16 additions and 14 deletions

View file

@ -16,7 +16,7 @@ import RegisteringFeatureSource from "./RegisteringFeatureSource";
export default class FeaturePipeline implements FeatureSource { export default class FeaturePipeline implements FeatureSource {
public features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{feature: any; freshness: Date}[]>([]); public features: UIEventSource<{ feature: any; freshness: Date }[]> ;
public readonly name = "FeaturePipeline" public readonly name = "FeaturePipeline"
@ -28,6 +28,8 @@ export default class FeaturePipeline implements FeatureSource {
locationControl: UIEventSource<Loc>, locationControl: UIEventSource<Loc>,
selectedElement: UIEventSource<any>) { selectedElement: UIEventSource<any>) {
const allLoadedFeatures = new UIEventSource<{ feature: any; freshness: Date }[]>([])
// first we metatag, then we save to get the metatags into storage too // first we metatag, then we save to get the metatags into storage too
// Note that we need to register before we do metatagging (as it expects the event sources) // Note that we need to register before we do metatagging (as it expects the event sources)
@ -35,7 +37,7 @@ export default class FeaturePipeline implements FeatureSource {
const amendedOverpassSource = const amendedOverpassSource =
new RememberingSource( new RememberingSource(
new LocalStorageSaver( new LocalStorageSaver(
new MetaTaggingFeatureSource(this, new MetaTaggingFeatureSource(allLoadedFeatures,
new FeatureDuplicatorPerLayer(flayers, new FeatureDuplicatorPerLayer(flayers,
new RegisteringFeatureSource( new RegisteringFeatureSource(
updater) updater)
@ -46,7 +48,7 @@ export default class FeaturePipeline implements FeatureSource {
.map(geojsonSource => { .map(geojsonSource => {
let source = new RegisteringFeatureSource(new FeatureDuplicatorPerLayer(flayers, geojsonSource)); let source = new RegisteringFeatureSource(new FeatureDuplicatorPerLayer(flayers, geojsonSource));
if(!geojsonSource.isOsmCache){ if(!geojsonSource.isOsmCache){
source = new MetaTaggingFeatureSource(this, source, updater.features); source = new MetaTaggingFeatureSource(allLoadedFeatures, source, updater.features);
} }
return source return source
}); });
@ -55,18 +57,17 @@ export default class FeaturePipeline implements FeatureSource {
new RememberingSource(new RegisteringFeatureSource(new FeatureDuplicatorPerLayer(flayers, new LocalStorageSource(layout)) new RememberingSource(new RegisteringFeatureSource(new FeatureDuplicatorPerLayer(flayers, new LocalStorageSource(layout))
)); ));
newPoints = new MetaTaggingFeatureSource(this, newPoints = new MetaTaggingFeatureSource(allLoadedFeatures,
new FeatureDuplicatorPerLayer(flayers, new FeatureDuplicatorPerLayer(flayers,
new RegisteringFeatureSource(newPoints))); new RegisteringFeatureSource(newPoints)));
const amendedOsmApiSource = new RememberingSource( const amendedOsmApiSource = new RememberingSource(
new MetaTaggingFeatureSource(this, new MetaTaggingFeatureSource(allLoadedFeatures,
new FeatureDuplicatorPerLayer(flayers, new FeatureDuplicatorPerLayer(flayers,
new RegisteringFeatureSource(fromOsmApi)))); new RegisteringFeatureSource(fromOsmApi))));
const merged = const merged =
new FeatureSourceMerger([ new FeatureSourceMerger([
amendedOverpassSource, amendedOverpassSource,
amendedOsmApiSource, amendedOsmApiSource,
@ -75,6 +76,8 @@ export default class FeaturePipeline implements FeatureSource {
...geojsonSources ...geojsonSources
]); ]);
merged.features.syncWith(allLoadedFeatures)
const source = const source =
new WayHandlingApplyingFeatureSource(flayers, new WayHandlingApplyingFeatureSource(flayers,
new FilteringFeatureSource( new FilteringFeatureSource(
@ -83,8 +86,7 @@ export default class FeaturePipeline implements FeatureSource {
selectedElement, selectedElement,
merged merged
)); ));
this.features = source.features;
source.features.syncWith(this.features)
} }
} }

View file

@ -15,12 +15,12 @@ export default class MetaTaggingFeatureSource implements FeatureSource {
* @param source: the source of features that should get their metatag and which should be exported again * @param source: the source of features that should get their metatag and which should be exported again
* @param updateTrigger * @param updateTrigger
*/ */
constructor(allFeaturesSource: FeatureSource, source: FeatureSource, updateTrigger?: UIEventSource<any>) { constructor(allFeaturesSource: UIEventSource<{ feature: any; freshness: Date }[]>, source: FeatureSource, updateTrigger?: UIEventSource<any>) {
const self = this; const self = this;
this.name = "MetaTagging of " + source.name this.name = "MetaTagging of " + source.name
if(allFeaturesSource.features === undefined){ if(allFeaturesSource === undefined){
throw ("Initialize the featuresource fully first!"+allFeaturesSource.name) throw ("UIEVentSource is undefined")
} }
function update() { function update() {

View file

@ -2,7 +2,7 @@ import LayerConfig from "../Customizations/JSON/LayerConfig";
import SimpleMetaTagger from "./SimpleMetaTagger"; import SimpleMetaTagger from "./SimpleMetaTagger";
import {ExtraFunction} from "./ExtraFunction"; import {ExtraFunction} from "./ExtraFunction";
import {Relation} from "./Osm/ExtractRelations"; import {Relation} from "./Osm/ExtractRelations";
import FeatureSource from "./FeatureSource/FeatureSource"; import {UIEventSource} from "./UIEventSource";
interface Params { interface Params {
@ -23,7 +23,7 @@ export default class MetaTagging {
* The features are a list of geojson-features, with a "properties"-field and geometry * The features are a list of geojson-features, with a "properties"-field and geometry
*/ */
static addMetatags(features: { feature: any; freshness: Date }[], static addMetatags(features: { feature: any; freshness: Date }[],
allKnownFeatures: FeatureSource, allKnownFeatures: UIEventSource<{ feature: any; freshness: Date }[]>,
relations: Map<string, { role: string, relation: Relation }[]>, relations: Map<string, { role: string, relation: Relation }[]>,
layers: LayerConfig[], layers: LayerConfig[],
includeDates = true) { includeDates = true) {
@ -51,7 +51,7 @@ export default class MetaTagging {
layerFuncs.set(layer.id, this.createRetaggingFunc(layer)); layerFuncs.set(layer.id, this.createRetaggingFunc(layer));
} }
allKnownFeatures.features.addCallbackAndRun(newFeatures => { allKnownFeatures.addCallbackAndRun(newFeatures => {
const featuresPerLayer = new Map<string, any[]>(); const featuresPerLayer = new Map<string, any[]>();
const allFeatures = Array.from(new Set(features.concat(newFeatures))) const allFeatures = Array.from(new Set(features.concat(newFeatures)))