Merge pull request #3610 from mapnik/v3.0.x-3609

GeoJSON - backport positions grammar changes from master, fixes #3609
This commit is contained in:
Artem Pavlenko 2017-02-03 11:28:22 +01:00 committed by GitHub
commit e35bca7381
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<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<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, 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> ring;
qi::rule<Iterator, void(box_type&), space_type> rings; qi::rule<Iterator, void(box_type&), space_type> rings;
qi::rule<Iterator, void(box_type&), space_type> rings_array; 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> template <typename T0, typename T1>
result_type operator() (T0 & bbox, T1 const& pos) const 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; bbox.init(x, y);
typename T0::value_type y = pos->y; }
if (!bbox.valid()) else
{ {
bbox.init(x, y); bbox.expand_to_include(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] >> 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"); coords.name("Coordinates");

View file

@ -44,7 +44,7 @@ struct positions_grammar :
{ {
positions_grammar(ErrorHandler & error_handler); positions_grammar(ErrorHandler & error_handler);
qi::rule<Iterator, coordinates(),space_type> coords; 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, positions(), space_type> ring;
qi::rule<Iterator, std::vector<positions>(), space_type> rings; qi::rule<Iterator, std::vector<positions>(), space_type> rings;
qi::rule<Iterator, std::vector<std::vector<positions> >(), space_type> rings_array; 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> template <typename T0,typename T1>
result_type operator() (T0 & coords, T1 const& pos) const 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> template <typename T0, typename T1>
result_type operator() (T0 & coords, T1 const& pos) const 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)] 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"); coords.name("Coordinates");
pos.name("Position"); pos.name("Position");