forked from MapComplete/MapComplete
		
	Add possibility to use a cutom overpass script, add 'grassfields in parks'-layer
This commit is contained in:
		
							parent
							
								
									0d51015cc8
								
							
						
					
					
						commit
						f659bc1141
					
				
					 40 changed files with 499 additions and 222 deletions
				
			
		| 
						 | 
					@ -28,6 +28,8 @@ import * as sport_pitch from "../assets/layers/sport_pitch/sport_pitch.json"
 | 
				
			||||||
import * as slow_roads from "../assets/layers/slow_roads/slow_roads.json"
 | 
					import * as slow_roads from "../assets/layers/slow_roads/slow_roads.json"
 | 
				
			||||||
import LayerConfig from "./JSON/LayerConfig";
 | 
					import LayerConfig from "./JSON/LayerConfig";
 | 
				
			||||||
import {LayerConfigJson} from "./JSON/LayerConfigJson";
 | 
					import {LayerConfigJson} from "./JSON/LayerConfigJson";
 | 
				
			||||||
 | 
					import * as grass_in_parks from "../assets/layers/village_green/grass_in_parks.json"
 | 
				
			||||||
 | 
					import * as village_green from "../assets/layers/village_green/village_green.json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class AllKnownLayers {
 | 
					export default class AllKnownLayers {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,7 +62,9 @@ export default class AllKnownLayers {
 | 
				
			||||||
        play_forest,
 | 
					        play_forest,
 | 
				
			||||||
        playground,
 | 
					        playground,
 | 
				
			||||||
        sport_pitch,
 | 
					        sport_pitch,
 | 
				
			||||||
        slow_roads
 | 
					        slow_roads,
 | 
				
			||||||
 | 
					        grass_in_parks,
 | 
				
			||||||
 | 
					        village_green
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Must be below the list...
 | 
					    // Must be below the list...
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,6 @@ export class FromJSON {
 | 
				
			||||||
        const tag = Utils.SplitFirst(json, "=");
 | 
					        const tag = Utils.SplitFirst(json, "=");
 | 
				
			||||||
        return new Tag(tag[0], tag[1]);
 | 
					        return new Tag(tag[0], tag[1]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static Tag(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter {
 | 
					    public static Tag(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter {
 | 
				
			||||||
        try{
 | 
					        try{
 | 
				
			||||||
            return this.TagUnsafe(json, context);
 | 
					            return this.TagUnsafe(json, context);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,7 @@ import {UIEventSource} from "../../Logic/UIEventSource";
 | 
				
			||||||
import {FixedUiElement} from "../../UI/Base/FixedUiElement";
 | 
					import {FixedUiElement} from "../../UI/Base/FixedUiElement";
 | 
				
			||||||
import {UIElement} from "../../UI/UIElement";
 | 
					import {UIElement} from "../../UI/UIElement";
 | 
				
			||||||
import {SubstitutedTranslation} from "../../UI/SubstitutedTranslation";
 | 
					import {SubstitutedTranslation} from "../../UI/SubstitutedTranslation";
 | 
				
			||||||
 | 
					import SourceConfig from "./SourceConfig";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class LayerConfig {
 | 
					export default class LayerConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +26,7 @@ export default class LayerConfig {
 | 
				
			||||||
    id: string;
 | 
					    id: string;
 | 
				
			||||||
    name: Translation
 | 
					    name: Translation
 | 
				
			||||||
    description: Translation;
 | 
					    description: Translation;
 | 
				
			||||||
    overpassTags: TagsFilter;
 | 
					    source: SourceConfig;
 | 
				
			||||||
    doNotDownload: boolean;
 | 
					    doNotDownload: boolean;
 | 
				
			||||||
    passAllFeatures: boolean;
 | 
					    passAllFeatures: boolean;
 | 
				
			||||||
    minzoom: number;
 | 
					    minzoom: number;
 | 
				
			||||||
| 
						 | 
					@ -49,8 +50,6 @@ export default class LayerConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tagRenderings: TagRenderingConfig [];
 | 
					    tagRenderings: TagRenderingConfig [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private readonly configuration_warnings: string[] = []
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    constructor(json: LayerConfigJson,
 | 
					    constructor(json: LayerConfigJson,
 | 
				
			||||||
                context?: string) {
 | 
					                context?: string) {
 | 
				
			||||||
        context = context + "." + json.id;
 | 
					        context = context + "." + json.id;
 | 
				
			||||||
| 
						 | 
					@ -58,9 +57,39 @@ export default class LayerConfig {
 | 
				
			||||||
        this.id = json.id;
 | 
					        this.id = json.id;
 | 
				
			||||||
        this.name = Translations.T(json.name, context + ".name");
 | 
					        this.name = Translations.T(json.name, context + ".name");
 | 
				
			||||||
        this.description = Translations.T(json.description, context + ".description");
 | 
					        this.description = Translations.T(json.description, context + ".description");
 | 
				
			||||||
        this.overpassTags = FromJSON.Tag(json.overpassTags, context + ".overpasstags");
 | 
					
 | 
				
			||||||
        this.doNotDownload = json.doNotDownload ?? false,
 | 
					        let legacy = undefined;
 | 
				
			||||||
            this.passAllFeatures = json.passAllFeatures ?? false;
 | 
					        if (json["overpassTags"] !== undefined) {
 | 
				
			||||||
 | 
					            // @ts-ignore
 | 
				
			||||||
 | 
					            legacy = FromJSON.Tag(json["overpassTags"], context + ".overpasstags");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(json.source !== undefined){
 | 
				
			||||||
 | 
					            if (legacy !== undefined ) {
 | 
				
			||||||
 | 
					                throw context+"Both the legacy 'layer.overpasstags' and the new 'layer.source'-field are defined"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let osmTags: TagsFilter = legacy;
 | 
				
			||||||
 | 
					            if (json.source["osmTags"]) {
 | 
				
			||||||
 | 
					                osmTags = FromJSON.Tag(json.source["osmTags"], context + "source.osmTags");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            this.source = new SourceConfig({
 | 
				
			||||||
 | 
					                osmTags: osmTags,
 | 
				
			||||||
 | 
					                geojsonSource: json.source["geoJsonSource"],
 | 
				
			||||||
 | 
					                overpassScript: json.source["overpassScript"],
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            this.source = new SourceConfig({
 | 
				
			||||||
 | 
					                osmTags : legacy
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.doNotDownload = json.doNotDownload ?? false;
 | 
				
			||||||
 | 
					        this.passAllFeatures = json.passAllFeatures ?? false;
 | 
				
			||||||
        this.minzoom = json.minzoom;
 | 
					        this.minzoom = json.minzoom;
 | 
				
			||||||
        this.wayHandling = json.wayHandling ?? 0;
 | 
					        this.wayHandling = json.wayHandling ?? 0;
 | 
				
			||||||
        this.hideUnderlayingFeaturesMinPercentage = json.hideUnderlayingFeaturesMinPercentage ?? 0;
 | 
					        this.hideUnderlayingFeaturesMinPercentage = json.hideUnderlayingFeaturesMinPercentage ?? 0;
 | 
				
			||||||
| 
						 | 
					@ -82,16 +111,15 @@ export default class LayerConfig {
 | 
				
			||||||
                if (deflt === undefined) {
 | 
					                if (deflt === undefined) {
 | 
				
			||||||
                    return undefined;
 | 
					                    return undefined;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return new TagRenderingConfig(deflt, self.overpassTags, `${context}.${key}.default value`);
 | 
					                return new TagRenderingConfig(deflt, self.source.osmTags, `${context}.${key}.default value`);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (typeof v === "string") {
 | 
					            if (typeof v === "string") {
 | 
				
			||||||
                const shared = SharedTagRenderings.SharedTagRendering[v];
 | 
					                const shared = SharedTagRenderings.SharedTagRendering[v];
 | 
				
			||||||
                if (shared) {
 | 
					                if (shared) {
 | 
				
			||||||
                    console.log("Got shared TR:", v, "-->", shared)
 | 
					 | 
				
			||||||
                    return shared;
 | 
					                    return shared;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return new TagRenderingConfig(v, self.overpassTags, `${context}.${key}`);
 | 
					            return new TagRenderingConfig(v, self.source.osmTags, `${context}.${key}`);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
| 
						 | 
					@ -119,7 +147,7 @@ export default class LayerConfig {
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        throw `Predefined tagRendering ${renderingJson} not found in ${context}`;
 | 
					                        throw `Predefined tagRendering ${renderingJson} not found in ${context}`;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return new TagRenderingConfig(renderingJson, self.overpassTags, `${context}.tagrendering[${i}]`);
 | 
					                    return new TagRenderingConfig(renderingJson, self.source.osmTags, `${context}.tagrendering[${i}]`);
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -142,7 +170,7 @@ export default class LayerConfig {
 | 
				
			||||||
        this.title = tr("title", undefined);
 | 
					        this.title = tr("title", undefined);
 | 
				
			||||||
        this.icon = tr("icon", Img.AsData(Svg.pin));
 | 
					        this.icon = tr("icon", Img.AsData(Svg.pin));
 | 
				
			||||||
        this.iconOverlays = (json.iconOverlays ?? []).map((overlay, i) => {
 | 
					        this.iconOverlays = (json.iconOverlays ?? []).map((overlay, i) => {
 | 
				
			||||||
            let tr = new TagRenderingConfig(overlay.then, self.overpassTags, `iconoverlays.${i}`);
 | 
					            let tr = new TagRenderingConfig(overlay.then, self.source.osmTags, `iconoverlays.${i}`);
 | 
				
			||||||
            if (typeof overlay.then === "string" && SharedTagRenderings.SharedIcons[overlay.then] !== undefined) {
 | 
					            if (typeof overlay.then === "string" && SharedTagRenderings.SharedIcons[overlay.then] !== undefined) {
 | 
				
			||||||
                tr = SharedTagRenderings.SharedIcons[overlay.then];
 | 
					                tr = SharedTagRenderings.SharedIcons[overlay.then];
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -281,7 +309,7 @@ export default class LayerConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const iconUrlStatic = render(this.icon);
 | 
					        const iconUrlStatic = render(this.icon);
 | 
				
			||||||
        const self = this;
 | 
					        const self = this;
 | 
				
			||||||
        var mappedHtml = tags.map(tgs => {
 | 
					        const mappedHtml = tags.map(tgs => {
 | 
				
			||||||
            // What do you mean, 'tgs' is never read?
 | 
					            // What do you mean, 'tgs' is never read?
 | 
				
			||||||
            // It is read implicitly in the 'render' method
 | 
					            // It is read implicitly in the 'render' method
 | 
				
			||||||
            const iconUrl = render(self.icon);
 | 
					            const iconUrl = render(self.icon);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,8 +26,23 @@ export interface LayerConfigJson {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * The tags to load from overpass. Either a simple 'key=value'-string, otherwise an advanced configuration
 | 
					     * The tags to load from overpass. Either a simple 'key=value'-string, otherwise an advanced configuration
 | 
				
			||||||
 | 
					     * DEPRECATED
 | 
				
			||||||
 | 
					     * shorthand for source: {osmTags: "key=value"}
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    overpassTags: AndOrTagConfigJson | string;
 | 
					    //overpassTags: AndOrTagConfigJson | string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * This determines where the data for the layer is fetched.
 | 
				
			||||||
 | 
					     * There are some options:
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * source: {osmTags: "key=value"} will fetch all objects with given tags from OSM. Currently, this will create a query to overpass and fetch the data - in the future this might fetch from the OSM API
 | 
				
			||||||
 | 
					     * source: {geoJsonSource: "https://my.source.net/some-geo-data.geojson"} to fetch a geojson from a third party source
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * source: {overpassScript: "<custom overpass tags>"} when you want to do special things. _This should be really rare_. 
 | 
				
			||||||
 | 
					     *      This means that the data will be pulled from overpass with this script, and will ignore the osmTags for the query
 | 
				
			||||||
 | 
					     *      However, for the rest of the pipeline, the OsmTags will _still_ be used. This is important to enable layers etc...
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    source: {osmTags: AndOrTagConfigJson | string} | {geoJsonSource: string} | {overpassScript: string}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers. 
 | 
					     * If set, this layer will not query overpass; but it'll still match the tags above which are by chance returned by other layers. 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										32
									
								
								Customizations/JSON/SourceConfig.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								Customizations/JSON/SourceConfig.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					import {TagsFilter} from "../../Logic/Tags";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class SourceConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    osmTags?: TagsFilter;
 | 
				
			||||||
 | 
					    overpassScript?: string;
 | 
				
			||||||
 | 
					    geojsonSource?: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(params: {
 | 
				
			||||||
 | 
					        osmTags?: TagsFilter,
 | 
				
			||||||
 | 
					        overpassScript?: string,
 | 
				
			||||||
 | 
					        geojsonSource?: string
 | 
				
			||||||
 | 
					    }) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let defined = 0;
 | 
				
			||||||
 | 
					        if (params.osmTags) {
 | 
				
			||||||
 | 
					            defined++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (params.overpassScript) {
 | 
				
			||||||
 | 
					            defined++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (params.geojsonSource) {
 | 
				
			||||||
 | 
					            defined++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (defined == 0) {
 | 
				
			||||||
 | 
					            throw "Source: nothing correct defined in the source"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.osmTags = params.osmTags;
 | 
				
			||||||
 | 
					        this.overpassScript = params.overpassScript;
 | 
				
			||||||
 | 
					        this.geojsonSource = params.geojsonSource;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@ import LayoutConfig from "../../Customizations/JSON/LayoutConfig";
 | 
				
			||||||
import {Overpass} from "../Osm/Overpass";
 | 
					import {Overpass} from "../Osm/Overpass";
 | 
				
			||||||
import Bounds from "../../Models/Bounds";
 | 
					import Bounds from "../../Models/Bounds";
 | 
				
			||||||
import FeatureSource from "../FeatureSource/FeatureSource";
 | 
					import FeatureSource from "../FeatureSource/FeatureSource";
 | 
				
			||||||
 | 
					import {Utils} from "../../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class UpdateFromOverpass implements FeatureSource {
 | 
					export default class UpdateFromOverpass implements FeatureSource {
 | 
				
			||||||
| 
						 | 
					@ -71,11 +72,12 @@ export default class UpdateFromOverpass implements FeatureSource {
 | 
				
			||||||
        this.update();
 | 
					        this.update();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private GetFilter() {
 | 
					    private GetFilter(): Overpass {
 | 
				
			||||||
        const filters: TagsFilter[] = [];
 | 
					        let filters: TagsFilter[] = [];
 | 
				
			||||||
 | 
					        let extraScripts: string[] = [];
 | 
				
			||||||
        for (const layer of this._layoutToUse.data.layers) {
 | 
					        for (const layer of this._layoutToUse.data.layers) {
 | 
				
			||||||
            if (typeof (layer) === "string") {
 | 
					            if (typeof (layer) === "string") {
 | 
				
			||||||
                continue;
 | 
					                throw "A layer was not expanded!"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (this._location.data.zoom < layer.minzoom) {
 | 
					            if (this._location.data.zoom < layer.minzoom) {
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
| 
						 | 
					@ -102,20 +104,21 @@ export default class UpdateFromOverpass implements FeatureSource {
 | 
				
			||||||
            if (previouslyLoaded) {
 | 
					            if (previouslyLoaded) {
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            filters.push(layer.overpassTags);
 | 
					            if (layer.source.overpassScript !== undefined) {
 | 
				
			||||||
 | 
					                extraScripts.push(layer.source.overpassScript)
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                filters.push(layer.source.osmTags);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (filters.length === 0) {
 | 
					        filters = Utils.NoNull(filters)
 | 
				
			||||||
 | 
					        extraScripts = Utils.NoNull(extraScripts)
 | 
				
			||||||
 | 
					        if (filters.length + extraScripts.length === 0) {
 | 
				
			||||||
            return undefined;
 | 
					            return undefined;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return new Or(filters);
 | 
					        return new Overpass(new Or(filters), extraScripts);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private update(): void {
 | 
					    private update(): void {
 | 
				
			||||||
        const filter = this.GetFilter();
 | 
					 | 
				
			||||||
        if (filter === undefined) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.runningQuery.data) {
 | 
					        if (this.runningQuery.data) {
 | 
				
			||||||
            console.log("Still running a query, skip");
 | 
					            console.log("Still running a query, skip");
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
| 
						 | 
					@ -133,9 +136,12 @@ export default class UpdateFromOverpass implements FeatureSource {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const z = Math.floor(this._location.data.zoom ?? 0);
 | 
					        const z = Math.floor(this._location.data.zoom ?? 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.runningQuery.setData(true);
 | 
					 | 
				
			||||||
        const self = this;
 | 
					        const self = this;
 | 
				
			||||||
        const overpass = new Overpass(filter);
 | 
					        const overpass = this.GetFilter();
 | 
				
			||||||
 | 
					        if (overpass === undefined) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.runningQuery.setData(true);
 | 
				
			||||||
        overpass.queryGeoJson(queryBounds,
 | 
					        overpass.queryGeoJson(queryBounds,
 | 
				
			||||||
            function (data, date) {
 | 
					            function (data, date) {
 | 
				
			||||||
                self._previousBounds.get(z).push(queryBounds);
 | 
					                self._previousBounds.get(z).push(queryBounds);
 | 
				
			||||||
| 
						 | 
					@ -168,6 +174,7 @@ export default class UpdateFromOverpass implements FeatureSource {
 | 
				
			||||||
                        }, 1000
 | 
					                        }, 1000
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                countDown();
 | 
					                countDown();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ export default class FeatureDuplicatorPerLayer implements FeatureSource {
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                let foundALayer = false;
 | 
					                let foundALayer = false;
 | 
				
			||||||
                for (const layer of layers.data) {
 | 
					                for (const layer of layers.data) {
 | 
				
			||||||
                    if (layer.layerDef.overpassTags.matchesProperties(f.feature.properties)) {
 | 
					                    if (layer.layerDef.source.osmTags.matchesProperties(f.feature.properties)) {
 | 
				
			||||||
                        foundALayer = true;
 | 
					                        foundALayer = true;
 | 
				
			||||||
                        if (layer.layerDef.passAllFeatures) {
 | 
					                        if (layer.layerDef.passAllFeatures) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,9 +9,11 @@ import Bounds from "../../Models/Bounds";
 | 
				
			||||||
export class Overpass {
 | 
					export class Overpass {
 | 
				
			||||||
    private _filter: TagsFilter
 | 
					    private _filter: TagsFilter
 | 
				
			||||||
    public static testUrl: string = null
 | 
					    public static testUrl: string = null
 | 
				
			||||||
 | 
					    private readonly  _extraScripts: string[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(filter: TagsFilter) {
 | 
					    constructor(filter: TagsFilter, extraScripts: string[]) {
 | 
				
			||||||
        this._filter = filter
 | 
					        this._filter = filter
 | 
				
			||||||
 | 
					        this._extraScripts = extraScripts;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					@ -21,6 +23,9 @@ export class Overpass {
 | 
				
			||||||
        for (const filterOr of filters) {
 | 
					        for (const filterOr of filters) {
 | 
				
			||||||
            filter += 'nwr' + filterOr + ';'
 | 
					            filter += 'nwr' + filterOr + ';'
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        for (const extraScript of this._extraScripts){
 | 
				
			||||||
 | 
					            filter += '('+extraScript+');';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        const query =
 | 
					        const query =
 | 
				
			||||||
            '[out:json][timeout:25]' + bbox + ';(' + filter + ');out body;>;out skel qt;'
 | 
					            '[out:json][timeout:25]' + bbox + ';(' + filter + ');out body;>;out skel qt;'
 | 
				
			||||||
        return "https://overpass-api.de/api/interpreter?data=" + encodeURIComponent(query)
 | 
					        return "https://overpass-api.de/api/interpreter?data=" + encodeURIComponent(query)
 | 
				
			||||||
| 
						 | 
					@ -48,6 +53,7 @@ export class Overpass {
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                // @ts-ignore
 | 
					                // @ts-ignore
 | 
				
			||||||
                const geojson = OsmToGeoJson.default(json);
 | 
					                const geojson = OsmToGeoJson.default(json);
 | 
				
			||||||
 | 
					                console.log("Received geojson", geojson)
 | 
				
			||||||
                const osmTime = new Date(json.osm3s.timestamp_osm_base);
 | 
					                const osmTime = new Date(json.osm3s.timestamp_osm_base);
 | 
				
			||||||
                continuation(geojson, osmTime);
 | 
					                continuation(geojson, osmTime);
 | 
				
			||||||
            }).fail(onFail)
 | 
					            }).fail(onFail)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@ import { Utils } from "../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class Constants {
 | 
					export default class Constants {
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    public static vNumber = "0.5.14";
 | 
					    public static vNumber = "0.6.0";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The user journey states thresholds when a new feature gets unlocked
 | 
					    // The user journey states thresholds when a new feature gets unlocked
 | 
				
			||||||
    public static userJourney = {
 | 
					    public static userJourney = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,9 @@
 | 
				
			||||||
    "fr": "Bancs"
 | 
					    "fr": "Bancs"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 14,
 | 
					  "minzoom": 14,
 | 
				
			||||||
  "overpassTags": "amenity=bench",
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": "amenity=bench"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
      "en": "Bench",
 | 
					      "en": "Bench",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,11 +6,13 @@
 | 
				
			||||||
    "fr": "Bancs des arrêts de transport en commun"
 | 
					    "fr": "Bancs des arrêts de transport en commun"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 14,
 | 
					  "minzoom": 14,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "or": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "bench=yes",
 | 
					      "or": [
 | 
				
			||||||
      "bench=stand_up_bench"
 | 
					        "bench=yes",
 | 
				
			||||||
    ]
 | 
					        "bench=stand_up_bench"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,9 @@
 | 
				
			||||||
    "nl": "Picnictafels"
 | 
					    "nl": "Picnictafels"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 12,
 | 
					  "minzoom": 12,
 | 
				
			||||||
  "overpassTags": "leisure=picnic_table",
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": "leisure=picnic_table"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
      "en": "Picnic table",
 | 
					      "en": "Picnic table",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,8 @@
 | 
				
			||||||
    "nl": "Fietsbibliotheek"
 | 
					    "nl": "Fietsbibliotheek"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 8  ,
 | 
					  "minzoom": 8  ,
 | 
				
			||||||
  "overpassTags": "amenity=bicycle_library",
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": "amenity=bicycle_library"},
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
      "en": "Bicycle library",
 | 
					      "en": "Bicycle library",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,11 +37,13 @@
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "iconSize": "50,50,bottom",
 | 
					  "iconSize": "50,50,bottom",
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "amenity=vending_machine",
 | 
					      "and": [
 | 
				
			||||||
      "vending~.*bicycle_tube.*"
 | 
					        "amenity=vending_machine",
 | 
				
			||||||
    ]
 | 
					        "vending~.*bicycle_tube.*"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "wayHandling": 2,
 | 
					  "wayHandling": 2,
 | 
				
			||||||
| 
						 | 
					@ -104,7 +106,7 @@
 | 
				
			||||||
      "mappings": [
 | 
					      "mappings": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": "payment:coins=yes",
 | 
					          "if": "payment:coins=yes",
 | 
				
			||||||
          "ifnot":  "payment:coins=no",
 | 
					          "ifnot": "payment:coins=no",
 | 
				
			||||||
          "then": "Payment with coins is possible"
 | 
					          "then": "Payment with coins is possible"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,18 +8,20 @@
 | 
				
			||||||
    "de": "Fahrrad-Café"
 | 
					    "de": "Fahrrad-Café"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "amenity~pub|bar|cafe|restaurant",
 | 
					      "and": [
 | 
				
			||||||
      {
 | 
					        "amenity~pub|bar|cafe|restaurant",
 | 
				
			||||||
        "#": "Note the double tilde in 'service:bicycle' which interprets the key as regex too",
 | 
					        {
 | 
				
			||||||
        "or": [
 | 
					          "#": "Note the double tilde in 'service:bicycle' which interprets the key as regex too",
 | 
				
			||||||
          "pub~cycling|bicycle",
 | 
					          "or": [
 | 
				
			||||||
          "theme~cycling|bicycle",
 | 
					            "pub~cycling|bicycle",
 | 
				
			||||||
          "service:bicycle:.*~~*"
 | 
					            "theme~cycling|bicycle",
 | 
				
			||||||
        ]
 | 
					            "service:bicycle:.*~~*"
 | 
				
			||||||
      }
 | 
					          ]
 | 
				
			||||||
    ]
 | 
					        }
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,12 +23,14 @@
 | 
				
			||||||
    "render": "./assets/layers/bike_cleaning/bike_cleaning.svg"
 | 
					    "render": "./assets/layers/bike_cleaning/bike_cleaning.svg"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "iconSize": "50,50,bottom",
 | 
					  "iconSize": "50,50,bottom",
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "or": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "service:bicycle:cleaning=yes",
 | 
					      "or": [
 | 
				
			||||||
      "service:bicycle:cleaning=diy",
 | 
					        "service:bicycle:cleaning=yes",
 | 
				
			||||||
      "amenity=bicycle_wash"
 | 
					        "service:bicycle:cleaning=diy",
 | 
				
			||||||
    ]
 | 
					        "amenity=bicycle_wash"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "wayHandling": 1,
 | 
					  "wayHandling": 1,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,14 +1,16 @@
 | 
				
			||||||
 {
 | 
					{
 | 
				
			||||||
  "id": "bike_monitoring_station",
 | 
					  "id": "bike_monitoring_station",
 | 
				
			||||||
  "name": {
 | 
					  "name": {
 | 
				
			||||||
    "en": "Monitoring stations"
 | 
					    "en": "Monitoring stations"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 12,
 | 
					  "minzoom": 12,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "man_made=monitoring_station",
 | 
					      "and": [
 | 
				
			||||||
      "monitoring:bicycle=yes"
 | 
					        "man_made=monitoring_station",
 | 
				
			||||||
    ]
 | 
					        "monitoring:bicycle=yes"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					@ -32,12 +34,15 @@
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "tagRenderings": [ "images",
 | 
					  "tagRenderings": [
 | 
				
			||||||
 | 
					    "images",
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "render": "<b>{live({url},{url:format},hour)}</b> cyclists last hour<br/><b>{live({url},{url:format},day)}</b> cyclists today<br/><b>{live({url},{url:format},year)}</b> cyclists this year<br/>",
 | 
					      "render": "<b>{live({url},{url:format},hour)}</b> cyclists last hour<br/><b>{live({url},{url:format},day)}</b> cyclists today<br/><b>{live({url},{url:format},year)}</b> cyclists this year<br/>",
 | 
				
			||||||
      "condition": {
 | 
					      "condition": {
 | 
				
			||||||
        "and": ["url~*","url:format~*"]
 | 
					        "and": [
 | 
				
			||||||
 | 
					          "url~*",
 | 
				
			||||||
 | 
					          "url:format~*"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,10 +8,12 @@
 | 
				
			||||||
    "de": "Fahrrad-Parkplätze"
 | 
					    "de": "Fahrrad-Parkplätze"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 17,
 | 
					  "minzoom": 17,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "amenity=bicycle_parking"
 | 
					      "and": [
 | 
				
			||||||
    ]
 | 
					        "amenity=bicycle_parking"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "icon": {
 | 
					  "icon": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,10 +8,12 @@
 | 
				
			||||||
    "de": "Fahrradstationen (Reparatur, Pumpe oder beides)"
 | 
					    "de": "Fahrradstationen (Reparatur, Pumpe oder beides)"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "amenity=bicycle_repair_station"
 | 
					      "and": [
 | 
				
			||||||
    ]
 | 
					        "amenity=bicycle_repair_station"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					@ -71,7 +73,8 @@
 | 
				
			||||||
          "gl": "Bomba de ar estragada",
 | 
					          "gl": "Bomba de ar estragada",
 | 
				
			||||||
          "de": "Kaputte Pumpe"
 | 
					          "de": "Kaputte Pumpe"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },{
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
        "if": {
 | 
					        "if": {
 | 
				
			||||||
          "and": [
 | 
					          "and": [
 | 
				
			||||||
            "service:bicycle:pump=yes",
 | 
					            "service:bicycle:pump=yes",
 | 
				
			||||||
| 
						 | 
					@ -107,7 +110,7 @@
 | 
				
			||||||
  "titleIcons": [
 | 
					  "titleIcons": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "render": "<a href='https://fietsambassade.gent.be/' target='_blank'><img src='./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg'/></a>",
 | 
					      "render": "<a href='https://fietsambassade.gent.be/' target='_blank'><img src='./assets/themes/cyclofix/fietsambassade_gent_logo_small.svg'/></a>",
 | 
				
			||||||
      "condition":  "operator=De Fietsambassade Gent",
 | 
					      "condition": "operator=De Fietsambassade Gent",
 | 
				
			||||||
      "roaming": true
 | 
					      "roaming": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "defaults"
 | 
					    "defaults"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,41 +8,43 @@
 | 
				
			||||||
    "de": "Fahrradwerkstatt/geschäft"
 | 
					    "de": "Fahrradwerkstatt/geschäft"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "#": "We select all bicycle shops, sport shops (but we try to weed out non-bicycle related shops), and any shop with a bicycle related tag",
 | 
					    "osmTags": {
 | 
				
			||||||
    "or": [
 | 
					      "#": "We select all bicycle shops, sport shops (but we try to weed out non-bicycle related shops), and any shop with a bicycle related tag",
 | 
				
			||||||
      "shop=bicycle",
 | 
					      "or": [
 | 
				
			||||||
      {
 | 
					        "shop=bicycle",
 | 
				
			||||||
        "#": "A bicycle rental with a network is something such as villo, bluebike, ... We don't want them",
 | 
					        {
 | 
				
			||||||
        "and": [
 | 
					          "#": "A bicycle rental with a network is something such as villo, bluebike, ... We don't want them",
 | 
				
			||||||
          "amenity=bicycle_rental",
 | 
					          "and": [
 | 
				
			||||||
          "network="
 | 
					            "amenity=bicycle_rental",
 | 
				
			||||||
        ]
 | 
					            "network="
 | 
				
			||||||
      },
 | 
					          ]
 | 
				
			||||||
      {
 | 
					        },
 | 
				
			||||||
        "#": "if sport is defined and is not bicycle, it is retrackted; if bicycle retail/repair is marked as 'no', it is retracted too.",
 | 
					        {
 | 
				
			||||||
        "##": "There will be a few false-positives with this. They will get filtered out by people marking both 'not selling bikes' and 'not repairing bikes'. Furthermore, the OSMers will add a sports-subcategory on it",
 | 
					          "#": "if sport is defined and is not bicycle, it is retrackted; if bicycle retail/repair is marked as 'no', it is retracted too.",
 | 
				
			||||||
        "and": [
 | 
					          "##": "There will be a few false-positives with this. They will get filtered out by people marking both 'not selling bikes' and 'not repairing bikes'. Furthermore, the OSMers will add a sports-subcategory on it",
 | 
				
			||||||
          "shop=sports",
 | 
					          "and": [
 | 
				
			||||||
          "service:bicycle:retail!=no",
 | 
					            "shop=sports",
 | 
				
			||||||
          "service:bicycle:repair!=no",
 | 
					            "service:bicycle:retail!=no",
 | 
				
			||||||
          {
 | 
					            "service:bicycle:repair!=no",
 | 
				
			||||||
            "or": [
 | 
					            {
 | 
				
			||||||
              "sport=bicycle",
 | 
					              "or": [
 | 
				
			||||||
              "sport=cycling",
 | 
					                "sport=bicycle",
 | 
				
			||||||
              "sport="
 | 
					                "sport=cycling",
 | 
				
			||||||
            ]
 | 
					                "sport="
 | 
				
			||||||
          }
 | 
					              ]
 | 
				
			||||||
        ]
 | 
					            }
 | 
				
			||||||
      },
 | 
					          ]
 | 
				
			||||||
      {
 | 
					        },
 | 
				
			||||||
        "#": "Any shop with any bicycle service",
 | 
					        {
 | 
				
			||||||
        "and": [
 | 
					          "#": "Any shop with any bicycle service",
 | 
				
			||||||
          "shop~*",
 | 
					          "and": [
 | 
				
			||||||
          "service:bicycle:.*~~.*"
 | 
					            "shop~*",
 | 
				
			||||||
        ]
 | 
					            "service:bicycle:.*~~.*"
 | 
				
			||||||
      }
 | 
					          ]
 | 
				
			||||||
    ]
 | 
					        }
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					@ -575,7 +577,7 @@
 | 
				
			||||||
      "badge": true
 | 
					      "badge": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
     "if": "service:bicycle:pump=yes",
 | 
					      "if": "service:bicycle:pump=yes",
 | 
				
			||||||
      "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg",
 | 
					      "then": "circle:#e2783d;./assets/layers/bike_repair_station/pump.svg",
 | 
				
			||||||
      "badge": true
 | 
					      "badge": true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,10 +4,12 @@
 | 
				
			||||||
    "nl": "Vogelkijkhutten"
 | 
					    "nl": "Vogelkijkhutten"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 14,
 | 
					  "minzoom": 14,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "leisure=bird_hide"
 | 
					      "and": [
 | 
				
			||||||
    ]
 | 
					        "leisure=bird_hide"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,14 +7,16 @@
 | 
				
			||||||
    "de": "Mit Fahrrad zusammenhängendes Objekt"
 | 
					    "de": "Mit Fahrrad zusammenhängendes Objekt"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "or": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "theme~cycling|bicycle",
 | 
					      "or": [
 | 
				
			||||||
      "sport=cycling",
 | 
					        "theme~cycling|bicycle",
 | 
				
			||||||
      "association~cycling|bicycle",
 | 
					        "sport=cycling",
 | 
				
			||||||
      "ngo~cycling|bicycle",
 | 
					        "association~cycling|bicycle",
 | 
				
			||||||
      "club~bicycle|cycling"
 | 
					        "ngo~cycling|bicycle",
 | 
				
			||||||
    ]
 | 
					        "club~bicycle|cycling"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,11 +4,13 @@
 | 
				
			||||||
    "en": "Direction visualization"
 | 
					    "en": "Direction visualization"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 16,
 | 
					  "minzoom": 16,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "or": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "camera:direction~*",
 | 
					      "or": [
 | 
				
			||||||
      "direction~*"
 | 
					        "camera:direction~*",
 | 
				
			||||||
    ]
 | 
					        "direction~*"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "doNotDownload": true,
 | 
					  "doNotDownload": true,
 | 
				
			||||||
  "passAllFeatures": true,
 | 
					  "passAllFeatures": true,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,14 +31,15 @@
 | 
				
			||||||
      "badge": true
 | 
					      "badge": true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  "iconSize": "40,40,bottom",
 | 
					  "iconSize": "40,40,bottom",
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "amenity=drinking_water",
 | 
					      "and": [
 | 
				
			||||||
      "access!=permissive",
 | 
					        "amenity=drinking_water",
 | 
				
			||||||
      "access!=private"
 | 
					        "access!=permissive",
 | 
				
			||||||
    ]
 | 
					        "access!=private"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "wayHandling": 1,
 | 
					  "wayHandling": 1,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,9 @@
 | 
				
			||||||
    "nl": "Witte Fietsen",
 | 
					    "nl": "Witte Fietsen",
 | 
				
			||||||
    "de": "Geisterrad"
 | 
					    "de": "Geisterrad"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "overpassTags": "memorial=ghost_bike",
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": "memorial=ghost_bike"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  "minzoom": 0,
 | 
					  "minzoom": 0,
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,10 +5,12 @@
 | 
				
			||||||
    "en": "Information boards"
 | 
					    "en": "Information boards"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 12,
 | 
					  "minzoom": 12,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "information=board"
 | 
					      "and": [
 | 
				
			||||||
    ]
 | 
					        "information=board"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					@ -16,7 +18,9 @@
 | 
				
			||||||
      "en": "Information board"
 | 
					      "en": "Information board"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "tagRenderings": [ "images"],
 | 
					  "tagRenderings": [
 | 
				
			||||||
 | 
					    "images"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
  "hideUnderlayingFeaturesMinPercentage": 0,
 | 
					  "hideUnderlayingFeaturesMinPercentage": 0,
 | 
				
			||||||
  "icon": {
 | 
					  "icon": {
 | 
				
			||||||
    "render": "./assets/layers/information_board/board.svg"
 | 
					    "render": "./assets/layers/information_board/board.svg"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,11 +5,13 @@
 | 
				
			||||||
    "nl": "Kaarten"
 | 
					    "nl": "Kaarten"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 12,
 | 
					  "minzoom": 12,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "or": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "tourism=map",
 | 
					      "or": [
 | 
				
			||||||
      "information=map"
 | 
					        "tourism=map",
 | 
				
			||||||
    ]
 | 
					        "information=map"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,11 +4,13 @@
 | 
				
			||||||
    "nl": "Natuurgebied"
 | 
					    "nl": "Natuurgebied"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 12,
 | 
					  "minzoom": 12,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "or": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "leisure=nature_reserve",
 | 
					      "or": [
 | 
				
			||||||
      "boundary=protected_area"
 | 
					        "leisure=nature_reserve",
 | 
				
			||||||
    ]
 | 
					        "boundary=protected_area"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					@ -330,7 +332,8 @@
 | 
				
			||||||
        "key": "description:0"
 | 
					        "key": "description:0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {"#": "Surface are",
 | 
					    {
 | 
				
			||||||
 | 
					      "#": "Surface are",
 | 
				
			||||||
      "render": {
 | 
					      "render": {
 | 
				
			||||||
        "en": "Surface area: {_surface:ha}Ha",
 | 
					        "en": "Surface area: {_surface:ha}Ha",
 | 
				
			||||||
        "mappings": {
 | 
					        "mappings": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,10 +4,12 @@
 | 
				
			||||||
    "nl": "Speelbossen"
 | 
					    "nl": "Speelbossen"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "playground=forest"
 | 
					      "and": [
 | 
				
			||||||
    ]
 | 
					        "playground=forest"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,11 +5,13 @@
 | 
				
			||||||
    "en": "Playgrounds"
 | 
					    "en": "Playgrounds"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 13,
 | 
					  "minzoom": 13,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "leisure=playground",
 | 
					      "and": [
 | 
				
			||||||
      "playground!=forest"
 | 
					        "leisure=playground",
 | 
				
			||||||
    ]
 | 
					        "playground!=forest"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "description": {
 | 
					  "description": {
 | 
				
			||||||
    "nl": "Speeltuinen",
 | 
					    "nl": "Speeltuinen",
 | 
				
			||||||
| 
						 | 
					@ -299,7 +301,7 @@
 | 
				
			||||||
    "render": "https://upload.wikimedia.org/wikipedia/commons/0/00/Map_icons_by_Scott_de_Jonge_-_playground.svg"
 | 
					    "render": "https://upload.wikimedia.org/wikipedia/commons/0/00/Map_icons_by_Scott_de_Jonge_-_playground.svg"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "width": {
 | 
					  "width": {
 | 
				
			||||||
    "render": "3"
 | 
					    "render": "1"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "iconSize": {
 | 
					  "iconSize": {
 | 
				
			||||||
    "render": "40,40,center"
 | 
					    "render": "40,40,center"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,9 @@
 | 
				
			||||||
    "de": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich",
 | 
					    "de": "Ein Bücherschrank am Straßenrand mit Büchern, für jedermann zugänglich",
 | 
				
			||||||
    "fr": "Une armoire ou une boite contenant des livres en libre accès"
 | 
					    "fr": "Une armoire ou une boite contenant des livres en libre accès"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "overpassTags": "amenity=public_bookcase",
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": "amenity=public_bookcase"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  "minzoom": 12,
 | 
					  "minzoom": 12,
 | 
				
			||||||
  "wayHandling": 2,
 | 
					  "wayHandling": 2,
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
| 
						 | 
					@ -256,8 +258,11 @@
 | 
				
			||||||
            "de": "Teil des Netzwerks 'Little Free Library'",
 | 
					            "de": "Teil des Netzwerks 'Little Free Library'",
 | 
				
			||||||
            "fr": "Fait partie du réseau 'Little Free Library'"
 | 
					            "fr": "Fait partie du réseau 'Little Free Library'"
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "if":{
 | 
					          "if": {
 | 
				
			||||||
            "and": ["brand=Little Free Library","nobrand="]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "brand=Little Free Library",
 | 
				
			||||||
 | 
					              "nobrand="
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,16 +4,18 @@
 | 
				
			||||||
    "nl": "Trage wegen"
 | 
					    "nl": "Trage wegen"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 14,
 | 
					  "minzoom": 14,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "or": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "highway=pedestrian",
 | 
					      "or": [
 | 
				
			||||||
      "highway=cycleway",
 | 
					        "highway=pedestrian",
 | 
				
			||||||
      "highway=footway",
 | 
					        "highway=cycleway",
 | 
				
			||||||
      "highway=path",
 | 
					        "highway=footway",
 | 
				
			||||||
      "highway=bridleway",
 | 
					        "highway=path",
 | 
				
			||||||
      "highway=living_street",
 | 
					        "highway=bridleway",
 | 
				
			||||||
      "highway=track"
 | 
					        "highway=living_street",
 | 
				
			||||||
    ]
 | 
					        "highway=track"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,10 +5,11 @@
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "wayHandling": 2,
 | 
					  "wayHandling": 2,
 | 
				
			||||||
  "minzoom": 12,
 | 
					  "minzoom": 12,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": {
 | 
				
			||||||
    "and": [
 | 
					    "and": [
 | 
				
			||||||
      "leisure=pitch"
 | 
					      "leisure=pitch"
 | 
				
			||||||
    ]
 | 
					    ]}
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					@ -211,13 +212,13 @@
 | 
				
			||||||
    "render": "./assets/layers/sport_pitch/tabletennis.svg"
 | 
					    "render": "./assets/layers/sport_pitch/tabletennis.svg"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "width": {
 | 
					  "width": {
 | 
				
			||||||
    "render": "8"
 | 
					    "render": "1"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "iconSize": {
 | 
					  "iconSize": {
 | 
				
			||||||
    "render": "40,40,center"
 | 
					    "render": "40,40,center"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "color": {
 | 
					  "color": {
 | 
				
			||||||
    "render": "#00f"
 | 
					    "render": "#009"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "presets": [
 | 
					  "presets": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,17 +5,19 @@
 | 
				
			||||||
    "nl": "Bewakingscamera's"
 | 
					    "nl": "Bewakingscamera's"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 12,
 | 
					  "minzoom": 12,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": [
 | 
					    "osmTags": {
 | 
				
			||||||
      "man_made=surveillance",
 | 
					      "and": [
 | 
				
			||||||
      {
 | 
					        "man_made=surveillance",
 | 
				
			||||||
        "or": [
 | 
					        {
 | 
				
			||||||
          "surveillance:type=camera",
 | 
					          "or": [
 | 
				
			||||||
          "surveillance:type=ALPR",
 | 
					            "surveillance:type=camera",
 | 
				
			||||||
          "surveillance:type=ANPR"
 | 
					            "surveillance:type=ALPR",
 | 
				
			||||||
        ]
 | 
					            "surveillance:type=ANPR"
 | 
				
			||||||
      }
 | 
					          ]
 | 
				
			||||||
    ]
 | 
					        }
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,9 @@
 | 
				
			||||||
    "de": "Toiletten",
 | 
					    "de": "Toiletten",
 | 
				
			||||||
    "fr": "Toilettes"
 | 
					    "fr": "Toilettes"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "overpassTags": "amenity=toilets",
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": "amenity=toilets"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
      "en": "Toilet",
 | 
					      "en": "Toilet",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,8 +5,12 @@
 | 
				
			||||||
    "en": "Tree"
 | 
					    "en": "Tree"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "minzoom": 14,
 | 
					  "minzoom": 14,
 | 
				
			||||||
  "overpassTags": {
 | 
					  "source": {
 | 
				
			||||||
    "and": ["natural=tree"]
 | 
					    "osmTags": {
 | 
				
			||||||
 | 
					      "and": [
 | 
				
			||||||
 | 
					        "natural=tree"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "title": {
 | 
					  "title": {
 | 
				
			||||||
    "render": {
 | 
					    "render": {
 | 
				
			||||||
| 
						 | 
					@ -38,7 +42,9 @@
 | 
				
			||||||
      "mappings": [
 | 
					      "mappings": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["height~^[0-9.]+$"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "height~^[0-9.]+$"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "Hoogte: {height} m",
 | 
					            "nl": "Hoogte: {height} m",
 | 
				
			||||||
| 
						 | 
					@ -55,7 +61,9 @@
 | 
				
			||||||
      "mappings": [
 | 
					      "mappings": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["leaf_type=broadleaved"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "leaf_type=broadleaved"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Loofboom",
 | 
					            "nl": "<img src=\"./assets/themes/trees/broadleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Loofboom",
 | 
				
			||||||
| 
						 | 
					@ -64,7 +72,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["leaf_type=needleleaved"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "leaf_type=needleleaved"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Naaldboom",
 | 
					            "nl": "<img src=\"./assets/themes/trees/needleleaved.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Naaldboom",
 | 
				
			||||||
| 
						 | 
					@ -73,7 +83,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["leaf_type=leafless"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "leaf_type=leafless"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Permanent bladloos",
 | 
					            "nl": "<img src=\"./assets/themes/trees/leafless.svg\" style=\"width:1.5em;height:1.5em\" alt=\"\"/> Permanent bladloos",
 | 
				
			||||||
| 
						 | 
					@ -91,7 +103,9 @@
 | 
				
			||||||
      "mappings": [
 | 
					      "mappings": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["denotation=landmark"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "denotation=landmark"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "De boom valt op door zijn grootte of prominente locatie. Hij is nuttig voor navigatie.",
 | 
					            "nl": "De boom valt op door zijn grootte of prominente locatie. Hij is nuttig voor navigatie.",
 | 
				
			||||||
| 
						 | 
					@ -100,7 +114,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["denotation=natural_monument"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "denotation=natural_monument"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "De boom is een natuurlijk monument, bijvoorbeeld doordat hij bijzonder oud of van een waardevolle soort is.",
 | 
					            "nl": "De boom is een natuurlijk monument, bijvoorbeeld doordat hij bijzonder oud of van een waardevolle soort is.",
 | 
				
			||||||
| 
						 | 
					@ -109,7 +125,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["denotation=agricultural"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "denotation=agricultural"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "De boom wordt voor landbouwdoeleinden gebruikt, bijvoorbeeld in een boomgaard.",
 | 
					            "nl": "De boom wordt voor landbouwdoeleinden gebruikt, bijvoorbeeld in een boomgaard.",
 | 
				
			||||||
| 
						 | 
					@ -118,7 +136,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["denotation=park"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "denotation=park"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "De boom staat in een park of dergelijke (begraafplaats, schoolterrein, …).",
 | 
					            "nl": "De boom staat in een park of dergelijke (begraafplaats, schoolterrein, …).",
 | 
				
			||||||
| 
						 | 
					@ -127,7 +147,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["denotation=garden"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "denotation=garden"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "De boom staat in de tuin bij een woning/flatgebouw.",
 | 
					            "nl": "De boom staat in de tuin bij een woning/flatgebouw.",
 | 
				
			||||||
| 
						 | 
					@ -136,7 +158,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["denotation=avenue"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "denotation=avenue"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "Dit is een laanboom.",
 | 
					            "nl": "Dit is een laanboom.",
 | 
				
			||||||
| 
						 | 
					@ -145,7 +169,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["denotation=urban"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "denotation=urban"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "De boom staat in een woonkern.",
 | 
					            "nl": "De boom staat in een woonkern.",
 | 
				
			||||||
| 
						 | 
					@ -154,7 +180,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["denotation=none"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "denotation=none"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "De boom staat buiten een woonkern.",
 | 
					            "nl": "De boom staat buiten een woonkern.",
 | 
				
			||||||
| 
						 | 
					@ -171,7 +199,9 @@
 | 
				
			||||||
      "mappings": [
 | 
					      "mappings": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["leaf_cycle=deciduous"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "leaf_cycle=deciduous"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "Bladverliezend: de boom is een periode van het jaar kaal.",
 | 
					            "nl": "Bladverliezend: de boom is een periode van het jaar kaal.",
 | 
				
			||||||
| 
						 | 
					@ -180,7 +210,9 @@
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "if": {
 | 
					          "if": {
 | 
				
			||||||
            "and": ["leaf_cycle=evergreen"]
 | 
					            "and": [
 | 
				
			||||||
 | 
					              "leaf_cycle=evergreen"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          "then": {
 | 
					          "then": {
 | 
				
			||||||
            "nl": "Groenblijvend.",
 | 
					            "nl": "Groenblijvend.",
 | 
				
			||||||
| 
						 | 
					@ -189,7 +221,9 @@
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "condition": {
 | 
					      "condition": {
 | 
				
			||||||
        "and": ["leaf_type!~^leafless$"]
 | 
					        "and": [
 | 
				
			||||||
 | 
					          "leaf_type!~^leafless$"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -351,13 +385,17 @@
 | 
				
			||||||
    "mappings": [
 | 
					    "mappings": [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        "if": {
 | 
					        "if": {
 | 
				
			||||||
          "and": ["leaf_type=broadleaved"]
 | 
					          "and": [
 | 
				
			||||||
 | 
					            "leaf_type=broadleaved"
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "then": "circle:#ffffff;./assets/themes/trees/broadleaved.svg"
 | 
					        "then": "circle:#ffffff;./assets/themes/trees/broadleaved.svg"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        "if": {
 | 
					        "if": {
 | 
				
			||||||
          "and": ["leaf_type=needleleaved"]
 | 
					          "and": [
 | 
				
			||||||
 | 
					            "leaf_type=needleleaved"
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "then": "circle:#ffffff;./assets/themes/trees/needleleaved.svg"
 | 
					        "then": "circle:#ffffff;./assets/themes/trees/needleleaved.svg"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,9 @@
 | 
				
			||||||
    "nl": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past",
 | 
					    "nl": "Een mooi uitzicht - ideaal om een foto toe te voegen wanneer iets niet in een andere categorie past",
 | 
				
			||||||
    "de": "Ein schöner Aussichtspunkt oder eine schöne Aussicht. Ideal zum Hinzufügen eines Bildes, wenn keine andere Kategorie passt"
 | 
					    "de": "Ein schöner Aussichtspunkt oder eine schöne Aussicht. Ideal zum Hinzufügen eines Bildes, wenn keine andere Kategorie passt"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "overpassTags": "tourism=viewpoint",
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": "tourism=viewpoint"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  "minzoom": 14,
 | 
					  "minzoom": 14,
 | 
				
			||||||
  "icon": "./assets/layers/viewpoint/viewpoint.svg",
 | 
					  "icon": "./assets/layers/viewpoint/viewpoint.svg",
 | 
				
			||||||
  "iconSize": "20,20,center",
 | 
					  "iconSize": "20,20,center",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										48
									
								
								assets/layers/village_green/grass_in_parks.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								assets/layers/village_green/grass_in_parks.json
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,48 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "id": "grass_in_parks",
 | 
				
			||||||
 | 
					  "name": {
 | 
				
			||||||
 | 
					    "nl": "Toegankelijke grasvelden in parken"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": {
 | 
				
			||||||
 | 
					      "and": [
 | 
				
			||||||
 | 
					        "landuse=grass",
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          "or": [
 | 
				
			||||||
 | 
					            "access=public",
 | 
				
			||||||
 | 
					            "access=yes"
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "overpassScript": "way[\"leisure\"=\"park\"];node(w);is_in;area._[\"leisure\"=\"park\"];(way(area)[\"landuse\"=\"grass\"]; node(w); );"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "minzoom": 0,
 | 
				
			||||||
 | 
					  "title": {
 | 
				
			||||||
 | 
					    "render": {
 | 
				
			||||||
 | 
					      "nl": "Speelweide in een park"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "mappings": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "if": "name~*",
 | 
				
			||||||
 | 
					        "then": {
 | 
				
			||||||
 | 
					          "nl": "{name}"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "icon": "./assets/themes/playgrounds/playground.svg",
 | 
				
			||||||
 | 
					  "iconSize": "40,40,bottom",
 | 
				
			||||||
 | 
					  "width": "1",
 | 
				
			||||||
 | 
					  "color": "#0f0",
 | 
				
			||||||
 | 
					  "wayHandling": 2,
 | 
				
			||||||
 | 
					  "tagRenderings": [
 | 
				
			||||||
 | 
					    "images",
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "render": "Op dit grasveld in het park mag je spelen, picnicken, zitten, ..."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "render": "{reviews(name, landuse=grass )}"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										37
									
								
								assets/layers/village_green/village_green.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								assets/layers/village_green/village_green.json
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "id": "village_green",
 | 
				
			||||||
 | 
					  "name": {
 | 
				
			||||||
 | 
					    "nl": "Speelweide"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "source": {
 | 
				
			||||||
 | 
					    "osmTags": "landuse=village_green"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "minzoom": 0,
 | 
				
			||||||
 | 
					  "title": {
 | 
				
			||||||
 | 
					    "render": {
 | 
				
			||||||
 | 
					      "nl": "Speelweide"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "mappings": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "if": "name~*",
 | 
				
			||||||
 | 
					        "then": {
 | 
				
			||||||
 | 
					          "nl": "{name}"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "icon": "./assets/themes/playgrounds/playground.svg",
 | 
				
			||||||
 | 
					  "iconSize": "40,40,bottom",
 | 
				
			||||||
 | 
					  "width": "1",
 | 
				
			||||||
 | 
					  "color": "#0f0",
 | 
				
			||||||
 | 
					  "wayHandling": 2,
 | 
				
			||||||
 | 
					  "tagRenderings": [
 | 
				
			||||||
 | 
					    "images",
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "render": "Dit is een klein stukje openbaar groen waar je mag spelen, picnicken, zitten, ..."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "render": "{reviews(name, landuse=village_green )}"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,9 @@
 | 
				
			||||||
    "play_forest",
 | 
					    "play_forest",
 | 
				
			||||||
    "playground",
 | 
					    "playground",
 | 
				
			||||||
    "sport_pitch",
 | 
					    "sport_pitch",
 | 
				
			||||||
    "slow_roads"
 | 
					    "slow_roads",
 | 
				
			||||||
 | 
					    "grass_in_parks",
 | 
				
			||||||
 | 
					    "village_green"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "roamingRenderings": []
 | 
					  "roamingRenderings": []
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue