From 7a761b359eabfe7a9e0333efb7f512bfa2979283 Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Sun, 1 May 2011 00:42:54 +0000 Subject: [PATCH] rtree::find parameters changed [SVN r71640] --- .../extensions/index/rtree/filters.hpp | 14 +++-- .../extensions/index/rtree/linear/split.hpp | 6 +- .../geometry/extensions/index/rtree/rtree.hpp | 9 +-- .../extensions/index/rtree/visitors/find.hpp | 56 +++++++++++++++++-- tests/additional_sizes_and_times.cpp | 3 +- 5 files changed, 68 insertions(+), 20 deletions(-) diff --git a/include/boost/geometry/extensions/index/rtree/filters.hpp b/include/boost/geometry/extensions/index/rtree/filters.hpp index 4855ae8a6..dcd598152 100644 --- a/include/boost/geometry/extensions/index/rtree/filters.hpp +++ b/include/boost/geometry/extensions/index/rtree/filters.hpp @@ -10,11 +10,13 @@ #ifndef BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_FILTERS_HPP #define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_FILTERS_HPP -#include +#include #include #include -#include + +// TODO: awulkiew - implement nearest filter +//#include namespace boost { namespace geometry { namespace index { @@ -27,13 +29,13 @@ template class spatial_filter< index::rtree > { public: - typedef typename std::vector::iterator iterator; - typedef typename std::vector::const_iterator const_iterator; + typedef typename std::deque::iterator iterator; + typedef typename std::deque::const_iterator const_iterator; template spatial_filter(index::rtree const& rtree, Geometry const& geom) { - m_result = rtree.find(geom); + rtree.find(geom, std::back_inserter(m_result)); } iterator begin() { return m_result.begin(); } @@ -42,7 +44,7 @@ public: const_iterator end() const { return m_result.end(); } private: - std::vector m_result; + std::deque m_result; }; } // namespace filters diff --git a/include/boost/geometry/extensions/index/rtree/linear/split.hpp b/include/boost/geometry/extensions/index/rtree/linear/split.hpp index 2df8f1921..c1b279105 100644 --- a/include/boost/geometry/extensions/index/rtree/linear/split.hpp +++ b/include/boost/geometry/extensions/index/rtree/linear/split.hpp @@ -46,8 +46,8 @@ struct find_greatest_normalized_separation assert(2 <= elements_count); // find the lowest low, highest high - coordinate_type lowest_low = geometry::get(rtree::element_indexable(elements[0], tr)); - coordinate_type highest_high = geometry::get(rtree::element_indexable(elements[0], tr)); + coordinate_type lowest_low = index::get(rtree::element_indexable(elements[0], tr)); + coordinate_type highest_high = index::get(rtree::element_indexable(elements[0], tr)); // and the lowest high coordinate_type lowest_high = highest_high; size_t lowest_high_index = 0; @@ -71,7 +71,7 @@ struct find_greatest_normalized_separation // find the highest low size_t highest_low_index = lowest_high_index == 0 ? 1 : 0; - coordinate_type highest_low = geometry::get(rtree::element_indexable(elements[highest_low_index], tr)); + coordinate_type highest_low = index::get(rtree::element_indexable(elements[highest_low_index], tr)); for ( size_t i = highest_low_index ; i < elements_count ; ++i ) { coordinate_type min_coord = index::get(rtree::element_indexable(elements[i], tr)); diff --git a/include/boost/geometry/extensions/index/rtree/rtree.hpp b/include/boost/geometry/extensions/index/rtree/rtree.hpp index 5f414a852..e39c258f2 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree.hpp @@ -70,12 +70,13 @@ public: boost::apply_visitor(del_v, *m_root); } - template - inline std::deque find(Geometry const& geom) const + // TODO: awulkiew - change name to query? + + template + inline void find(Geometry const& geom, OutIter out_it) const { - detail::rtree::visitors::find find_v(geom, m_translator); + detail::rtree::visitors::find find_v(m_translator, geom, out_it); boost::apply_visitor(find_v, *m_root); - return find_v.result; } void insert(value_type const& value) diff --git a/include/boost/geometry/extensions/index/rtree/visitors/find.hpp b/include/boost/geometry/extensions/index/rtree/visitors/find.hpp index 3ed40e0d8..d92b9126f 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/find.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/find.hpp @@ -14,24 +14,65 @@ #include +#include + namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace visitors { // rtree spatial query visitor -template +template struct find : public boost::static_visitor<> { + typedef typename rtree::node::type node; typedef typename rtree::internal_node::type internal_node; typedef typename rtree::leaf::type leaf; - inline find(Geometry const& g, Translator const& t) - : geom(g), tr(t) + inline find(Translator const& t, Geometry const& g, OutIter out_it) + : tr(t), geom(g), out_iter(out_it) {} inline void operator()(internal_node const& n) { + /*typedef typename internal_node::children_type children_type; + + std::deque nodes; + + for (typename children_type::const_iterator it = n.children.begin(); + it != n.children.end(); ++it) + { + if ( geometry::intersects(it->first, geom) ) + { + nodes.push_back(it->second); + } + } + + while ( !nodes.empty() ) + { + node *n = nodes.back(); + nodes.pop_back(); + + if ( !boost::apply_visitor(visitors::is_leaf(), *n) ) + { + internal_node &in = boost::get(*n); + + for (typename children_type::const_iterator it = in.children.begin(); + it != in.children.end(); ++it) + { + if ( geometry::intersects(it->first, geom) ) + { + nodes.push_back(it->second); + } + } + } + else + { + operator()(boost::get(*n)); + } + } + */ + typedef typename internal_node::children_type children_type; for (typename children_type::const_iterator it = n.children.begin(); @@ -50,13 +91,16 @@ struct find : public boost::static_visitor<> it != n.values.end(); ++it) { if ( geometry::intersects(tr(*it), geom) ) - result.push_back(*it); + { + out_iter = *it; + ++out_iter; + } } } - Geometry const& geom; Translator const& tr; - std::deque result; + Geometry const& geom; + OutIter out_iter; }; }}} // namespace detail::rtree::visitors diff --git a/tests/additional_sizes_and_times.cpp b/tests/additional_sizes_and_times.cpp index 3ebec7099..a4cd11e42 100644 --- a/tests/additional_sizes_and_times.cpp +++ b/tests/additional_sizes_and_times.cpp @@ -95,7 +95,8 @@ int main() { float x = coords[i].first; float y = coords[i].second; - std::deque< std::pair > result = t.find(B(P(x - 10, y - 10), P(x + 10, y + 10))); + std::deque< std::pair > result; + t.find(B(P(x - 10, y - 10), P(x + 10, y + 10)), std::back_inserter(result)); temp += result.size(); } std::cout << "time: " << tim.elapsed() << "s\n";