[mapserver-commits] r12608 - in trunk/mapserver/mapcache: . include
src
svn at osgeo.org
svn at osgeo.org
Fri Sep 30 07:04:44 EDT 2011
Author: tbonfort
Date: 2011-09-30 04:04:43 -0700 (Fri, 30 Sep 2011)
New Revision: 12608
Modified:
trunk/mapserver/mapcache/include/mapcache.h
trunk/mapserver/mapcache/mapcache.xml.sample
trunk/mapserver/mapcache/src/configuration_xml.c
trunk/mapserver/mapcache/src/mapcache_seed.c
trunk/mapserver/mapcache/src/service_demo.c
trunk/mapserver/mapcache/src/service_tms.c
trunk/mapserver/mapcache/src/service_wms.c
trunk/mapserver/mapcache/src/service_wmts.c
trunk/mapserver/mapcache/src/tileset.c
Log:
add minzoom/maxzoom to grid reference in tileset to allow using subsets of defined grids
Modified: trunk/mapserver/mapcache/include/mapcache.h
===================================================================
--- trunk/mapserver/mapcache/include/mapcache.h 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/include/mapcache.h 2011-09-30 11:04:43 UTC (rev 12608)
@@ -1012,6 +1012,7 @@
*/
double *restricted_extent;
int **grid_limits;
+ int minz,maxz;
};
/**\class mapcache_tileset
Modified: trunk/mapserver/mapcache/mapcache.xml.sample
===================================================================
--- trunk/mapserver/mapcache/mapcache.xml.sample 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/mapcache.xml.sample 2011-09-30 11:04:43 UTC (rev 12608)
@@ -585,11 +585,13 @@
cached are not invalidated should you want to modify the restricted extent in the future. When using
the restricted_extent attribute, you should give the corresponding information to the client that will
be using the service.
+ you can also limit the zoom levels that are cached/accessible by using the minzoom, maxzoom attributes.
+
NOTE: when adding a <grid> element, you *MUST* make sure that the source you have selected is able to
return images in the grid's srs.
-->
- <grid restricted_extent="-10 40 10 50">WGS84</grid>
+ <grid restricted_extent="-10 40 10 50" minzoom="6" maxzoom="8">WGS84</grid>
<grid>g</grid>
<!-- metadata
Modified: trunk/mapserver/mapcache/src/configuration_xml.c
===================================================================
--- trunk/mapserver/mapcache/src/configuration_xml.c 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/src/configuration_xml.c 2011-09-30 11:04:43 UTC (rev 12608)
@@ -445,8 +445,6 @@
return;
}
-
-
void parseTileset(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config) {
char *name = NULL;
mapcache_tileset *tileset = NULL;
@@ -508,6 +506,8 @@
}
mapcache_grid_link *gridlink = apr_pcalloc(ctx->pool,sizeof(mapcache_grid_link));
gridlink->grid = grid;
+ gridlink->minz = 0;
+ gridlink->maxz = grid->nlevels;
gridlink->grid_limits = apr_pcalloc(ctx->pool,grid->nlevels*sizeof(int*));
for(i=0;i<grid->nlevels;i++) {
gridlink->grid_limits[i] = apr_pcalloc(ctx->pool,4*sizeof(int));
@@ -541,9 +541,41 @@
return;
}
}
+
mapcache_grid_compute_limits(grid,extent,gridlink->grid_limits,tolerance);
+ sTolerance = (char*)ezxml_attr(cur_node,"minzoom");
+ if(sTolerance) {
+ char *endptr;
+ tolerance = (int)strtol(sTolerance,&endptr,10);
+ if(*endptr != 0 || tolerance < 0) {
+ ctx->set_error(ctx, 400, "failed to parse grid minzoom %s (expecting a positive integer)",
+ sTolerance);
+ return;
+ }
+ gridlink->minz = tolerance;
+ }
+
+ sTolerance = (char*)ezxml_attr(cur_node,"maxzoom");
+ if(sTolerance) {
+ char *endptr;
+ tolerance = (int)strtol(sTolerance,&endptr,10);
+ if(*endptr != 0 || tolerance < 0) {
+ ctx->set_error(ctx, 400, "failed to parse grid maxzoom %s (expecting a positive integer)",
+ sTolerance);
+ return;
+ }
+ gridlink->maxz = tolerance + 1;
+ }
+
+ if(gridlink->minz<0 || gridlink->maxz>grid->nlevels || gridlink->minz>=gridlink->maxz) {
+ ctx->set_error(ctx, 400, "invalid grid maxzoom/minzoom %d/%d", gridlink->minz,gridlink->maxz);
+ return;
+ }
+
+
+
/* compute wgs84 bbox if it wasn't supplied already */
if(!havewgs84bbox && !strcasecmp(grid->srs,"EPSG:4326")) {
tileset->wgs84bbox[0] = extent[0];
Modified: trunk/mapserver/mapcache/src/mapcache_seed.c
===================================================================
--- trunk/mapserver/mapcache/src/mapcache_seed.c 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/src/mapcache_seed.c 2011-09-30 11:04:43 UTC (rev 12608)
@@ -680,11 +680,11 @@
}
}
if(minzoom == 0 && maxzoom ==0) {
- minzoom = 0;
- maxzoom = grid_link->grid->nlevels - 1;
+ minzoom = grid_link->minz;
+ maxzoom = grid_link->maxz - 1;
}
- if(minzoom<0) minzoom = 0;
- if(maxzoom>= grid_link->grid->nlevels) maxzoom = grid_link->grid->nlevels - 1;
+ if(minzoom<grid_link->minz) minzoom = grid_link->minz;
+ if(maxzoom>= grid_link->maxz) maxzoom = grid_link->maxz - 1;
}
Modified: trunk/mapserver/mapcache/src/service_demo.c
===================================================================
--- trunk/mapserver/mapcache/src/service_demo.c 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/src/service_demo.c 2011-09-30 11:04:43 UTC (rev 12608)
@@ -142,6 +142,7 @@
" gutter:0,buffer:0,isBaseLayer:true,transitionEffect:'resize',\n"
" tileOrigin: new OpenLayers.LonLat(%f,%f),\n"
" resolutions:[%s],\n"
+ " zoomOffset:%d,\n"
" units:\"%s\",\n"
" maxExtent: new OpenLayers.Bounds(%f,%f,%f,%f),\n"
" projection: new OpenLayers.Projection(\"%s\".toUpperCase()),\n"
@@ -160,6 +161,7 @@
" style: 'default',\n"
" gutter:0,buffer:0,isBaseLayer:true,transitionEffect:'resize',\n"
" resolutions:[%s],\n"
+ " zoomOffset:%d,\n"
" units:\"%s\",\n"
" maxExtent: new OpenLayers.Bounds(%f,%f,%f,%f),\n"
" projection: new OpenLayers.Projection(\"%s\".toUpperCase()),\n"
@@ -274,7 +276,7 @@
" return { x: x, y: y };\n"
" }\n"
"\n"
- "function makeLayer(name, url, size, extension) {\n"
+ "function makeLayer(name, url, size, extension, minzoom, maxzoom) {\n"
" var layer = {\n"
" name: name,\n"
" TypeOptions: {\n"
@@ -288,8 +290,8 @@
" },\n"
" tileSize: size,\n"
" isPng: true,\n"
- " maxZoom: 18,\n"
- " minZoom: 0,\n"
+ " maxZoom: maxzoom,\n"
+ " minZoom: minzoom,\n"
" name: name\n"
" },\n"
" OverlayTypeOptions: {\n"
@@ -303,8 +305,8 @@
" },\n"
" tileSize: size,\n"
" isPng: true,\n"
- " maxZoom: 18,\n"
- " minZoom: 0,\n"
+ " maxZoom: maxzoom,\n"
+ " minZoom: minzoom,\n"
" opacity: 0.5, // o=transparenty, 1=opaque\n"
" name: name+'_overlay'\n"
" }\n"
@@ -339,7 +341,7 @@
/*
* name, baseurl, name, grid, size, size, extension
*/
-static char *demo_layer_gmaps = "layers.push(makeLayer('%s %s', '%s/tms/1.0.0/%s@%s/', new google.maps.Size(%d,%d), '%s'));\n";
+static char *demo_layer_gmaps = "layers.push(makeLayer('%s %s', '%s/tms/1.0.0/%s@%s/', new google.maps.Size(%d,%d), '%s', %d, %d));\n";
static char *demo_footer_gmaps =
"%s\n"
@@ -455,7 +457,8 @@
char *resolutions="";
char *unit="dd";
char *smerc = "false";
- mapcache_grid *grid = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*)->grid;
+ mapcache_grid_link *grid_link = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*);
+ mapcache_grid *grid = grid_link->grid;
if(grid->unit == MAPCACHE_UNIT_METERS) {
unit="m";
} else if(grid->unit == MAPCACHE_UNIT_FEET) {
@@ -471,8 +474,8 @@
|| (!isalnum(ol_layer_name[i]) && ol_layer_name[i] != '_'))
ol_layer_name[i] = '_';
- resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[0]->resolution);
- for(i=1;i<grid->nlevels;i++) {
+ resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[grid_link->minz]->resolution);
+ for(i=grid_link->minz+1;i<grid_link->maxz;i++) {
resolutions = apr_psprintf(ctx->pool,"%s,%.20f",resolutions,grid->levels[i]->resolution);
}
@@ -544,7 +547,8 @@
char *resolutions="";
char *unit="dd";
char *smerc = "false";
- mapcache_grid *grid = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*)->grid;
+ mapcache_grid_link *grid_link = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*);
+ mapcache_grid *grid = grid_link->grid;
if(grid->unit == MAPCACHE_UNIT_METERS) {
unit="m";
} else if(grid->unit == MAPCACHE_UNIT_FEET) {
@@ -560,8 +564,8 @@
|| (!isalnum(ol_layer_name[i]) && ol_layer_name[i] != '_'))
ol_layer_name[i] = '_';
- resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[0]->resolution);
- for(i=1;i<grid->nlevels;i++) {
+ resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[grid_link->minz]->resolution);
+ for(i=grid_link->minz+1;i<grid_link->maxz;i++) {
resolutions = apr_psprintf(ctx->pool,"%s,%.20f",resolutions,grid->levels[i]->resolution);
}
@@ -576,6 +580,7 @@
grid->extent[0],
grid->extent[1],
resolutions,
+ grid_link->minz,
unit,
grid->extent[0],
grid->extent[1],
@@ -611,7 +616,8 @@
char *resolutions="";
char *unit="dd";
char *smerc = "false";
- mapcache_grid *grid = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*)->grid;
+ mapcache_grid_link *grid_link = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*);
+ mapcache_grid *grid = grid_link->grid;
if(grid->unit == MAPCACHE_UNIT_METERS) {
unit="m";
} else if(grid->unit == MAPCACHE_UNIT_FEET) {
@@ -627,8 +633,8 @@
|| (!isalnum(ol_layer_name[i]) && ol_layer_name[i] != '_'))
ol_layer_name[i] = '_';
- resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[0]->resolution);
- for(i=1;i<grid->nlevels;i++) {
+ resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[grid_link->minz]->resolution);
+ for(i=grid_link->minz+1;i<grid_link->maxz;i++) {
resolutions = apr_psprintf(ctx->pool,"%s,%.20f",resolutions,grid->levels[i]->resolution);
}
@@ -641,6 +647,7 @@
grid->name,
mime_type,
resolutions,
+ grid_link->minz,
unit,
grid->extent[0],
grid->extent[1],
@@ -673,7 +680,8 @@
char *resolutions="";
char *unit="dd";
char *smerc = "false";
- mapcache_grid *grid = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*)->grid;
+ mapcache_grid_link *grid_link = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*);
+ mapcache_grid *grid = grid_link->grid;
if(grid->unit == MAPCACHE_UNIT_METERS) {
unit="m";
} else if(grid->unit == MAPCACHE_UNIT_FEET) {
@@ -689,8 +697,8 @@
|| (!isalnum(ol_layer_name[i]) && ol_layer_name[i] != '_'))
ol_layer_name[i] = '_';
- resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[0]->resolution);
- for(i=1;i<grid->nlevels;i++) {
+ resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[grid_link->minz]->resolution);
+ for(i=grid_link->minz+1;i<grid_link->maxz;i++) {
resolutions = apr_psprintf(ctx->pool,"%s,%.20f",resolutions,grid->levels[i]->resolution);
}
@@ -758,28 +766,13 @@
mapcache_tileset *tileset;
const void *key; apr_ssize_t keylen;
apr_hash_this(tileindex_index,&key,&keylen,(void**)&tileset);
- int i,j;
+ int j;
for(j=0;j<tileset->grid_links->nelts;j++) {
- char *resolutions="";
- char *unit="dd";
- char *smerc = "false";
- mapcache_grid *grid = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*)->grid;
- if(grid->unit == MAPCACHE_UNIT_METERS) {
- unit="m";
- } else if(grid->unit == MAPCACHE_UNIT_FEET) {
- unit="ft";
- }
- if(strstr(grid->srs, ":900913") || strstr(grid->srs, ":3857")) {
- smerc = "true";
- }
- else
+ mapcache_grid_link *grid_link = APR_ARRAY_IDX(tileset->grid_links,j,mapcache_grid_link*);
+ mapcache_grid *grid = grid_link->grid;
+ if(!strstr(grid->srs, ":900913") && !strstr(grid->srs, ":3857"))
continue; /* skip layers that are not in google projrction */
- resolutions = apr_psprintf(ctx->pool,"%s%.20f",resolutions,grid->levels[0]->resolution);
- for(i=1;i<grid->nlevels;i++) {
- resolutions = apr_psprintf(ctx->pool,"%s,%.20f",resolutions,grid->levels[i]->resolution);
- }
-
ol_layer = apr_psprintf(ctx->pool, demo_layer_gmaps,
tileset->name,
grid->name,
@@ -788,7 +781,9 @@
grid->name,
grid->tile_sx,
grid->tile_sy,
- tileset->format->extension
+ tileset->format->extension,
+ grid_link->minz,
+ grid_link->maxz
);
caps = apr_psprintf(ctx->pool,"%s%s",caps,ol_layer);
}
Modified: trunk/mapserver/mapcache/src/service_tms.c
===================================================================
--- trunk/mapserver/mapcache/src/service_tms.c 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/src/service_tms.c 2011-09-30 11:04:43 UTC (rev 12608)
@@ -87,7 +87,8 @@
}
} else {
mapcache_tileset *tileset = request->tileset;
- mapcache_grid *grid = request->grid_link->grid;
+ mapcache_grid_link *grid_link = request->grid_link;
+ mapcache_grid *grid = grid_link->grid;
int i;
double *extent = (request->grid_link->restricted_extent)?request->grid_link->restricted_extent:request->grid_link->grid->extent;
const char *title = apr_table_get(tileset->metadata,"title");
@@ -132,7 +133,7 @@
}
ezxml_t tilesets = ezxml_add_child(caps,"TileSets",0);
- for(i=0;i<grid->nlevels;i++) {
+ for(i=grid_link->minz;i<grid_link->maxz;i++) {
ezxml_t xmltileset = ezxml_add_child(tilesets,"TileSet",0);
char *order = apr_psprintf(ctx->pool,"%d",i);
ezxml_set_attr(xmltileset,"href",
Modified: trunk/mapserver/mapcache/src/service_wms.c
===================================================================
--- trunk/mapserver/mapcache/src/service_wms.c 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/src/service_wms.c 2011-09-30 11:04:43 UTC (rev 12608)
@@ -265,7 +265,7 @@
char *resolutions="";
int i;
- for(i=0;i<grid->nlevels;i++) {
+ for(i=gridlink->minz;i<gridlink->maxz;i++) {
resolutions = apr_psprintf(ctx->pool,"%s%.20f ",resolutions,grid->levels[i]->resolution);
}
ezxml_set_txt(ezxml_add_child(tsxml,"Resolutions",0),resolutions);
Modified: trunk/mapserver/mapcache/src/service_wmts.c
===================================================================
--- trunk/mapserver/mapcache/src/service_wmts.c 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/src/service_wmts.c 2011-09-30 11:04:43 UTC (rev 12608)
@@ -521,7 +521,7 @@
} else {
char *endptr;
level = (int)strtol(matrix,&endptr,10);
- if(*endptr != 0 || level < 0 || level >= grid_link->grid->nlevels) {
+ if(*endptr != 0 || level < grid_link->minz || level >= grid_link->maxz) {
ctx->set_error(ctx, 404, "received wmts request with invalid TILEMATRIX %s", matrix);
return;
}
Modified: trunk/mapserver/mapcache/src/tileset.c
===================================================================
--- trunk/mapserver/mapcache/src/tileset.c 2011-09-29 16:58:47 UTC (rev 12607)
+++ trunk/mapserver/mapcache/src/tileset.c 2011-09-30 11:04:43 UTC (rev 12608)
@@ -114,7 +114,7 @@
}
void mapcache_tileset_tile_validate(mapcache_context *ctx, mapcache_tile *tile) {
- if(tile->z < 0 || tile->z >= tile->grid_link->grid->nlevels) {
+ if(tile->z < tile->grid_link->minz || tile->z >= tile->grid_link->maxz) {
ctx->set_error(ctx,404,"invalid tile z level");
return;
}
More information about the mapserver-commits
mailing list