This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository mapnik-vector-tile.
commit 3fa1df4173cca95bc92383252ca1ad25fd63c412 Author: Bas Couwenberg <sebas...@xs4all.nl> Date: Fri Sep 11 22:55:20 2015 +0200 Imported Upstream version 0.8.5+dfsg --- .gitignore | 2 ++ .npmignore | 13 ++++++- CHANGELOG.md | 5 +++ CONTRIBUTING.md | 13 +++++++ Makefile | 6 ++++ bench/vtile-transform.cpp | 14 ++++++-- bootstrap.sh | 2 +- package.json | 2 +- src/vector_tile_datasource_pbf.ipp | 2 +- src/vector_tile_processor.hpp | 3 +- src/vector_tile_processor.ipp | 37 +++++++++----------- src/vector_tile_strategy.hpp | 41 +++++++++++++++++++--- test/clipper_test.cpp | 12 +++++-- test/data/linestrings_and_point.geojson | 56 ++++++++++++++++++++++++++++++ test/test_utils.cpp | 9 +++++ test/test_utils.hpp | 1 + test/vector_tile.cpp | 6 ++-- test/vector_tile_pbf.cpp | 61 +++++++++++++++++++++++++++++++++ 18 files changed, 248 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index 02cdd31..3e38244 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ test/run-raster-test archive TODO.md examples/c++/tileinfo +.mason +mason_packages diff --git a/.npmignore b/.npmignore index d9382ea..77504b7 100644 --- a/.npmignore +++ b/.npmignore @@ -8,4 +8,15 @@ python/vector_tile_pb2.py test/run-test *pyc archive -TODO.md \ No newline at end of file +TODO.md +.mason +mason_packages +deps +build +.travis.yml +scripts +gyp +test +CONTRIBUTING.md +bootstrap.sh +bench diff --git a/CHANGELOG.md b/CHANGELOG.md index d38b756..1226381 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.8.5 + + - Remove geometries from clipping that never intersect with the bounding box of the tile (#135) + - Fix indexing error in tile_datasource_pbf (#132) + ## 0.8.4 - Started to skip coordinates that are out of range (#121) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d0a99ce --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,13 @@ +# Contributing + +General guidelines for contributing to mapnik-vector-tile + +## Releasing + +To release a new node-mapnik version: + + - Make sure that all tests as passing (including travis and appveyor tests). + - Update the CHANGELOG.md and commit new version. + - Create a github tag like `git tag -a v0.8.5 -m "v0.8.5"` + - Ensure you have a clean checkout (no extra files in your check that are not known by git). You need to be careful, for instance, to avoid a large accidental file being packaged by npm. You can get a view of what npm will publish by running `make testpack` + - Then publish the module to npm repositories by running `npm publish` diff --git a/Makefile b/Makefile index 58085e4..c3ee347 100755 --- a/Makefile +++ b/Makefile @@ -25,6 +25,12 @@ libvtile: build/Makefile Makefile test: libvtile ./build/$(BUILDTYPE)/tests +testpack: + rm -f ./*tgz + npm pack + tar -ztvf *tgz + rm -f ./*tgz + clean: rm -rf ./build diff --git a/bench/vtile-transform.cpp b/bench/vtile-transform.cpp index 772a90d..b716cc3 100644 --- a/bench/vtile-transform.cpp +++ b/bench/vtile-transform.cpp @@ -60,7 +60,11 @@ int main() { { mapnik::vector_tile_impl::vector_tile_strategy_proj vs(prj_trans,tr, 16); mapnik::progress_timer __stats__(std::clog, "transform_visitor with reserve with proj no-op"); - mapnik::vector_tile_impl::transform_visitor<mapnik::vector_tile_impl::vector_tile_strategy_proj> transit(vs); + mapnik::box2d<double> clip_extent(std::numeric_limits<double>::min(), + std::numeric_limits<double>::min(), + std::numeric_limits<double>::max(), + std::numeric_limits<double>::max()); + mapnik::vector_tile_impl::transform_visitor<mapnik::vector_tile_impl::vector_tile_strategy_proj> transit(vs, clip_extent); for (unsigned i=0;i<10000;++i) { mapnik::geometry::geometry<std::int64_t> new_geom = mapnik::util::apply_visitor(transit,geom); @@ -76,7 +80,11 @@ int main() { { mapnik::vector_tile_impl::vector_tile_strategy vs(tr, 16); mapnik::progress_timer __stats__(std::clog, "transform_visitor with reserve with no proj function call overhead"); - mapnik::vector_tile_impl::transform_visitor<mapnik::vector_tile_impl::vector_tile_strategy> transit(vs); + mapnik::box2d<double> clip_extent(std::numeric_limits<double>::min(), + std::numeric_limits<double>::min(), + std::numeric_limits<double>::max(), + std::numeric_limits<double>::max()); + mapnik::vector_tile_impl::transform_visitor<mapnik::vector_tile_impl::vector_tile_strategy> transit(vs, clip_extent); for (unsigned i=0;i<10000;++i) { mapnik::geometry::geometry<std::int64_t> new_geom = mapnik::util::apply_visitor(transit,geom); @@ -90,4 +98,4 @@ int main() { } } return 0; -} \ No newline at end of file +} diff --git a/bootstrap.sh b/bootstrap.sh index d98f431..c2c6ced 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -28,7 +28,7 @@ function install_mason_deps() { install harfbuzz 0.9.40 install jpeg_turbo 1.4.0 install libxml2 2.9.2 - install libpng 1.6.16 + install libpng 1.6.17 install webp 0.4.2 install icu 54.1 install proj 4.8.0 diff --git a/package.json b/package.json index 7dfbbd3..2b3124a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapnik-vector-tile", - "version": "0.8.4", + "version": "0.8.5", "description": "Mapnik vector tile API", "main": "./package.json", "repository" : { diff --git a/src/vector_tile_datasource_pbf.ipp b/src/vector_tile_datasource_pbf.ipp index 8976b4b..e3ab58d 100644 --- a/src/vector_tile_datasource_pbf.ipp +++ b/src/vector_tile_datasource_pbf.ipp @@ -110,10 +110,10 @@ namespace mapnik { namespace vector_tile_impl { else { val_idx = *_i; - val = layer_values_.at(val_idx); std::string name = layer_keys_.at(key_idx); if (feature->has_key(name)) { + val = layer_values_.at(val_idx); if (val.is<std::string>()) { feature->put(name, tr_.transcode(val.get<std::string>().data(), val.get<std::string>().length())); diff --git a/src/vector_tile_processor.hpp b/src/vector_tile_processor.hpp index 2bf2808..916e2a1 100644 --- a/src/vector_tile_processor.hpp +++ b/src/vector_tile_processor.hpp @@ -85,7 +85,8 @@ public: MAPNIK_VECTOR_INLINE unsigned handle_geometry(T2 const& vs, mapnik::feature_impl const& feature, mapnik::geometry::geometry<double> const& geom, - mapnik::box2d<int> const& tile_clipping_extent); + mapnik::box2d<int> const& tile_clipping_extent, + mapnik::box2d<double> const& target_clipping_extent); }; }} // end ns diff --git a/src/vector_tile_processor.ipp b/src/vector_tile_processor.ipp index 72da363..bf820e4 100644 --- a/src/vector_tile_processor.ipp +++ b/src/vector_tile_processor.ipp @@ -24,7 +24,6 @@ #include <mapnik/util/noncopyable.hpp> #include <mapnik/transform_path_adapter.hpp> #include <mapnik/geometry_is_empty.hpp> -#include <mapnik/geometry_envelope.hpp> #include <mapnik/geometry_adapters.hpp> #include <mapnik/geometry_transform.hpp> @@ -802,7 +801,8 @@ void processor<T>::apply_to_layer(mapnik::layer const& lay, if (handle_geometry(vs, *feature, geom, - tile_clipping_extent) > 0) + tile_clipping_extent, + target_clipping_extent) > 0) { painted_ = true; } @@ -818,6 +818,7 @@ void processor<T>::apply_to_layer(mapnik::layer const& lay, mapnik::geometry::point<std::int64_t> p2_max = mapnik::geometry::transform<std::int64_t>(p1_max, vs); box2d<int> tile_clipping_extent(p2_min.x, p2_min.y, p2_max.x, p2_max.y); mapnik::vector_tile_impl::vector_tile_strategy_proj vs2(prj_trans,t_,backend_.get_path_multiplier()); + prj_trans.forward(target_clipping_extent, PROJ_ENVELOPE_POINTS); while (feature) { mapnik::geometry::geometry<double> const& geom = feature->get_geometry(); @@ -829,7 +830,8 @@ void processor<T>::apply_to_layer(mapnik::layer const& lay, if (handle_geometry(vs2, *feature, geom, - tile_clipping_extent) > 0) + tile_clipping_extent, + target_clipping_extent) > 0) { painted_ = true; } @@ -912,13 +914,10 @@ struct encoder_visitor { unsigned operator() (mapnik::geometry::point<std::int64_t> const& geom) { unsigned path_count = 0; - if (tile_clipping_extent_.intersects(geom.x,geom.y)) - { - backend_.start_tile_feature(feature_); - backend_.current_feature_->set_type(vector_tile::Tile_GeomType_POINT); - path_count = backend_.add_path(geom); - backend_.stop_tile_feature(); - } + backend_.start_tile_feature(feature_); + backend_.current_feature_->set_type(vector_tile::Tile_GeomType_POINT); + path_count = backend_.add_path(geom); + backend_.stop_tile_feature(); return path_count; } @@ -928,16 +927,13 @@ struct encoder_visitor { bool first = true; for (auto const& pt : geom) { - if (tile_clipping_extent_.intersects(pt.x,pt.y)) + if (first) { - if (first) - { - first = false; - backend_.start_tile_feature(feature_); - backend_.current_feature_->set_type(vector_tile::Tile_GeomType_POINT); - } - path_count += backend_.add_path(pt); + first = false; + backend_.start_tile_feature(feature_); + backend_.current_feature_->set_type(vector_tile::Tile_GeomType_POINT); } + path_count += backend_.add_path(pt); } if (!first) { @@ -1269,13 +1265,14 @@ template <typename T> template <typename T2> unsigned processor<T>::handle_geometry(T2 const& vs, mapnik::feature_impl const& feature, mapnik::geometry::geometry<double> const& geom, - mapnik::box2d<int> const& tile_clipping_extent) + mapnik::box2d<int> const& tile_clipping_extent, + mapnik::box2d<double> const& target_clipping_extent) { // TODO // - no need to create a new skipping_transformer per geometry // - write a non-skipping / zero copy transformer to be used when no projection is needed using vector_tile_strategy_type = T2; - mapnik::vector_tile_impl::transform_visitor<vector_tile_strategy_type> skipping_transformer(vs); + mapnik::vector_tile_impl::transform_visitor<vector_tile_strategy_type> skipping_transformer(vs, target_clipping_extent); mapnik::geometry::geometry<std::int64_t> new_geom = mapnik::util::apply_visitor(skipping_transformer,geom); encoder_visitor<T> encoder(backend_, feature, tile_clipping_extent, area_threshold_); if (simplify_distance_ > 0) diff --git a/src/vector_tile_strategy.hpp b/src/vector_tile_strategy.hpp index 27a83dc..a8f535f 100644 --- a/src/vector_tile_strategy.hpp +++ b/src/vector_tile_strategy.hpp @@ -6,6 +6,7 @@ #include <mapnik/util/noncopyable.hpp> #include <mapnik/proj_transform.hpp> #include <mapnik/view_transform.hpp> +#include <mapnik/geometry_envelope.hpp> #include "clipper.hpp" @@ -17,7 +18,6 @@ #include <boost/numeric/conversion/cast.hpp> #pragma GCC diagnostic pop - namespace mapnik { namespace vector_tile_impl { @@ -106,11 +106,13 @@ struct vector_tile_strategy_proj template <typename TransformType> struct transform_visitor { - transform_visitor(TransformType const& tr) : - tr_(tr) {} + transform_visitor(TransformType const& tr, box2d<double> const& target_clipping_extent) : + tr_(tr), + target_clipping_extent_(target_clipping_extent) {} inline mapnik::geometry::geometry<std::int64_t> operator() (mapnik::geometry::point<double> const& geom) { + if (!target_clipping_extent_.intersects(geom.x,geom.y)) return mapnik::geometry::geometry_empty(); mapnik::geometry::point<std::int64_t> new_geom; if (!tr_.apply(geom,new_geom)) return mapnik::geometry::geometry_empty(); return new_geom; @@ -123,16 +125,22 @@ struct transform_visitor { for (auto const& pt : geom) { mapnik::geometry::point<std::int64_t> pt2; - if (tr_.apply(pt,pt2)) + if (target_clipping_extent_.intersects(pt.x, pt.y) && tr_.apply(pt,pt2)) { new_geom.push_back(std::move(pt2)); } } + if (new_geom.empty()) return mapnik::geometry::geometry_empty(); return new_geom; } inline mapnik::geometry::geometry<std::int64_t> operator() (mapnik::geometry::line_string<double> const& geom) { + mapnik::box2d<double> geom_bbox = mapnik::geometry::envelope(geom); + if (!target_clipping_extent_.intersects(geom_bbox)) + { + return mapnik::geometry::geometry_empty(); + } mapnik::geometry::line_string<std::int64_t> new_geom; new_geom.reserve(geom.size()); for (auto const& pt : geom) @@ -152,6 +160,8 @@ struct transform_visitor { new_geom.reserve(geom.size()); for (auto const& line : geom) { + mapnik::box2d<double> line_bbox = mapnik::geometry::envelope(line); + if (!target_clipping_extent_.intersects(line_bbox)) continue; mapnik::geometry::line_string<std::int64_t> new_line; new_line.reserve(line.size()); for (auto const& pt : line) @@ -164,11 +174,17 @@ struct transform_visitor { } new_geom.push_back(std::move(new_line)); } + if (new_geom.empty()) return mapnik::geometry::geometry_empty(); return new_geom; } inline mapnik::geometry::geometry<std::int64_t> operator() (mapnik::geometry::polygon<double> const& geom) { + mapnik::box2d<double> ext_bbox = mapnik::geometry::envelope(geom); + if (!target_clipping_extent_.intersects(ext_bbox)) + { + return mapnik::geometry::geometry_empty(); + } mapnik::geometry::polygon<std::int64_t> new_geom; new_geom.exterior_ring.reserve(geom.exterior_ring.size()); for (auto const& pt : geom.exterior_ring) @@ -181,6 +197,11 @@ struct transform_visitor { } for (auto const& ring : geom.interior_rings) { + mapnik::box2d<double> ring_bbox = mapnik::geometry::envelope(static_cast<mapnik::geometry::line_string<double> const&>(ring)); + if (!target_clipping_extent_.intersects(ring_bbox)) + { + continue; + } mapnik::geometry::linear_ring<std::int64_t> new_ring; new_ring.reserve(ring.size()); for (auto const& pt : ring) @@ -202,6 +223,11 @@ struct transform_visitor { new_geom.reserve(geom.size()); for (auto const& poly : geom) { + mapnik::box2d<double> ext_bbox = mapnik::geometry::envelope(poly); + if (!target_clipping_extent_.intersects(ext_bbox)) + { + continue; + } mapnik::geometry::polygon<std::int64_t> new_poly; new_poly.exterior_ring.reserve(poly.exterior_ring.size()); for (auto const& pt : poly.exterior_ring) @@ -214,6 +240,11 @@ struct transform_visitor { } for (auto const& ring : poly.interior_rings) { + mapnik::box2d<double> ring_bbox = mapnik::geometry::envelope(static_cast<mapnik::geometry::line_string<double> const&>(ring)); + if (!target_clipping_extent_.intersects(ring_bbox)) + { + continue; + } mapnik::geometry::linear_ring<std::int64_t> new_ring; new_ring.reserve(ring.size()); for (auto const& pt : ring) @@ -228,6 +259,7 @@ struct transform_visitor { } new_geom.push_back(std::move(new_poly)); } + if (new_geom.empty()) return mapnik::geometry::geometry_empty(); return new_geom; } @@ -247,6 +279,7 @@ struct transform_visitor { return geom; } TransformType const& tr_; + box2d<double> const& target_clipping_extent_; }; } diff --git a/test/clipper_test.cpp b/test/clipper_test.cpp index fcbdd0c..5224a98 100644 --- a/test/clipper_test.cpp +++ b/test/clipper_test.cpp @@ -61,7 +61,11 @@ TEST_CASE( "vector_tile_strategy", "should not overflow" ) { double path_multiplier = 1000000000000.0; mapnik::vector_tile_impl::vector_tile_strategy_proj vs(prj_trans, tr, path_multiplier); CHECK_THROWS( mapnik::geometry::transform<std::int64_t>(g, vs) ); - mapnik::vector_tile_impl::transform_visitor<mapnik::vector_tile_impl::vector_tile_strategy_proj> skipping_transformer(vs); + mapnik::box2d<double> clip_extent(std::numeric_limits<double>::min(), + std::numeric_limits<double>::min(), + std::numeric_limits<double>::max(), + std::numeric_limits<double>::max()); + mapnik::vector_tile_impl::transform_visitor<mapnik::vector_tile_impl::vector_tile_strategy_proj> skipping_transformer(vs, clip_extent); mapnik::geometry::geometry<std::int64_t> new_geom = skipping_transformer(g); REQUIRE( new_geom.is<mapnik::geometry::polygon<std::int64_t>>() ); auto const& poly = mapnik::util::get<mapnik::geometry::polygon<std::int64_t>>(new_geom); @@ -89,7 +93,11 @@ TEST_CASE( "vector_tile_strategy2", "invalid mercator coord in interior ring" ) mapnik::view_transform tr(tile_size,tile_size,z15_extent,0,0); mapnik::vector_tile_impl::vector_tile_strategy_proj vs(prj_trans, tr, 16); CHECK_THROWS( mapnik::geometry::transform<std::int64_t>(geom, vs) ); - mapnik::vector_tile_impl::transform_visitor<mapnik::vector_tile_impl::vector_tile_strategy_proj> skipping_transformer(vs); + mapnik::box2d<double> clip_extent(std::numeric_limits<double>::min(), + std::numeric_limits<double>::min(), + std::numeric_limits<double>::max(), + std::numeric_limits<double>::max()); + mapnik::vector_tile_impl::transform_visitor<mapnik::vector_tile_impl::vector_tile_strategy_proj> skipping_transformer(vs, clip_extent); mapnik::geometry::geometry<std::int64_t> new_geom = mapnik::util::apply_visitor(skipping_transformer,geom); REQUIRE( new_geom.is<mapnik::geometry::polygon<std::int64_t>>() ); auto const& poly = mapnik::util::get<mapnik::geometry::polygon<std::int64_t>>(new_geom); diff --git a/test/data/linestrings_and_point.geojson b/test/data/linestrings_and_point.geojson new file mode 100644 index 0000000..dddeef1 --- /dev/null +++ b/test/data/linestrings_and_point.geojson @@ -0,0 +1,56 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": 1, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -180, + 60.020952153748 + ], + [ + 180, + -60.020952153748 + ] + ] + }, + "properties": {} + }, + { + "type": "Feature", + "id": 2, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + -180, + -60.020952153748 + ], + [ + 180, + 60.020952153748 + ] + ] + }, + "properties": {} + }, + { + "type": "Feature", + "id": 1, + "geometry": { + "type": "Point", + "coordinates": [ + 0, + 0 + ] + }, + "properties": { + "x": 0, + "y": 0 + } + } + ] +} \ No newline at end of file diff --git a/test/test_utils.cpp b/test/test_utils.cpp index b26b5ae..68a8d42 100644 --- a/test/test_utils.cpp +++ b/test/test_utils.cpp @@ -12,6 +12,7 @@ #include <mapnik/datasource.hpp> #include <mapnik/load_map.hpp> #include <mapnik/memory_datasource.hpp> +#include <mapnik/datasource_cache.hpp> #include <mapnik/image.hpp> #include <mapnik/image_reader.hpp> #include <mapnik/util/file_io.hpp> @@ -75,6 +76,14 @@ std::shared_ptr<mapnik::memory_datasource> build_geojson_ds(std::string const& g return ds; } +std::shared_ptr<mapnik::datasource> build_geojson_fs_ds(std::string const& geojson_file) { + mapnik::parameters params; + params["type"] = "geojson"; + params["file"] = geojson_file; + params["cache_features"] = "false"; + return mapnik::datasource_cache::instance().create(params); +} + mapnik::geometry::geometry<double> read_geojson(std::string const& geojson_file) { mapnik::util::file input(geojson_file); if (!input.open()) diff --git a/test/test_utils.hpp b/test/test_utils.hpp index fe51943..96d9fbc 100644 --- a/test/test_utils.hpp +++ b/test/test_utils.hpp @@ -12,6 +12,7 @@ namespace testing { std::shared_ptr<mapnik::memory_datasource> build_ds(double x,double y, bool second=false); mapnik::geometry::geometry<double> read_geojson(std::string const& geojson_file); std::shared_ptr<mapnik::memory_datasource> build_geojson_ds(std::string const& geojson_file); +std::shared_ptr<mapnik::memory_datasource> build_geojson_fs_ds(std::string const& geojson_file); unsigned compare_images(std::string const& src_fn, std::string const& dest_fn, diff --git a/test/vector_tile.cpp b/test/vector_tile.cpp index d5a349a..2716cfc 100644 --- a/test/vector_tile.cpp +++ b/test/vector_tile.cpp @@ -614,7 +614,7 @@ mapnik::geometry::geometry<double> round_trip(mapnik::geometry::geometry<double> mapnik::geometry::point<std::int64_t> p2_min = mapnik::geometry::transform<std::int64_t>(p1_min, vs); mapnik::geometry::point<std::int64_t> p2_max = mapnik::geometry::transform<std::int64_t>(p1_max, vs); mapnik::box2d<int> clipping_extent(p2_min.x, p2_min.y, p2_max.x, p2_max.y); - ren.handle_geometry(vs2,*feature,geom,clipping_extent); + ren.handle_geometry(vs2,*feature,geom,clipping_extent, bbox); backend.stop_tile_layer(); if (tile.layers_size() != 1) { @@ -1021,7 +1021,7 @@ mapnik::geometry::geometry<double> round_trip2(mapnik::geometry::geometry<double mapnik::geometry::point<std::int64_t> p2_min = mapnik::geometry::transform<std::int64_t>(p1_min, vs); mapnik::geometry::point<std::int64_t> p2_max = mapnik::geometry::transform<std::int64_t>(p1_max, vs); mapnik::box2d<int> clipping_extent(p2_min.x, p2_min.y, p2_max.x, p2_max.y); - ren.handle_geometry(vs2,*feature,geom,clipping_extent); + ren.handle_geometry(vs2,*feature,geom,clipping_extent, bbox); backend.stop_tile_layer(); if (tile.layers_size() != 1) { @@ -1227,4 +1227,4 @@ TEST_CASE( "vector tile transform2", "should not throw reprojected data from loc if (diff > 0) { mapnik::save_to_file(im,"test/fixtures/transform-actual-2.png","png32"); } -} \ No newline at end of file +} diff --git a/test/vector_tile_pbf.cpp b/test/vector_tile_pbf.cpp index fb0e3c0..8f2774f 100644 --- a/test/vector_tile_pbf.cpp +++ b/test/vector_tile_pbf.cpp @@ -559,3 +559,64 @@ TEST_CASE("Check that we throw on various valid-but-we-don't-handle PBF encoded } } + +TEST_CASE( "pbf vector tile from linestring geojson", "should create vector tile with data" ) { + typedef mapnik::vector_tile_impl::backend_pbf backend_type; + typedef mapnik::vector_tile_impl::processor<backend_type> renderer_type; + typedef vector_tile::Tile tile_type; + tile_type tile; + backend_type backend(tile,1000); + unsigned tile_size = 256; + mapnik::box2d<double> bbox(-20037508.342789,-20037508.342789,20037508.342789,20037508.342789); + mapnik::Map map(tile_size,tile_size,"+init=epsg:3857"); + mapnik::layer lyr("layer","+init=epsg:4326"); + auto ds = testing::build_geojson_fs_ds("./test/data/linestrings_and_point.geojson"); + lyr.set_datasource(ds); + map.add_layer(lyr); + map.zoom_to_box(bbox); + mapnik::request m_req(tile_size,tile_size,bbox); + renderer_type ren(backend,map,m_req); + ren.apply(); + CHECK( ren.painted() == true ); + REQUIRE(1 == tile.layers_size()); + vector_tile::Tile_Layer const& layer = tile.layers(0); + CHECK(std::string("layer") == layer.name()); + REQUIRE(3 == layer.features_size()); + std::string buffer; + tile.SerializeToString(&buffer); + mapbox::util::pbf pbf_tile(buffer.c_str(), buffer.size()); + pbf_tile.next(); + mapbox::util::pbf layer3 = pbf_tile.get_message(); + std::shared_ptr<mapnik::vector_tile_impl::tile_datasource_pbf> ds2 = std::make_shared< + mapnik::vector_tile_impl::tile_datasource_pbf>( + layer3,0,0,0,256); + CHECK(ds2->get_name() == "layer"); + mapnik::query q(bbox); + // note: https://github.com/mapbox/mapnik-vector-tile/issues/132 does not occur + // if we uncomment these lines + //q.add_property_name("x"); + //q.add_property_name("y"); + std::size_t expected_num_attr_returned = q.property_names().size(); + auto fs = ds2->features(q); + auto f_ptr = fs->next(); + CHECK(f_ptr != mapnik::feature_ptr()); + // no attributes + CHECK(f_ptr->context()->size() == expected_num_attr_returned); + CHECK(f_ptr->get_geometry().is<mapnik::geometry::line_string<double> >()); + // second feature + f_ptr = fs->next(); + CHECK(f_ptr != mapnik::feature_ptr()); + CHECK(f_ptr->context()->size() == expected_num_attr_returned); + CHECK(f_ptr->get_geometry().is<mapnik::geometry::line_string<double> >()); + + // third feature + f_ptr = fs->next(); + CHECK(f_ptr != mapnik::feature_ptr()); + CHECK(f_ptr->context()->size() == expected_num_attr_returned); + CHECK(f_ptr->get_geometry().is<mapnik::geometry::point<double> >()); + + // only three features + f_ptr = fs->next(); + CHECK(f_ptr == mapnik::feature_ptr()); + +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapnik-vector-tile.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel