[mapnik-vector-tile] 01/07: Imported Upstream version 1.0.6+dfsg

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Fri Apr 8 08:40:24 UTC 2016


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 9b6750630332a5cfc43b811710d39c4938498ef5
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Fri Apr 8 09:41:13 2016 +0200

    Imported Upstream version 1.0.6+dfsg
---
 .travis.yml                               |  38 +++---
 CHANGELOG.md                              |   5 +
 Makefile                                  |   4 +-
 bootstrap.sh                              |   6 +-
 package.json                              |   2 +-
 scripts/build.sh                          |   2 -
 scripts/coverage.sh                       |   2 +
 src/vector_tile_douglas_peucker.hpp       | 196 ++++++++++++++++++++++++++++++
 src/vector_tile_featureset_pbf.ipp        |  22 ++--
 src/vector_tile_geometry_decoder.ipp      |   8 +-
 src/vector_tile_geometry_simplifier.hpp   | 100 +++++++++++----
 src/vector_tile_is_valid.hpp              |  89 +-------------
 src/vector_tile_load_tile.hpp             |   6 +-
 test/data/simplified_geometry.geojson     |   2 +-
 test/data/simplified_geometry_pbf.geojson |   2 +-
 15 files changed, 326 insertions(+), 158 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 610888b..d4ef065 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,46 +1,42 @@
-language: c
+language: generic
 
 git:
   depth: 10
 
-sudo: false
+cache:
+  directories:
+  - $HOME/.ccache
+
+env:
+  global:
+   - CCACHE_TEMPDIR=/tmp/.ccache-temp
+   - CCACHE_COMPRESS=1
 
 matrix:
   include:
-    # Broken: https://github.com/mapbox/mapnik-vector-tile/issues/103
-    #- os: linux
-    #  compiler: gcc
-    #  env: JOBS=2 CXX=g++-4.9
-    #  addons:
-    #    apt:
-    #      sources: ['ubuntu-toolchain-r-test']
-    #      packages: ['g++-4.9']
     - os: linux
-      compiler: clang
-      env: JOBS=10 CXX=clang++-3.5
+      sudo: false
+      compiler: ": clang"
+      env: JOBS=10 CXX="ccache clang++-3.5 -Qunused-arguments"
       sudo: false
       addons:
         apt:
           sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.5']
           packages: ['clang-3.5']
     - os: linux
-      compiler: clang
-      env: JOBS=10 CXX=clang++-3.5 BUILDTYPE=Debug
+      sudo: false
+      compiler: ": clang-coverage"
+      env: JOBS=10 CXX="ccache clang++-3.5 -Qunused-arguments" COVERAGE=true BUILDTYPE=Debug
       sudo: false
       addons:
         apt:
           sources: ['ubuntu-toolchain-r-test','llvm-toolchain-precise-3.5']
-          packages: ['clang-3.5']
-    - os: osx
-      compiler: clang
-      env: JOBS=10 COVERAGE=true BUILDTYPE=Debug
-      # https://docs.travis-ci.com/user/languages/objective-c/#Supported-OS-X-iOS-SDK-versions
-      osx_image: xcode7.3 # upgrades clang from 6 -> 7
+          packages: ['clang-3.5', 'llvm-3.5-dev']
     - os: osx
       compiler: clang
       env: JOBS=10
       # https://docs.travis-ci.com/user/languages/objective-c/#Supported-OS-X-iOS-SDK-versions
-      osx_image: xcode7.3 # upgrades clang from 6 -> 7
+      osx_image: xcode7 # upgrades clang from 6 -> 7
 
 before_install:
  - source ./bootstrap.sh
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5d6a1ba..6e126a5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Changelog
 
+## 1.0.6
+
+- Removed boost simplification and implemented custom douglas peucker for big speed boost.
+- Updated the version of the clipper used. 
+
 ## 1.0.5
 
 - Several updates to the version of the clipper used. 
diff --git a/Makefile b/Makefile
index 234363e..497457c 100755
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 MAPNIK_PLUGINDIR := $(shell mapnik-config --input-plugins)
 BUILDTYPE ?= Release
 
-CLIPPER_REVISION=3eb6a85910affdf070927bba3b6ab12a67a1381b
+CLIPPER_REVISION=68c49e9a9adaff1ddddb008eaf49f71bf259c4e8
 PROTOZERO_REVISION=v1.3.0
 GYP_REVISION=3464008
 
@@ -26,7 +26,7 @@ test/geometry-test-data:
 	git submodule update --init
 
 test: libvtile test/geometry-test-data
-	./build/$(BUILDTYPE)/tests
+	DYLD_LIBRARY_PATH=$(MVT_LIBRARY_PATH) ./build/$(BUILDTYPE)/tests
 
 testpack:
 	rm -f ./*tgz
diff --git a/bootstrap.sh b/bootstrap.sh
index 01767a2..7e612ae 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -5,7 +5,7 @@ MASON_VERSION="694d08c"
 function setup_mason() {
     if [[ ! -d ./.mason ]]; then
         git clone https://github.com/mapbox/mason.git ./.mason
-        git checkout ${MASON_VERSION}
+        (cd ./.mason && git checkout ${MASON_VERSION})
     else
         echo "Updating to latest mason"
         (cd ./.mason && git fetch && git checkout ${MASON_VERSION})
@@ -27,6 +27,7 @@ function install() {
 ICU_VERSION="55.1"
 
 function install_mason_deps() {
+    install ccache 3.2.4
     install mapnik latest
     install protobuf 2.6.1
     install freetype 2.6
@@ -51,6 +52,9 @@ function setup_runtime_settings() {
     export GDAL_DATA=${MASON_LINKED_ABS}/share/gdal
     if [[ $(uname -s) == 'Darwin' ]]; then
         export DYLD_LIBRARY_PATH=$(pwd)/mason_packages/.link/lib:${DYLD_LIBRARY_PATH}
+        # OS X > 10.11 blocks DYLD_LIBRARY_PATH so we pass along using a
+        # differently named variable
+        export MVT_LIBRARY_PATH=${DYLD_LIBRARY_PATH}
     else
         export LD_LIBRARY_PATH=$(pwd)/mason_packages/.link/lib:${LD_LIBRARY_PATH}
     fi
diff --git a/package.json b/package.json
index 5263cde..fa74330 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "mapnik-vector-tile",
-    "version": "1.0.5",
+    "version": "1.0.6",
     "description": "Mapnik Vector Tile API",
     "main": "./package.json",
     "repository"   :  {
diff --git a/scripts/build.sh b/scripts/build.sh
index c3ba34b..3248157 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -6,8 +6,6 @@ if [[ ${COVERAGE:-false} == true ]]; then
     export CXXFLAGS="--coverage"
 fi
 
-echo $PROJ_LIB
-ls $PROJ_LIB/
 make -j${JOBS:-1} test BUILDTYPE=${BUILDTYPE:-Release} V=1
 
 set +e +u
diff --git a/scripts/coverage.sh b/scripts/coverage.sh
index ff4e494..d6b8384 100755
--- a/scripts/coverage.sh
+++ b/scripts/coverage.sh
@@ -6,6 +6,7 @@ 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
@@ -13,6 +14,7 @@ if [[ ${COVERAGE} == true ]]; then
         export PYTHONPATH=$(pwd)/mason_packages/.link/lib/python/site-packages
     fi
     ./mason_packages/.link/bin/cpp-coveralls \
+        --gcov /usr/bin/llvm-cov-3.5 \
         --build-root build \
         --gcov-options '\-lp' \
         --exclude examples \
diff --git a/src/vector_tile_douglas_peucker.hpp b/src/vector_tile_douglas_peucker.hpp
new file mode 100644
index 0000000..521c5cc
--- /dev/null
+++ b/src/vector_tile_douglas_peucker.hpp
@@ -0,0 +1,196 @@
+#ifndef __MAPNIK_VECTOR_TILE_DOUGLAS_PEUCKER_H__
+#define __MAPNIK_VECTOR_TILE_DOUGLAS_PEUCKER_H__
+
+// Some concepts and code layout borrowed from boost geometry
+// so boost license is included for this header.
+
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+
+// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
+// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+//
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+//
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// mapnik
+#include <mapnik/geometry.hpp>
+
+// std
+#include <vector>
+
+namespace mapnik 
+{
+
+namespace vector_tile_impl
+{
+
+namespace detail
+{
+
+template<typename T>
+struct douglas_peucker_point
+{
+    mapnik::geometry::point<T> const& p;
+    bool included;
+
+    inline douglas_peucker_point(mapnik::geometry::point<T> const& ap)
+        : p(ap)
+        , included(false)
+    {}
+
+    inline douglas_peucker_point<T> operator=(douglas_peucker_point<T> const& )
+    {
+        return douglas_peucker_point<T>(*this);
+    }
+};
+
+template <typename value_type, typename calc_type>
+inline void consider(typename std::vector<douglas_peucker_point<value_type> >::iterator begin,
+                     typename std::vector<douglas_peucker_point<value_type> >::iterator end,
+                     calc_type const& max_dist)
+{
+    typedef typename std::vector<douglas_peucker_point<value_type> >::iterator iterator_type;
+    
+    std::size_t size = end - begin;
+
+    // size must be at least 3
+    // because we want to consider a candidate point in between
+    if (size <= 2)
+    {
+        return;
+    }
+
+    iterator_type last = end - 1;
+
+    // Find most far point, compare to the current segment
+    calc_type md(-1.0); // any value < 0
+    iterator_type candidate;
+    {
+        /*
+            Algorithm [p: (px,py), p1: (x1,y1), p2: (x2,y2)]
+            VECTOR v(x2 - x1, y2 - y1)
+            VECTOR w(px - x1, py - y1)
+            c1 = w . v
+            c2 = v . v
+            b = c1 / c2
+            RETURN POINT(x1 + b * vx, y1 + b * vy)
+        */
+        calc_type const v_x = last->p.x - begin->p.x;
+        calc_type const v_y = last->p.y - begin->p.y;
+        calc_type const c2 = v_x * v_x + v_y * v_y;
+        for(iterator_type it = begin + 1; it != last; ++it)
+        {
+            calc_type const w_x = it->p.x - begin->p.x;
+            calc_type const w_y = it->p.y - begin->p.y;
+            calc_type const c1 = w_x * v_x + w_y * v_y;
+            calc_type dist;
+            if (c1 <= 0) // calc_type() should be 0 of the proper calc type format
+            {
+                calc_type const dx = it->p.x - begin->p.x;
+                calc_type const dy = it->p.y - begin->p.y;
+                dist = dx * dx + dy * dy;
+            }
+            else if (c2 <= c1)
+            {
+                calc_type const dx = it->p.x - last->p.x;
+                calc_type const dy = it->p.y - last->p.y;
+                dist = dx * dx + dy * dy;
+            }
+            else 
+            {
+                // See above, c1 > 0 AND c2 > c1 so: c2 != 0
+                calc_type const b = c1 / c2;
+                calc_type const p_x = begin->p.x + b * v_x;
+                calc_type const p_y = begin->p.y + b * v_y;
+                calc_type const dx = it->p.x - p_x;
+                calc_type const dy = it->p.y - p_y;
+                dist = dx * dx + dy * dy;
+            }
+            if (md < dist)
+            {
+                md = dist;
+                candidate = it;
+            }
+        }
+    }
+
+    // If a point is found, set the include flag
+    // and handle segments in between recursively
+    if (max_dist < md)
+    {
+        candidate->included = true;
+        consider<value_type>(begin, candidate + 1, max_dist);
+        consider<value_type>(candidate, end, max_dist);
+    }
+}
+
+} // end ns detail
+
+template <typename value_type, typename calc_type, typename Range, typename OutputIterator>
+inline void douglas_peucker(Range const& range,
+                            OutputIterator out,
+                            calc_type max_distance)
+{
+    // Copy coordinates, a vector of references to all points
+    std::vector<detail::douglas_peucker_point<value_type> > ref_candidates(std::begin(range),
+                    std::end(range));
+
+    // Include first and last point of line,
+    // they are always part of the line
+    ref_candidates.front().included = true;
+    ref_candidates.back().included = true;
+
+    // We will compare to squared of distance so we don't have to do a sqrt
+    calc_type const max_sqrd = max_distance * max_distance;
+
+    // Get points, recursively, including them if they are further away
+    // than the specified distance
+    detail::consider<value_type, calc_type>(std::begin(ref_candidates), std::end(ref_candidates), max_sqrd);
+
+    // Copy included elements to the output
+    for(typename std::vector<detail::douglas_peucker_point<value_type> >::const_iterator it
+                    = std::begin(ref_candidates);
+        it != std::end(ref_candidates);
+        ++it)
+    {
+        if (it->included)
+        {
+            // copy-coordinates does not work because OutputIterator
+            // does not model Point (??)
+            //geometry::convert(it->p, *out);
+            *out = it->p;
+            out++;
+        }
+    }
+}
+
+} // end ns vector_tile_impl
+
+} // end ns mapnik
+
+#endif // __MAPNIK_VECTOR_TILE_SIMPLIFY_H__
diff --git a/src/vector_tile_featureset_pbf.ipp b/src/vector_tile_featureset_pbf.ipp
index 441624a..191341d 100644
--- a/src/vector_tile_featureset_pbf.ipp
+++ b/src/vector_tile_featureset_pbf.ipp
@@ -125,7 +125,7 @@ feature_ptr tile_featureset_pbf<Filter>::next()
         bool has_geometry_type = false;
         std::pair<protozero::pbf_reader::const_uint32_iterator, protozero::pbf_reader::const_uint32_iterator> geom_itr;
         bool has_raster = false;
-        std::pair<const char*, protozero::pbf_length_type> image_buffer;
+        std::unique_ptr<mapnik::image_reader> reader;
         while (f.next())
         {
             switch(f.tag())
@@ -176,16 +176,19 @@ feature_ptr tile_featureset_pbf<Filter>::next()
                     }
                     break;
                 case 5:
-                    if (has_geometry)
-                    {
-                        throw std::runtime_error("Vector Tile has a feature with a geometry and a raster, it must have only one of them");
-                    }
-                    if (has_raster)
                     {
-                        throw std::runtime_error("Vector Tile has a feature with multiple raster fields, it must have only one of them");
+                        if (has_geometry)
+                        {
+                            throw std::runtime_error("Vector Tile has a feature with a geometry and a raster, it must have only one of them");
+                        }
+                        if (has_raster)
+                        {
+                            throw std::runtime_error("Vector Tile has a feature with multiple raster fields, it must have only one of them");
+                        }
+                        has_raster = true;
+                        auto image_buffer = f.get_data();
+                        reader = std::unique_ptr<mapnik::image_reader>(mapnik::get_image_reader(image_buffer.first, image_buffer.second));
                     }
-                    has_raster = true;
-                    image_buffer = f.get_data();
                     break;
                 case 4:
                     if (has_raster)
@@ -206,7 +209,6 @@ feature_ptr tile_featureset_pbf<Filter>::next()
         }
         if (has_raster)
         {
-            std::unique_ptr<mapnik::image_reader> reader(mapnik::get_image_reader(image_buffer.first, image_buffer.second));
             if (reader.get())
             {
                 int image_width = reader->width();
diff --git a/src/vector_tile_geometry_decoder.ipp b/src/vector_tile_geometry_decoder.ipp
index 5a182f8..6023952 100644
--- a/src/vector_tile_geometry_decoder.ipp
+++ b/src/vector_tile_geometry_decoder.ipp
@@ -208,7 +208,7 @@ void decode_linestring(mapnik::geometry::geometry<typename T::value_type> & geom
         {
             break;
         } 
-        // else we are gauranteed it is a moveto
+        // else we are guaranteed it is a moveto
         x0 = x1;
         y0 = y1;
     }
@@ -264,7 +264,7 @@ void read_rings(std::vector<mapnik::geometry::linear_ring<typename T::value_type
         {
             if (cmd == T::close && version == 1)
             {
-                // Version 1 of the specification we were not clear on the command requirements for polygons
+                // Version 1 of the specification was not clear on the command requirements for polygons
                 // lets just to recover from this situation.
                 cmd = paths.ring_next(x0, y0, false);
                 if (cmd == T::end)
@@ -297,7 +297,7 @@ void read_rings(std::vector<mapnik::geometry::linear_ring<typename T::value_type
         {
             if (cmd == T::close && version == 1)
             {
-                // Version 1 of the specification we were not clear on the command requirements for polygons
+                // Version 1 of the specification was not clear on the command requirements for polygons
                 // lets just to recover from this situation.
                 cmd = paths.ring_next(x0, y0, false);
                 if (cmd == T::end)
@@ -780,7 +780,7 @@ typename GeometryPBF<T>::command GeometryPBF<T>::ring_next(value_type & rx,
                     throw std::runtime_error("Vector Tile has POLYGON with a MOVETO command that is given more then one pair of parameters or not enough parameters are provided");
                 }
                 --length;
-                // It is possible for the next to lines to throw because we can not check the length
+                // It is possible for the next two lines to throw because we can not check the length
                 // of the buffer to ensure that it is long enough.
                 // If an exception occurs it will likely be a end_of_buffer_exception with the text:
                 // "end of buffer exception"
diff --git a/src/vector_tile_geometry_simplifier.hpp b/src/vector_tile_geometry_simplifier.hpp
index 3cc117a..8977764 100644
--- a/src/vector_tile_geometry_simplifier.hpp
+++ b/src/vector_tile_geometry_simplifier.hpp
@@ -3,14 +3,12 @@
 
 // mapnik-vector-tile
 #include "vector_tile_config.hpp"
+#include "vector_tile_douglas_peucker.hpp"
 
 // mapnik
 #include <mapnik/geometry.hpp>
 #include <mapnik/geometry_adapters.hpp>
 
-// boost
-#include <boost/geometry/algorithms/simplify.hpp>
-
 namespace mapnik
 {
 
@@ -42,42 +40,94 @@ struct geometry_simplifier
 
     void operator() (mapnik::geometry::line_string<std::int64_t> & geom)
     {
-        mapnik::geometry::line_string<std::int64_t> simplified;
-        boost::geometry::simplify<
-                mapnik::geometry::line_string<std::int64_t>,
-                std::int64_t>
-                (geom, simplified, simplify_distance_);
-        next_(simplified);
+        if (geom.size() <= 2)
+        {
+            next_(geom);
+        }
+        else
+        {
+            mapnik::geometry::line_string<std::int64_t> simplified;
+            douglas_peucker<std::int64_t>(geom, std::back_inserter(simplified), simplify_distance_);
+            next_(simplified);
+        }
     }
 
     void operator() (mapnik::geometry::multi_line_string<std::int64_t> & geom)
     {
         mapnik::geometry::multi_line_string<std::int64_t> simplified;
-        boost::geometry::simplify<
-                mapnik::geometry::multi_line_string<std::int64_t>,
-                std::int64_t>
-                (geom, simplified, simplify_distance_);
+        for (auto const & g : geom)
+        {
+            if (g.size() <= 2)
+            {
+                simplified.push_back(g);
+            }
+            else
+            {
+                mapnik::geometry::line_string<std::int64_t> simplified_line;
+                douglas_peucker<std::int64_t>(g, std::back_inserter(simplified_line), simplify_distance_);
+                simplified.push_back(simplified_line);
+            }
+        }
         next_(simplified);
     }
 
     void operator() (mapnik::geometry::polygon<std::int64_t> & geom)
     {
         mapnik::geometry::polygon<std::int64_t> simplified;
-        boost::geometry::simplify<
-                mapnik::geometry::polygon<std::int64_t>,
-                std::int64_t>
-                (geom, simplified, simplify_distance_);
+        if (geom.exterior_ring.size() <= 4)
+        {
+            simplified.exterior_ring = geom.exterior_ring;
+        }
+        else
+        {
+            douglas_peucker<std::int64_t>(geom.exterior_ring, std::back_inserter(simplified.exterior_ring), simplify_distance_);
+        }
+        for (auto const & g : geom.interior_rings)
+        {
+            if (g.size() <= 4)
+            {
+                simplified.interior_rings.push_back(g);
+            }
+            else
+            {
+                mapnik::geometry::linear_ring<std::int64_t> simplified_ring;
+                douglas_peucker<std::int64_t>(g, std::back_inserter(simplified_ring), simplify_distance_);
+                simplified.interior_rings.push_back(simplified_ring);
+            }
+        }
         next_(simplified);
     }
 
-    void operator() (mapnik::geometry::multi_polygon<std::int64_t> & geom)
+    void operator() (mapnik::geometry::multi_polygon<std::int64_t> & multi_geom)
     {
-        mapnik::geometry::multi_polygon<std::int64_t> simplified;
-        boost::geometry::simplify<
-                mapnik::geometry::multi_polygon<std::int64_t>,
-                std::int64_t>
-                (geom, simplified, simplify_distance_);
-        next_(simplified);
+        mapnik::geometry::multi_polygon<std::int64_t> simplified_multi;
+        for (auto const & geom : multi_geom)
+        {
+            mapnik::geometry::polygon<std::int64_t> simplified;
+            if (geom.exterior_ring.size() <= 4)
+            {
+                simplified.exterior_ring = geom.exterior_ring;
+            }
+            else
+            {
+                douglas_peucker<std::int64_t>(geom.exterior_ring, std::back_inserter(simplified.exterior_ring), simplify_distance_);
+            }
+            for (auto const & g : geom.interior_rings)
+            {
+                if (g.size() <= 4)
+                {
+                    simplified.interior_rings.push_back(g);
+                }
+                else
+                {
+                    mapnik::geometry::linear_ring<std::int64_t> simplified_ring;
+                    douglas_peucker<std::int64_t>(g, std::back_inserter(simplified_ring), simplify_distance_);
+                    simplified.interior_rings.push_back(simplified_ring);
+                }
+            }
+            simplified_multi.push_back(simplified);
+        }
+        next_(simplified_multi);
     }
 
     void operator() (mapnik::geometry::geometry_collection<std::int64_t> & geom)
@@ -89,7 +139,7 @@ struct geometry_simplifier
     }
         
     NextProcessor & next_;
-    unsigned simplify_distance_;
+    double simplify_distance_;
 };
 
 } // end ns vector_tile_impl
diff --git a/src/vector_tile_is_valid.hpp b/src/vector_tile_is_valid.hpp
index 1ef6a82..ce83407 100644
--- a/src/vector_tile_is_valid.hpp
+++ b/src/vector_tile_is_valid.hpp
@@ -342,7 +342,7 @@ inline void layer_is_valid(protozero::pbf_reader & layer_msg,
             }
         }
     }
-    catch (...)
+    catch (std::exception const&)
     {
         errors.insert(INVALID_PBF_BUFFER);   
     }
@@ -386,93 +386,6 @@ inline void layer_is_valid(protozero::pbf_reader & layer_msg,
                           raster_feature_count);
 }
 
-// Check some common things that could be wrong with a tile
-// does not check all items in line with the v2 spec. For
-// example does does not check validity of geometry. It also does not 
-// verify that all feature attributes are valid.
-inline void tile_is_valid(protozero::pbf_reader & tile_msg, 
-                          std::set<validity_error> & errors,
-                          std::uint32_t & version,
-                          std::uint64_t & point_feature_count,
-                          std::uint64_t & line_feature_count,
-                          std::uint64_t & polygon_feature_count,
-                          std::uint64_t & unknown_feature_count,
-                          std::uint64_t & raster_feature_count)
-{
-    std::set<std::string> layer_names_set;
-    bool first_layer = true;
-    try
-    {
-        while (tile_msg.next())
-        {
-            switch (tile_msg.tag())
-            {
-                case Tile_Encoding::LAYERS:
-                    {
-                        protozero::pbf_reader layer_msg = tile_msg.get_message();
-                        std::string layer_name;
-                        std::uint32_t layer_version = 1;
-                        layer_is_valid(layer_msg, errors, layer_name, layer_version);
-                        if (!layer_name.empty())
-                        {
-                            auto p = layer_names_set.insert(layer_name);
-                            if (!p.second)
-                            {
-                                errors.insert(TILE_REPEATED_LAYER_NAMES);
-                            }
-                        }
-                        if (first_layer)
-                        {
-                            version = layer_version;
-                        }
-                        else
-                        {
-                            if (version != layer_version)
-                            {
-                                errors.insert(TILE_HAS_DIFFERENT_VERSIONS);
-                            }
-                        }
-                        first_layer = false;
-                    }
-                    break;
-                default:
-                    errors.insert(TILE_HAS_UNKNOWN_TAG);
-                    tile_msg.skip();
-                    break;
-            }
-        }
-    }
-    catch (...)
-    {
-        errors.insert(INVALID_PBF_BUFFER);
-    }
-}
-
-inline void tile_is_valid(protozero::pbf_reader & tile_msg, 
-                          std::set<validity_error> & errors)
-{
-    std::uint32_t version = 1;
-    std::uint64_t point_feature_count = 0;
-    std::uint64_t line_feature_count = 0;
-    std::uint64_t polygon_feature_count = 0;
-    std::uint64_t unknown_feature_count = 0;
-    std::uint64_t raster_feature_count = 0;
-    return tile_is_valid(tile_msg,
-                         errors,
-                         version,
-                         point_feature_count,
-                         line_feature_count,
-                         polygon_feature_count,
-                         unknown_feature_count,
-                         raster_feature_count);
-}
-
-inline void tile_is_valid(std::string const& tile, std::set<validity_error> & errors)
-{
-    protozero::pbf_reader tile_msg(tile);
-    tile_is_valid(tile_msg, errors);
-}
-
 } // end ns vector_tile_impl
 
 } // end ns mapnik
diff --git a/src/vector_tile_load_tile.hpp b/src/vector_tile_load_tile.hpp
index d83b6c1..5858c13 100644
--- a/src/vector_tile_load_tile.hpp
+++ b/src/vector_tile_load_tile.hpp
@@ -11,6 +11,7 @@
 // mapnik
 #include <mapnik/map.hpp>
 #include <mapnik/layer.hpp>
+#include <mapnik/make_unique.hpp>
 
 //protozero
 #include <protozero/pbf_reader.hpp>
@@ -19,6 +20,7 @@
 // std
 #include <set>
 #include <string>
+#include <memory>
 
 namespace mapnik
 {
@@ -55,7 +57,7 @@ void merge_from_buffer(merc_tile & t, const char * data, std::size_t size)
                     }
                     if (version == 1)
                     {
-                        // v1 tiles will be convereted to v2
+                        // v1 tiles will be converted to v2
                         protozero::pbf_reader layer_msg(layer_data);
                         ds_vec.push_back(std::make_shared<mapnik::vector_tile_impl::tile_datasource_pbf>(
                                     layer_msg,
@@ -83,7 +85,7 @@ void merge_from_buffer(merc_tile & t, const char * data, std::size_t size)
     std::int32_t prev_buffer_size = t.buffer_size();
     t.buffer_size(4096); // very large buffer so we don't miss any buffered points
     mapnik::Map map(t.tile_size(), t.tile_size(), "+init=epsg:3857");
-    for (auto ds : ds_vec)
+    for (auto const& ds : ds_vec)
     {    
         ds->set_envelope(t.get_buffered_extent());
         mapnik::layer lyr(ds->get_name(), "+init=epsg:3857");
diff --git a/test/data/simplified_geometry.geojson b/test/data/simplified_geometry.geojson
index 8ce0bdb..3e590aa 100644
--- a/test/data/simplified_geometry.geojson
+++ b/test/data/simplified_geometry.geojson
@@ -1 +1 @@
-{"type":"Polygon","coordinates":[[[160.36171875,11.2997786224589],[160.3828125,11.3011576095711],[160.408125,11.3039155638972],[160.408125,11.2997786224589],[160.425,11.3094313929343],[160.41234375,11.3411453475587],[160.3996875,11.3301148056307],[160.40953125,11.3700984927314],[160.39265625,11.3618264654176],[160.396875,11.3797488877286],[160.4053125,11.3893989555911],[160.40953125,11.3866418267411],[160.419375,11.4004272036667],[160.41515625,11.4059411672242],[160.419375,11.41145502372 [...]
\ No newline at end of file
+{"type":"Polygon","coordinates":[[[160.36171875,11.2997786224589],[160.3828125,11.3011576095711],[160.408125,11.3039155638972],[160.408125,11.2997786224589],[160.425,11.3094313929343],[160.41234375,11.3411453475587],[160.3996875,11.3301148056307],[160.40953125,11.3700984927314],[160.39265625,11.3618264654176],[160.396875,11.3797488877286],[160.4053125,11.3893989555911],[160.40953125,11.3866418267411],[160.419375,11.4004272036667],[160.41515625,11.4059411672242],[160.419375,11.41145502372 [...]
\ No newline at end of file
diff --git a/test/data/simplified_geometry_pbf.geojson b/test/data/simplified_geometry_pbf.geojson
index 8ce0bdb..3e590aa 100644
--- a/test/data/simplified_geometry_pbf.geojson
+++ b/test/data/simplified_geometry_pbf.geojson
@@ -1 +1 @@
-{"type":"Polygon","coordinates":[[[160.36171875,11.2997786224589],[160.3828125,11.3011576095711],[160.408125,11.3039155638972],[160.408125,11.2997786224589],[160.425,11.3094313929343],[160.41234375,11.3411453475587],[160.3996875,11.3301148056307],[160.40953125,11.3700984927314],[160.39265625,11.3618264654176],[160.396875,11.3797488877286],[160.4053125,11.3893989555911],[160.40953125,11.3866418267411],[160.419375,11.4004272036667],[160.41515625,11.4059411672242],[160.419375,11.41145502372 [...]
\ No newline at end of file
+{"type":"Polygon","coordinates":[[[160.36171875,11.2997786224589],[160.3828125,11.3011576095711],[160.408125,11.3039155638972],[160.408125,11.2997786224589],[160.425,11.3094313929343],[160.41234375,11.3411453475587],[160.3996875,11.3301148056307],[160.40953125,11.3700984927314],[160.39265625,11.3618264654176],[160.396875,11.3797488877286],[160.4053125,11.3893989555911],[160.40953125,11.3866418267411],[160.419375,11.4004272036667],[160.41515625,11.4059411672242],[160.419375,11.41145502372 [...]
\ No newline at end of file

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapnik-vector-tile.git



More information about the Pkg-grass-devel mailing list