forked from MapComplete/MapComplete
Add switch to hide certain features, cleanup of code
This commit is contained in:
parent
aa0989b72a
commit
1b1ec9f15d
18 changed files with 230 additions and 173 deletions
|
@ -6,7 +6,7 @@ import LayerConfig from "../../Customizations/JSON/LayerConfig";
|
|||
/**
|
||||
* In some rare cases, some elements are shown on multiple layers (when 'passthrough' is enabled)
|
||||
* If this is the case, multiple objects with a different _matching_layer_id are generated.
|
||||
* If not, the _feature_layter_id is added
|
||||
* In any case, this featureSource marks the objects with _matching_layer_id
|
||||
*/
|
||||
export default class FeatureDuplicatorPerLayer implements FeatureSource {
|
||||
public readonly features: UIEventSource<{ feature: any; freshness: Date }[]>;
|
||||
|
|
|
@ -12,6 +12,7 @@ import LocalStorageSource from "./LocalStorageSource";
|
|||
import LayoutConfig from "../../Customizations/JSON/LayoutConfig";
|
||||
import Loc from "../../Models/Loc";
|
||||
import GeoJsonSource from "./GeoJsonSource";
|
||||
import MetaTaggingFeatureSource from "./MetaTaggingFeatureSource";
|
||||
|
||||
export default class FeaturePipeline implements FeatureSource {
|
||||
|
||||
|
@ -25,42 +26,42 @@ export default class FeaturePipeline implements FeatureSource {
|
|||
|
||||
const amendedOverpassSource =
|
||||
new RememberingSource(
|
||||
new WayHandlingApplyingFeatureSource(flayers,
|
||||
new NoOverlapSource(flayers, new FeatureDuplicatorPerLayer(flayers,
|
||||
new LocalStorageSaver(updater, layout)))
|
||||
)
|
||||
new NoOverlapSource(flayers, new FeatureDuplicatorPerLayer(flayers,
|
||||
new LocalStorageSaver(updater, layout)))
|
||||
);
|
||||
|
||||
const geojsonSources: GeoJsonSource [] = []
|
||||
for (const flayer of flayers.data) {
|
||||
const sourceUrl = flayer.layerDef.source.geojsonSource
|
||||
if (sourceUrl !== undefined) {
|
||||
geojsonSources.push(new WayHandlingApplyingFeatureSource(flayers,
|
||||
new GeoJsonSource(flayer.layerDef.id, sourceUrl)))
|
||||
geojsonSources.push(
|
||||
new GeoJsonSource(flayer.layerDef.id, sourceUrl))
|
||||
}
|
||||
}
|
||||
|
||||
const amendedLocalStorageSource =
|
||||
new RememberingSource(
|
||||
new WayHandlingApplyingFeatureSource(flayers,
|
||||
new NoOverlapSource(flayers, new FeatureDuplicatorPerLayer(flayers, new LocalStorageSource(layout)))
|
||||
));
|
||||
new NoOverlapSource(flayers, new FeatureDuplicatorPerLayer(flayers, new LocalStorageSource(layout)))
|
||||
);
|
||||
|
||||
newPoints = new FeatureDuplicatorPerLayer(flayers, newPoints);
|
||||
|
||||
const merged = new FeatureSourceMerger([
|
||||
amendedOverpassSource,
|
||||
amendedLocalStorageSource,
|
||||
newPoints,
|
||||
...geojsonSources
|
||||
]);
|
||||
const merged =
|
||||
new MetaTaggingFeatureSource(
|
||||
new FeatureSourceMerger([
|
||||
amendedOverpassSource,
|
||||
amendedLocalStorageSource,
|
||||
newPoints,
|
||||
...geojsonSources
|
||||
]));
|
||||
|
||||
const source =
|
||||
new FilteringFeatureSource(
|
||||
flayers,
|
||||
locationControl,
|
||||
merged
|
||||
);
|
||||
new WayHandlingApplyingFeatureSource(flayers,
|
||||
new FilteringFeatureSource(
|
||||
flayers,
|
||||
locationControl,
|
||||
merged
|
||||
));
|
||||
this.features = source.features;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ export default class FilteringFeatureSource implements FeatureSource {
|
|||
|
||||
const newFeatures = features.filter(f => {
|
||||
const layerId = f.feature._matching_layer_id;
|
||||
|
||||
if (layerId !== undefined) {
|
||||
const layer: {
|
||||
isDisplayed: UIEventSource<boolean>,
|
||||
|
@ -38,6 +39,17 @@ export default class FilteringFeatureSource implements FeatureSource {
|
|||
console.error("No layer found with id ", layerId);
|
||||
return true;
|
||||
}
|
||||
|
||||
const isShown = layer.layerDef.isShown
|
||||
const tags = f.feature.properties;
|
||||
console.log("Is shown: ", isShown," known? ", isShown.IsKnown(tags), " result: ", isShown.GetRenderValue(tags).txt)
|
||||
if(isShown.IsKnown(tags)){
|
||||
const result = layer.layerDef.isShown.GetRenderValue(f.feature.properties).txt;
|
||||
if(result !== "yes"){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (FilteringFeatureSource.showLayer(layer, location)) {
|
||||
return true;
|
||||
}
|
||||
|
|
30
Logic/FeatureSource/MetaTaggingFeatureSource.ts
Normal file
30
Logic/FeatureSource/MetaTaggingFeatureSource.ts
Normal file
|
@ -0,0 +1,30 @@
|
|||
import FeatureSource from "./FeatureSource";
|
||||
import {UIEventSource} from "../UIEventSource";
|
||||
import State from "../../State";
|
||||
import Hash from "../Web/Hash";
|
||||
import MetaTagging from "../MetaTagging";
|
||||
|
||||
export default class MetaTaggingFeatureSource implements FeatureSource {
|
||||
features: UIEventSource<{ feature: any; freshness: Date }[]> = new UIEventSource<{feature: any; freshness: Date}[]>(undefined);
|
||||
|
||||
constructor(source: FeatureSource) {
|
||||
const self = this;
|
||||
source.features.addCallbackAndRun((featuresFreshness: { feature: any, freshness: Date }[]) => {
|
||||
if (featuresFreshness === undefined) {
|
||||
return;
|
||||
}
|
||||
featuresFreshness.forEach(featureFresh => {
|
||||
const feature = featureFresh.feature;
|
||||
State.state.allElements.addOrGetElement(feature);
|
||||
|
||||
if (Hash.hash.data === feature.properties.id) {
|
||||
State.state.selectedElement.setData(feature);
|
||||
}
|
||||
})
|
||||
|
||||
MetaTagging.addMetatags(featuresFreshness, State.state.layoutToUse.data.layers);
|
||||
self.features.setData(featuresFreshness);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -3,6 +3,9 @@ import {UIEventSource} from "../UIEventSource";
|
|||
import LayerConfig from "../../Customizations/JSON/LayerConfig";
|
||||
import {GeoOperations} from "../GeoOperations";
|
||||
|
||||
/**
|
||||
* This is the part of the pipeline which introduces extra points at the center of an area (but only if this is demanded by the wayhandling)
|
||||
*/
|
||||
export default class WayHandlingApplyingFeatureSource implements FeatureSource {
|
||||
features: UIEventSource<{ feature: any; freshness: Date }[]>;
|
||||
|
||||
|
@ -46,6 +49,7 @@ export default class WayHandlingApplyingFeatureSource implements FeatureSource {
|
|||
continue;
|
||||
}
|
||||
|
||||
// Create the copy
|
||||
const centerPoint = GeoOperations.centerpoint(feat);
|
||||
centerPoint._matching_layer_id = feat._matching_layer_id;
|
||||
newFeatures.push({feature: centerPoint, freshness: f.freshness});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue