+ support GEOMETRYCOLLECTION in WKT generator
This commit is contained in:
parent
4f1438db01
commit
98e8164ce1
1 changed files with 34 additions and 16 deletions
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue