GeoJSON - backport positions grammar changes from master, fixes #3609

This commit is contained in:
artemp 2017-02-03 11:22:24 +01:00
parent ab206321b5
commit 6cb3bce2d7
4 changed files with 20 additions and 23 deletions

View file

@ -51,7 +51,7 @@ struct extract_bounding_box_grammar :
qi::rule<Iterator, qi::locals<Iterator>, void(boxes_type&), space_type> features;
qi::rule<Iterator, qi::locals<int, box_type>, void(boxes_type&, Iterator const&), space_type> feature;
qi::rule<Iterator, qi::locals<box_type>, box_type(), space_type> coords;
qi::rule<Iterator, boost::optional<position_type>(), space_type> pos;
qi::rule<Iterator, position_type(), space_type> pos;
qi::rule<Iterator, void(box_type&), space_type> ring;
qi::rule<Iterator, void(box_type&), space_type> rings;
qi::rule<Iterator, void(box_type&), space_type> rings_array;

View file

@ -42,18 +42,15 @@ struct calculate_bounding_box_impl
template <typename T0, typename T1>
result_type operator() (T0 & bbox, T1 const& pos) const
{
if (pos)
typename T0::value_type x = pos.x;
typename T0::value_type y = pos.y;
if (!bbox.valid())
{
typename T0::value_type x = pos->x;
typename T0::value_type y = pos->y;
if (!bbox.valid())
{
bbox.init(x, y);
}
else
{
bbox.expand_to_include(x, y);
}
bbox.init(x, y);
}
else
{
bbox.expand_to_include(x, y);
}
}
};
@ -132,16 +129,16 @@ extract_bounding_box_grammar<Iterator, Boxes, ErrorHandler>::extract_bounding_bo
>> lit(':') >> (rings_array(_a) | rings (_a) | ring(_a) | pos[calculate_bounding_box(_a,_1)])[_val = _a]
;
pos = lit('[') > -(double_ > lit(',') > double_) > omit[*(lit(',') > double_)] > lit(']')
pos = lit('[') > double_ > lit(',') > double_ > omit[*(lit(',') > double_)] > lit(']')
;
ring = lit('[') >> pos[calculate_bounding_box(_r1,_1)] % lit(',') > lit(']')
ring = lit('[') >> -(pos[calculate_bounding_box(_r1,_1)] % lit(',')) >> lit(']')
;
rings = lit('[') >> ring(_r1) % lit(',') > lit(']')
rings = lit('[') >> (ring(_r1) % lit(',') > lit(']'))
;
rings_array = lit('[') >> rings(_r1) % lit(',') > lit(']')
rings_array = lit('[') >> (rings(_r1) % lit(',') > lit(']'))
;
coords.name("Coordinates");

View file

@ -44,7 +44,7 @@ struct positions_grammar :
{
positions_grammar(ErrorHandler & error_handler);
qi::rule<Iterator, coordinates(),space_type> coords;
qi::rule<Iterator, boost::optional<position>(), space_type> pos;
qi::rule<Iterator, position(), space_type> pos;
qi::rule<Iterator, positions(), space_type> ring;
qi::rule<Iterator, std::vector<positions>(), space_type> rings;
qi::rule<Iterator, std::vector<std::vector<positions> >(), space_type> rings_array;

View file

@ -41,7 +41,7 @@ struct set_position_impl
template <typename T0,typename T1>
result_type operator() (T0 & coords, T1 const& pos) const
{
if (pos) coords = *pos;
coords = pos;
}
};
@ -51,7 +51,7 @@ struct push_position_impl
template <typename T0, typename T1>
result_type operator() (T0 & coords, T1 const& pos) const
{
if (pos) coords.emplace_back(*pos);
coords.emplace_back(pos);
}
};
@ -75,13 +75,13 @@ positions_grammar<Iterator, ErrorHandler>::positions_grammar(ErrorHandler & erro
coords = rings_array[_val = _1] | rings [_val = _1] | ring[_val = _1] | pos[set_position(_val,_1)]
;
pos = lit('[') > -(double_ > lit(',') > double_) > omit[*(lit(',') > double_)] > lit(']')
pos = lit('[') > double_ > lit(',') > double_ > omit[*(lit(',') > double_)] > lit(']')
;
ring = lit('[') >> pos[push_position(_val,_1)] % lit(',') > lit(']')
ring = lit('[') >> -(pos[push_position(_val,_1)] % lit(',')) >> lit(']')
;
rings = lit('[') >> ring % lit(',') > lit(']')
rings = lit('[') >> (ring % lit(',') > lit(']'))
;
rings_array = lit('[') >> rings % lit(',') > lit(']')
rings_array = lit('[') >> (rings % lit(',') > lit(']'))
;
coords.name("Coordinates");
pos.name("Position");