| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  | import LayerConfig from "../Customizations/JSON/LayerConfig"; | 
					
						
							|  |  |  | import SimpleMetaTagger from "./SimpleMetaTagger"; | 
					
						
							| 
									
										
										
										
											2021-03-25 15:19:44 +01:00
										 |  |  | import {ExtraFunction} from "./ExtraFunction"; | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  | import {Relation} from "./Osm/ExtractRelations"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface Params { | 
					
						
							|  |  |  |     featuresPerLayer: Map<string, any[]>, | 
					
						
							|  |  |  |     memberships: Map<string, { role: string, relation: Relation }[]> | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-10-19 12:08:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Metatagging adds various tags to the elements, e.g. lat, lon, surface area, ... | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * All metatags start with an underscore | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export default class MetaTagging { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * 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 | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  |     static addMetatags(features: { feature: any; freshness: Date }[], | 
					
						
							| 
									
										
										
										
											2021-04-25 13:25:03 +02:00
										 |  |  |                        relations: Map<string, { role: string, relation: Relation }[]>,  | 
					
						
							|  |  |  |                        layers: LayerConfig[], | 
					
						
							|  |  |  |                        includeDates = true) { | 
					
						
							| 
									
										
										
										
											2020-10-30 00:56:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |         for (const metatag of SimpleMetaTagger.metatags) { | 
					
						
							| 
									
										
										
										
											2021-04-25 13:25:03 +02:00
										 |  |  |             if(metatag.includesDates && !includeDates){ | 
					
						
							|  |  |  |                 // We do not add dated entries
 | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |             try { | 
					
						
							|  |  |  |                 metatag.addMetaTags(features); | 
					
						
							|  |  |  |             } catch (e) { | 
					
						
							|  |  |  |                 console.error("Could not calculate metatag for ", metatag.keys.join(","), ":", e) | 
					
						
							| 
									
										
										
										
											2020-10-30 00:56:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-30 00:56:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |         // The functions - per layer - which add the new keys
 | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  |         const layerFuncs = new Map<string, ((params: Params, feature: any) => void)>(); | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |         for (const layer of layers) { | 
					
						
							|  |  |  |             layerFuncs.set(layer.id, this.createRetaggingFunc(layer)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-30 00:56:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-26 03:24:58 +01:00
										 |  |  |         const featuresPerLayer = new Map<string, any[]>(); | 
					
						
							|  |  |  |         for (const feature of features) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const key = feature.feature._matching_layer_id; | 
					
						
							|  |  |  |             if (!featuresPerLayer.has(key)) { | 
					
						
							|  |  |  |                 featuresPerLayer.set(key, []) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             featuresPerLayer.get(key).push(feature.feature) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |         for (const feature of features) { | 
					
						
							|  |  |  |             // @ts-ignore
 | 
					
						
							|  |  |  |             const key = feature.feature._matching_layer_id; | 
					
						
							|  |  |  |             const f = layerFuncs.get(key); | 
					
						
							|  |  |  |             if (f === undefined) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							| 
									
										
										
										
											2020-10-30 00:56:46 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  |             f({featuresPerLayer: featuresPerLayer, memberships: relations}, feature.feature) | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-30 00:56:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-30 00:56:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  |     private static createRetaggingFunc(layer: LayerConfig): | 
					
						
							|  |  |  |         ((params: Params, feature: any) => void) { | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |         const calculatedTags: [string, string][] = layer.calculatedTags; | 
					
						
							|  |  |  |         if (calculatedTags === undefined) { | 
					
						
							|  |  |  |             return undefined; | 
					
						
							| 
									
										
										
										
											2020-10-30 00:56:46 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-03-22 02:45:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  |         const functions: ((params: Params, feature: any) => void)[] = []; | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |         for (const entry of calculatedTags) { | 
					
						
							|  |  |  |             const key = entry[0] | 
					
						
							|  |  |  |             const code = entry[1]; | 
					
						
							|  |  |  |             if (code === undefined) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							| 
									
										
										
										
											2021-03-22 01:04:25 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |             const func = new Function("feat", "return " + code + ";"); | 
					
						
							| 
									
										
										
										
											2021-03-22 01:04:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-26 03:24:58 +01:00
										 |  |  |             const f = (featuresPerLayer, feature: any) => { | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |                 feature.properties[key] = func(feature); | 
					
						
							| 
									
										
										
										
											2021-03-22 01:04:25 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |             functions.push(f) | 
					
						
							| 
									
										
										
										
											2021-02-20 03:29:55 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  |         return (params: Params, feature) => { | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |             const tags = feature.properties | 
					
						
							|  |  |  |             if (tags === undefined) { | 
					
						
							|  |  |  |                 return; | 
					
						
							| 
									
										
										
										
											2020-11-11 16:23:49 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-03-22 02:45:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  |             const relations = params.memberships.get(feature.properties.id) | 
					
						
							|  |  |  |             ExtraFunction.FullPatchFeature(params.featuresPerLayer, relations, feature); | 
					
						
							| 
									
										
										
										
											2021-03-26 03:24:58 +01:00
										 |  |  |             try { | 
					
						
							|  |  |  |                 for (const f of functions) { | 
					
						
							| 
									
										
										
										
											2021-04-22 13:30:00 +02:00
										 |  |  |                     f(params, feature); | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-03-26 03:24:58 +01:00
										 |  |  |             } catch (e) { | 
					
						
							|  |  |  |                 console.error("While calculating a tag value: ", e) | 
					
						
							| 
									
										
										
										
											2021-03-24 01:25:57 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-03-22 01:04:25 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-03-25 15:19:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-19 12:08:42 +02:00
										 |  |  | } |