Skip to content

Commit fa73ef2

Browse files
authored
Merge pull request #223 from jbo-ads/second-dimension-optimization
Enable retrieval of second level dimension values at map level
2 parents 051e56e + 24a4c02 commit fa73ef2

File tree

4 files changed

+55
-5
lines changed

4 files changed

+55
-5
lines changed

include/mapcache.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,8 @@ void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *til
11751175
mapcache_extent *bbox, int width, int height,
11761176
int *ntiles,
11771177
mapcache_tile ***tiles,
1178-
mapcache_grid_link **effectively_used_grid_link);
1178+
mapcache_grid_link **effectively_used_grid_link,
1179+
apr_array_header_t *dimensions);
11791180

11801181
mapcache_image* mapcache_tileset_assemble_map_tiles(mapcache_context *ctx, mapcache_tileset *tileset,
11811182
mapcache_grid_link *grid_link,
@@ -1580,6 +1581,7 @@ struct mapcache_requested_dimension {
15801581
mapcache_dimension *dimension;
15811582
char *requested_value;
15821583
char *cached_value;
1584+
apr_array_header_t *cached_entries_for_value;
15831585
};
15841586

15851587
void mapcache_tile_set_cached_dimension(mapcache_context *ctx, mapcache_tile *tile, const char *name, const char *value);
@@ -1593,6 +1595,7 @@ MS_DLL_EXPORT apr_array_header_t *mapcache_requested_dimensions_clone(apr_pool_t
15931595
struct mapcache_dimension {
15941596
mapcache_dimension_type type;
15951597
int isTime;
1598+
int wms_querybymap_minzoom;
15961599
char *name;
15971600
char *unit;
15981601
apr_table_t *metadata;

lib/configuration_xml.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ void parseMetadata(mapcache_context *ctx, ezxml_t node, apr_table_t *metadata)
6363
void parseDimensions(mapcache_context *ctx, ezxml_t node, mapcache_tileset *tileset)
6464
{
6565
ezxml_t dimension_node;
66+
ezxml_t wms_querybymap_node;
6667
apr_array_header_t *dimensions = apr_array_make(ctx->pool,1,sizeof(mapcache_dimension*));
6768
for(dimension_node = ezxml_child(node,"dimension"); dimension_node; dimension_node = dimension_node->next) {
6869
char *name = (char*)ezxml_attr(dimension_node,"name");
@@ -120,6 +121,26 @@ void parseDimensions(mapcache_context *ctx, ezxml_t node, mapcache_tileset *tile
120121
return;
121122
}
122123

124+
dimension->wms_querybymap_minzoom = -1;
125+
wms_querybymap_node = ezxml_child(dimension_node,"wms_querybymap");
126+
if (wms_querybymap_node && wms_querybymap_node->txt) {
127+
if (!strcasecmp(wms_querybymap_node->txt,"true")) {
128+
const char * minzoom = ezxml_attr(wms_querybymap_node,"minzoom");
129+
dimension->wms_querybymap_minzoom = 0;
130+
if (minzoom && *minzoom) {
131+
char *endptr;
132+
dimension->wms_querybymap_minzoom = strtol(minzoom,&endptr,10);
133+
if (*endptr != 0 || dimension->wms_querybymap_minzoom < 0) {
134+
ctx->set_error(ctx, 400, "failed to parse minzoom \"%s\" for <wms_querybymap>"
135+
"expecting an integer starting from 0",minzoom);
136+
return;
137+
}
138+
}
139+
} else if (strcasecmp(wms_querybymap_node->txt,"false")) {
140+
ctx->set_error(ctx,400,"failed to parse <wms_querybymap> (%s), expecting \"true\" or \"false\"",wms_querybymap_node->txt);
141+
return;
142+
}
143+
}
123144

124145
dimension->configuration_parse_xml(ctx,dimension,dimension_node);
125146
GC_CHECK_ERROR(ctx);

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: 28 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;
@@ -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

Comments
 (0)