Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

Ability to filter on geometry type #546

Closed
artemp opened this Issue Oct 11, 2011 · 13 comments

Comments

Projects
None yet
3 participants
Owner

artemp commented Oct 11, 2011

Would be useful to be able to filter by geometry type or properties at the Rule level to have better control over which symbolizers apply to which features:

<Filter>{geometry_type} = point</Filter>

or, maybe grab all polygons like:
(http://docs.djangoproject.com/en/dev/ref/contrib/gis/gdal/#django.contrib.gis.gdal.OGRGeometry.dimension)

<Filter>{coord_dims} >= 3</Filter>

All 3d or 4d geometries
(http://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#dim)

<Filter>{geom_dims} >= 3</Filter>

Lots of potential syntax possible:

<Filter>dim([the_geom]) >= 3</Filter>
Member

kunitoki commented Apr 16, 2012

I need this much these days. I need to filter a single layer, and visualize all of the geometry type with their style.

Any advice on what to look to implement this ?

Owner

springmeyer commented Apr 16, 2012

Since features can contain mixed geometry types this is not trivial of course. Would require some experimentation either inside feature_style_processor or in the process() functions for each symbolizer to find a solution that is performant and does not impact the common situation of rendering all geoms.

Member

kunitoki commented Apr 16, 2012

how about OSM stylesheet come with <Filter>[mapnik:geometry] = 1</Filter> ... they patched mapnik ? any idea ?

Owner

springmeyer commented Apr 16, 2012

I think mapnik::geometry was just a proper field created in the layer sql like: https://github.com/springmeyer/render-collections/blob/master/postgis.xml#L119

Member

kunitoki commented May 9, 2012

i'm trying this but i'm getting a bunch of template errors in boost:spirit. is this the right approach ? i'm no boost spirit expert, so maybe i'm doing a lot of useless stuff.

diff --git a/include/mapnik/attribute.hpp b/include/mapnik/attribute.hpp
index b38292c..b435af1 100644
--- a/include/mapnik/attribute.hpp
+++ b/include/mapnik/attribute.hpp
@@ -44,6 +44,9 @@ struct attribute

     std::string const& name() const { return name_;}
 };
+
+struct value_geometry {};
+
 }

 #endif // MAPNIK_ATTRIBUTE_HPP
diff --git a/include/mapnik/expression_evaluator.hpp b/include/mapnik/expression_evaluator.hpp
index b2155f9..fdeedad 100644
--- a/include/mapnik/expression_evaluator.hpp
+++ b/include/mapnik/expression_evaluator.hpp
@@ -29,6 +29,7 @@
 #include <boost/regex/icu.hpp>
 #endif

+
 namespace mapnik
 {
 template <typename T0, typename T1>
@@ -45,12 +46,21 @@ struct evaluate : boost::static_visitor<T1>
         return x;
     }

+    value_type operator() (value_geometry g) const
+    {
+        value_type v = (int) 0;
+        if (feature_.num_geometries() > 0)
+        {
+            v = value_type((int)feature_.get_geometry(0).type());
+        }
+        return v;
+    }
+
     value_type operator() (attribute const& attr) const
     {
         return attr.value<value_type,feature_type>(feature_);
     }

-
     value_type operator() (binary_node<tags::logical_and> const & x) const
     {
         return (boost::apply_visitor(evaluate<feature_type,value_type>(feature_),x.left).to_bool())
@@ -100,6 +110,7 @@ struct evaluate : boost::static_visitor<T1>
 #endif
     }

+
     feature_type const& feature_;
 };

diff --git a/include/mapnik/expression_grammar.hpp b/include/mapnik/expression_grammar.hpp
index c62b537..05c3b87 100644
--- a/include/mapnik/expression_grammar.hpp
+++ b/include/mapnik/expression_grammar.hpp
@@ -219,6 +219,7 @@ struct expression_grammar : qi::grammar<Iterator, expr_node(), space_type>
             | lit("true") [_val = true]
             | lit("false") [_val = false]
             | lit("null") [_val = value_null() ]
