diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-06-25 22:59:01 +0000 |
---|---|---|
committer | <> | 2013-09-27 11:49:28 +0000 |
commit | 8c4528713d907ee2cfd3bfcbbad272c749867f84 (patch) | |
tree | c09e2ce80f47b90c85cc720f5139089ad9c8cfff /libs/geometry/doc/index/src/examples/rtree | |
download | boost-tarball-8c4528713d907ee2cfd3bfcbbad272c749867f84.tar.gz |
Imported from /home/lorry/working-area/delta_boost-tarball/boost_1_54_0.tar.bz2.boost_1_54_0baserock/morph
Diffstat (limited to 'libs/geometry/doc/index/src/examples/rtree')
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; +} + +//] |