forked from MapComplete/MapComplete
		
	Rendering bug fixes, add 'get' to the ExtraFunctions, filtering in the GRB theme
This commit is contained in:
		
							parent
							
								
									10d9f18110
								
							
						
					
					
						commit
						c74989e88d
					
				
					 9 changed files with 318 additions and 114 deletions
				
			
		|  | @ -163,12 +163,41 @@ export class ExtraFunction { | |||
|         } | ||||
|     ) | ||||
| 
 | ||||
|     private static readonly GetParsed = new ExtraFunction( | ||||
|         { | ||||
|             name: "get", | ||||
|             doc: "Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ...", | ||||
|             args: ["key"] | ||||
|         }, | ||||
|         (params, feat) => { | ||||
|             return key => { | ||||
|                 const value = feat.properties[key] | ||||
|                 if (value === undefined) { | ||||
|                     return undefined; | ||||
|                 } | ||||
|                 try { | ||||
|                     const parsed = JSON.parse(value) | ||||
|                     if(parsed === null){ | ||||
|                         return undefined; | ||||
|                     } | ||||
|                     return parsed; | ||||
|                 } catch (e) { | ||||
|                     console.warn("Could not parse property " + key + " due to: " + e + ", the value is " + value) | ||||
|                     return undefined; | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
|     ) | ||||
| 
 | ||||
|     private static readonly allFuncs: ExtraFunction[] = [ | ||||
|         ExtraFunction.DistanceToFunc, | ||||
|         ExtraFunction.OverlapFunc, | ||||
|         ExtraFunction.ClosestObjectFunc, | ||||
|         ExtraFunction.ClosestNObjectFunc, | ||||
|         ExtraFunction.Memberships | ||||
|         ExtraFunction.Memberships, | ||||
|         ExtraFunction.GetParsed | ||||
|     ]; | ||||
|     private readonly _name: string; | ||||
|     private readonly _args: string[]; | ||||
|  | @ -249,8 +278,8 @@ export class ExtraFunction { | |||
|                     throw "Undefined distance!" | ||||
|                 } | ||||
| 
 | ||||
|                 if(distance === 0){ | ||||
|                     console.trace("Got a suspiciously zero distance between", otherFeature, "and self-feature",feature) | ||||
|                 if (distance === 0) { | ||||
|                     console.trace("Got a suspiciously zero distance between", otherFeature, "and self-feature", feature) | ||||
|                 } | ||||
| 
 | ||||
|                 if (distance > maxDistance) { | ||||
|  |  | |||
|  | @ -12,7 +12,6 @@ import OverpassFeatureSource from "../Actors/OverpassFeatureSource"; | |||
| import {Changes} from "../Osm/Changes"; | ||||
| import GeoJsonSource from "./Sources/GeoJsonSource"; | ||||
| import Loc from "../../Models/Loc"; | ||||
| import WayHandlingApplyingFeatureSource from "./Sources/RenderingMultiPlexerFeatureSource"; | ||||
| import RegisteringAllFromFeatureSourceActor from "./Actors/RegisteringAllFromFeatureSourceActor"; | ||||
| import TiledFromLocalStorageSource from "./TiledFeatureSource/TiledFromLocalStorageSource"; | ||||
| import SaveTileToLocalStorageActor from "./Actors/SaveTileToLocalStorageActor"; | ||||
|  | @ -26,6 +25,7 @@ import OsmFeatureSource from "./TiledFeatureSource/OsmFeatureSource"; | |||
| import {OsmConnection} from "../Osm/OsmConnection"; | ||||
| import {Tiles} from "../../Models/TileRange"; | ||||
| import TileFreshnessCalculator from "./TileFreshnessCalculator"; | ||||
| import {ElementStorage} from "../ElementStorage"; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  | @ -85,7 +85,8 @@ export default class FeaturePipeline { | |||
|             readonly overpassMaxZoom: UIEventSource<number>; | ||||
|             readonly osmConnection: OsmConnection | ||||
|             readonly currentBounds: UIEventSource<BBox>, | ||||
|             readonly osmApiTileSize: UIEventSource<number> | ||||
|             readonly osmApiTileSize: UIEventSource<number>, | ||||
|             readonly allElements: ElementStorage | ||||
|         }) { | ||||
|         this.state = state; | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,6 +3,8 @@ import FilteredLayer from "../../../Models/FilteredLayer"; | |||
| import {FeatureSourceForLayer, Tiled} from "../FeatureSource"; | ||||
| import Hash from "../../Web/Hash"; | ||||
| import {BBox} from "../../BBox"; | ||||
| import {ElementStorage} from "../../ElementStorage"; | ||||
| import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"; | ||||
| 
 | ||||
| export default class FilteringFeatureSource implements FeatureSourceForLayer, Tiled { | ||||
|     public features: UIEventSource<{ feature: any; freshness: Date }[]> = | ||||
|  | @ -12,12 +14,16 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti | |||
|     public readonly tileIndex: number | ||||
|     public readonly bbox: BBox | ||||
|     private readonly upstream: FeatureSourceForLayer; | ||||
|     private readonly state: { locationControl: UIEventSource<{ zoom: number }>; selectedElement: UIEventSource<any> }; | ||||
|     private readonly state: { | ||||
|         locationControl: UIEventSource<{ zoom: number }>; selectedElement: UIEventSource<any>, | ||||
|         allElements: ElementStorage | ||||
|     }; | ||||
| 
 | ||||
|     constructor( | ||||
|         state: { | ||||
|             locationControl: UIEventSource<{ zoom: number }>, | ||||
|             selectedElement: UIEventSource<any>, | ||||
|             allElements: ElementStorage | ||||
|         }, | ||||
|         tileIndex, | ||||
|         upstream: FeatureSourceForLayer | ||||
|  | @ -30,23 +36,51 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti | |||
| 
 | ||||
|         this.layer = upstream.layer; | ||||
|         const layer = upstream.layer; | ||||
|        | ||||
|         const self = this; | ||||
|         upstream.features.addCallback(() => { | ||||
|            this. update(); | ||||
|             self.update(); | ||||
|         }); | ||||
| 
 | ||||
| 
 | ||||
|         layer.appliedFilters.addCallback(_ => { | ||||
|             this.update() | ||||
|             self.update() | ||||
|         }) | ||||
| 
 | ||||
|         this._is_dirty.stabilized(250).addCallbackAndRunD(dirty => { | ||||
|             if (dirty) { | ||||
|                 self.update() | ||||
|             } | ||||
|         }) | ||||
| 
 | ||||
|         this.update(); | ||||
|     } | ||||
|     public update() { | ||||
| 
 | ||||
|     private readonly _alreadyRegistered = new Set<UIEventSource<any>>(); | ||||
|     private readonly _is_dirty = new UIEventSource(false) | ||||
| 
 | ||||
|     private registerCallback(feature: any, layer: LayerConfig) { | ||||
|         const src = this.state.allElements.addOrGetElement(feature) | ||||
|         if (this._alreadyRegistered.has(src)) { | ||||
|             return | ||||
|         } | ||||
|         this._alreadyRegistered.add(src) | ||||
|         if (layer.isShown !== undefined) { | ||||
| 
 | ||||
|             const self = this; | ||||
|             src.map(tags => layer.isShown?.GetRenderValue(tags, "yes").txt).addCallbackAndRunD(isShown => { | ||||
|                 self._is_dirty.setData(true) | ||||
|             }) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public update() { | ||||
|         const self = this; | ||||
|         const layer = this.upstream.layer; | ||||
|         const features: { feature: any; freshness: Date }[] = this.upstream.features.data; | ||||
|         const newFeatures = features.filter((f) => { | ||||
| 
 | ||||
|             self.registerCallback(f.feature, layer.layerDef) | ||||
| 
 | ||||
|             if ( | ||||
|                 this.state.selectedElement.data?.id === f.feature.id || | ||||
|                 f.feature.id === Hash.hash.data) { | ||||
|  | @ -79,6 +113,7 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti | |||
|         }); | ||||
| 
 | ||||
|         this.features.setData(newFeatures); | ||||
|         this._is_dirty.setData(false) | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ export default class LineRenderingConfig extends WithContextLoader { | |||
|         this.offset = this.tr("offset", "0"); | ||||
|     } | ||||
| 
 | ||||
| public GenerateLeafletStyle(        tags: {}    ): | ||||
|     public GenerateLeafletStyle(tags: {}): | ||||
|         { | ||||
|             color: string, | ||||
|             weight: number, | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ import {VariableUiElement} from "../../UI/Base/VariableUIElement"; | |||
| 
 | ||||
| export default class PointRenderingConfig extends WithContextLoader { | ||||
| 
 | ||||
|     private static readonly  allowed_location_codes = new Set<string>(["point", "centroid","start","end"]) | ||||
|     public readonly location: Set<"point" | "centroid" | "start" | "end"> | ||||
| 
 | ||||
|     public readonly icon: TagRenderingConfig; | ||||
|  | @ -25,8 +26,20 @@ export default class PointRenderingConfig extends WithContextLoader { | |||
| 
 | ||||
|     constructor(json: PointRenderingConfigJson, context: string) { | ||||
|         super(json, context) | ||||
|          | ||||
|         if(typeof json.location === "string"){ | ||||
|             json.location = [json.location] | ||||
|         } | ||||
|          | ||||
|         this.location = new Set(json.location) | ||||
|          | ||||
|         this.location.forEach(l => { | ||||
|             const allowed = PointRenderingConfig.allowed_location_codes | ||||
|             if(!allowed.has(l)){ | ||||
|                 throw `A point rendering has an invalid location: '${l}' is not one of ${Array.from(allowed).join(", ")} (at ${context}.location)` | ||||
|             } | ||||
|         }) | ||||
| 
 | ||||
|         if(this.location.size == 0){ | ||||
|             throw "A pointRendering should have at least one 'location' to defined where it should be rendered. (At "+context+".location)" | ||||
|         } | ||||
|  |  | |||
|  | @ -212,12 +212,13 @@ export default class ShowDataLayer { | |||
|         const lineRenderingIndex = feature.lineRenderingIndex | ||||
| 
 | ||||
|         if (pointRenderingIndex !== undefined) { | ||||
|             const style = layer.mapRendering[pointRenderingIndex].GenerateLeafletStyle(tagsSource, this._enablePopups) | ||||
|             return { | ||||
|                 icon: layer.mapRendering[pointRenderingIndex].GenerateLeafletStyle(tagsSource, this._enablePopups) | ||||
|                 icon: style | ||||
|             } | ||||
|         } | ||||
|         if (lineRenderingIndex !== undefined) { | ||||
|             return layer.lineRendering[lineRenderingIndex].GenerateLeafletStyle(tagsSource) | ||||
|             return layer.lineRendering[lineRenderingIndex].GenerateLeafletStyle(tagsSource.data) | ||||
|         } | ||||
| 
 | ||||
|         throw "Neither lineRendering nor mapRendering defined for " + feature | ||||
|  | @ -232,9 +233,8 @@ export default class ShowDataLayer { | |||
|         if (layer === undefined) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         let tagSource = this.allElements?.getEventSourceById(feature.properties.id) ?? new UIEventSource<any>(feature.properties) | ||||
|         const clickable = !(layer.title === undefined && (layer.tagRenderings ?? []).length === 0) | ||||
|         const clickable = !(layer.title === undefined && (layer.tagRenderings ?? []).length === 0) && this._enablePopups | ||||
|         let style: any = layer.mapRendering[feature.pointRenderingIndex].GenerateLeafletStyle(tagSource, clickable); | ||||
|         const baseElement = style.html; | ||||
|         if (!this._enablePopups) { | ||||
|  |  | |||
|  | @ -20,6 +20,9 @@ | |||
|   "startZoom": 14, | ||||
|   "widenFactor": 2, | ||||
|   "socialImage": "", | ||||
|   "clustering": { | ||||
|     "maxZoom": 15 | ||||
|   }, | ||||
|   "layers": [ | ||||
|     { | ||||
|       "id": "OSM-buildings", | ||||
|  | @ -28,7 +31,7 @@ | |||
|         "osmTags": "building~*", | ||||
|         "maxCacheAge": 0 | ||||
|       }, | ||||
|       "minzoom": 18, | ||||
|       "minzoom": 16, | ||||
|       "mapRendering": [ | ||||
|         { | ||||
|           "width": { | ||||
|  | @ -277,7 +280,7 @@ | |||
|         { | ||||
|           "location": [ | ||||
|             "point", | ||||
|             "center" | ||||
|             "centroid" | ||||
|           ], | ||||
|           "label": { | ||||
|             "mappings": [ | ||||
|  | @ -311,17 +314,46 @@ | |||
|         "geoJsonZoomLevel": 18, | ||||
|         "maxCacheAge": 0 | ||||
|       }, | ||||
|       "minzoom": 19, | ||||
|       "minzoom": 16, | ||||
|       "name": "CRAB-addressen", | ||||
|       "title": "CRAB-adres", | ||||
|       "mapRendering": [ | ||||
|         { | ||||
|           "location": "point", | ||||
|           "location": ["point"], | ||||
|           "icon": "circle:#bb3322", | ||||
|           "iconSize": "15,15,center" | ||||
|         } | ||||
|       ], | ||||
|       "calculatedTags": [ | ||||
|         "_embedded_in=feat.overlapWith('OSM-buildings').filter(f => f.feat.properties['addr:housenumber'] !== undefined)[0]?.feat?.properties ", | ||||
|         "_embedding_nr=feat.get('_embedded_in')['addr:housenumber']", | ||||
|         "_embedding_street=feat.get('_embedded_in')['addr:street']" | ||||
|       ], | ||||
|       "isShown": { | ||||
|         "render": "yes", | ||||
|         "mappings": [ | ||||
|           { | ||||
|             "if": { | ||||
|               "and":["_embedding_nr:={HUISNR}","_embedding_street:={STRAATNM}"] | ||||
|             }, | ||||
|             "then": "no" | ||||
|           } | ||||
|         ] | ||||
|       }, | ||||
|       "tagRenderings": [ | ||||
| 
 | ||||
|         { | ||||
|           "id": "render_crab", | ||||
|           "render": "Volgens het CRAB ligt hier <b>{STRAATNM}</b> {HUISNR} (label: {HNRLABEL})" | ||||
|         }, | ||||
|         { | ||||
|           "id": "render_embedded", | ||||
|           "render": "Het omliggende object met addres heeft <b>{_embedding_street}</b> {_embedding_nr}", | ||||
|           "condition": { | ||||
|             "and": ["_embedding_street~*","_embedding_nr~*"] | ||||
|           } | ||||
|         }, | ||||
|          | ||||
|         "all_tags", | ||||
|         { | ||||
|           "id": "import-button", | ||||
|  | @ -334,7 +366,7 @@ | |||
|       "name": { | ||||
|         "nl": "Fixmes op gebouwen" | ||||
|       }, | ||||
|       "minzoom": 12, | ||||
|       "minzoom": 16, | ||||
|       "source": { | ||||
|         "maxCacheAge": 0, | ||||
|         "osmTags": { | ||||
|  | @ -490,7 +522,7 @@ | |||
|         { | ||||
|           "location": [ | ||||
|             "point", | ||||
|             "center" | ||||
|             "centroid" | ||||
|           ], | ||||
|           "iconSize": { | ||||
|             "render": "40,40,center" | ||||
|  | @ -512,12 +544,66 @@ | |||
|             "render": "#00f" | ||||
|           } | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "id": "GRB", | ||||
|       "source": { | ||||
|         "geoJson": "https://betadata.grbosm.site/grb?bbox={x_min},{y_min},{x_max},{y_max}", | ||||
|         "geoJsonZoomLevel": 18, | ||||
|         "mercatorCrs": true, | ||||
|         "maxCacheAge": 0 | ||||
|       }, | ||||
|       "name": "GRB geometries", | ||||
|       "title": "GRB outline", | ||||
|       "minzoom": 16, | ||||
|       "calculatedTags": [ | ||||
|         "_overlaps_with=feat.overlapWith('OSM-buildings').filter(f => f.overlap > 1 && feat.properties._surface - f.overlap < 5)[0] ?? null", | ||||
|         "_osm_obj:source:ref=JSON.parse(feat.properties._overlaps_with)?.feat?.properties['source:geometry:ref']", | ||||
|         "_osm_obj:source:date=JSON.parse(feat.properties._overlaps_with)?.feat?.properties['source:geometry:date'].replace(/\\//g, '-')", | ||||
|         "_imported_osm_object_found= feat.properties['_osm_obj:source:ref'] == feat.properties['source:geometry:entity'] + '/' + feat.properties['source:geometry:oidn']", | ||||
|         "_grb_date=feat.properties['source:geometry:date'].replace(/\\//g,'-')", | ||||
|         "_imported_osm_still_fresh= feat.properties['_osm_obj:source:date'] == feat.properties._grb_date" | ||||
|       ], | ||||
|       "presets": [] | ||||
|       "tagRenderings": [ | ||||
|         "all_tags" | ||||
|       ], | ||||
|       "isShown": { | ||||
|         "render": "yes", | ||||
|         "mappings": [ | ||||
|           { | ||||
|             "if": { | ||||
|               "and": [ | ||||
|                 "_imported_osm_object_found=true", | ||||
|                 "_imported_osm_still_fresh=true" | ||||
|               ] | ||||
|             }, | ||||
|             "then": "no" | ||||
|           } | ||||
|         ] | ||||
|       }, | ||||
|       "mapRendering": [ | ||||
|         { | ||||
|           "color": { | ||||
|             "render": "#00a", | ||||
|             "mappings": [ | ||||
|               { | ||||
|                 "if": { | ||||
|                   "and": [ | ||||
|                     "_imported_osm_object_found=true", | ||||
|                     "_imported_osm_still_fresh=true" | ||||
|                   ] | ||||
|                 }, | ||||
|                 "then": "#0f0" | ||||
|               } | ||||
|             ] | ||||
|           } | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|   ], | ||||
|   "hideFromOverview": true, | ||||
|   "defaultBackgroundId": "AGIVFlandersGRB", | ||||
|   "overpassMaxZoom": 18, | ||||
|   "overpassMaxZoom": 15, | ||||
|   "osmApiTileSize": 17 | ||||
| } | ||||
|  | @ -57,10 +57,14 @@ | |||
|         }, | ||||
|         "minzoom": 13, | ||||
|         "minzoomVisible": 0, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg" | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "#": "Nature reserve overview from cache, points only, z < 13", | ||||
|  | @ -77,9 +81,13 @@ | |||
|           "isOsmCache": "duplicate" | ||||
|         }, | ||||
|         "minzoom": 1, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/nature_reserve.svg" | ||||
|         }, | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
|         "presets": [] | ||||
|       } | ||||
|     }, | ||||
|  | @ -96,10 +104,14 @@ | |||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "minzoom": 1, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/information.svg" | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "trail", | ||||
|  | @ -115,6 +127,8 @@ | |||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "minzoom": 10, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/trail.svg", | ||||
|               "mappings": [ | ||||
|  | @ -129,6 +143,8 @@ | |||
|               ] | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "toilet", | ||||
|  | @ -139,6 +155,8 @@ | |||
|           "geoJsonZoomLevel": 12, | ||||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/toilets.svg", | ||||
|               "mappings": [ | ||||
|  | @ -153,6 +171,8 @@ | |||
|               ] | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "birdhide", | ||||
|  | @ -163,11 +183,15 @@ | |||
|           "geoJsonZoomLevel": 12, | ||||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/birdhide.svg", | ||||
|               "mappings": null | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "picnic_table", | ||||
|  | @ -178,10 +202,14 @@ | |||
|           "geoJsonZoomLevel": 12, | ||||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/picnic_table.svg" | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "drinking_water", | ||||
|  | @ -192,15 +220,21 @@ | |||
|           "geoJsonZoomLevel": 12, | ||||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/drips.svg" | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "parking", | ||||
|       "override": { | ||||
|         "minzoom": "16", | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/parking.svg", | ||||
|               "mappings": [ | ||||
|  | @ -223,6 +257,8 @@ | |||
|               } | ||||
|             ] | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "information_board", | ||||
|  | @ -233,10 +269,14 @@ | |||
|           "geoJsonZoomLevel": 12, | ||||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/information_board.svg" | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "bench", | ||||
|  | @ -247,10 +287,14 @@ | |||
|           "geoJsonZoomLevel": 12, | ||||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/bench.svg" | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "builtin": "watermill", | ||||
|  | @ -261,10 +305,14 @@ | |||
|           "geoJsonZoomLevel": 12, | ||||
|           "isOsmCache": true | ||||
|         }, | ||||
|         "mapRendering": [ | ||||
|           { | ||||
|             "icon": { | ||||
|               "render": "circle:#FE6F32;./assets/themes/natuurpunt/watermill.svg" | ||||
|             } | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   "enableIframePopout": false | ||||
|  |  | |||
|  | @ -251,12 +251,11 @@ | |||
|               } | ||||
|             ] | ||||
|           }, | ||||
|           "width": { | ||||
|             "render": "8" | ||||
|           }, | ||||
|           "iconSize": { | ||||
|             "render": "40,40,center" | ||||
|           }, | ||||
|           } | ||||
|           | ||||
|         }, { | ||||
|           "color": { | ||||
|             "render": "#00f", | ||||
|             "mappings": [ | ||||
|  | @ -275,6 +274,9 @@ | |||
|                 "then": "#ff0" | ||||
|               } | ||||
|             ] | ||||
|           }, | ||||
|           "width": { | ||||
|             "render": "8" | ||||
|           } | ||||
|         } | ||||
|       ] | ||||
|  | @ -290,17 +292,7 @@ | |||
|           ] | ||||
|         } | ||||
|       }, | ||||
|       "mapRendering": [ | ||||
|         { | ||||
|           "location": "point", | ||||
|           "color": { | ||||
|             "render": "#ccc" | ||||
|           }, | ||||
|           "width": { | ||||
|             "render": "0" | ||||
|           } | ||||
|         } | ||||
|       ] | ||||
|       "mapRendering": [] | ||||
|     } | ||||
|   ], | ||||
|   "enableShareScreen": false, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue