+ use rtree index

This commit is contained in:
Artem Pavlenko 2012-06-14 12:16:25 +01:00
parent de7d3383d1
commit 2ac6384992
4 changed files with 29 additions and 22 deletions

View file

@ -25,7 +25,6 @@
#include <fstream>
#include <iostream>
// boost
#include <boost/make_shared.hpp>
#include <boost/algorithm/string.hpp>
@ -129,11 +128,9 @@ std::map<std::string, mapnik::parameters> geojson_datasource::get_statistics() c
return statistics_;
}
// FIXME: implement
mapnik::box2d<double> geojson_datasource::envelope() const
{
if (!is_bound_) bind();
return extent_;
}
@ -149,9 +146,13 @@ mapnik::featureset_ptr geojson_datasource::features(mapnik::query const& q) cons
if (!is_bound_) bind();
// 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);
std::cout << "QUERY SIZE=" << index_array_.size() << std::endl;
return boost::make_shared<geojson_featureset>(features_, index_array_.begin(), index_array_.end());
}
// otherwise return an empty featureset pointer
return mapnik::featureset_ptr();

View file

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

View file

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

View file

@ -2,22 +2,26 @@
#define GEOJSON_FEATURESET_HPP
#include <mapnik/datasource.hpp>
#include <vector>
#include "geojson_datasource.hpp"
#include <vector>
#include <deque>
class geojson_featureset : public mapnik::Featureset
{
public:
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();
mapnik::feature_ptr next();
private:
mapnik::box2d<double> box_;
unsigned int feature_id_;
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