[mapnik-vector-tile] 09/11: Imported Upstream version 0.3.4+dfsg

Jérémy Lal kapouer at moszumanska.debian.org
Sun Feb 9 20:41:19 UTC 2014


This is an automated email from the git hooks/post-receive script.

kapouer pushed a commit to branch master
in repository mapnik-vector-tile.

commit f7af37347e112e080cda1913fc1496f8e45360ea
Author: Jérémy Lal <kapouer at melix.org>
Date:   Sun Feb 9 21:03:03 2014 +0100

    Imported Upstream version 0.3.4+dfsg
---
 CHANGELOG.md                   |  4 ++++
 README.md                      |  2 +-
 package.json                   |  2 +-
 proto/vector_tile.proto        |  4 ++--
 src/vector_tile_datasource.hpp | 37 ++++++++++++++++++++++++-------------
 5 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2c3b8c7..60593b4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changlog
 
+## 0.3.4
+
+ - Fixed tile_datasource geometry decoding such that it respects multipart geometries (#19)
+
 ## 0.3.3
 
  - Added support in tileinfo demo program for reading zlib compressed tiles
diff --git a/README.md b/README.md
index dcb0bbc..445fbf5 100644
--- a/README.md
+++ b/README.md
@@ -36,7 +36,7 @@ as multiple features, each storing a single geometry part.
 Geometries are stored as an x,y,command stream (where `command` is a rendering command
 like move_to or line_to). Geometries are clipped, reprojected into the map srs,
 converted to screen coordinates, and [delta](http://en.wikipedia.org/wiki/Delta_encoding)
-and [zigzag](http://en.wikipedia.org/wiki/Delta_encoding) encoded.
+and [zigzag](https://developers.google.com/protocol-buffers/docs/encoding#types) encoded.
 
 Feature attributes are encoded as key:value pairs which are dictionary encoded
 at the layer level for compact storage of any repeated keys or values. Values use variant
diff --git a/package.json b/package.json
index 65c3553..41602ee 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "mapnik-vector-tile",
-    "version": "0.3.3",
+    "version": "0.3.4",
     "description": "Mapnik vector tile API",
     "main": "./package.json",
     "repository"   :  {
diff --git a/proto/vector_tile.proto b/proto/vector_tile.proto
index e25ac3b..110f37c 100644
--- a/proto/vector_tile.proto
+++ b/proto/vector_tile.proto
@@ -48,8 +48,8 @@ message tile {
                 // - ClosePath: 7   (no parameters follow)
                 //
                 // Ex.: MoveTo(3, 6), LineTo(8, 12), LineTo(20, 34), ClosePath
-                // Encoded as: [ 9 3 6 18 5 6 12 22 7 ]
-                //                                  == command type 7 (ClosePath)
+                // Encoded as: [ 9 3 6 18 5 6 12 22 15 ]
+                //                                  == command type 7 (ClosePath), length 1
                 //                             ===== relative LineTo(+12, +22) == LineTo(20, 34)
                 //                         === relative LineTo(+5, +6) == LineTo(8, 12)
                 //                      == [00010 010] = command type 2 (LineTo), length 2
diff --git a/src/vector_tile_datasource.hpp b/src/vector_tile_datasource.hpp
index 7105a3d..362e8e9 100644
--- a/src/vector_tile_datasource.hpp
+++ b/src/vector_tile_datasource.hpp
@@ -77,15 +77,26 @@ namespace mapnik { namespace vector {
             {
                 mapnik::vector::tile_feature const& f = layer_.features(itr_);
                 mapnik::value_integer feature_id = itr_++;
-                std::auto_ptr<mapnik::geometry_type> geom(
-                    new mapnik::geometry_type(
+                // if encoded feature was given an id, respect it
+                // https://github.com/mapbox/mapnik-vector-tile/issues/17
+                // https://github.com/mapbox/mapnik-vector-tile/issues/18
+                if (f.has_id())
+                {
+                    feature_id = f.id();
+                }
+                mapnik::feature_ptr feature(
+                    mapnik::feature_factory::create(ctx_,feature_id));
+                feature->paths().push_back(new mapnik::geometry_type(
                         mapnik::eGeomType(f.type())));
+                mapnik::geometry_type * geom = &feature->paths().front();
                 int cmd = -1;
                 const int cmd_bits = 3;
                 unsigned length = 0;
                 double x = tile_x_, y = tile_y_;
                 bool first = true;
                 mapnik::box2d<double> envelope;
+                double first_x=0;
+                double first_y=0;
                 for (int k = 0; k < f.geometry_size();)
                 {
                     if (!length) {
@@ -103,6 +114,16 @@ namespace mapnik { namespace vector {
                             dy = ((dy >> 1) ^ (-(dy & 1)));
                             x += (static_cast<double>(dx) / scale_);
                             y -= (static_cast<double>(dy) / scale_);
+                            if (cmd == mapnik::SEG_MOVETO)
+                            {
+                                if (!first) {
+                                    feature->paths().push_back(new mapnik::geometry_type(
+                                        mapnik::eGeomType(f.type())));
+                                    geom = &feature->paths().back();
+                                }
+                                first_x = x;
+                                first_y = y;
+                            }
                             if (first)
                             {
                                 envelope.init(x,y,x,y);
@@ -116,6 +137,7 @@ namespace mapnik { namespace vector {
                         }
                         else if (cmd == (mapnik::SEG_CLOSE & ((1 << cmd_bits) - 1)))
                         {
+                            geom->push_vertex(first_x, first_y, mapnik::SEG_LINETO);
                             geom->push_vertex(0, 0, mapnik::SEG_CLOSE);
                         }
                         else
@@ -128,17 +150,6 @@ namespace mapnik { namespace vector {
                 {
                     continue;
                 }
-                // if encoded feature was given an id, respect it
-                // TODO: id should not be optional!
-                // https://github.com/mapbox/mapnik-vector-tile/issues/17
-                // https://github.com/mapbox/mapnik-vector-tile/issues/18
-                if (f.has_id())
-                {
-                    feature_id = f.id();
-                }
-                mapnik::feature_ptr feature(
-                    mapnik::feature_factory::create(ctx_,feature_id));
-                feature->paths().push_back(geom);
 
                 // attributes
                 for (int m = 0; m < f.tags_size(); m += 2)

-- 
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