import {GeoOperations} from "./GeoOperations"; import {UIElement} from "../UI/UIElement"; import Combine from "../UI/Base/Combine"; export class ExtraFunction { private static DistanceToFunc = new ExtraFunction( "distanceTo", "Calculates the distance between the feature and a specified point", ["longitude", "latitude"], (feature) => { return (lon, lat) => { // Feature._lon and ._lat is conveniently place by one of the other metatags return GeoOperations.distanceBetween([lon, lat], [feature._lon, feature._lat]); } } ) private static readonly allFuncs: ExtraFunction[] = [ExtraFunction.DistanceToFunc]; private readonly _name: string; private readonly _args: string[]; private readonly _doc: string; private readonly _f: (feat: any) => any; constructor(name: string, doc: string, args: string[], f: ((feat: any) => any)) { this._name = name; this._doc = doc; this._args = args; this._f = f; } public static FullPatchFeature(feature) { for (const func of ExtraFunction.allFuncs) { func.PatchFeature(feature); } } public static HelpText(): UIElement { return new Combine([ ExtraFunction.intro, ...ExtraFunction.allFuncs.map(func => new Combine([ "

" + func._name + "

", func._doc, "" ]) ) ]); } public PatchFeature(feature: any) { feature[this._name] = this._f(feature); } static readonly intro = `

Calculating tags with Javascript

In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. _lat, lon, _country), as detailed above.

It is also possible to calculate your own tags - but this requires some javascript knowledge.

Before proceeding, some warnings: In the layer object, add a field calculatedTags, e.g.:
"calculatedTags": { "_someKey": "javascript-expression", "name": "feat.properties.name ?? feat.properties.ref ?? feat.properties.operator", "_distanceCloserThen3Km": "feat.distanceTo( some_lon, some_lat) < 3 ? 'yes' : 'no'" }
` }