@@ -8,19 +8,7 @@ import { mapbox_style, kdk_style } from '@kalisio/leaflet-pmtiles'
88import { api , Time , Units , Events , TemplateContext } from '../../../../core/client/index.js'
99import * as time from '../../../../core/client/utils/utils.time.js'
1010import * as layers from '../../utils/utils.layers.js'
11-
12- function detectStyleType ( style ) {
13- // `style` field on pmtile layer definition can be one of:
14- // - string => in this case we assume this is a mapbox json style
15- // - kdk style object
16- // - protomaps style object
17-
18- if ( typeof style === 'string' ) return 'mapbox'
19- // Look for 'symbolizer' keys in the object, if we find one, this is a protomaps style
20- if ( _ . some ( style , ( rule ) => rule . symbolizer !== undefined ) ) return 'protomaps'
21- // Otherwise we assume this is a kdk style object
22- return style ? 'kdk' : 'empty'
23- }
11+ import { detectStyleType , applyLayerFilters } from '../../../common/pmtiles-utils.js'
2412
2513export const pmtilesLayers = {
2614 methods : {
@@ -110,28 +98,12 @@ export const pmtilesLayers = {
11098 } else if ( styleType === 'kdk' ) {
11199 // Translate kdk style to protomap rules, take care to merge with default engine style
112100 const engineStyle = _ . pick ( _ . get ( this . activityOptions , 'engine.style' , { } ) , [ 'point' , 'line' , 'polygon' ] )
113- rules = kdk_style ( _ . merge ( engineStyle , style ) , leafletOptions . dataLayer )
101+ rules = kdk_style ( _ . merge ( _ . cloneDeep ( engineStyle ) , style ) , leafletOptions . dataLayer )
114102 }
115103 if ( options . filters ) {
116104 // Translate layer filters to filter function
117105 const filterFn = layers . getFilterFunctionFromLayerFilters ( options )
118- rules . paintRules . forEach ( rule => {
119- // kdkFilter member may not be present, this is added by kdk_style when translating kdk style
120- // to leaflet-protomaps rules
121- if ( rule . kdkFilter ) {
122- rule . filter = ( zoom , feature ) => {
123- const kdkFilter = rule . kdkFilter ( zoom , feature )
124- const filter = filterFn ( { zoom, feature, properties : feature . props } )
125- // Final filter = kdk style filter + updated filter
126- return kdkFilter && filter
127- }
128- } else {
129- rule . filter = ( zoom , feature ) => {
130- const filter = filterFn ( { zoom, feature, properties : feature . props } )
131- return filter
132- }
133- }
134- } )
106+ applyLayerFilters ( filterFn , rules . paintRules )
135107 }
136108 }
137109
@@ -179,24 +151,13 @@ export const pmtilesLayers = {
179151 }
180152 } ,
181153 onLayerFilterToggledPMTilesLayers ( layer , filter ) {
154+ // Retrieve the engine layer and update the filter function directly
155+ const leafletLayer = this . getLeafletLayerByName ( layer . name )
156+ if ( ! leafletLayer ) return
182157 // Filtering is managed by mongodb query syntax, we need to update the filter function
183158 const filterFn = layers . getFilterFunctionFromLayerFilters ( layer )
184- // Retrieve the engine layer and update the filter function directly
185- layer = this . getLeafletLayerByName ( layer . name )
186- if ( ! layer ) return
187- layer . paintRules . forEach ( rule => {
188- // kdkFilter member may not be present, this is added by kdk_style when translating kdk style
189- // to leaflet-protomaps rules
190- if ( rule . kdkFilter ) {
191- rule . filter = ( zoom , feature ) => {
192- // Final filter = kdk style filter + updated filter
193- return rule . kdkFilter ( zoom , feature ) && filterFn ( { zoom, feature, properties : feature . props } )
194- }
195- } else {
196- rule . filter = ( zoom , feature ) => filterFn ( { zoom, feature, properties : feature . props } )
197- }
198- } )
199- layer . redraw ( )
159+ applyLayerFilters ( filterFn , leafletLayer . paintRules )
160+ leafletLayer . redraw ( )
200161 }
201162 } ,
202163 created ( ) {
0 commit comments