mapnik::parameters params; params["type"] = "gdal"; // created with: // wget http://www.nacis.org/naturalearth/50m/raster/NE2_50m_SR_W.zip // gdalwarp -t_srs EPSG:3857 -ts 1048 1048 -r bilinear NE2_50M_SR_W.tif natural_earth.tif params["file"] = "test/natural_earth.tif"; MAPNIK_SHARED_PTR<mapnik::datasource> ds = mapnik::datasource_cache::instance().create(params); lyr.set_datasource(ds); map.MAPNIK_ADD_LAYER(lyr); mapnik::request m_req(tile_size,tile_size,bbox); m_req.set_buffer_size(map.buffer_size()); renderer_type ren(backend,map,m_req,1.0,0,0,1,"jpeg",mapnik::SCALING_BILINEAR); ren.apply(); CHECK(1 == tile.layers_size()); mapnik::vector::tile_layer const& layer = tile.layers(0); CHECK(std::string("layer") == layer.name()); CHECK(1 == layer.features_size()); mapnik::vector::tile_feature const& f = layer.features(0); CHECK(static_cast<mapnik::value_integer>(1) == static_cast<mapnik::value_integer>(f.id())); CHECK(0 == f.geometry_size()); CHECK(f.has_raster()); std::string const& ras_buffer = f.raster(); CHECK(!ras_buffer.empty()); // debug bool debug = false; if (debug) { std::ofstream file("out.jpeg", std::ios::out|std::ios::trunc|std::ios::binary); file << ras_buffer; file.close(); }
ren.apply(); // serialize to message std::string buffer; CHECK(tile.SerializeToString(&buffer)); CHECK(151 == buffer.size()); // now create new objects mapnik::Map map2(tile_size,tile_size,"+init=epsg:3857"); tile_type tile2; CHECK(tile2.ParseFromString(buffer)); std::string key(""); CHECK(false == mapnik::vector_tile_impl::is_solid_extent(tile2,key)); CHECK("" == key); CHECK(false == mapnik::vector_tile_impl::is_solid_extent(buffer,key)); CHECK("" == key); CHECK(1 == tile2.layers_size()); vector_tile::Tile_Layer const& layer2 = tile2.layers(0); CHECK(std::string("layer") == layer2.name()); CHECK(1 == layer2.features_size()); mapnik::layer lyr2("layer",map.srs()); protozero::pbf_reader pbf_tile(buffer.c_str(), buffer.size()); pbf_tile.next(); protozero::pbf_reader layer3 = pbf_tile.get_message(); std::shared_ptr<mapnik::vector_tile_impl::tile_datasource_pbf> ds = std::make_shared< mapnik::vector_tile_impl::tile_datasource_pbf>( layer3,0,0,0,map2.width()); CHECK(ds->get_name() == "layer"); ds->set_envelope(bbox); CHECK( ds->type() == mapnik::datasource::Vector );