summaryrefslogtreecommitdiff
path: root/libs/geometry/doc/index/src/examples/rtree/polygons_vector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/geometry/doc/index/src/examples/rtree/polygons_vector.cpp')
-rw-r--r--libs/geometry/doc/index/src/examples/rtree/polygons_vector.cpp96
1 files changed, 96 insertions, 0 deletions
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;
+}
+
+//]