+ support GEOMETRYCOLLECTION in WKT generator

This commit is contained in:
Artem Pavlenko 2011-12-13 16:33:27 +00:00
parent 7e8e600790
commit e228b1143d

View file

@ -89,23 +89,32 @@ struct multi_geometry_
struct multi_geometry_type struct multi_geometry_type
{ {
template <typename T> template <typename T>
struct result { typedef unsigned type; }; struct result { typedef boost::tuple<unsigned,bool> type; };
unsigned operator() (geometry_container const& geom) const boost::tuple<unsigned,bool> operator() (geometry_container const& geom) const
{ {
unsigned type = 0u; unsigned type = 0u;
bool collection = false;
geometry_container::const_iterator itr = geom.begin(); geometry_container::const_iterator itr = geom.begin();
geometry_container::const_iterator end = geom.end(); geometry_container::const_iterator end = geom.end();
for ( ; itr != end; ++itr) for ( ; itr != end; ++itr)
{ {
if (type != 0 && itr->type() != type)
{
collection = true;
break;
}
type = itr->type(); type = itr->type();
} }
return type; return boost::tuple<unsigned,bool>(type, collection);
} }
}; };
template <typename T> template <typename T>
struct coordinate_policy : karma::real_policies<T> struct wkt_coordinate_policy : karma::real_policies<T>
{ {
typedef boost::spirit::karma::real_policies<T> base_type; typedef boost::spirit::karma::real_policies<T> base_type;
static int floatfield(T n) { return base_type::fmtflags::fixed; } static int floatfield(T n) { return base_type::fmtflags::fixed; }
@ -187,14 +196,15 @@ struct wkt_generator :
phoenix::function<get_type > _type; phoenix::function<get_type > _type;
phoenix::function<get_first> _first; phoenix::function<get_first> _first;
// //
karma::real_generator<double, coordinate_policy<double> > coord_type; karma::real_generator<double, wkt_coordinate_policy<double> > coord_type;
}; };
template <typename OutputIterator> template <typename OutputIterator>
struct wkt_multi_generator : struct wkt_multi_generator :
karma::grammar<OutputIterator, geometry_container const& ()> karma::grammar<OutputIterator, karma::locals< boost::tuple<unsigned,bool> >, geometry_container const& ()>
{ {
wkt_multi_generator() wkt_multi_generator()
@ -204,6 +214,7 @@ struct wkt_multi_generator :
using boost::spirit::karma::eps; using boost::spirit::karma::eps;
using boost::spirit::karma::_val; using boost::spirit::karma::_val;
using boost::spirit::karma::_1; using boost::spirit::karma::_1;
using boost::spirit::karma::_a;
geometry_types.add geometry_types.add
(mapnik::Point,"Point") (mapnik::Point,"Point")
@ -211,27 +222,34 @@ struct wkt_multi_generator :
(mapnik::Polygon,"Polygon") (mapnik::Polygon,"Polygon")
; ;
wkt = eps(_multi(_val)) << "Multi" << geometry_types[_1 = _type(_val)] wkt = eps(phoenix::at_c<1>(_a))[_a = _multi_type(_val)]
<< "(" << multi_geometry << ")" | geometry_types[_1 = _type(_val)] << lit("GeometryCollection(") << geometry << lit(")")
<< geometry | eps(is_multi(_val)) << lit("Multi") << geometry_types[_1 = phoenix::at_c<0>(_a)]
<< "(" << multi_geometry << ")"
| geometry
; ;
geometry = *path geometry = -(single_geometry % lit(','))
; ;
single_geometry = geometry_types[_1 = _type(_val)] << path
;
multi_geometry = -(path % lit(',')) multi_geometry = -(path % lit(','))
; ;
} }
// rules // rules
karma::rule<OutputIterator, geometry_container const& ()> wkt; karma::rule<OutputIterator, karma::locals<boost::tuple<unsigned,bool> >, geometry_container const& ()> wkt;
karma::rule<OutputIterator, geometry_container const& ()> geometry; karma::rule<OutputIterator, geometry_container const& ()> geometry;
karma::rule<OutputIterator, geometry_type const& ()> single_geometry;
karma::rule<OutputIterator, geometry_container const& ()> multi_geometry; karma::rule<OutputIterator, geometry_container const& ()> multi_geometry;
wkt_generator<OutputIterator> path; wkt_generator<OutputIterator> path;
// phoenix // phoenix
phoenix::function<multi_geometry_> _multi; phoenix::function<multi_geometry_> is_multi;
phoenix::function<multi_geometry_type> _type; phoenix::function<multi_geometry_type> _multi_type;
// phoenix::function<get_type > _type;
//
karma::symbols<unsigned, char const*> geometry_types; karma::symbols<unsigned, char const*> geometry_types;
}; };