[mapnik-vector-tile] 01/11: Imported Upstream version 0.3.3+dfsg
Jérémy Lal
kapouer at moszumanska.debian.org
Sun Feb 9 20:41:18 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 20d677b5461d843d2e59d56b40503238703f060a
Author: Jérémy Lal <kapouer at melix.org>
Date: Sun Feb 9 19:21:35 2014 +0100
Imported Upstream version 0.3.3+dfsg
---
.travis.yml | 31 ++++++++++
CHANGELOG.md | 6 ++
README.md | 8 ++-
examples/c++/Makefile | 7 ++-
examples/c++/tileinfo.cpp | 123 ++++++++++++++++++++++++++++++++--------
package.json | 2 +-
src/vector_tile_backend_pbf.hpp | 2 +
src/vector_tile_compression.hpp | 65 +++++++++++++++++++++
src/vector_tile_util.hpp | 7 ++-
test/vector_tile.cpp | 2 +-
10 files changed, 223 insertions(+), 30 deletions(-)
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..a422bfc
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,31 @@
+language: cpp
+
+compiler:
+ - clang
+ - gcc
+
+before_install:
+ - sudo apt-add-repository --yes ppa:mapnik/v2.2.0
+ - sudo apt-add-repository --yes ppa:mapnik/nightly-2.3
+ - sudo apt-get update -qq
+
+install:
+ - sudo apt-get -qq install libprotobuf7 libprotobuf-dev protobuf-compiler
+
+before_script:
+ - sudo apt-get -qq install libmapnik=2.2.0* mapnik-utils=2.2.0* libmapnik-dev=2.2.0*
+ - make clean
+ - make test
+ - sudo apt-get purge libmapnik=2.2.0* mapnik-utils=2.2.0* libmapnik-dev=2.2.0*
+
+script:
+ - sudo apt-get -qq install libmapnik=2.3.0* mapnik-utils=2.3.0* libmapnik-dev=2.3.0*
+ - make clean
+ - make test
+ - sudo apt-get purge libmapnik=2.3.0* mapnik-utils=2.3.0* libmapnik-dev=2.3.0*
+
+notifications:
+ irc:
+ channels:
+ - "irc.freenode.org#mapnik"
+ use_notice: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e0ce235..2c3b8c7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changlog
+## 0.3.3
+
+ - Added support in tileinfo demo program for reading zlib compressed tiles
+ - Removed dependence on clipper.hp unless `-DCONV_CLIPPER` is defined in `CXXFLAGS`
+ - Upgraded bundled cache.hpp test framework to `1.0 build 8` (kapouer)
+
## 0.3.2
- Fixed `mapnik::vector::tile_datasource` to respect the feature id if known
diff --git a/README.md b/README.md
index 6e713a8..dcb0bbc 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,8 @@
## mapnik-vector-tile
-A high performance library for working with vector tiles from the
-team at [MapBox](http://mapbox.com/about/team/).
+[](http://travis-ci.org/mapbox/mapnik-vector-tile)
+
+A high performance library for working with vector tiles with Mapnik.
Provides C++ headers that support rendering geodata into vector tiles
and rendering vector tiles into images.
@@ -89,6 +90,7 @@ See examples in examples/c++
These require the protobuf python bindings and the `rtree` library
which can be installed like:
+ sudo apt-get install libspatialindex-dev
pip install protobuf rtree
To build and test the python example code do:
@@ -109,4 +111,4 @@ Run the example code:
- http://mike.teczno.com/notes/postgreslessness-mapnik-vectiles.html
- https://github.com/mdaines/ceramic
-- https://github.com/opensciencemap/VectorTileMap
\ No newline at end of file
+- https://github.com/opensciencemap/VectorTileMap
diff --git a/examples/c++/Makefile b/examples/c++/Makefile
index e3f1353..d2870c9 100755
--- a/examples/c++/Makefile
+++ b/examples/c++/Makefile
@@ -6,10 +6,15 @@ LDFLAGS := $(LDFLAGS) # inherit from env
all: tileinfo
tileinfo: tileinfo.cpp ../../src/vector_tile.pb.cc
- $(CXX) tileinfo.cpp ../../src/vector_tile.pb.cc -o tileinfo -lprotobuf-lite
+ $(CXX) tileinfo.cpp ../../src/vector_tile.pb.cc -o tileinfo -lprotobuf-lite -lz
test:
./tileinfo ../data/14_8716_8015.vector.pbf
+ ./tileinfo ../data/14_2620_6331.vector.pbf.z
+
+install:
+ cp ./tileinfo /usr/local/bin/tileinfo
+ chmod +x /usr/local/bin/tileinfo
clean:
@rm -f ./tileinfo
diff --git a/examples/c++/tileinfo.cpp b/examples/c++/tileinfo.cpp
index d8b17e0..65b90c2 100644
--- a/examples/c++/tileinfo.cpp
+++ b/examples/c++/tileinfo.cpp
@@ -1,25 +1,30 @@
#include "../../src/vector_tile.pb.h"
+#include "../../src/vector_tile_compression.hpp"
#include <vector>
#include <iostream>
#include <fstream>
#include <stdexcept>
-
int main(int argc, char** argv)
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
std::vector<std::string> args;
+ bool verbose = false;
for (int i=1;i<argc;++i)
{
- args.push_back(argv[i]);
+ if (strcmp(argv[i], "--verbose") == 0) {
+ verbose = true;
+ } else {
+ args.push_back(argv[i]);
+ }
}
if (args.empty())
{
- std::clog << "please pass the path to an uncompressed protobuf tile (.vector.pbf)\n";
+ std::clog << "please pass the path to an uncompressed or zlib-compressed protobuf tile\n";
return -1;
}
-
+
try
{
std::string filename = args[0];
@@ -35,30 +40,102 @@ int main(int argc, char** argv)
// now attemp to open protobuf
mapnik::vector::tile tile;
- if (!tile.ParseFromString(message))
+ if (mapnik::vector::is_compressed(message))
{
- std::clog << "failed to parse protobuf\n";
+ std::string uncompressed;
+ mapnik::vector::decompress(message,uncompressed);
+ if (!tile.ParseFromString(uncompressed))
+ {
+ std::clog << "failed to parse compressed protobuf\n";
+ }
}
-
- std::cout << "number of layers: " << tile.layers_size() << "\n";
-
- for (unsigned i=0;i<tile.layers_size();++i)
+ else
{
- mapnik::vector::tile_layer const& layer = tile.layers(i);
- std::cout << " layer: " << i << "\n";
- std::cout << " layer name: " << layer.name() << "\n";
- std::cout << " layer extent: " << layer.extent() << "\n";
- std::cout << " layer features: " << layer.features_size() << "\n";
- for (unsigned j=0;j<layer.features_size();++j)
+ if (!tile.ParseFromString(message))
{
- mapnik::vector::tile_feature const& feature = layer.features(j);
- std::cout << " feature: " << j << "\n";
- std::cout << " feature id: " << feature.id() << "\n";
- std::cout << " feature type: " << feature.type() << "\n";
- // TODO - dump tags and geometries
+ std::clog << "failed to parse protobuf\n";
+ }
+ }
+ if (!verbose) {
+ std::cout << "layers: " << tile.layers_size() << "\n";
+ for (unsigned i=0;i<tile.layers_size();++i)
+ {
+ mapnik::vector::tile_layer const& layer = tile.layers(i);
+ std::cout << layer.name() << ":\n";
+ std::cout << " version: " << layer.version() << "\n";
+ std::cout << " extent: " << layer.extent() << "\n";
+ std::cout << " features: " << layer.features_size() << "\n";
+ std::cout << " keys: " << layer.keys_size() << "\n";
+ std::cout << " values: " << layer.values_size() << "\n";
+ }
+ } else {
+ for (unsigned i=0;i<tile.layers_size();++i)
+ {
+ mapnik::vector::tile_layer const& layer = tile.layers(i);
+ std::cout << "layer: " << layer.name() << "\n";
+ std::cout << " version: " << layer.version() << "\n";
+ std::cout << " extent: " << layer.extent() << "\n";
+ std::cout << " keys: ";
+ for (unsigned i=0;i<layer.keys_size();++i)
+ {
+ std::string const& key = layer.keys(i);
+ std::cout << key << ",";
+ }
+ std::cout << "\n";
+ std::cout << " values: ";
+ for (unsigned i=0;i<layer.values_size();++i)
+ {
+ mapnik::vector::tile_value const & value = layer.values(i);
+ if (value.has_string_value()) {
+ std::cout << "'" << value.string_value();
+ } else if (value.has_int_value()) {
+ std::cout << value.int_value();
+ } else if (value.has_double_value()) {
+ std::cout << value.double_value();
+ } else if (value.has_float_value()) {
+ std::cout << value.float_value();
+ } else if (value.has_bool_value()) {
+ std::cout << value.bool_value();
+ } else if (value.has_sint_value()) {
+ std::cout << value.sint_value();
+ } else if (value.has_uint_value()) {
+ std::cout << value.uint_value();
+ } else {
+ std::cout << "null";
+ }
+ if (i<layer.values_size()-1) {
+ std::cout << ",";
+ }
+ }
+ std::cout << "\n";
+ for (unsigned i=0;i<layer.features_size();++i)
+ {
+ mapnik::vector::tile_feature const & feat = layer.features(i);
+ std::cout << " feature: " << feat.id() << " " << feat.type() << "\n";
+ std::cout << " tags: ";
+ for (unsigned j=0;j<feat.tags_size();++j)
+ {
+ uint32_t tag = feat.tags(j);
+ std::cout << tag;
+ if (j<feat.tags_size()-1) {
+ std::cout << ",";
+ }
+ }
+ std::cout << "\n";
+ std::cout << " geometries: ";
+ for (unsigned j=0;j<feat.geometry_size();++j)
+ {
+ uint32_t geom = feat.geometry(j);
+ std::cout << geom;
+ if (j<feat.geometry_size()-1) {
+ std::cout << ",";
+ }
+ }
+ std::cout << "\n";
+ }
+ std::cout << "\n";
}
}
-
}
catch (std::exception const& ex)
{
@@ -67,4 +144,4 @@ int main(int argc, char** argv)
}
google::protobuf::ShutdownProtobufLibrary();
-}
\ No newline at end of file
+}
diff --git a/package.json b/package.json
index e949c37..65c3553 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "mapnik-vector-tile",
- "version": "0.3.2",
+ "version": "0.3.3",
"description": "Mapnik vector tile API",
"main": "./package.json",
"repository" : {
diff --git a/src/vector_tile_backend_pbf.hpp b/src/vector_tile_backend_pbf.hpp
index d67f3db..717c9be 100644
--- a/src/vector_tile_backend_pbf.hpp
+++ b/src/vector_tile_backend_pbf.hpp
@@ -91,6 +91,8 @@ namespace mapnik { namespace vector {
current_feature_ = current_layer_->add_features();
x_ = y_ = 0;
+ // TODO - encode as sint64: (n << 1) ^ ( n >> 63)
+ // test current behavior with negative numbers
current_feature_->set_id(feature.id());
feature_kv_iterator itr = feature.begin();
diff --git a/src/vector_tile_compression.hpp b/src/vector_tile_compression.hpp
new file mode 100644
index 0000000..1afd618
--- /dev/null
+++ b/src/vector_tile_compression.hpp
@@ -0,0 +1,65 @@
+#include <stdexcept>
+#include <zlib.h>
+
+namespace mapnik { namespace vector {
+
+inline bool is_compressed(std::string const& data)
+{
+ return data.size() > 2 && (uint8_t)data[0] == 0x78 && (uint8_t)data[1] == 0x9C;
+}
+
+inline void decompress(std::string const& input, std::string & output)
+{
+ z_stream inflate_s;
+ inflate_s.zalloc = Z_NULL;
+ inflate_s.zfree = Z_NULL;
+ inflate_s.opaque = Z_NULL;
+ inflate_s.avail_in = 0;
+ inflate_s.next_in = Z_NULL;
+ inflateInit(&inflate_s);
+ inflate_s.next_in = (Bytef *)input.data();
+ inflate_s.avail_in = input.size();
+ size_t length = 0;
+ do {
+ output.resize(length + 2 * input.size());
+ inflate_s.avail_out = 2 * input.size();
+ inflate_s.next_out = (Bytef *)(output.data() + length);
+ int ret = inflate(&inflate_s, Z_FINISH);
+ if (ret != Z_STREAM_END && ret != Z_OK && ret != Z_BUF_ERROR) {
+ throw std::runtime_error(inflate_s.msg);
+ }
+
+ length += (2 * input.size() - inflate_s.avail_out);
+ } while (inflate_s.avail_out == 0);
+ inflateEnd(&inflate_s);
+ output.resize(length);
+}
+
+inline void compress(std::string const& input, std::string & output)
+{
+ z_stream deflate_s;
+ deflate_s.zalloc = Z_NULL;
+ deflate_s.zfree = Z_NULL;
+ deflate_s.opaque = Z_NULL;
+ deflate_s.avail_in = 0;
+ deflate_s.next_in = Z_NULL;
+ deflateInit(&deflate_s, Z_DEFAULT_COMPRESSION);
+ deflate_s.next_in = (Bytef *)input.data();
+ deflate_s.avail_in = input.size();
+ size_t length = 0;
+ do {
+ size_t increase = input.size() / 2 + 1024;
+ output.resize(length + increase);
+ deflate_s.avail_out = increase;
+ deflate_s.next_out = (Bytef *)(output.data() + length);
+ int ret = deflate(&deflate_s, Z_FINISH);
+ if (ret != Z_STREAM_END && ret != Z_OK && ret != Z_BUF_ERROR) {
+ throw std::runtime_error(deflate_s.msg);
+ }
+ length += (increase - deflate_s.avail_out);
+ } while (deflate_s.avail_out == 0);
+ deflateEnd(&deflate_s);
+ output.resize(length);
+}
+
+}}
diff --git a/src/vector_tile_util.hpp b/src/vector_tile_util.hpp
index 06e8d55..25611f7 100644
--- a/src/vector_tile_util.hpp
+++ b/src/vector_tile_util.hpp
@@ -1,7 +1,6 @@
#ifndef __MAPNIK_VECTOR_TILE_UTIL_H__
#define __MAPNIK_VECTOR_TILE_UTIL_H__
-#include "clipper.hpp"
#include "vector_tile.pb.h"
#include <mapnik/vertex.hpp>
#include <mapnik/box2d.hpp>
@@ -9,8 +8,13 @@
#include <stdexcept>
#include <string>
+#ifdef CONV_CLIPPER
+#include "clipper.hpp"
+#endif
+
namespace mapnik { namespace vector {
+#ifdef CONV_CLIPPER
bool is_solid_clipper(mapnik::vector::tile const& tile, std::string & key)
{
ClipperLib::Clipper clipper;
@@ -119,6 +123,7 @@ namespace mapnik { namespace vector {
// not on the border of the bbox.
return true;
}
+#endif
bool is_solid_extent(mapnik::vector::tile const& tile, std::string & key)
{
diff --git a/test/vector_tile.cpp b/test/vector_tile.cpp
index 66b6aac..8b4d8a6 100644
--- a/test/vector_tile.cpp
+++ b/test/vector_tile.cpp
@@ -219,7 +219,7 @@ int main (int argc, char* const argv[])
mapnik::vector::spherical_mercator merc(256);
merc.xyz(x,y,z,minx,miny,maxx,maxy);
bbox.init(minx,miny,maxx,maxy);
- int result = Catch::Main( argc, argv );
+ int result = Catch::Session().run( argc, argv );
if (!result) printf("\x1b[1;32m ✓ \x1b[0m\n");
google::protobuf::ShutdownProtobufLibrary();
return result;
--
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