+            | lit("gtype") [_val = value_geometry() ]
             | ustring [_val = unicode_(_1) ]
             | attr [_val = construct<mapnik::attribute>( _1 ) ]
             | '(' >> expr [_val = _1 ] >> ')'

and this is the error:

In file included from /usr/include/boost-1_48/boost/variant.hpp:17:0,
                 from include/mapnik/value.hpp:32,
                 from include/mapnik/expression_node.hpp:27,
                 from include/mapnik/expression.hpp:28,
                 from src/expression.cpp:24:
/usr/include/boost-1_48/boost/variant/variant.hpp: In member function ‘void boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::convert_construct(T&, int, mpl_::false_) [with T = mapnik::value_geometry, T0_ = mapnik::value_null, T1 = bool, T2 = int, T3 = double, T4 = icu_48::UnicodeString, T5 = boost::detail::variant::void_, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_, T9 = boost::detail::variant::void_, T10 = boost::detail::variant::void_, T11 = boost::detail::variant::void_, T12 = boost::detail::variant::void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant::void_, T15 = boost::detail::variant::void_, T16 = boost::detail::variant::void_, T17 = boost::detail::variant::void_, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_, mpl_::false_ = mpl_::bool_<false>]’:
/usr/include/boost-1_48/boost/variant/variant.hpp:1405:9:   instantiated from ‘boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::variant(T&) [with T = mapnik::value_geometry, T0_ = mapnik::value_null, T1 = bool, T2 = int, T3 = double, T4 = icu_48::UnicodeString, T5 = boost::detail::variant::void_, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_, T9 = boost::detail::variant::void_, T10 = boost::detail::variant::void_, T11 = boost::detail::variant::void_, T12 = boost::detail::variant::void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant::void_, T15 = boost::detail::variant::void_, T16 = boost::detail::variant::void_, T17 = boost::detail::variant::void_, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_]’
include/mapnik/value.hpp:724:22:   instantiated from ‘mapnik::value::value(T) [with T = mapnik::value_geometry]’
/usr/include/boost-1_48/boost/variant/variant.hpp:1326:9:   instantiated from ‘void boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::convert_construct(T&, int, mpl_::false_) [with T = const mapnik::value_geometry, T0_ = mapnik::value, T1 = mapnik::attribute, T2 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, T3 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, T4 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, T5 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, T6 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, T7 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, T8 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, T9 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, T10 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, T11 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, T12 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, T13 = boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, T14 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, T15 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, T16 = boost::recursive_wrapper<mapnik::regex_match_node>, T17 = boost::recursive_wrapper<mapnik::regex_replace_node>, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_, mpl_::false_ = mpl_::bool_<false>]’
/usr/include/boost-1_48/boost/variant/variant.hpp:1399:9:   instantiated from ‘boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::variant(const T&) [with T = mapnik::value_geometry, T0_ = mapnik::value, T1 = mapnik::attribute, T2 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, T3 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, T4 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, T5 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, T6 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, T7 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, T8 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, T9 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, T10 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, T11 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, T12 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, T13 = boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, T14 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, T15 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, T16 = boost::recursive_wrapper<mapnik::regex_match_node>, T17 = boost::recursive_wrapper<mapnik::regex_replace_node>, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_]’
/usr/include/boost-1_48/boost/variant/variant.hpp:1642:29:   instantiated from ‘void boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::assign(const T&) [with T = mapnik::value_geometry, T0_ = mapnik::value, T1 = mapnik::attribute, T2 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, T3 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, T4 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, T5 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, T6 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, T7 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, T8 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, T9 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, T10 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, T11 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, T12 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, T13 = boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, T14 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, T15 = boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, T16 = boost::recursive_wrapper<mapnik::regex_match_node>, T17 = boost::recursive_wrapper<mapnik::regex_replace_node>, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_]’
/usr/include/boost-1_48/boost/variant/variant.hpp:1652:9:   [ skipping 22 instantiation contexts ]
/usr/include/boost-1_48/boost/function/function_template.hpp:1042:16:   instantiated from ‘boost::function<R(T0, T1, T2, T3)>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::any_real_parser<double, boost::spirit::qi::strict_real_policies<double> >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::any_int_parser<int, 10u, 1u, -0x00000000000000001>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::literal_string<const char (&)[5], true>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<bool>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::literal_string<const char (&)[6], true>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<bool>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::literal_string<const char (&)[5], true>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<mapnik::value_null>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::literal_string<const char (&)[6], true>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<mapnik::value_geometry>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::locals<char>, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::composite<boost::phoenix::detail::function_eval<1>, boost::fusion::vector<boost::phoenix::value<mapnik::unicode_impl>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::composite<boost::phoenix::detail::construct_eval<mapnik::attribute>, boost::fusion::vector<boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard, true, false>, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard, true, false>, boost::fusion::nil> > > >, boost::fusion::nil> > > > > > > > > >, mpl_::bool_<false> >, R = bool, T0 = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >&, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’
/usr/include/boost-1_48/boost/function/function_template.hpp:1083:5:   instantiated from ‘typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R(T0, T1, T2, T3)>&>::type boost::function<R(T0, T1, T2, T3)>::operator=(Functor) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::alternative<boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::any_real_parser<double, boost::spirit::qi::strict_real_policies<double> >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::any_int_parser<int, 10u, 1u, -0x00000000000000001>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::literal_string<const char (&)[5], true>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<bool>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::literal_string<const char (&)[6], true>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<bool>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::literal_string<const char (&)[5], true>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<mapnik::value_null>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::literal_string<const char (&)[6], true>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<mapnik::value_geometry>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::locals<char>, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::composite<boost::phoenix::detail::function_eval<1>, boost::fusion::vector<boost::phoenix::value<mapnik::unicode_impl>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::composite<boost::phoenix::detail::construct_eval<mapnik::attribute>, boost::fusion::vector<boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::sequence<boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard, true, false>, boost::fusion::cons<boost::spirit::qi::action<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > >, boost::fusion::cons<boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard, true, false>, boost::fusion::nil> > > >, boost::fusion::nil> > > > > > > > > >, mpl_::bool_<false> >, R = bool, T0 = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >&, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R(T0, T1, T2, T3)>&>::type = boost::function<bool(__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&, const __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >&, boost::spirit::context<boost::fusion::cons<boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >&, boost::fusion::nil>, boost::fusion::vector0<> >&, const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >&)>&]’
/usr/include/boost-1_48/boost/spirit/home/qi/nonterminal/rule.hpp:182:13:   instantiated from ‘static void boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::define(boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>&, const Expr&, mpl_::true_) [with Auto = mpl_::bool_<false>, Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::spirit::terminal<boost::spirit::tag::stateful_tag<boost::spirit::qi::strict_real_policies<double>, boost::spirit::tag::double_, double, boost::spirit::unused_type> >&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::int_>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit, boost::fusion::vector1<const char (&)[5]> > >, 0l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<bool>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit, boost::fusion::vector1<const char (&)[6]> > >, 0l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<bool>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit, boost::fusion::vector1<const char (&)[5]> > >, 0l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<mapnik::value_null>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit, boost::fusion::vector1<const char (&)[6]> > >, 0l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<mapnik::value_geometry>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::locals<char>, boost::spirit::unused_type, boost::spirit::unused_type>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::composite<boost::phoenix::detail::function_eval<1>, boost::fusion::vector<boost::phoenix::value<mapnik::unicode_impl>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::composite<boost::phoenix::detail::construct_eval<mapnik::attribute>, boost::fusion::vector<boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const char&>, 0l>, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const char&>, 0l> >, 2l>&>, 2l>, Iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, T1 = boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >(), T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type, boost::spirit::qi::rule<Iterator, T1, T2, T3, T4> = boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>, mpl_::true_ = mpl_::bool_<true>]’
/usr/include/boost-1_48/boost/spirit/home/qi/nonterminal/rule.hpp:220:13:   instantiated from ‘boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>& boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::operator=(const Expr&) [with Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::spirit::terminal<boost::spirit::tag::stateful_tag<boost::spirit::qi::strict_real_policies<double>, boost::spirit::tag::double_, double, boost::spirit::unused_type> >&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::int_>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit, boost::fusion::vector1<const char (&)[5]> > >, 0l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<bool>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit, boost::fusion::vector1<const char (&)[6]> > >, 0l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<bool>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit, boost::fusion::vector1<const char (&)[5]> > >, 0l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<mapnik::value_null>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::lit, boost::fusion::vector1<const char (&)[6]> > >, 0l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::value<mapnik::value_geometry>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::locals<char>, boost::spirit::unused_type, boost::spirit::unused_type>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::composite<boost::phoenix::detail::function_eval<1>, boost::fusion::vector<boost::phoenix::value<mapnik::unicode_impl>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::phoenix::composite<boost::phoenix::detail::construct_eval<mapnik::attribute>, boost::fusion::vector<boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_right, boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const char&>, 0l>, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >&>, 0l> >, 2l>&>, 2l>&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const char&>, 0l> >, 2l>&>, 2l>, Iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, T1 = boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >(), T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type, boost::spirit::qi::rule<Iterator, T1, T2, T3, T4> = boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, boost::variant<mapnik::value, mapnik::attribute, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::plus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::minus> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mult> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::div> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::mod> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::less_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::greater_equal> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::equal_to> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::not_equal_to> >, boost::recursive_wrapper<mapnik::unary_node<mapnik::tags::logical_not> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_and> >, boost::recursive_wrapper<mapnik::binary_node<mapnik::tags::logical_or> >, boost::recursive_wrapper<mapnik::regex_match_node>, boost::recursive_wrapper<mapnik::regex_replace_node> >(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>]’
include/mapnik/expression_grammar.hpp:218:9:   instantiated from ‘mapnik::expression_grammar<Iterator>::expression_grammar(const mapnik::transcoder&) [with Iterator = __gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >]’
src/expression.cpp:41:65:   instantiated from here
/usr/include/boost-1_48/boost/variant/variant.hpp:1326:9: error: no matching function for call to ‘boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list5<mapnik::value_null, bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list4<bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<2> >, boost::mpl::l_iter<boost::mpl::list3<int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<3> >, boost::mpl::l_iter<boost::mpl::list2<double, icu_48::UnicodeString> > >::initializer_node::initialize(void*, mapnik::value_geometry&)’
/usr/include/boost-1_48/boost/variant/detail/initializer.hpp:89:24: note: candidates are: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list5<mapnik::value_null, bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list4<bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<2> >, boost::mpl::l_iter<boost::mpl::list3<int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<3> >, boost::mpl::l_iter<boost::mpl::list2<double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<4> >, Iterator = boost::mpl::l_iter<boost::mpl::list1<icu_48::UnicodeString> >, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const icu_48::UnicodeString&]
/usr/include/boost-1_48/boost/variant/detail/initializer.hpp:89:24: note:                 static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list5<mapnik::value_null, bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list4<bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<2> >, Iterator = boost::mpl::l_iter<boost::mpl::list3<int, double, icu_48::UnicodeString> >, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const int]
/usr/include/boost-1_48/boost/variant/detail/initializer.hpp:89:24: note:                 static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, Iterator = boost::mpl::l_iter<boost::mpl::list5<mapnik::value_null, bool, int, double, icu_48::UnicodeString> >, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const mapnik::value_null&]
/usr/include/boost-1_48/boost/variant/detail/initializer.hpp:122:17: note:                 static void boost::detail::variant::initializer_root::initialize()
/usr/include/boost-1_48/boost/variant/detail/initializer.hpp:89:24: note:                 static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list5<mapnik::value_null, bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<1> >, Iterator = boost::mpl::l_iter<boost::mpl::list4<bool, int, double, icu_48::UnicodeString> >, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const bool]
/usr/include/boost-1_48/boost/variant/detail/initializer.hpp:89:24: note:                 static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list5<mapnik::value_null, bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list4<bool, int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<2> >, boost::mpl::l_iter<boost::mpl::list3<int, double, icu_48::UnicodeString> > >::initializer_node, mpl_::int_<3> >, Iterator = boost::mpl::l_iter<boost::mpl::list2<double, icu_48::UnicodeString> >, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const double]
scons: *** [src/expression.os] Error 1
Member

