/** * \private \memberof mapcache_source_wms * \sa mapcache_source::render_map() */ void _mapcache_source_wms_render_map(mapcache_context *ctx, mapcache_map *map) { mapcache_source_wms *wms = (mapcache_source_wms*)map->tileset->source; mapcache_http *http; apr_table_t *params = apr_table_clone(ctx->pool,wms->wms_default_params); apr_table_setn(params,"BBOX",apr_psprintf(ctx->pool,"%f,%f,%f,%f", map->extent.minx,map->extent.miny,map->extent.maxx,map->extent.maxy)); apr_table_setn(params,"WIDTH",apr_psprintf(ctx->pool,"%d",map->width)); apr_table_setn(params,"HEIGHT",apr_psprintf(ctx->pool,"%d",map->height)); apr_table_setn(params,"FORMAT","image/png"); apr_table_setn(params,"SRS",map->grid_link->grid->srs); apr_table_overlap(params,wms->getmap_params,APR_OVERLAP_TABLES_SET); if(map->dimensions && !apr_is_empty_table(map->dimensions)) { const apr_array_header_t *elts = apr_table_elts(map->dimensions); int i; for(i=0; i<elts->nelts; i++) { apr_table_entry_t entry = APR_ARRAY_IDX(elts,i,apr_table_entry_t); /* set both DIM_key=val and key=val KVP params */ apr_table_setn(params,entry.key,entry.val); if(strcasecmp(entry.key,"TIME") && strcasecmp(entry.key,"ELEVATION")) { char *dim_name = apr_pstrcat(ctx->pool,"DIM_",entry.key,NULL); apr_table_setn(params,dim_name,entry.val); } } } /* if the source has no LAYERS parameter defined, then use the tileset name * as the LAYERS to request. When using mirror-mode, the source has no layers * defined, it is added based on the incoming request */ if(!apr_table_get(params,"layers")) { apr_table_set(params,"LAYERS",map->tileset->name); } map->encoded_data = mapcache_buffer_create(30000,ctx->pool); http = mapcache_http_clone(ctx, wms->http); http->url = mapcache_http_build_url(ctx,http->url,params); mapcache_http_do_request(ctx,http,map->encoded_data,NULL,NULL); GC_CHECK_ERROR(ctx); if(!mapcache_imageio_is_valid_format(ctx,map->encoded_data)) { char *returned_data = apr_pstrndup(ctx->pool,(char*)map->encoded_data->buf,map->encoded_data->size); ctx->set_error(ctx, 502, "wms request for tileset %s returned an unsupported format:\n%s", map->tileset->name, returned_data); } }
//------------------------------------------------------------------------------ void _mapcache_source_tms_render_map_elevation(mapcache_context *ctx, mapcache_map *map) { mapcache_source_tms *tms; int elevationblock; int zoom, x, y; char* url; double dx, dy; tms = (mapcache_source_tms*)map->tileset->source; elevationblock = map->grid_link->grid->elevationblock; _GetTileCoords(map, &zoom, &x, &y, tms->flipy); url = apr_psprintf(ctx->pool,"%s/1.0.0/%s/%i/%i/%i.%s", tms->url,tms->layer,zoom,x,y,tms->format); tms->http->url = apr_pstrdup(ctx->pool,url); map->encoded_data = mapcache_buffer_create(30000,ctx->pool); mapcache_http_do_request(ctx, tms->http, map->encoded_data, NULL, NULL); GC_CHECK_ERROR(ctx); if(!mapcache_imageio_is_valid_format(ctx,map->encoded_data)) { char *returned_data = apr_pstrndup(ctx->pool,(char*)map->encoded_data->buf,map->encoded_data->size); ctx->set_error(ctx, 502, "tms request for tileset %s returned an unsupported format:\n%s", map->tileset->name, returned_data); return; } map->raw_image = mapcache_imageio_decode(ctx, map->encoded_data); map->raw_image->is_elevation = MC_ELEVATION_YES; GC_CHECK_ERROR(ctx); //map->raw_image->stride = 4 * elevationblock; dx = fabs(map->grid_link->grid->extent.maxx-map->grid_link->grid->extent.minx); dy = fabs(map->grid_link->grid->extent.maxx-map->grid_link->grid->extent.minx); map->raw_image->x0 = map->extent.minx / dx * 2.0; map->raw_image->y0 = map->extent.miny / dy * 2.0; map->raw_image->x1 = map->extent.maxx / dx * 2.0; map->raw_image->y1 = map->extent.maxy / dy * 2.0; if (map->raw_image->w != elevationblock || map->raw_image->h != elevationblock) { ctx->set_error(ctx,500,"Error: size of heightmap from source is not configured propery!"); } }
//------------------------------------------------------------------------------ void _mapcache_source_tms_render_map_image(mapcache_context *ctx, mapcache_map *map) { int zoom, x, y; mapcache_source_tms *tms; char* url; tms = (mapcache_source_tms*)map->tileset->source; _GetTileCoords(map, &zoom, &x, &y, tms->flipy); url = apr_psprintf(ctx->pool,"%s/1.0.0/%s/%i/%i/%i.%s", tms->url,tms->layer,zoom,x,y,tms->format); tms->http->url = apr_pstrdup(ctx->pool,url); map->encoded_data = mapcache_buffer_create(30000,ctx->pool); mapcache_http_do_request(ctx, tms->http, map->encoded_data, NULL, NULL); GC_CHECK_ERROR(ctx); if(!mapcache_imageio_is_valid_format(ctx,map->encoded_data)) { char *returned_data = apr_pstrndup(ctx->pool,(char*)map->encoded_data->buf,map->encoded_data->size); ctx->set_error(ctx, 502, "tms request for tileset %s returned an unsupported format:\n%s", map->tileset->name, returned_data); } }