Пример #1
0
/**
 * \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);
  }
}
Пример #2
0
//------------------------------------------------------------------------------
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!");
    }

}
Пример #3
0
//------------------------------------------------------------------------------
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);
    }
}