summaryrefslogtreecommitdiff
path: root/libs/geometry/doc/index/src/examples/rtree
diff options
context:
space:
mode:
Diffstat (limited to 'libs/geometry/doc/index/src/examples/rtree')
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/Jamfile.v225
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/interprocess.cpp112
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/polygons_shared_ptr.cpp88
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/polygons_vector.cpp96
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/quick_start.cpp87
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/value_index.cpp97
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/value_shared_ptr.cpp91
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/variants_map.cpp143
8 files changed, 739 insertions, 0 deletions
diff --git a/libs/geometry/doc/index/src/examples/rtree/Jamfile.v2 b/libs/geometry/doc/index/src/examples/rtree/Jamfile.v2
new file mode 100644
index 000000000..79778b9ab
--- /dev/null
+++ b/libs/geometry/doc/index/src/examples/rtree/Jamfile.v2
@@ -0,0 +1,25 @@
+# Boost.Geometry Index
+#
+# Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+#
+# Use, modification and distribution is subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+exe quick_start : quick_start.cpp ;
+exe polygons_vector : polygons_vector.cpp ;
+exe polygons_shared_ptr : polygons_shared_ptr.cpp ;
+exe variants_map : variants_map.cpp ;
+exe value_shared_ptr : value_shared_ptr.cpp ;
+exe value_index : value_index.cpp ;
+
+exe interprocess : interprocess.cpp /boost/thread//boost_thread
+ :
+ <toolset>acc:<linkflags>-lrt
+ <toolset>acc-pa_risc:<linkflags>-lrt
+ <toolset>gcc-mingw:<linkflags>"-lole32 -loleaut32 -lpsapi -ladvapi32"
+ <host-os>hpux,<toolset>gcc:<linkflags>"-Wl,+as,mpas"
+ :
+ <threading>multi
+ : # requirements
+ ;
diff --git a/libs/geometry/doc/index/src/examples/rtree/interprocess.cpp b/libs/geometry/doc/index/src/examples/rtree/interprocess.cpp
new file mode 100644
index 000000000..61d3f0b50
--- /dev/null
+++ b/libs/geometry/doc/index/src/examples/rtree/interprocess.cpp
@@ -0,0 +1,112 @@
+// Boost.Geometry Index
+//
+// Quickbook Examples
+//
+// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//[rtree_interprocess
+
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/box.hpp>
+
+#include <boost/geometry/index/rtree.hpp>
+
+#include <boost/foreach.hpp>
+
+#include <boost/interprocess/managed_shared_memory.hpp>
+#include <boost/interprocess/allocators/allocator.hpp>
+
+#include <vector>
+#include <string>
+#include <cstdlib> //std::system
+
+//For parent process argc == 1, for child process argc > 1
+int main(int argc, char *argv[])
+{
+ using namespace boost::interprocess;
+ namespace bg = boost::geometry;
+ namespace bgm = bg::model;
+ namespace bgi = bg::index;
+
+ typedef bgm::point<float, 2, bg::cs::cartesian> P;
+ typedef bgm::box<P> B;
+
+ typedef bgi::linear<32, 8> Par;
+ typedef bgi::indexable<B> I;
+ typedef bgi::equal_to<B> E;
+ typedef allocator<B, managed_shared_memory::segment_manager> Alloc;
+ typedef bgi::rtree<B, Par, I, E, Alloc> Rtree;
+
+ //Parent process
+ if ( argc == 1 )
+ {
+ struct shm_remove
+ {
+ shm_remove() { shared_memory_object::remove("MySharedMemory"); }
+ ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
+ } remover;
+
+ managed_shared_memory segment(create_only, "MySharedMemory", 65536);
+
+ std::cout << "Parent: Constructing container\n";
+
+ Rtree * tree = segment.construct<Rtree>("Rtree")(Par(), I(), E(), Alloc(segment.get_segment_manager()));
+
+ std::cout << "Parent: Filling container with 100 boxes\n";
+
+ for ( float i = 0 ; i < 100 ; i += 1 )
+ tree->insert(B(P(i, i), P(i+0.5f, i+0.5f)));
+
+ std::cout << "Parent: Tree content\n";
+ Rtree::bounds_type bb = tree->bounds();
+ std::cout << "[(" << bg::get<0>(bb.min_corner()) << ", " << bg::get<1>(bb.min_corner())
+ << ")(" << bg::get<0>(bb.max_corner()) << ", " << bg::get<1>(bb.max_corner()) << ")]\n";
+
+ std::cout << "Parent: Running child process\n";
+
+ std::string s(argv[0]); s += " child ";
+ if ( 0 != std::system(s.c_str()) )
+ return 1;
+
+ if ( segment.find<Rtree>("Rtree").first )
+ return 1;
+
+ std::cout << "Parent: Container was properly destroyed by the child process\n";
+ }
+ //Child process
+ else
+ {
+ managed_shared_memory segment(open_only, "MySharedMemory");
+
+ std::cout << "Child: Searching of the container in shared memory\n";
+
+ Rtree * tree = segment.find<Rtree>("Rtree").first;
+
+ std::cout << "Child: Querying for objects intersecting box = [(45, 45)(55, 55)]\n";
+
+ std::vector<B> result;
+ unsigned k = tree->query(bgi::intersects(B(P(45, 45), P(55, 55))), std::back_inserter(result));
+
+ std::cout << "Child: Found objects:\n";
+ std::cout << k << "\n";
+ BOOST_FOREACH(B const& b, result)
+ {
+ std::cout << "[(" << bg::get<0>(b.min_corner()) << ", " << bg::get<1>(b.min_corner())
+ << ")(" << bg::get<0>(b.max_corner()) << ", " << bg::get<1>(b.max_corner()) << ")]\n";
+ }
+ std::cout << "\n";
+
+ std::cout << "Child: Destroying container\n";
+
+ segment.destroy<Rtree>("Rtree");
+ }
+
+ return 0;
+};
+
+//]
diff --git a/libs/geometry/doc/index/src/examples/rtree/polygons_shared_ptr.cpp b/libs/geometry/doc/index/src/examples/rtree/polygons_shared_ptr.cpp
new file mode 100644
index 000000000..c65ba5376
--- /dev/null
+++ b/libs/geometry/doc/index/src/examples/rtree/polygons_shared_ptr.cpp
@@ -0,0 +1,88 @@
+// Boost.Geometry Index
+//
+// Quickbook Examples
+//
+// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//[rtree_polygons_shared_ptr
+
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/box.hpp>
+#include <boost/geometry/geometries/polygon.hpp>
+
+#include <boost/geometry/index/rtree.hpp>
+
+#include <cmath>
+#include <vector>
+#include <iostream>
+#include <boost/foreach.hpp>
+#include <boost/shared_ptr.hpp>
+
+namespace bg = boost::geometry;
+namespace bgi = boost::geometry::index;
+
+int main(void)
+{
+ typedef bg::model::point<float, 2, bg::cs::cartesian> point;
+ typedef bg::model::box<point> box;
+ typedef bg::model::polygon<point, false, false> polygon; // ccw, open polygon
+ typedef boost::shared_ptr<polygon> shp;
+ typedef std::pair<box, shp> value;
+
+ // create the rtree using default constructor
+ bgi::rtree< value, bgi::linear<16, 4> > rtree;
+
+ std::cout << "filling index with polygons shared pointers:" << std::endl;
+
+ // create some polygons and fill the spatial index
+ for ( unsigned i = 0 ; i < 10 ; ++i )
+ {
+ // create a polygon
+ shp p(new polygon());
+ for ( float a = 0 ; a < 6.28316f ; a += 1.04720f )
+ {
+ float x = i + int(10*::cos(a))*0.1f;
+ float y = i + int(10*::sin(a))*0.1f;
+ p->outer().push_back(point(x, y));
+ }
+
+ // display new polygon
+ std::cout << bg::wkt<polygon>(*p) << std::endl;
+
+ // calculate polygon bounding box
+ box b = bg::return_envelope<box>(*p);
+ // insert new value
+ rtree.insert(std::make_pair(b, p));
+ }
+
+ // find values intersecting some area defined by a box
+ box query_box(point(0, 0), point(5, 5));
+ std::vector<value> result_s;
+ rtree.query(bgi::intersects(query_box), std::back_inserter(result_s));
+
+ // find 5 nearest values to a point
+ std::vector<value> result_n;
+ rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n));
+
+ // display results
+ std::cout << "spatial query box:" << std::endl;
+ std::cout << bg::wkt<box>(query_box) << std::endl;
+ std::cout << "spatial query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_s)
+ std::cout << bg::wkt<polygon>(*v.second) << std::endl;
+
+ std::cout << "knn query point:" << std::endl;
+ std::cout << bg::wkt<point>(point(0, 0)) << std::endl;
+ std::cout << "knn query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_n)
+ std::cout << bg::wkt<polygon>(*v.second) << std::endl;
+
+ return 0;
+}
+
+//]
diff --git a/libs/geometry/doc/index/src/examples/rtree/polygons_vector.cpp b/libs/geometry/doc/index/src/examples/rtree/polygons_vector.cpp
new file mode 100644
index 000000000..a8984a732
--- /dev/null
+++ b/libs/geometry/doc/index/src/examples/rtree/polygons_vector.cpp
@@ -0,0 +1,96 @@
+// Boost.Geometry Index
+//
+// Quickbook Examples
+//
+// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//[rtree_polygons_vector
+
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/box.hpp>
+#include <boost/geometry/geometries/polygon.hpp>
+
+#include <boost/geometry/index/rtree.hpp>
+
+#include <cmath>
+#include <vector>
+#include <iostream>
+#include <boost/foreach.hpp>
+
+namespace bg = boost::geometry;
+namespace bgi = boost::geometry::index;
+
+int main(void)
+{
+ typedef bg::model::point<float, 2, bg::cs::cartesian> point;
+ typedef bg::model::box<point> box;
+ typedef bg::model::polygon<point, false, false> polygon; // ccw, open polygon
+ typedef std::pair<box, unsigned> value;
+
+ // polygons
+ std::vector<polygon> polygons;
+
+ // create some polygons
+ for ( unsigned i = 0 ; i < 10 ; ++i )
+ {
+ // create a polygon
+ polygon p;
+ for ( float a = 0 ; a < 6.28316f ; a += 1.04720f )
+ {
+ float x = i + int(10*::cos(a))*0.1f;
+ float y = i + int(10*::sin(a))*0.1f;
+ p.outer().push_back(point(x, y));
+ }
+
+ // add polygon
+ polygons.push_back(p);
+ }
+
+ // display polygons
+ std::cout << "generated polygons:" << std::endl;
+ BOOST_FOREACH(polygon const& p, polygons)
+ std::cout << bg::wkt<polygon>(p) << std::endl;
+
+ // create the rtree using default constructor
+ bgi::rtree< value, bgi::rstar<16, 4> > rtree;
+
+ // fill the spatial index
+ for ( unsigned i = 0 ; i < polygons.size() ; ++i )
+ {
+ // calculate polygon bounding box
+ box b = bg::return_envelope<box>(polygons[i]);
+ // insert new value
+ rtree.insert(std::make_pair(b, i));
+ }
+
+ // find values intersecting some area defined by a box
+ box query_box(point(0, 0), point(5, 5));
+ std::vector<value> result_s;
+ rtree.query(bgi::intersects(query_box), std::back_inserter(result_s));
+
+ // find 5 nearest values to a point
+ std::vector<value> result_n;
+ rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n));
+
+ // display results
+ std::cout << "spatial query box:" << std::endl;
+ std::cout << bg::wkt<box>(query_box) << std::endl;
+ std::cout << "spatial query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_s)
+ std::cout << bg::wkt<polygon>(polygons[v.second]) << std::endl;
+
+ std::cout << "knn query point:" << std::endl;
+ std::cout << bg::wkt<point>(point(0, 0)) << std::endl;
+ std::cout << "knn query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_n)
+ std::cout << bg::wkt<polygon>(polygons[v.second]) << std::endl;
+
+ return 0;
+}
+
+//]
diff --git a/libs/geometry/doc/index/src/examples/rtree/quick_start.cpp b/libs/geometry/doc/index/src/examples/rtree/quick_start.cpp
new file mode 100644
index 000000000..80c883122
--- /dev/null
+++ b/libs/geometry/doc/index/src/examples/rtree/quick_start.cpp
@@ -0,0 +1,87 @@
+// Boost.Geometry Index
+//
+// Quickbook Examples
+//
+// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//[rtree_quickstart
+
+//[rtree_quickstart_include
+
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/box.hpp>
+
+#include <boost/geometry/index/rtree.hpp>
+
+// to store queries results
+#include <vector>
+
+// just for output
+#include <iostream>
+#include <boost/foreach.hpp>
+
+namespace bg = boost::geometry;
+namespace bgi = boost::geometry::index;
+//]
+
+int main(void)
+{
+ //[rtree_quickstart_valuetype
+ typedef bg::model::point<float, 2, bg::cs::cartesian> point;
+ typedef bg::model::box<point> box;
+ typedef std::pair<box, unsigned> value;
+ //]
+
+ //[rtree_quickstart_create
+ // create the rtree using default constructor
+ bgi::rtree< value, bgi::quadratic<16> > rtree;
+ //]
+
+ //[rtree_quickstart_insert
+ // create some values
+ for ( unsigned i = 0 ; i < 10 ; ++i )
+ {
+ // create a box
+ box b(point(i, i), point(i + 0.5f, i + 0.5f));
+ // insert new value
+ rtree.insert(std::make_pair(b, i));
+ }
+ //]
+
+ //[rtree_quickstart_spatial_query
+ // find values intersecting some area defined by a box
+ box query_box(point(0, 0), point(5, 5));
+ std::vector<value> result_s;
+ rtree.query(bgi::intersects(query_box), std::back_inserter(result_s));
+ //]
+
+ //[rtree_quickstart_nearest_query
+ // find 5 nearest values to a point
+ std::vector<value> result_n;
+ rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n));
+ //]
+
+ //[rtree_quickstart_output
+ // display results
+ std::cout << "spatial query box:" << std::endl;
+ std::cout << bg::wkt<box>(query_box) << std::endl;
+ std::cout << "spatial query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_s)
+ std::cout << bg::wkt<box>(v.first) << " - " << v.second << std::endl;
+
+ std::cout << "knn query point:" << std::endl;
+ std::cout << bg::wkt<point>(point(0, 0)) << std::endl;
+ std::cout << "knn query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_n)
+ std::cout << bg::wkt<box>(v.first) << " - " << v.second << std::endl;
+ //]
+
+ return 0;
+}
+
+//]
diff --git a/libs/geometry/doc/index/src/examples/rtree/value_index.cpp b/libs/geometry/doc/index/src/examples/rtree/value_index.cpp
new file mode 100644
index 000000000..32f306909
--- /dev/null
+++ b/libs/geometry/doc/index/src/examples/rtree/value_index.cpp
@@ -0,0 +1,97 @@
+// Boost.Geometry Index
+//
+// Quickbook Examples
+//
+// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//[rtree_value_index
+
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/box.hpp>
+
+#include <boost/geometry/index/rtree.hpp>
+
+#include <cmath>
+#include <vector>
+#include <iostream>
+#include <boost/foreach.hpp>
+
+namespace bg = boost::geometry;
+namespace bgi = boost::geometry::index;
+
+template <typename Container>
+class my_indexable
+{
+ typedef typename Container::size_type size_t;
+ typedef typename Container::const_reference cref;
+ Container const& container;
+
+public:
+ typedef cref result_type;
+ explicit my_indexable(Container const& c) : container(c) {}
+ result_type operator()(size_t i) const { return container[i]; }
+};
+
+int main(void)
+{
+ typedef bg::model::point<float, 2, bg::cs::cartesian> point;
+ typedef bg::model::box<point> box;
+ typedef std::vector<box>::size_type value;
+ typedef bgi::rstar<16, 4> parameters;
+ typedef my_indexable< std::vector<box> > indexable_getter;
+
+ // boxes
+ std::vector<box> boxes;
+
+ // create some boxes
+ for ( unsigned i = 0 ; i < 10 ; ++i )
+ {
+ // add a box
+ boxes.push_back(box(point(i, i), point(i+0.5f, i+0.5f)));
+ }
+
+ // display boxes
+ std::cout << "generated boxes:" << std::endl;
+ BOOST_FOREACH(box const& b, boxes)
+ std::cout << bg::wkt<box>(b) << std::endl;
+
+ // create the rtree
+ parameters params;
+ indexable_getter ind(boxes);
+ bgi::rtree<value, parameters, indexable_getter> rtree(params, ind);
+
+ // fill the spatial index
+ for ( size_t i = 0 ; i < boxes.size() ; ++i )
+ rtree.insert(i);
+
+ // find values intersecting some area defined by a box
+ box query_box(point(0, 0), point(5, 5));
+ std::vector<value> result_s;
+ rtree.query(bgi::intersects(query_box), std::back_inserter(result_s));
+
+ // find 5 nearest values to a point
+ std::vector<value> result_n;
+ rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n));
+
+ // display results
+ std::cout << "spatial query box:" << std::endl;
+ std::cout << bg::wkt<box>(query_box) << std::endl;
+ std::cout << "spatial query result:" << std::endl;
+ BOOST_FOREACH(value i, result_s)
+ std::cout << bg::wkt<box>(boxes[i]) << std::endl;
+
+ std::cout << "knn query point:" << std::endl;
+ std::cout << bg::wkt<point>(point(0, 0)) << std::endl;
+ std::cout << "knn query result:" << std::endl;
+ BOOST_FOREACH(value i, result_n)
+ std::cout << bg::wkt<box>(boxes[i]) << std::endl;
+
+ return 0;
+}
+
+//]
diff --git a/libs/geometry/doc/index/src/examples/rtree/value_shared_ptr.cpp b/libs/geometry/doc/index/src/examples/rtree/value_shared_ptr.cpp
new file mode 100644
index 000000000..e2ff55737
--- /dev/null
+++ b/libs/geometry/doc/index/src/examples/rtree/value_shared_ptr.cpp
@@ -0,0 +1,91 @@
+// Boost.Geometry Index
+//
+// Quickbook Examples
+//
+// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//[rtree_value_shared_ptr
+
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/box.hpp>
+
+#include <boost/geometry/index/rtree.hpp>
+
+#include <cmath>
+#include <vector>
+#include <iostream>
+#include <boost/foreach.hpp>
+#include <boost/shared_ptr.hpp>
+
+namespace bg = boost::geometry;
+namespace bgi = boost::geometry::index;
+
+namespace boost { namespace geometry { namespace index {
+
+template <typename Box>
+struct indexable< boost::shared_ptr<Box> >
+{
+ typedef boost::shared_ptr<Box> V;
+
+ typedef Box const& result_type;
+ result_type operator()(V const& v) const { return *v; }
+};
+
+}}} // namespace boost::geometry::index
+
+int main(void)
+{
+ typedef bg::model::point<float, 2, bg::cs::cartesian> point;
+ typedef bg::model::box<point> box;
+ typedef boost::shared_ptr<box> shp;
+ typedef shp value;
+
+ // create the rtree using default constructor
+ bgi::rtree< value, bgi::linear<16, 4> > rtree;
+
+ std::cout << "filling index with boxes shared pointers:" << std::endl;
+
+ // fill the spatial index
+ for ( unsigned i = 0 ; i < 10 ; ++i )
+ {
+ // create a box
+ shp b(new box(point(i, i), point(i+0.5f, i+0.5f)));
+
+ // display new box
+ std::cout << bg::wkt<box>(*b) << std::endl;
+
+ // insert new value
+ rtree.insert(b);
+ }
+
+ // find values intersecting some area defined by a box
+ box query_box(point(0, 0), point(5, 5));
+ std::vector<value> result_s;
+ rtree.query(bgi::intersects(query_box), std::back_inserter(result_s));
+
+ // find 5 nearest values to a point
+ std::vector<value> result_n;
+ rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n));
+
+ // display results
+ std::cout << "spatial query box:" << std::endl;
+ std::cout << bg::wkt<box>(query_box) << std::endl;
+ std::cout << "spatial query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_s)
+ std::cout << bg::wkt<box>(*v) << std::endl;
+
+ std::cout << "knn query point:" << std::endl;
+ std::cout << bg::wkt<point>(point(0, 0)) << std::endl;
+ std::cout << "knn query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_n)
+ std::cout << bg::wkt<box>(*v) << std::endl;
+
+ return 0;
+}
+
+//]
diff --git a/libs/geometry/doc/index/src/examples/rtree/variants_map.cpp b/libs/geometry/doc/index/src/examples/rtree/variants_map.cpp
new file mode 100644
index 000000000..462795002
--- /dev/null
+++ b/libs/geometry/doc/index/src/examples/rtree/variants_map.cpp
@@ -0,0 +1,143 @@
+// Boost.Geometry Index
+//
+// Quickbook Examples
+//
+// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//[rtree_variants_map
+
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/box.hpp>
+#include <boost/geometry/geometries/polygon.hpp>
+#include <boost/geometry/geometries/ring.hpp>
+#include <boost/geometry/geometries/linestring.hpp>
+
+#include <boost/geometry/index/rtree.hpp>
+
+#include <cmath>
+#include <vector>
+#include <map>
+#include <iostream>
+#include <boost/foreach.hpp>
+#include <boost/variant.hpp>
+
+namespace bg = boost::geometry;
+namespace bgi = boost::geometry::index;
+
+typedef bg::model::point<float, 2, bg::cs::cartesian> point;
+typedef bg::model::box<point> box;
+typedef bg::model::polygon<point, false, false> polygon; // ccw, open polygon
+typedef bg::model::ring<point, false, false> ring; // ccw, open ring
+typedef bg::model::linestring<point> linestring;
+typedef boost::variant<polygon, ring, linestring> geometry;
+
+typedef std::map<unsigned, geometry> map;
+typedef std::pair<box, map::iterator> value;
+
+template <class Container>
+void fill(unsigned i, Container & container)
+{
+ for ( float a = 0 ; a < 6.28316f ; a += 1.04720f )
+ {
+ float x = i + int(10*::cos(a))*0.1f;
+ float y = i + int(10*::sin(a))*0.1f;
+ container.push_back(point(x, y));
+ }
+}
+
+struct print_visitor : public boost::static_visitor<>
+{
+ void operator()(polygon const& g) const { std::cout << bg::wkt<polygon>(g) << std::endl; }
+ void operator()(ring const& g) const { std::cout << bg::wkt<ring>(g) << std::endl; }
+ void operator()(linestring const& g) const { std::cout << bg::wkt<linestring>(g) << std::endl; }
+};
+
+struct envelope_visitor : public boost::static_visitor<box>
+{
+ box operator()(polygon const& g) const { return bg::return_envelope<box>(g); }
+ box operator()(ring const& g) const { return bg::return_envelope<box>(g); }
+ box operator()(linestring const& g) const { return bg::return_envelope<box>(g); }
+};
+
+
+int main(void)
+{
+ // geometries container
+ map geometries;
+
+ // create some geometries
+ for ( unsigned i = 0 ; i < 10 ; ++i )
+ {
+ unsigned c = rand() % 3;
+
+ if ( 0 == c )
+ {
+ // create polygon
+ polygon p;
+ fill(i, p.outer());
+ geometries.insert(std::make_pair(i, geometry(p)));
+ }
+ else if ( 1 == c )
+ {
+ // create ring
+ ring r;
+ fill(i, r);
+ geometries.insert(std::make_pair(i, geometry(r)));
+ }
+ else if ( 2 == c )
+ {
+ // create linestring
+ linestring l;
+ fill(i, l);
+ geometries.insert(std::make_pair(i, geometry(l)));
+ }
+ }
+
+ // display geometries
+ std::cout << "generated geometries:" << std::endl;
+ BOOST_FOREACH(map::value_type const& p, geometries)
+ boost::apply_visitor(print_visitor(), p.second);
+
+ // create the rtree using default constructor
+ bgi::rtree< value, bgi::quadratic<16, 4> > rtree;
+
+ // fill the spatial index
+ for ( map::iterator it = geometries.begin() ; it != geometries.end() ; ++it )
+ {
+ // calculate polygon bounding box
+ box b = boost::apply_visitor(envelope_visitor(), it->second);
+ // insert new value
+ rtree.insert(std::make_pair(b, it));
+ }
+
+ // find values intersecting some area defined by a box
+ box query_box(point(0, 0), point(5, 5));
+ std::vector<value> result_s;
+ rtree.query(bgi::intersects(query_box), std::back_inserter(result_s));
+
+ // find 5 nearest values to a point
+ std::vector<value> result_n;
+ rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n));
+
+ // display results
+ std::cout << "spatial query box:" << std::endl;
+ std::cout << bg::wkt<box>(query_box) << std::endl;
+ std::cout << "spatial query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_s)
+ boost::apply_visitor(print_visitor(), v.second->second);
+
+ std::cout << "knn query point:" << std::endl;
+ std::cout << bg::wkt<point>(point(0, 0)) << std::endl;
+ std::cout << "knn query result:" << std::endl;
+ BOOST_FOREACH(value const& v, result_n)
+ boost::apply_visitor(print_visitor(), v.second->second);
+
+ return 0;
+}
+
+//]