forked from MapComplete/MapComplete
Refactoring of metatagging and extrafunctions to splice out the relation memberships, add calculatedTags and metatags into cache
This commit is contained in:
parent
362abbf079
commit
0dec1d0f75
10 changed files with 98 additions and 54 deletions
|
@ -1,6 +1,14 @@
|
|||
import LayerConfig from "../Customizations/JSON/LayerConfig";
|
||||
import SimpleMetaTagger from "./SimpleMetaTagger";
|
||||
import {ExtraFunction} from "./ExtraFunction";
|
||||
import State from "../State";
|
||||
import {Relation} from "./Osm/ExtractRelations";
|
||||
|
||||
|
||||
interface Params {
|
||||
featuresPerLayer: Map<string, any[]>,
|
||||
memberships: Map<string, { role: string, relation: Relation }[]>
|
||||
}
|
||||
|
||||
/**
|
||||
* Metatagging adds various tags to the elements, e.g. lat, lon, surface area, ...
|
||||
|
@ -14,7 +22,8 @@ export default class MetaTagging {
|
|||
* An actor which adds metatags on every feature in the given object
|
||||
* The features are a list of geojson-features, with a "properties"-field and geometry
|
||||
*/
|
||||
static addMetatags(features: { feature: any; freshness: Date }[], layers: LayerConfig[]) {
|
||||
static addMetatags(features: { feature: any; freshness: Date }[],
|
||||
relations: Map<string, { role: string, relation: Relation }[]>, layers: LayerConfig[]) {
|
||||
|
||||
for (const metatag of SimpleMetaTagger.metatags) {
|
||||
try {
|
||||
|
@ -26,7 +35,7 @@ export default class MetaTagging {
|
|||
}
|
||||
|
||||
// The functions - per layer - which add the new keys
|
||||
const layerFuncs = new Map<string, ((featursPerLayer: Map<string, any[]>, feature: any) => void)>();
|
||||
const layerFuncs = new Map<string, ((params: Params, feature: any) => void)>();
|
||||
for (const layer of layers) {
|
||||
layerFuncs.set(layer.id, this.createRetaggingFunc(layer));
|
||||
}
|
||||
|
@ -48,27 +57,26 @@ export default class MetaTagging {
|
|||
if (f === undefined) {
|
||||
continue;
|
||||
}
|
||||
|
||||
f(featuresPerLayer, feature.feature)
|
||||
f({featuresPerLayer: featuresPerLayer, memberships: relations}, feature.feature)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static createRetaggingFunc(layer: LayerConfig): ((featuresPerLayer: Map<string, any[]>, feature: any) => void) {
|
||||
private static createRetaggingFunc(layer: LayerConfig):
|
||||
((params: Params, feature: any) => void) {
|
||||
const calculatedTags: [string, string][] = layer.calculatedTags;
|
||||
if (calculatedTags === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const functions: ((featuresPerLayer: Map<string, any[]>, feature: any) => void)[] = [];
|
||||
const functions: ((params: Params, feature: any) => void)[] = [];
|
||||
for (const entry of calculatedTags) {
|
||||
const key = entry[0]
|
||||
const code = entry[1];
|
||||
if (code === undefined) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const func = new Function("feat", "return " + code + ";");
|
||||
|
||||
const f = (featuresPerLayer, feature: any) => {
|
||||
|
@ -76,16 +84,17 @@ export default class MetaTagging {
|
|||
}
|
||||
functions.push(f)
|
||||
}
|
||||
return (featuresPerLayer: Map<string, any[]>, feature) => {
|
||||
return (params: Params, feature) => {
|
||||
const tags = feature.properties
|
||||
if (tags === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
ExtraFunction.FullPatchFeature(featuresPerLayer, feature);
|
||||
const relations = params.memberships.get(feature.properties.id)
|
||||
ExtraFunction.FullPatchFeature(params.featuresPerLayer, relations, feature);
|
||||
try {
|
||||
for (const f of functions) {
|
||||
f(featuresPerLayer, feature);
|
||||
f(params, feature);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("While calculating a tag value: ", e)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue