Merge branch 'master' of github.com:mapnik/mapnik

This commit is contained in:
Dane Springmeyer 2012-06-14 19:44:28 -04:00
commit b12e73fbc7
6 changed files with 55 additions and 50 deletions

View file

@ -87,7 +87,7 @@ struct feature_collection_grammar :
features = lit("\"features\"") features = lit("\"features\"")
> lit(":") > lit(":")
> lit('[') > lit('[')
> feature(_val) % lit(',') > -(feature(_val) % lit(','))
> lit(']') > lit(']')
; ;

View file

@ -162,7 +162,7 @@ struct feature_grammar :
using qi::_pass; using qi::_pass;
using qi::eps; using qi::eps;
using qi::raw; using qi::raw;
using phoenix::new_; using phoenix::new_;
using phoenix::push_back; using phoenix::push_back;
using phoenix::construct; using phoenix::construct;
@ -197,7 +197,7 @@ struct feature_grammar :
unesc_char.add unesc_char.add
("\\\"", '\"') // quotation mark ("\\\"", '\"') // quotation mark
("\\\\", '\\') // reverse solidus ("\\\\", '\\') // reverse solidus
("\\/", '/') // solidus ("\\/", '/') // solidus
("\\b", '\b') // backspace ("\\b", '\b') // backspace
("\\f", '\f') // formfeed ("\\f", '\f') // formfeed
("\\n", '\n') // newline ("\\n", '\n') // newline
@ -207,7 +207,7 @@ struct feature_grammar :
string_ %= lit('"') >> *(unesc_char | "\\u" >> hex4 | (char_ - lit('"'))) >> lit('"') string_ %= lit('"') >> *(unesc_char | "\\u" >> hex4 | (char_ - lit('"'))) >> lit('"')
; ;
// geojson types // geojson types
feature_type = lit("\"type\"") feature_type = lit("\"type\"")
@ -244,17 +244,17 @@ struct feature_grammar :
// ; // ;
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
geometry = (lit('{')[_a = 0 ] geometry = (lit('{')[_a = 0 ]
>> lit("\"type\"") >> lit(':') >> geometry_dispatch[_a = _1] // <---- should be Nabialek trick! >> lit("\"type\"") >> lit(':') >> geometry_dispatch[_a = _1] // <---- should be Nabialek trick!
>> lit(',') >> lit(',')
>> (lit("\"coordinates\"") > lit(':') > coordinates(_r1,_a) >> (lit("\"coordinates\"") > lit(':') > coordinates(_r1,_a)
| |
lit("\"geometries\"") > lit(':') lit("\"geometries\"") > lit(':')
>> lit('[') >> geometry_collection(_r1) >> lit(']')) >> lit('[') >> geometry_collection(_r1) >> lit(']'))
>> lit('}')) >> lit('}'))
| lit("null") | lit("null")
; ;
geometry_dispatch.add geometry_dispatch.add
("\"Point\"",1) ("\"Point\"",1)
("\"LineString\"",2) ("\"LineString\"",2)
@ -265,7 +265,7 @@ struct feature_grammar :
("\"GeometryCollection\"",7) ("\"GeometryCollection\"",7)
// //
; ;
coordinates = (eps(_r2 == 1) > point_coordinates(extract_geometry_(_r1))) coordinates = (eps(_r2 == 1) > point_coordinates(extract_geometry_(_r1)))
| (eps(_r2 == 2) > linestring_coordinates(extract_geometry_(_r1))) | (eps(_r2 == 2) > linestring_coordinates(extract_geometry_(_r1)))
| (eps(_r2 == 3) > polygon_coordinates(extract_geometry_(_r1))) | (eps(_r2 == 3) > polygon_coordinates(extract_geometry_(_r1)))
@ -273,46 +273,45 @@ struct feature_grammar :
| (eps(_r2 == 5) > multilinestring_coordinates(extract_geometry_(_r1))) | (eps(_r2 == 5) > multilinestring_coordinates(extract_geometry_(_r1)))
| (eps(_r2 == 6) > multipolygon_coordinates(extract_geometry_(_r1))) | (eps(_r2 == 6) > multipolygon_coordinates(extract_geometry_(_r1)))
; ;
point_coordinates = eps[ _a = new_<geometry_type>(Point) ] point_coordinates = eps[ _a = new_<geometry_type>(Point) ]
> ( point(SEG_MOVETO,_a) [push_back(_r1,_a)] | eps[cleanup_(_a)][_pass = false] ) > ( point(SEG_MOVETO,_a) [push_back(_r1,_a)] | eps[cleanup_(_a)][_pass = false] )
; ;
linestring_coordinates = eps[ _a = new_<geometry_type>(LineString)] linestring_coordinates = eps[ _a = new_<geometry_type>(LineString)]
> (points(_a) [push_back(_r1,_a)] > -(points(_a) [push_back(_r1,_a)]
| eps[cleanup_(_a)][_pass = false]) | eps[cleanup_(_a)][_pass = false])
; ;
polygon_coordinates = eps[ _a = new_<geometry_type>(Polygon) ] polygon_coordinates = eps[ _a = new_<geometry_type>(Polygon) ]
> ((lit('[') > ((lit('[')
> points(_a) % lit(',') > -(points(_a) % lit(','))
> lit(']')) [push_back(_r1,_a)] > lit(']')) [push_back(_r1,_a)]
| eps[cleanup_(_a)][_pass = false]) | eps[cleanup_(_a)][_pass = false])
; ;
multipoint_coordinates = lit('[') multipoint_coordinates = lit('[')
> (point_coordinates(_r1) % lit(',')) > -(point_coordinates(_r1) % lit(','))
> lit(']') > lit(']')
; ;
multilinestring_coordinates = lit('[') multilinestring_coordinates = lit('[')
> (linestring_coordinates(_r1) % lit(',')) > -(linestring_coordinates(_r1) % lit(','))
> lit(']') > lit(']')
; ;
multipolygon_coordinates = lit('[') multipolygon_coordinates = lit('[')
> (polygon_coordinates(_r1) % lit(',')) > -(polygon_coordinates(_r1) % lit(','))
> lit(']') > lit(']')
; ;
geometry_collection = *geometry(_r1) >> *(lit(',') >> geometry(_r1)) geometry_collection = *geometry(_r1) >> *(lit(',') >> geometry(_r1))
; ;
// point
point = (lit('[') > double_ > lit(',') > double_ > lit(']')) [push_vertex_(_r1,_r2,_1,_2)];
// points
points = lit('[')[_a = SEG_MOVETO] > point (_a,_r1) % lit(',') [_a = SEG_LINETO] > lit(']');
// point
point = lit('[') > -((double_ > lit(',') > double_)[push_vertex_(_r1,_r2,_1,_2)]) > lit(']');
// points
points = lit('[')[_a = SEG_MOVETO] > -(point (_a,_r1) % lit(',')[_a = SEG_LINETO]) > lit(']');
on_error<fail> on_error<fail>
( (
feature feature
@ -362,7 +361,7 @@ struct feature_grammar :
qi::rule<Iterator,qi::locals<geometry_type*>, qi::rule<Iterator,qi::locals<geometry_type*>,
void(boost::ptr_vector<mapnik::geometry_type>& ),space_type> linestring_coordinates; void(boost::ptr_vector<mapnik::geometry_type>& ),space_type> linestring_coordinates;
qi::rule<Iterator,qi::locals<geometry_type*>, qi::rule<Iterator,qi::locals<geometry_type*>,
void(boost::ptr_vector<mapnik::geometry_type>& ),space_type> polygon_coordinates; void(boost::ptr_vector<mapnik::geometry_type>& ),space_type> polygon_coordinates;
qi::rule<Iterator,void(boost::ptr_vector<mapnik::geometry_type>& ),space_type> multipoint_coordinates; qi::rule<Iterator,void(boost::ptr_vector<mapnik::geometry_type>& ),space_type> multipoint_coordinates;
qi::rule<Iterator,void(boost::ptr_vector<mapnik::geometry_type>& ),space_type> multilinestring_coordinates; qi::rule<Iterator,void(boost::ptr_vector<mapnik::geometry_type>& ),space_type> multilinestring_coordinates;

View file

@ -25,7 +25,6 @@
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
// boost // boost
#include <boost/make_shared.hpp> #include <boost/make_shared.hpp>
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
@ -129,11 +128,9 @@ std::map<std::string, mapnik::parameters> geojson_datasource::get_statistics() c
return statistics_; return statistics_;
} }
// FIXME: implement
mapnik::box2d<double> geojson_datasource::envelope() const mapnik::box2d<double> geojson_datasource::envelope() const
{ {
if (!is_bound_) bind(); if (!is_bound_) bind();
return extent_; return extent_;
} }
@ -149,9 +146,12 @@ mapnik::featureset_ptr geojson_datasource::features(mapnik::query const& q) cons
if (!is_bound_) bind(); if (!is_bound_) bind();
// if the query box intersects our world extent then query for features // if the query box intersects our world extent then query for features
if (extent_.intersects(q.get_bbox())) mapnik::box2d<double> const& b = q.get_bbox();
if (extent_.intersects(b))
{ {
return boost::make_shared<geojson_featureset>(features_,tree_); box_type box(point_type(b.minx(),b.miny()),point_type(b.maxx(),b.maxy()));
index_array_ = tree_.find(box);
return boost::make_shared<geojson_featureset>(features_, index_array_.begin(), index_array_.end());
} }
// otherwise return an empty featureset pointer // otherwise return an empty featureset pointer
return mapnik::featureset_ptr(); return mapnik::featureset_ptr();

