Skip to content

Commit a55685f

Browse files
committed
Query second level dimensions at map level when possible
1 parent 765ad96 commit a55685f

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

include/mapcache.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1163,7 +1163,8 @@ void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *til
11631163
mapcache_extent *bbox, int width, int height,
11641164
int *ntiles,
11651165
mapcache_tile ***tiles,
1166-
mapcache_grid_link **effectively_used_grid_link);
1166+
mapcache_grid_link **effectively_used_grid_link,
1167+
apr_array_header_t *dimensions);
11671168

11681169
mapcache_image* mapcache_tileset_assemble_map_tiles(mapcache_context *ctx, mapcache_tileset *tileset,
11691170
mapcache_grid_link *grid_link,
@@ -1563,6 +1564,7 @@ struct mapcache_requested_dimension {
15631564
mapcache_dimension *dimension;
15641565
char *requested_value;
15651566
char *cached_value;
1567+
apr_array_header_t *cached_entries_for_value;
15661568
};
15671569

15681570
void mapcache_tile_set_cached_dimension(mapcache_context *ctx, mapcache_tile *tile, const char *name, const char *value);

lib/core.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,8 @@ mapcache_map* mapcache_assemble_maps(mapcache_context *ctx, mapcache_map **maps,
369369
for(i=0; i<nmaps; i++) {
370370
mapcache_tileset_get_map_tiles(ctx,maps[i]->tileset,maps[i]->grid_link,
371371
&maps[i]->extent, maps[i]->width, maps[i]->height,
372-
&(nmaptiles[i]), &(maptiles[i]), &(effectively_used_grid_links[i]));
372+
&(nmaptiles[i]), &(maptiles[i]), &(effectively_used_grid_links[i]),
373+
maps[i]->dimensions);
373374
if(GC_HAS_ERROR(ctx)) return NULL;
374375
ntiles += nmaptiles[i];
375376
}

lib/tileset.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
@@ -220,6 +221,19 @@ void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *til
220221
resolution = mapcache_grid_get_resolution(bbox, width, height);
221222
*effectively_used_grid_link = mapcache_grid_get_closest_wms_level(ctx,grid_link,resolution,&level);
222223

224+
// Get dimensions values
225+
if (dimensions)
226+
{
227+
int j;
228+
for (j=0 ; j<dimensions->nelts ; j++)
229+
{
230+
mapcache_requested_dimension *rdim = APR_ARRAY_IDX(dimensions,j,mapcache_requested_dimension*);
231+
rdim->cached_entries_for_value =
232+
mapcache_dimension_get_entries_for_value(ctx,rdim->dimension,rdim->requested_value,
233+
tileset,bbox,(*effectively_used_grid_link)->grid);
234+
}
235+
}
236+
223237
/* we don't want to assemble tiles that have already been reassembled from a lower level */
224238
if((*effectively_used_grid_link)->outofzoom_strategy == MAPCACHE_OUTOFZOOM_REASSEMBLE && level > (*effectively_used_grid_link)->max_cached_zoom) {
225239
level = (*effectively_used_grid_link)->max_cached_zoom;
@@ -567,6 +581,7 @@ mapcache_tile* mapcache_tileset_tile_create(apr_pool_t *pool, mapcache_tileset *
567581
mapcache_requested_dimension *rdim = apr_pcalloc(pool,sizeof(mapcache_requested_dimension));
568582
rdim->requested_value = dimension->default_value;
569583
rdim->cached_value = NULL;
584+
rdim->cached_entries_for_value = NULL;
570585
rdim->dimension = dimension;
571586
APR_ARRAY_PUSH(tile->dimensions,mapcache_requested_dimension*) = rdim;
572587
}
@@ -617,6 +632,7 @@ mapcache_map* mapcache_tileset_map_create(apr_pool_t *pool, mapcache_tileset *ti
617632
mapcache_requested_dimension *rdim = apr_pcalloc(pool,sizeof(mapcache_requested_dimension));
618633
rdim->requested_value = dimension->default_value;
619634
rdim->cached_value = NULL;
635+
rdim->cached_entries_for_value = NULL;
620636
rdim->dimension = dimension;
621637
APR_ARRAY_PUSH(map->dimensions,mapcache_requested_dimension*) = rdim;
622638
}
@@ -641,6 +657,7 @@ mapcache_feature_info* mapcache_tileset_feature_info_create(apr_pool_t *pool, ma
641657
mapcache_requested_dimension *rdim = apr_pcalloc(pool,sizeof(mapcache_requested_dimension));
642658
rdim->requested_value = dimension->default_value;
643659
rdim->cached_value = NULL;
660+
rdim->cached_entries_for_value = NULL;
644661
rdim->dimension = dimension;
645662
APR_ARRAY_PUSH(fi->map.dimensions,mapcache_requested_dimension*) = rdim;
646663
}
@@ -819,8 +836,13 @@ void mapcache_tileset_tile_set_get_with_subdimensions(mapcache_context *ctx, map
819836

820837
for(i=0;i<tile->dimensions->nelts; i++) {
821838
mapcache_requested_dimension *rdim = APR_ARRAY_IDX(tile->dimensions,i,mapcache_requested_dimension*);
822-
apr_array_header_t *single_subdimension = mapcache_dimension_get_entries_for_value(ctx,rdim->dimension,rdim->requested_value,
823-
tile->tileset, &extent, tile->grid_link->grid);
839+
apr_array_header_t *single_subdimension;
840+
if (rdim->cached_entries_for_value) {
841+
single_subdimension = rdim->cached_entries_for_value;
842+
} else {
843+
single_subdimension = mapcache_dimension_get_entries_for_value(ctx,rdim->dimension,rdim->requested_value,
844+
tile->tileset, &extent, tile->grid_link->grid);
845+
}
824846
if(GC_HAS_ERROR(ctx)) /* invalid dimension given */
825847
goto cleanup;
826848
#ifdef DEBUG

0 commit comments

Comments
 (0)