[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