View file

@ -62,6 +62,7 @@ private:
boost::shared_ptr<mapnik::transcoder> tr_; boost::shared_ptr<mapnik::transcoder> tr_;
mutable std::vector<mapnik::feature_ptr> features_; mutable std::vector<mapnik::feature_ptr> features_;
mutable spatial_index_type tree_; mutable spatial_index_type tree_;
mutable std::deque<std::size_t> index_array_;
}; };

View file

@ -29,23 +29,24 @@
#include "geojson_featureset.hpp" #include "geojson_featureset.hpp"
geojson_featureset::geojson_featureset(std::vector<mapnik::feature_ptr> const& features, geojson_featureset::geojson_featureset(std::vector<mapnik::feature_ptr> const& features,
geojson_datasource::spatial_index_type const& tree) std::deque<std::size_t>::const_iterator index_itr,
: feature_id_(1), std::deque<std::size_t>::const_iterator index_end)
features_(features), : features_(features),
tree_(tree) {} index_itr_(index_itr),
index_end_(index_end) {}
geojson_featureset::~geojson_featureset() {} geojson_featureset::~geojson_featureset() {}
mapnik::feature_ptr geojson_featureset::next() mapnik::feature_ptr geojson_featureset::next()
{ {
feature_id_++; if (index_itr_ != index_end_)
if (feature_id_ <= features_.size())
{ {
return features_.at(feature_id_ - 1); std::size_t index = *index_itr_++;
} if ( index < features_.size())
else {
{ return features_.at(index);
return mapnik::feature_ptr(); }
} }
return mapnik::feature_ptr();
} }

View file

@ -2,22 +2,26 @@
#define GEOJSON_FEATURESET_HPP #define GEOJSON_FEATURESET_HPP
#include <mapnik/datasource.hpp> #include <mapnik/datasource.hpp>
#include <vector>
#include "geojson_datasource.hpp" #include "geojson_datasource.hpp"
#include <vector>
#include <deque>
class geojson_featureset : public mapnik::Featureset class geojson_featureset : public mapnik::Featureset
{ {
public: public:
geojson_featureset(std::vector<mapnik::feature_ptr> const& features, geojson_featureset(std::vector<mapnik::feature_ptr> const& features,
geojson_datasource::spatial_index_type const& tree); std::deque<std::size_t>::const_iterator index_itr,
std::deque<std::size_t>::const_iterator index_end);
virtual ~geojson_featureset(); virtual ~geojson_featureset();
mapnik::feature_ptr next(); mapnik::feature_ptr next();
private: private:
mapnik::box2d<double> box_; mapnik::box2d<double> box_;
unsigned int feature_id_;
std::vector<mapnik::feature_ptr> const& features_; std::vector<mapnik::feature_ptr> const& features_;
geojson_datasource::spatial_index_type const& tree_; std::deque<std::size_t>::const_iterator index_itr_;
std::deque<std::size_t>::const_iterator index_end_;
}; };
#endif // GEOJSON_FEATURESET_HPP #endif // GEOJSON_FEATURESET_HPP