Skip to content

Commit 30adc48

Browse files
committed
Add configuration attribute for activating this optimization
1 parent a55685f commit 30adc48

File tree

3 files changed

+34
-9
lines changed

3 files changed

+34
-9
lines changed

include/mapcache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1578,6 +1578,7 @@ MS_DLL_EXPORT apr_array_header_t *mapcache_requested_dimensions_clone(apr_pool_t
15781578
struct mapcache_dimension {
15791579
mapcache_dimension_type type;
15801580
int isTime;
1581+
int wms_single_query_minzoom;
15811582
char *name;
15821583
char *unit;
15831584
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_single_query_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_single_query_minzoom = -1;
125+
wms_single_query_node = ezxml_child(dimension_node,"wms_single_query");
126+
if (wms_single_query_node && wms_single_query_node->txt) {
127+
if (!strcasecmp(wms_single_query_node->txt,"true")) {
128+
const char * minzoom = ezxml_attr(wms_single_query_node,"minzoom");
129+
dimension->wms_single_query_minzoom = 0;
130+
if (minzoom && *minzoom) {
131+
char *endptr;
132+
dimension->wms_single_query_minzoom = strtol(minzoom,&endptr,10);
133+
if (*endptr != 0 || dimension->wms_single_query_minzoom < 0) {
134+
ctx->set_error(ctx, 400, "failed to parse minzoom \"%s\" for <wms_single_query>"
135+
"expecting an integer starting from 0",minzoom);
136+
return;
137+
}
138+
}
139+
} else if (strcasecmp(wms_single_query_node->txt,"false")) {
140+
ctx->set_error(ctx,400,"failed to parse <wms_single_query> (%s), expecting \"true\" or \"false\"",wms_single_query_node->txt);
141+
return;
142+
}
143+
}
123144

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

lib/tileset.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -221,24 +221,27 @@ void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *til
221221
resolution = mapcache_grid_get_resolution(bbox, width, height);
222222
*effectively_used_grid_link = mapcache_grid_get_closest_wms_level(ctx,grid_link,resolution,&level);
223223

224-
// Get dimensions values
224+
/* we don't want to assemble tiles that have already been reassembled from a lower level */
225+
if((*effectively_used_grid_link)->outofzoom_strategy == MAPCACHE_OUTOFZOOM_REASSEMBLE && level > (*effectively_used_grid_link)->max_cached_zoom) {
226+
level = (*effectively_used_grid_link)->max_cached_zoom;
227+
}
228+
229+
// Get dimensions values for whole map if required by <wms_single_query> configuration
225230
if (dimensions)
226231
{
227232
int j;
228233
for (j=0 ; j<dimensions->nelts ; j++)
229234
{
230235
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);
236+
mapcache_dimension *dim = rdim->dimension;
237+
if (dim->wms_single_query_minzoom != -1 && level >= dim->wms_single_query_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+
}
234242
}
235243
}
236244

237-
/* we don't want to assemble tiles that have already been reassembled from a lower level */
238-
if((*effectively_used_grid_link)->outofzoom_strategy == MAPCACHE_OUTOFZOOM_REASSEMBLE && level > (*effectively_used_grid_link)->max_cached_zoom) {
239-
level = (*effectively_used_grid_link)->max_cached_zoom;
240-
}
241-
242245
mapcache_grid_get_xy(ctx,(*effectively_used_grid_link)->grid,bbox->minx,bbox->miny,level,&bl_x,&bl_y);
243246
mapcache_grid_get_xy(ctx,(*effectively_used_grid_link)->grid,bbox->maxx,bbox->maxy,level,&tr_x,&tr_y);
244247
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);

0 commit comments

Comments
 (0)