kunitoki commented May 19, 2012

@artemp

sorry for bothering, do you have any clue on this ?

Member

kunitoki commented Jul 16, 2012

with this i'm able to use geometry type (writing [GT] as expression) in Filter declarations:

diff --git a/include/mapnik/attribute.hpp b/include/mapnik/attribute.hpp
index b38292c..ca945b9 100644
--- a/include/mapnik/attribute.hpp
+++ b/include/mapnik/attribute.hpp
@@ -33,17 +33,27 @@ namespace mapnik {
 struct attribute
 {
     std::string name_;
+    bool geometry_;
+
     explicit attribute(std::string const& name)
-        : name_(name) {}
+        : name_(name), geometry_(name_ == "__GT__") {}

-    template <typename V ,typename F>
+    template <typename V, typename F>
     V const& value(F const& f) const
     {
-        return f.get(name_);
+        if (geometry_)
+        {
+            return (V)f.get_geometry(0).type();
+        }
+        else
+        {
+            return f.get(name_);
+        }
     }

-    std::string const& name() const { return name_;}
+    std::string const& name() const { return name_; }
 };
+
 }

 #endif // MAPNIK_ATTRIBUTE_HPP

what do you think about this ? sure there are better ways to solve this, but this is an almost pain free change that needs no head hammering in boost phoenix, fusion and kharma...

Owner

springmeyer commented Jul 16, 2012

+1 to having a feature like this. @artemp - can you comment on whether this approach looks okay?

I think it looks like a good start but we will need to support filtering on null geometries (where non have been set) and collections (where multiple are present but they are different types ,a bit like: https://github.com/mapnik/mapnik/blob/master/include/mapnik/util/geometry_to_ds_type.hpp#L36-59)

Owner

springmeyer commented Jul 16, 2012

assigning to the 2.1 milestone, since this is a commonly requested feature and would be great to get done before release.

@artemp artemp was assigned Jul 16, 2012

@artemp artemp added a commit that referenced this issue Jul 20, 2012

@artemp artemp + expose geometry type in expression grammar to allow following
  filter expressions : [mapnik::geometry_type] = Polygon (#546)
516f7c7
Owner

artemp commented Jul 20, 2012

@kunitoki @springmeyer - initial implementation ( 516f7c7 )

geometry types are parsed as integers and [mapnik::geometry_type] is reserved attribute name :

[mapnik::geometry_type] = Polygon  

equivalent to

[mapnik::geometry_type] = 3

@kunitoki - does it work for your use-case ?

TODO: better handling of multiple geometries

Member

kunitoki commented Jul 21, 2012

Hey that's fantastic. I don't have the chance to test this but will as soon as i put my hands on my code... thanx !

@springmeyer springmeyer pushed a commit that referenced this issue Jul 25, 2012

Dane Springmeyer amend 516f7c7 to suport filtering on collections and rename line to l…
…inestring for consistency - refs #546
fa052c5
Owner

springmeyer commented Jul 25, 2012

closing. great work @artemp!

@springmeyer springmeyer pushed a commit that referenced this issue Jul 25, 2012

Dane Springmeyer update changelog with geometry filter support as per #546 d63cf68

@springmeyer springmeyer referenced this issue in mapbox/carto Sep 13, 2012

Closed

mapnik::geometry_type #180

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment