@@ -209,7 +209,8 @@ void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *til
209209 mapcache_extent * bbox , int width , int height ,
210210 int * ntiles ,
211211 mapcache_tile * * * tiles ,
212- mapcache_grid_link * * effectively_used_grid_link )
212+ mapcache_grid_link * * effectively_used_grid_link ,
213+ apr_array_header_t * dimensions )
213214{
214215 double resolution ;
215216 int level ;
@@ -225,6 +226,22 @@ void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *til
225226 level = (* effectively_used_grid_link )-> max_cached_zoom ;
226227 }
227228
229+ // Get dimensions values for whole map if required by <wms_querybymap> configuration
230+ if (dimensions )
231+ {
232+ int j ;
233+ for (j = 0 ; j < dimensions -> nelts ; j ++ )
234+ {
235+ mapcache_requested_dimension * rdim = APR_ARRAY_IDX (dimensions ,j ,mapcache_requested_dimension * );
236+ mapcache_dimension * dim = rdim -> dimension ;
237+ if (dim -> wms_querybymap_minzoom != -1 && level >= dim -> wms_querybymap_minzoom ) {
238+ rdim -> cached_entries_for_value =
239+ mapcache_dimension_get_entries_for_value (ctx ,rdim -> dimension ,rdim -> requested_value ,
240+ tileset ,bbox ,(* effectively_used_grid_link )-> grid );
241+ }
242+ }
243+ }
244+
228245 mapcache_grid_get_xy (ctx ,(* effectively_used_grid_link )-> grid ,bbox -> minx ,bbox -> miny ,level ,& bl_x ,& bl_y );
229246 mapcache_grid_get_xy (ctx ,(* effectively_used_grid_link )-> grid ,bbox -> maxx ,bbox -> maxy ,level ,& tr_x ,& tr_y );
230247 Mx = MAPCACHE_MAX (MAPCACHE_MIN (MAPCACHE_MAX (tr_x ,bl_x ),(* effectively_used_grid_link )-> grid_limits [level ].maxx ),(* effectively_used_grid_link )-> grid_limits [level ].minx );
@@ -567,6 +584,7 @@ mapcache_tile* mapcache_tileset_tile_create(apr_pool_t *pool, mapcache_tileset *
567584 mapcache_requested_dimension * rdim = apr_pcalloc (pool ,sizeof (mapcache_requested_dimension ));
568585 rdim -> requested_value = dimension -> default_value ;
569586 rdim -> cached_value = NULL ;
587+ rdim -> cached_entries_for_value = NULL ;
570588 rdim -> dimension = dimension ;
571589 APR_ARRAY_PUSH (tile -> dimensions ,mapcache_requested_dimension * ) = rdim ;
572590 }
@@ -617,6 +635,7 @@ mapcache_map* mapcache_tileset_map_create(apr_pool_t *pool, mapcache_tileset *ti
617635 mapcache_requested_dimension * rdim = apr_pcalloc (pool ,sizeof (mapcache_requested_dimension ));
618636 rdim -> requested_value = dimension -> default_value ;
619637 rdim -> cached_value = NULL ;
638+ rdim -> cached_entries_for_value = NULL ;
620639 rdim -> dimension = dimension ;
621640 APR_ARRAY_PUSH (map -> dimensions ,mapcache_requested_dimension * ) = rdim ;
622641 }
@@ -641,6 +660,7 @@ mapcache_feature_info* mapcache_tileset_feature_info_create(apr_pool_t *pool, ma
641660 mapcache_requested_dimension * rdim = apr_pcalloc (pool ,sizeof (mapcache_requested_dimension ));
642661 rdim -> requested_value = dimension -> default_value ;
643662 rdim -> cached_value = NULL ;
663+ rdim -> cached_entries_for_value = NULL ;
644664 rdim -> dimension = dimension ;
645665 APR_ARRAY_PUSH (fi -> map .dimensions ,mapcache_requested_dimension * ) = rdim ;
646666 }
@@ -851,8 +871,13 @@ void mapcache_tileset_tile_set_get_with_subdimensions(mapcache_context *ctx, map
851871
852872 for (i = 0 ;i < tile -> dimensions -> nelts ; i ++ ) {
853873 mapcache_requested_dimension * rdim = APR_ARRAY_IDX (tile -> dimensions ,i ,mapcache_requested_dimension * );
854- apr_array_header_t * single_subdimension = mapcache_dimension_get_entries_for_value (ctx ,rdim -> dimension ,rdim -> requested_value ,
855- tile -> tileset , & extent , tile -> grid_link -> grid );
874+ apr_array_header_t * single_subdimension ;
875+ if (rdim -> cached_entries_for_value ) {
876+ single_subdimension = rdim -> cached_entries_for_value ;
877+ } else {
878+ single_subdimension = mapcache_dimension_get_entries_for_value (ctx ,rdim -> dimension ,rdim -> requested_value ,
879+ tile -> tileset , & extent , tile -> grid_link -> grid );
880+ }
856881 if (GC_HAS_ERROR (ctx )) /* invalid dimension given */
857882 goto cleanup ;
858883#ifdef DEBUG
0 commit comments