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 bc27443eccf53299ce30fc17f18181153dfc769f Author: Bas Couwenberg <[email protected]> Date: Fri Jun 9 11:03:21 2017 +0200 Imported Upstream version 1.4.0+dfsg --- .travis.yml | 21 ++++-- CHANGELOG.md | 8 ++ README.md | 5 +- bin/vtile-fuzz.cpp | 113 ----------------------------- codecov.yml | 5 ++ gyp/build.gyp | 15 ---- install_mason.sh | 4 +- package.json | 2 +- scripts/coverage.sh | 29 ++------ src/vector_tile_featureset_pbf.ipp | 34 +++++---- src/vector_tile_layer.hpp | 16 +++- src/vector_tile_processor.ipp | 57 ++++----------- test/data/layer_scale_denom_style.xml | 21 ++++++ test/fixtures/expected-2.jpeg | Bin 42943 -> 45612 bytes test/fixtures/expected-2.png | Bin 419393 -> 423118 bytes test/raster_tile.cpp | 2 +- test/unit/processor/scale_denom_filter.cpp | 42 +++++++++++ 17 files changed, 147 insertions(+), 227 deletions(-) diff --git a/.travis.yml b/.travis.yml index bbf20b7..91a6e69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,15 @@ matrix: - os: linux sudo: false compiler: ": clang" - env: JOBS=10 CXX="ccache clang++-3.8 -Qunused-arguments" + env: JOBS=10 CXX="ccache clang++-3.9 -Qunused-arguments" + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: [ 'libstdc++-5-dev', 'xutils-dev'] + - os: linux + sudo: false + compiler: ": clang-coverage" + env: JOBS=10 CXX="ccache clang++-3.9 -Qunused-arguments" COVERAGE=true BUILDTYPE=Debug addons: apt: sources: ['ubuntu-toolchain-r-test'] @@ -34,18 +42,19 @@ matrix: compiler: clang env: JOBS=10 # https://docs.travis-ci.com/user/languages/objective-c/#Supported-OS-X-iOS-SDK-versions - osx_image: xcode7 # upgrades clang from 6 -> 7 + osx_image: xcode8.3 # upgrades clang from 6 -> 7 before_install: - source ./bootstrap.sh - ./install_mason.sh - | if [[ $(uname -s) == 'Linux' ]]; then - ./mason/mason install llvm-cov 3.8.1 - ./mason/mason install clang++ 3.8.1 - export PATH=$(./mason/mason prefix clang++ 3.8.1)/bin:${PATH} + ./mason/mason install llvm-cov 3.9.1 + ./mason/mason install clang++ 3.9.1 + export PATH=$(./mason/mason prefix clang++ 3.9.1)/bin:${PATH} which clang++ - export LLVM_COV="$(./mason/mason prefix llvm-cov 3.8.1)/bin/llvm-cov" + export PATH=$(./mason/mason prefix llvm-cov 3.9.1)/bin:${PATH} + which llvm-cov fi install: diff --git a/CHANGELOG.md b/CHANGELOG.md index ab37c09..3a5c72c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 1.4.0 + +- Fixed a bug associated with image height and width when reading from an image resulting in a size of zero causing exceptions. +- Updated to use mapnik 3.0.14, previous version of mapnik will not work properly with this newest version. +- Corrected issues with resolution associated with mapnik queries that was allowing the buffer size of the vector tile to affect the resolution. +- Removed some duplicate code +- Removed fuzzer from library + ## 1.3.0 - Updated protozero to 1.5.1 diff --git a/README.md b/README.md index f0eaeec..3baf062 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,13 @@ Provides C++ headers that support rendering geodata into vector tiles and render - Master: [](https://travis-ci.org/mapbox/mapnik-vector-tile) - 0.6.x series: [](http://travis-ci.org/mapbox/mapnik-vector-tile) -[](https://coveralls.io/github/mapbox/mapnik-vector-tile?branch=master) +[](https://codecov.io/gh/mapbox/mapnik-vector-tile) ## Depends +Mapnik Vector Tile does not currently support Mapnik 3.1.x. + + - mapnik-vector-tile >=1.4.x depends on Mapnik >=v3.0.14 - mapnik-vector-tile >=1.0.x depends on Mapnik >=v3.0.11 - mapnik-vector-tile 1.0.0 to 0.7.x depends on Mapnik v3.0.x (until 3.0.0 is released this means latest mapnik HEAD) - mapnik-vector-tile 0.6.x and previous work with Mapnik v2.2.x or v2.3.x diff --git a/bin/vtile-fuzz.cpp b/bin/vtile-fuzz.cpp deleted file mode 100644 index ee6136c..0000000 --- a/bin/vtile-fuzz.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "vector_tile_geometry_clipper.hpp" - -#include <vector> -#include <iostream> -#include <limits> -#include <cstdlib> - - -/* - -https://github.com/mapnik/clipper/issues/3 - -*/ - -class noop_process { -public: - noop_process() {} - template <typename T> - void operator() (T &) - { - return; - } -}; - -int main() { - - noop_process no_op; - using clipping_process = mapnik::vector_tile_impl::geometry_clipper<noop_process>; - mapnik::box2d<int> no_op_max_extent(std::numeric_limits<int>::min(), - std::numeric_limits<int>::min(), - std::numeric_limits<int>::max(), - std::numeric_limits<int>::max()); - while (1) - { - - std::size_t len = std::rand() % 700 + 3; - - for (auto strictly_simple : { true, false }) - { - for (auto multi_polygon_union : { true, false }) - { - for (auto process_all_rings : { true, false }) - { - for (auto area_threshold : { 0.0, 0.5 }) - { - for (auto fill_type : { mapnik::vector_tile_impl::even_odd_fill, - mapnik::vector_tile_impl::non_zero_fill, - mapnik::vector_tile_impl::positive_fill, - mapnik::vector_tile_impl::negative_fill }) - { - mapbox::geometry::polygon<std::int64_t> poly; - mapbox::geometry::linear_ring<std::int64_t> ring; - mapnik::box2d<int> geom_extent; - - bool added_exterior = false; - bool first = true; - - for (std::size_t i = 0; i < len; ++i) { - std::int64_t x = std::rand() % 4096; - std::int64_t y = std::rand() % 4096; - - ring.emplace_back(x,y); - if (first) { - first = false; - geom_extent.init(x,y,x,y); - } else { - geom_extent.expand_to_include(x,y); - } - - if (!added_exterior && i > 100) { - poly.push_back(ring); - ring.clear(); - added_exterior = true; - } - - if (added_exterior && std::rand() % 50 == 0 && ring.size() >= 3) { - poly.push_back(ring); - ring.clear(); - } - } - std::clog << "size: " << poly.size() << "\n"; - // clip with max extent: should result in nothing being clipped - { - clipping_process clipper(no_op_max_extent, - area_threshold, - strictly_simple, - multi_polygon_union, - fill_type, - process_all_rings, - no_op); - clipper(poly); - } - // clip with the extent of geometries minus a bit - { - // TODO - mapnik core needs support for ints - //mapnik::box2d<int> geom_extent = mapnik::geometry::envelope(poly); - geom_extent.pad(-100); - clipping_process clipper(geom_extent, - area_threshold, - strictly_simple, - multi_polygon_union, - fill_type, - process_all_rings, - no_op); - clipper(poly); - } - } - } - } - } - } - } -} diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..d06f00a --- /dev/null +++ b/codecov.yml @@ -0,0 +1,5 @@ +ignore: + - "bin" + - "bench" + - "examples" + - "test" \ No newline at end of file diff --git a/gyp/build.gyp b/gyp/build.gyp index 4da8b20..5a22717 100644 --- a/gyp/build.gyp +++ b/gyp/build.gyp @@ -193,21 +193,6 @@ ] }, { - "target_name": "vtile-fuzz", - 'dependencies': [ 'mapnik_vector_tile_impl' ], - "type": "executable", - "defines": [ - "<@(common_defines)", - "MAPNIK_PLUGINDIR=<(MAPNIK_PLUGINDIR)" - ], - "sources": [ - "../bin/vtile-fuzz.cpp" - ], - "include_dirs": [ - "../src", - ] - }, - { "target_name": "tileinfo", 'dependencies': [ 'vector_tile' ], "type": "executable", diff --git a/install_mason.sh b/install_mason.sh index 6954b4c..c20d294 100755 --- a/install_mason.sh +++ b/install_mason.sh @@ -12,7 +12,7 @@ ICU_VERSION="57.1" if [ ! -f ./mason/mason.sh ]; then mkdir -p ./mason - curl -sSfL https://github.com/mapbox/mason/archive/0ba3b42.tar.gz | tar --gunzip --extract --strip-components=1 --exclude="*md" --exclude="test*" --directory=./mason + curl -sSfL https://github.com/mapbox/mason/archive/9eac60614fda7cfeb8a9e81d18e8cca5c1ae8fbc.tar.gz | tar --gunzip --extract --strip-components=1 --exclude="*md" --exclude="test*" --directory=./mason fi if [ ! -f ./mason_packages/.link/bin/mapnik-config ]; then @@ -35,7 +35,7 @@ if [ ! -f ./mason_packages/.link/bin/mapnik-config ]; then install harfbuzz 1.4.2-ft # mapnik - install mapnik 3.0.13 + install mapnik 3.0.14 # other deps install protozero 1.5.1 diff --git a/package.json b/package.json index 117511e..dc2e6b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapnik-vector-tile", - "version": "1.3.0", + "version": "1.4.0", "description": "Mapnik Vector Tile API", "main": "include_dirs.js", "repository" : { diff --git a/scripts/coverage.sh b/scripts/coverage.sh index b82e565..14bfc83 100755 --- a/scripts/coverage.sh +++ b/scripts/coverage.sh @@ -3,27 +3,8 @@ set -e -u set -o pipefail -COVERAGE=${COVERAGE:-false} - -if [[ ${COVERAGE} == true ]]; then - - PYTHONUSERBASE=$(pwd)/mason_packages/.link pip install --user cpp-coveralls - if [[ $(uname -s) == 'Linux' ]]; then - export PYTHONPATH=$(pwd)/mason_packages/.link/lib/python2.7/site-packages - else - export PYTHONPATH=$(pwd)/mason_packages/.link/lib/python/site-packages - fi - ./mason_packages/.link/bin/cpp-coveralls \ - --gcov ${LLVM_COV} \ - --build-root build \ - --gcov-options '\-lp' \ - --exclude examples \ - --exclude deps \ - --exclude test \ - --exclude bench \ - --exclude build/Debug/obj/gen/ \ - --exclude mason_packages \ - --exclude scripts > /dev/null -fi - -set +e +u +if [[ ${COVERAGE:-false} != false ]]; then + curl -S -f https://codecov.io/bash -o codecov + chmod +x codecov + ./codecov -x "llvm-cov gcov" -Z +fi \ No newline at end of file diff --git a/src/vector_tile_featureset_pbf.ipp b/src/vector_tile_featureset_pbf.ipp index d19a463..5121134 100644 --- a/src/vector_tile_featureset_pbf.ipp +++ b/src/vector_tile_featureset_pbf.ipp @@ -218,34 +218,36 @@ feature_ptr tile_featureset_pbf<Filter>::next() mapnik::view_transform t(image_width, image_height, tile_extent_, 0, 0); box2d<double> intersect = tile_extent_.intersect(unbuffered_query_); box2d<double> ext = t.forward(intersect); - if (ext.width() > 0.5 && ext.height() > 0.5 ) + if (ext.width() > std::numeric_limits<double>::epsilon() * 5.0 + && ext.height() > std::numeric_limits<double>::epsilon() * 5.0) { // select minimum raster containing whole ext - int x_off = static_cast<int>(std::floor(ext.minx() +.5)); - int y_off = static_cast<int>(std::floor(ext.miny() +.5)); - int end_x = static_cast<int>(std::floor(ext.maxx() +.5)); - int end_y = static_cast<int>(std::floor(ext.maxy() +.5)); + int x_off = static_cast<int>(std::floor(ext.minx())); + int y_off = static_cast<int>(std::floor(ext.miny())); + int end_x = static_cast<int>(std::ceil(ext.maxx())); + int end_y = static_cast<int>(std::ceil(ext.maxy())); // clip to available data - if (x_off < 0) - x_off = 0; - if (y_off < 0) - y_off = 0; - if (end_x > image_width) - end_x = image_width; - if (end_y > image_height) - end_y = image_height; + if (x_off >= image_width) x_off = image_width - 1; + if (y_off >= image_height) y_off = image_height - 1; + if (x_off < 0) x_off = 0; + if (y_off < 0) y_off = 0; + if (end_x > image_width) end_x = image_width; + if (end_y > image_height) end_y = image_height; int width = end_x - x_off; int height = end_y - y_off; + if (width < 1) width = 1; + if (height < 1) height = 1; box2d<double> feature_raster_extent(x_off, y_off, x_off + width, y_off + height); - intersect = t.backward(feature_raster_extent); + feature_raster_extent = t.backward(feature_raster_extent); double filter_factor = 1.0; mapnik::image_any data = reader->read(x_off, y_off, width, height); - mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(intersect, - data, + mapnik::raster_ptr raster = std::make_shared<mapnik::raster>(feature_raster_extent, + intersect, + std::move(data), filter_factor ); feature->set_raster(raster); diff --git a/src/vector_tile_layer.hpp b/src/vector_tile_layer.hpp index 07e4c8b..1ab7509 100644 --- a/src/vector_tile_layer.hpp +++ b/src/vector_tile_layer.hpp @@ -236,6 +236,14 @@ public: } mapnik::box2d<double> query_extent(lay.envelope()); // source projection + mapnik::box2d<double> unbuffered_query_extent(tile_extent_bbox); + if (!prj_trans_.equal()) + { + if (!prj_trans_.forward(unbuffered_query_extent, PROJ_ENVELOPE_POINTS)) + { + throw std::runtime_error("vector_tile_processor: unbuffered query extent did not repoject back to map projection"); + } + } // first, try intersection of map extent forward projected into layer srs if (source_buffered_extent_.intersects(query_extent)) @@ -255,7 +263,7 @@ public: // forward project layer extent back into native projection if (!prj_trans_.forward(query_extent, PROJ_ENVELOPE_POINTS)) { - throw std::runtime_error("vector_tile_processor: layer extent did not repoject back to map projection"); + throw std::runtime_error("vector_tile_processor: query extent did not repoject back to map projection"); } } else @@ -263,8 +271,8 @@ public: // if no intersection then nothing to do for layer valid_ = false; } - double qw = query_extent.width() > 0 ? query_extent.width() : 1; - double qh = query_extent.height() > 0 ? query_extent.height() : 1; + double qw = unbuffered_query_extent.width() > 0 ? unbuffered_query_extent.width() : 1; + double qh = unbuffered_query_extent.height() > 0 ? unbuffered_query_extent.height() : 1; if (!ds_ || ds_->type() == datasource::Vector) { qw = VT_LEGACY_IMAGE_SIZE / qw; @@ -276,7 +284,7 @@ public: qh = static_cast<double>(layer_extent_) / qh; } mapnik::query::resolution_type res(qw, qh); - mapnik::query q(query_extent, res, scale_denom, tile_extent_bbox); + mapnik::query q(query_extent, res, scale_denom, unbuffered_query_extent); if (ds_) { mapnik::layer_descriptor lay_desc = ds_->get_descriptor(); diff --git a/src/vector_tile_processor.ipp b/src/vector_tile_processor.ipp index 679048e..fecc5bc 100644 --- a/src/vector_tile_processor.ipp +++ b/src/vector_tile_processor.ipp @@ -64,6 +64,19 @@ inline void create_geom_layer(tile_layer & layer, using encoding_process = mapnik::vector_tile_impl::geometry_to_feature_pbf_visitor; using clipping_process = mapnik::vector_tile_impl::geometry_clipper<encoding_process>; + + mapnik::vector_tile_impl::vector_tile_strategy vs(layer.get_view_transform()); + mapnik::box2d<double> const& buffered_extent = layer.get_target_buffered_extent(); + const mapnik::geometry::point<double> p1_min(buffered_extent.minx(), buffered_extent.miny()); + const mapnik::geometry::point<double> p1_max(buffered_extent.maxx(), buffered_extent.maxy()); + const mapnik::geometry::point<std::int64_t> p2_min = mapnik::geometry::transform<std::int64_t>(p1_min, vs); + const mapnik::geometry::point<std::int64_t> p2_max = mapnik::geometry::transform<std::int64_t>(p1_max, vs); + const double minx = std::min(p2_min.x, p2_max.x); + const double maxx = std::max(p2_min.x, p2_max.x); + const double miny = std::min(p2_min.y, p2_max.y); + const double maxy = std::max(p2_min.y, p2_max.y); + const mapnik::box2d<int> tile_clipping_extent(minx, miny, maxx, maxy); + if (simplify_distance > 0) { using simplifier_process = mapnik::vector_tile_impl::geometry_simplifier<clipping_process>; @@ -71,17 +84,6 @@ inline void create_geom_layer(tile_layer & layer, { using strategy_type = mapnik::vector_tile_impl::vector_tile_strategy; using transform_type = mapnik::vector_tile_impl::transform_visitor<strategy_type, simplifier_process>; - strategy_type vs(layer.get_view_transform()); - mapnik::box2d<double> const& buffered_extent = layer.get_target_buffered_extent(); - mapnik::geometry::point<double> p1_min(buffered_extent.minx(), buffered_extent.miny()); - mapnik::geometry::point<double> p1_max(buffered_extent.maxx(), buffered_extent.maxy()); - 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); - double minx = std::min(p2_min.x, p2_max.x); - double maxx = std::max(p2_min.x, p2_max.x); - double miny = std::min(p2_min.y, p2_max.y); - double maxy = std::max(p2_min.y, p2_max.y); - mapnik::box2d<int> tile_clipping_extent(minx, miny, maxx, maxy); while (feature) { mapnik::geometry::geometry<double> const& geom = feature->get_geometry(); @@ -103,17 +105,6 @@ inline void create_geom_layer(tile_layer & layer, { using strategy_type = mapnik::vector_tile_impl::vector_tile_strategy_proj; using transform_type = mapnik::vector_tile_impl::transform_visitor<strategy_type, simplifier_process>; - mapnik::vector_tile_impl::vector_tile_strategy vs(layer.get_view_transform()); - mapnik::box2d<double> const& buffered_extent = layer.get_target_buffered_extent(); - mapnik::geometry::point<double> p1_min(buffered_extent.minx(), buffered_extent.miny()); - mapnik::geometry::point<double> p1_max(buffered_extent.maxx(), buffered_extent.maxy()); - 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); - double minx = std::min(p2_min.x, p2_max.x); - double maxx = std::max(p2_min.x, p2_max.x); - double miny = std::min(p2_min.y, p2_max.y); - double maxy = std::max(p2_min.y, p2_max.y); - mapnik::box2d<int> tile_clipping_extent(minx, miny, maxx, maxy); strategy_type vs2(layer.get_proj_transform(), layer.get_view_transform()); mapnik::box2d<double> const& trans_buffered_extent = layer.get_source_buffered_extent(); while (feature) @@ -140,17 +131,6 @@ inline void create_geom_layer(tile_layer & layer, { using strategy_type = mapnik::vector_tile_impl::vector_tile_strategy; using transform_type = mapnik::vector_tile_impl::transform_visitor<strategy_type, clipping_process>; - strategy_type vs(layer.get_view_transform()); - mapnik::box2d<double> const& buffered_extent = layer.get_target_buffered_extent(); - mapnik::geometry::point<double> p1_min(buffered_extent.minx(), buffered_extent.miny()); - mapnik::geometry::point<double> p1_max(buffered_extent.maxx(), buffered_extent.maxy()); - 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); - double minx = std::min(p2_min.x, p2_max.x); - double maxx = std::max(p2_min.x, p2_max.x); - double miny = std::min(p2_min.y, p2_max.y); - double maxy = std::max(p2_min.y, p2_max.y); - mapnik::box2d<int> tile_clipping_extent(minx, miny, maxx, maxy); while (feature) { mapnik::geometry::geometry<double> const& geom = feature->get_geometry(); @@ -171,17 +151,6 @@ inline void create_geom_layer(tile_layer & layer, { using strategy_type = mapnik::vector_tile_impl::vector_tile_strategy_proj; using transform_type = mapnik::vector_tile_impl::transform_visitor<strategy_type, clipping_process>; - mapnik::vector_tile_impl::vector_tile_strategy vs(layer.get_view_transform()); - mapnik::box2d<double> const& buffered_extent = layer.get_target_buffered_extent(); - mapnik::geometry::point<double> p1_min(buffered_extent.minx(), buffered_extent.miny()); - mapnik::geometry::point<double> p1_max(buffered_extent.maxx(), buffered_extent.maxy()); - 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); - double minx = std::min(p2_min.x, p2_max.x); - double maxx = std::max(p2_min.x, p2_max.x); - double miny = std::min(p2_min.y, p2_max.y); - double maxy = std::max(p2_min.y, p2_max.y); - mapnik::box2d<int> tile_clipping_extent(minx, miny, maxx, maxy); strategy_type vs2(layer.get_proj_transform(), layer.get_view_transform()); mapnik::box2d<double> const& trans_buffered_extent = layer.get_source_buffered_extent(); while (feature) diff --git a/test/data/layer_scale_denom_style.xml b/test/data/layer_scale_denom_style.xml new file mode 100644 index 0000000..9e4d663 --- /dev/null +++ b/test/data/layer_scale_denom_style.xml @@ -0,0 +1,21 @@ +<Map srs="+init=epsg:3857"> + <Layer name="1" srs="+init=epsg:3857"> + <Datasource> + <Parameter name="type">csv</Parameter> + <Parameter name="inline"> + x, y + 1, 2 + </Parameter> + </Datasource> + </Layer> + <Layer name="2" srs="+init=epsg:3857" maximum-scale-denominator="200000"> + <Datasource> + <Parameter name="type">csv</Parameter> + <Parameter name="inline"> + x, y + 3, 4 + 1, 4 + </Parameter> + </Datasource> + </Layer> +</Map> diff --git a/test/fixtures/expected-2.jpeg b/test/fixtures/expected-2.jpeg index 6af9c26..9d9840d 100644 Binary files a/test/fixtures/expected-2.jpeg and b/test/fixtures/expected-2.jpeg differ diff --git a/test/fixtures/expected-2.png b/test/fixtures/expected-2.png index 1162082..bf28d86 100644 Binary files a/test/fixtures/expected-2.png and b/test/fixtures/expected-2.png differ diff --git a/test/raster_tile.cpp b/test/raster_tile.cpp index 6e6437a..466773b 100644 --- a/test/raster_tile.cpp +++ b/test/raster_tile.cpp @@ -99,7 +99,7 @@ TEST_CASE("raster tile output 1") mapnik::save_to_file(im_data,"test/fixtures/actual-2.jpeg","jpeg"); } - std::size_t expected_image_size = 42977; + std::size_t expected_image_size = 45660; std::size_t expected_vtile_size = expected_image_size + 26; if (!debug) { diff --git a/test/unit/processor/scale_denom_filter.cpp b/test/unit/processor/scale_denom_filter.cpp new file mode 100644 index 0000000..e200753 --- /dev/null +++ b/test/unit/processor/scale_denom_filter.cpp @@ -0,0 +1,42 @@ +#include "catch.hpp" + +// mapnik +#include <mapnik/load_map.hpp> + +// mapnik-vector-tile +#include "vector_tile_processor.hpp" + +// libprotobuf +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic ignored "-Wsign-conversion" +#include "vector_tile.pb.h" +#pragma GCC diagnostic pop + + +TEST_CASE("feature processor - filtering by scale denominator on layer level") +{ + mapnik::Map map(256, 256); + mapnik::load_map(map, "test/data/layer_scale_denom_style.xml"); + mapnik::vector_tile_impl::processor ren(map); + const double scale_denom = 200000; + + { + mapnik::vector_tile_impl::tile out_tile = ren.create_tile( + 2048, 2047, 12, 4096, 0, scale_denom); + vector_tile::Tile tile; + REQUIRE(tile.ParseFromString(out_tile.get_buffer())); + REQUIRE(2 == tile.layers_size()); + CHECK(1 == tile.layers(0).features_size()); + CHECK(2 == tile.layers(1).features_size()); + } + { + // One layer is filtered out after change of scale denominator. + mapnik::vector_tile_impl::tile out_tile = ren.create_tile( + 2048, 2047, 12, 4096, 0, scale_denom * 2.0); + vector_tile::Tile tile; + REQUIRE(tile.ParseFromString(out_tile.get_buffer())); + REQUIRE(1 == tile.layers_size()); + CHECK(1 == tile.layers(0).features_size()); + } +} -- 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 [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

