This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository mapnik.
commit a84fefb1e9a4d9373c5244392e4a90daeb917d28 Author: Bas Couwenberg <[email protected]> Date: Thu Aug 18 19:51:42 2016 +0200 Imported Upstream version 3.0.12~rc4+ds --- bootstrap.sh | 4 +-- demo/c++/rundemo.cpp | 2 +- include/mapnik/feature_kv_iterator.hpp | 3 +- include/mapnik/feature_layer_desc.hpp | 9 ++++++ include/mapnik/featureset.hpp | 14 ++++++--- plugins/input/csv/csv_datasource.cpp | 2 +- plugins/input/geojson/geojson_datasource.cpp | 19 ++++++------ plugins/input/geojson/geojson_datasource.hpp | 2 +- plugins/input/ogr/ogr_datasource.cpp | 4 +-- plugins/input/pgraster/pgraster_datasource.cpp | 6 ++-- plugins/input/postgis/postgis_datasource.cpp | 6 ++-- plugins/input/raster/raster_datasource.cpp | 2 +- plugins/input/sqlite/sqlite_datasource.cpp | 4 +-- plugins/input/topojson/topojson_datasource.cpp | 2 +- src/map.cpp | 2 +- src/svg/svg_parser.cpp | 1 - test/unit/datasource/geojson.cpp | 43 +++++++++++++++++++++++--- 17 files changed, 86 insertions(+), 39 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 62eb1ec..113d60f 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -30,7 +30,6 @@ function install() { MASON_PLATFORM_ID=$(mason env MASON_PLATFORM_ID) if [[ ! -d ./mason_packages/${MASON_PLATFORM_ID}/${1}/${2} ]]; then mason install $1 $2 - mason link $1 $2 if [[ ${3:-false} != false ]]; then LA_FILE=$(mason prefix $1 $2)/lib/$3.la if [[ -f ${LA_FILE} ]]; then @@ -40,6 +39,7 @@ function install() { fi fi fi + mason link $1 $2 } ICU_VERSION="55.1" @@ -60,7 +60,7 @@ function install_mason_deps() { install protobuf 2.6.1 & # technically protobuf is not a mapnik core dep, but installing # here by default helps make mapnik-vector-tile builds easier - install webp 0.4.2 libwebp & + install webp 0.5.0 libwebp & install gdal 1.11.2 libgdal & install boost 1.61.0 & install boost_libsystem 1.61.0 & diff --git a/demo/c++/rundemo.cpp b/demo/c++/rundemo.cpp index c20c288..ff7907d 100644 --- a/demo/c++/rundemo.cpp +++ b/demo/c++/rundemo.cpp @@ -55,7 +55,7 @@ int main ( int, char** ) try { std::cout << " running demo ... \n"; datasource_cache::instance().register_datasources("plugins/input/"); - freetype_engine::register_font("fonts/dejavu-fonts-ttf-2.35/ttf/DejaVuSans.ttf"); + freetype_engine::register_font("fonts/dejavu-fonts-ttf-2.37/ttf/DejaVuSans.ttf"); Map m(800,600); m.set_background(parse_color("white")); diff --git a/include/mapnik/feature_kv_iterator.hpp b/include/mapnik/feature_kv_iterator.hpp index 77b292f..1def2e7 100644 --- a/include/mapnik/feature_kv_iterator.hpp +++ b/include/mapnik/feature_kv_iterator.hpp @@ -46,12 +46,11 @@ class feature_impl; class MAPNIK_DECL feature_kv_iterator : public boost::iterator_facade<feature_kv_iterator, - std::tuple<std::string , value> const, + std::tuple<std::string, value> const, boost::forward_traversal_tag> { public: using value_type = std::tuple<std::string,value>; - feature_kv_iterator (feature_impl const& f, bool begin = false); private: friend class boost::iterator_core_access; diff --git a/include/mapnik/feature_layer_desc.hpp b/include/mapnik/feature_layer_desc.hpp index 9d1186a..cd69d83 100644 --- a/include/mapnik/feature_layer_desc.hpp +++ b/include/mapnik/feature_layer_desc.hpp @@ -94,12 +94,21 @@ public: { return extra_params_; } + bool has_name(std::string const& name) const { auto result = std::find_if(std::begin(descriptors_), std::end(descriptors_), [&name](attribute_descriptor const& desc) { return name == desc.get_name();}); return result != std::end(descriptors_); } + void order_by_name() + { + std::sort(std::begin(descriptors_), std::end(descriptors_), + [](attribute_descriptor const& d0, attribute_descriptor const& d1) + { + return d0.get_name() < d1.get_name(); + }); + } private: std::string name_; std::string encoding_; diff --git a/include/mapnik/featureset.hpp b/include/mapnik/featureset.hpp index 6886d87..a6ad4e8 100644 --- a/include/mapnik/featureset.hpp +++ b/include/mapnik/featureset.hpp @@ -41,21 +41,25 @@ struct MAPNIK_DECL Featureset : private util::noncopyable virtual ~Featureset() {} }; - -struct MAPNIK_DECL empty_featureset final : Featureset +struct MAPNIK_DECL invalid_featureset final : Featureset { feature_ptr next() { return feature_ptr(); } - ~empty_featureset() {} + ~invalid_featureset() {} }; using featureset_ptr = std::shared_ptr<Featureset>; -inline featureset_ptr make_empty_featureset() +inline featureset_ptr make_invalid_featureset() +{ + return std::make_shared<invalid_featureset>(); +} + +inline bool is_valid(featureset_ptr const& ptr) { - return std::make_shared<empty_featureset>(); + return (dynamic_cast<invalid_featureset*>(ptr.get()) == nullptr) ? true : false; } } diff --git a/plugins/input/csv/csv_datasource.cpp b/plugins/input/csv/csv_datasource.cpp index 4a246b4..3229405 100644 --- a/plugins/input/csv/csv_datasource.cpp +++ b/plugins/input/csv/csv_datasource.cpp @@ -431,7 +431,7 @@ mapnik::featureset_ptr csv_datasource::features(mapnik::query const& q) const return std::make_shared<csv_index_featureset>(filename_, filter, locator_, separator_, quote_, headers_, ctx_); } } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } mapnik::featureset_ptr csv_datasource::features_at_point(mapnik::coord2d const& pt, double tol) const diff --git a/plugins/input/geojson/geojson_datasource.cpp b/plugins/input/geojson/geojson_datasource.cpp index d2ebc2d..9027087 100644 --- a/plugins/input/geojson/geojson_datasource.cpp +++ b/plugins/input/geojson/geojson_datasource.cpp @@ -116,7 +116,8 @@ geojson_datasource::geojson_datasource(parameters const& params) inline_string_(), extent_(), features_(), - tree_(nullptr) + tree_(nullptr), + num_features_to_query_(*params.get<mapnik::value_integer>("num_features_to_query",5)) { boost::optional<std::string> inline_string = params.get<std::string>("inline"); if (inline_string) @@ -233,7 +234,7 @@ void geojson_datasource::initialise_disk_index(std::string const& filename) mapnik::util::file file(filename_); if (!file) throw mapnik::datasource_exception("GeoJSON Plugin: could not open: '" + filename_ + "'"); - + mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>(); for (auto const& pos : positions) { std::fseek(file.get(), pos.first, SEEK_SET); @@ -242,8 +243,7 @@ void geojson_datasource::initialise_disk_index(std::string const& filename) std::fread(record.data(), pos.second, 1, file.get()); auto const* start = record.data(); auto const* end = start + record.size(); - mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>(); - mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,1)); + mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx, -1)); using namespace boost::spirit; standard::space_type space; if (!boost::spirit::qi::phrase_parse(start, end, @@ -254,6 +254,7 @@ void geojson_datasource::initialise_disk_index(std::string const& filename) } initialise_descriptor(feature); } + desc_.order_by_name(); } template <typename Iterator> @@ -314,6 +315,7 @@ void geojson_datasource::initialise_index(Iterator start, Iterator end) tree_ = std::make_unique<spatial_index_type>(boxes); // calculate total extent std::size_t feature_count = 0; + mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>(); for (auto const& item : boxes) { auto const& box = std::get<0>(item); @@ -326,7 +328,6 @@ void geojson_datasource::initialise_index(Iterator start, Iterator end) // NOTE: this doesn't yield correct answer for geoJSON in general, just an indication Iterator itr2 = start + geometry_index.first; Iterator end2 = itr2 + geometry_index.second; - mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>(); mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx,-1)); // temp feature if (!boost::spirit::qi::phrase_parse(itr2, end2, (geojson_datasource_static_feature_grammar)(boost::phoenix::ref(*feature)), space) @@ -339,6 +340,7 @@ void geojson_datasource::initialise_index(Iterator start, Iterator end) } } } + desc_.order_by_name(); } template <typename Iterator> @@ -355,7 +357,7 @@ void geojson_datasource::parse_geojson(Iterator start, Iterator end) try { bool result = boost::spirit::qi::phrase_parse(itr, end, (geojson_datasource_static_fc_grammar) - (boost::phoenix::ref(ctx),boost::phoenix::ref(start_id), boost::phoenix::ref(callback)), + (boost::phoenix::ref(ctx), boost::phoenix::ref(start_id), boost::phoenix::ref(callback)), space); if (!result || itr != end) { @@ -457,7 +459,7 @@ boost::optional<mapnik::datasource_geometry_t> geojson_datasource::get_geometry_ mapnik::util::file file(filename_); if (!file) throw mapnik::datasource_exception("GeoJSON Plugin: could not open: '" + filename_ + "'"); - + mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>(); for (auto const& pos : positions) { std::fseek(file.get(), pos.first, SEEK_SET); @@ -466,7 +468,6 @@ boost::optional<mapnik::datasource_geometry_t> geojson_datasource::get_geometry_ std::fread(record.data(), pos.second, 1, file.get()); auto const* start = record.data(); auto const* end = start + record.size(); - mapnik::context_ptr ctx = std::make_shared<mapnik::context_type>(); mapnik::feature_ptr feature(mapnik::feature_factory::create(ctx, -1)); // temp feature using namespace boost::spirit; standard::space_type space; @@ -588,7 +589,7 @@ mapnik::featureset_ptr geojson_datasource::features(mapnik::query const& q) cons } // otherwise return an empty featureset - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } mapnik::featureset_ptr geojson_datasource::features_at_point(mapnik::coord2d const& pt, double tol) const diff --git a/plugins/input/geojson/geojson_datasource.hpp b/plugins/input/geojson/geojson_datasource.hpp index a50bd95..5ba36a6 100644 --- a/plugins/input/geojson/geojson_datasource.hpp +++ b/plugins/input/geojson/geojson_datasource.hpp @@ -104,7 +104,7 @@ private: std::unique_ptr<spatial_index_type> tree_; bool cache_features_ = true; bool has_disk_index_ = false; - const std::size_t num_features_to_query_ = 5; + const std::size_t num_features_to_query_; }; diff --git a/plugins/input/ogr/ogr_datasource.cpp b/plugins/input/ogr/ogr_datasource.cpp index 2943962..706a376 100644 --- a/plugins/input/ogr/ogr_datasource.cpp +++ b/plugins/input/ogr/ogr_datasource.cpp @@ -560,7 +560,7 @@ featureset_ptr ogr_datasource::features(query const& q) const } } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } featureset_ptr ogr_datasource::features_at_point(coord2d const& pt, double tol) const @@ -603,5 +603,5 @@ featureset_ptr ogr_datasource::features_at_point(coord2d const& pt, double tol) } } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } diff --git a/plugins/input/pgraster/pgraster_datasource.cpp b/plugins/input/pgraster/pgraster_datasource.cpp index ced1810..e6eddf7 100644 --- a/plugins/input/pgraster/pgraster_datasource.cpp +++ b/plugins/input/pgraster/pgraster_datasource.cpp @@ -998,7 +998,7 @@ featureset_ptr pgraster_datasource::features_with_context(query const& q,process } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } @@ -1011,7 +1011,7 @@ featureset_ptr pgraster_datasource::features_at_point(coord2d const& pt, double if (pool) { shared_ptr<Connection> conn = pool->borrowObject(); - if (!conn) return mapnik::make_empty_featureset(); + if (!conn) return mapnik::make_invalid_featureset(); if (conn->isOK()) { @@ -1082,7 +1082,7 @@ featureset_ptr pgraster_datasource::features_at_point(coord2d const& pt, double } } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } box2d<double> pgraster_datasource::envelope() const diff --git a/plugins/input/postgis/postgis_datasource.cpp b/plugins/input/postgis/postgis_datasource.cpp index 2653e57..10ce521 100644 --- a/plugins/input/postgis/postgis_datasource.cpp +++ b/plugins/input/postgis/postgis_datasource.cpp @@ -942,7 +942,7 @@ featureset_ptr postgis_datasource::features_with_context(query const& q,processo } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } @@ -955,7 +955,7 @@ featureset_ptr postgis_datasource::features_at_point(coord2d const& pt, double t if (pool) { shared_ptr<Connection> conn = pool->borrowObject(); - if (!conn) return mapnik::make_empty_featureset(); + if (!conn) return mapnik::make_invalid_featureset(); if (conn->isOK()) { @@ -1030,7 +1030,7 @@ featureset_ptr postgis_datasource::features_at_point(coord2d const& pt, double t } } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } box2d<double> postgis_datasource::envelope() const diff --git a/plugins/input/raster/raster_datasource.cpp b/plugins/input/raster/raster_datasource.cpp index 38a6aa9..e059247 100644 --- a/plugins/input/raster/raster_datasource.cpp +++ b/plugins/input/raster/raster_datasource.cpp @@ -224,5 +224,5 @@ featureset_ptr raster_datasource::features_at_point(coord2d const&, double tol) { MAPNIK_LOG_WARN(raster) << "raster_datasource: feature_at_point not supported"; - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } diff --git a/plugins/input/sqlite/sqlite_datasource.cpp b/plugins/input/sqlite/sqlite_datasource.cpp index 37e4411..28add64 100644 --- a/plugins/input/sqlite/sqlite_datasource.cpp +++ b/plugins/input/sqlite/sqlite_datasource.cpp @@ -551,7 +551,7 @@ featureset_ptr sqlite_datasource::features(query const& q) const using_subquery_); } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } featureset_ptr sqlite_datasource::features_at_point(coord2d const& pt, double tol) const @@ -631,5 +631,5 @@ featureset_ptr sqlite_datasource::features_at_point(coord2d const& pt, double to using_subquery_); } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } diff --git a/plugins/input/topojson/topojson_datasource.cpp b/plugins/input/topojson/topojson_datasource.cpp index e6cab26..2cfad1f 100644 --- a/plugins/input/topojson/topojson_datasource.cpp +++ b/plugins/input/topojson/topojson_datasource.cpp @@ -284,7 +284,7 @@ mapnik::featureset_ptr topojson_datasource::features(mapnik::query const& q) con } } // otherwise return an empty featureset pointer - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } mapnik::featureset_ptr topojson_datasource::features_at_point(mapnik::coord2d const& pt, double tol) const diff --git a/src/map.cpp b/src/map.cpp index 9f1b6a5..ec0d9f8 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -746,7 +746,7 @@ featureset_ptr Map::query_point(unsigned index, double x, double y) const else s << " (map has no layers)"; throw std::out_of_range(s.str()); } - return mapnik::make_empty_featureset(); + return mapnik::make_invalid_featureset(); } featureset_ptr Map::query_map_point(unsigned index, double x, double y) const diff --git a/src/svg/svg_parser.cpp b/src/svg/svg_parser.cpp index 2483bae..827f557 100644 --- a/src/svg/svg_parser.cpp +++ b/src/svg/svg_parser.cpp @@ -111,7 +111,6 @@ mapnik::color parse_color(T & error_messages, const char* str) } catch (mapnik::config_error const& ex) { - error_messages.emplace_back(ex.what()); } return c; diff --git a/test/unit/datasource/geojson.cpp b/test/unit/datasource/geojson.cpp index 60052db..bcc9fa2 100644 --- a/test/unit/datasource/geojson.cpp +++ b/test/unit/datasource/geojson.cpp @@ -96,6 +96,45 @@ TEST_CASE("geojson") { } } + SECTION("GeoJSON an empty FeatureCollection") + { + for (auto cache_features : {true, false}) + { + mapnik::parameters params; + params["type"] = "geojson"; + params["file"] = "./test/data/json/empty_featurecollection.json"; + params["cache_features"] = cache_features; + auto ds = mapnik::datasource_cache::instance().create(params); + CHECK(ds != nullptr); + auto fs = all_features(ds); + REQUIRE(!mapnik::is_valid(fs)); + while (auto f = fs->next()) + { + CHECK(false); // shouldn't get here + } + } + } + + SECTION("GeoJSON attribute descriptors are alphabetically ordered") + { + for (auto cache_features : {true, false}) + { + mapnik::parameters params; + params["type"] = "geojson"; + params["file"] = "./test/data/json/properties.json"; + params["cache_features"] = cache_features; + auto ds = mapnik::datasource_cache::instance().create(params); + CHECK(ds != nullptr); + std::vector<std::string> expected_names = {"a", "b", "c", "d", "e"}; + auto fields = ds->get_descriptor().get_descriptors(); + std::size_t index = 0; + for (auto const& field : fields) + { + REQUIRE(field.get_name() == expected_names[index++]); + } + } + } + SECTION("GeoJSON invalid Point") { for (auto cache_features : {true, false}) @@ -285,8 +324,6 @@ TEST_CASE("geojson") { } auto features = ds->features(query); auto features2 = ds->features_at_point(ds->envelope().center(),0); - REQUIRE(features != nullptr); - REQUIRE(features2 != nullptr); auto feature = features->next(); auto feature2 = features2->next(); REQUIRE(feature != nullptr); @@ -404,7 +441,6 @@ TEST_CASE("geojson") { query.add_property_name(field.get_name()); } auto features = ds->features(query); - REQUIRE(features != nullptr); auto feature = features->next(); REQUIRE(feature != nullptr); REQUIRE(feature->envelope() == mapnik::box2d<double>(123,456,123,456)); @@ -693,7 +729,6 @@ TEST_CASE("geojson") { REQUIRE_FIELD_NAMES(fields, names); auto fs = all_features(ds); - REQUIRE(bool(fs)); std::initializer_list<attr> attrs = { attr{"name", tr.transcode("Test")}, attr{"NOM_FR", tr.transcode("Québec")}, -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapnik.git _______________________________________________ Pkg-grass-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

