From ac8ececf1c8fe5fdfac059dbce9307cd6f305ad1 Mon Sep 17 00:00:00 2001 From: artemp Date: Thu, 3 Oct 2013 15:32:07 +0100 Subject: [PATCH] == topojson == + use boost::variant<> for storing properties + parse properties as top level key/value pairs --- include/mapnik/json/topojson_grammar.hpp | 7 +++++-- include/mapnik/json/topojson_grammar_impl.hpp | 7 ++++++- include/mapnik/json/topology.hpp | 6 ++++-- plugins/input/topojson/topojson_featureset.cpp | 8 ++++++++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/include/mapnik/json/topojson_grammar.hpp b/include/mapnik/json/topojson_grammar.hpp index 9406c1e34..4b7e9d5ae 100644 --- a/include/mapnik/json/topojson_grammar.hpp +++ b/include/mapnik/json/topojson_grammar.hpp @@ -67,7 +67,8 @@ private: qi::int_parser int__; qi::rule string_; qi::rule key_value; - qi::rule number; + qi::rule()> number; qi::rule object; qi::rule array; qi::rule pairs; @@ -88,7 +89,9 @@ private: qi::rule()> ring; // properties - qi::rule properties; + qi::rule properties; + qi::rule attributes; + qi::rule attribute_value; // error boost::phoenix::function where_message_; diff --git a/include/mapnik/json/topojson_grammar_impl.hpp b/include/mapnik/json/topojson_grammar_impl.hpp index 5d969bf18..e4e6ffc13 100644 --- a/include/mapnik/json/topojson_grammar_impl.hpp +++ b/include/mapnik/json/topojson_grammar_impl.hpp @@ -144,9 +144,14 @@ topojson_grammar::topojson_grammar() properties = lit("\"properties\"") >> lit(':') - >> object + >> (( lit('{') >> attributes >> lit('}')) | object) ; + attributes = (string_ >> lit(':') >> attribute_value) % lit(',') + ; + + attribute_value %= number | string_ ; + arcs = lit("\"arcs\"") >> lit(':') >> lit('[') >> -( arc % lit(',')) >> lit(']') ; diff --git a/include/mapnik/json/topology.hpp b/include/mapnik/json/topology.hpp index e6d3b666a..412c6dab7 100644 --- a/include/mapnik/json/topology.hpp +++ b/include/mapnik/json/topology.hpp @@ -28,8 +28,8 @@ #include #include #include -#include #include +#include namespace mapnik { namespace topojson { @@ -41,7 +41,9 @@ struct coordinate double y; }; -typedef boost::spirit::utree properties; +typedef boost::variant value; +typedef std::tuple property; +typedef std::vector properties; struct point { diff --git a/plugins/input/topojson/topojson_featureset.cpp b/plugins/input/topojson/topojson_featureset.cpp index 9951c77f3..027d5f2bf 100644 --- a/plugins/input/topojson/topojson_featureset.cpp +++ b/plugins/input/topojson/topojson_featureset.cpp @@ -98,6 +98,14 @@ struct feature_generator : public boost::static_visitor poly_ptr->close_path(); } feature->paths().push_back(poly_ptr.release()); + + if (poly.props) + { + for (auto const& p : *poly.props) + { + feature->put_new(std::get<0>(p), mapnik::value(1LL)/*std::get<1>(p)*/); + } + } return feature; }