123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- // Boost.Geometry Index
- // Additional tests
- // 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)
- #include <iostream>
- #include <fstream>
- #define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL
- #include <boost/geometry.hpp>
- #include <boost/geometry/index/rtree.hpp>
- #include <boost/geometry/index/detail/rtree/utilities/statistics.hpp>
- #include <boost/archive/binary_oarchive.hpp>
- #include <boost/archive/binary_iarchive.hpp>
- #include <boost/archive/xml_oarchive.hpp>
- #include <boost/archive/xml_iarchive.hpp>
- #include <boost/serialization/vector.hpp>
- #include <boost/foreach.hpp>
- #include <boost/timer.hpp>
- template <typename T, size_t I = 0, size_t S = boost::tuples::length<T>::value>
- struct print_tuple
- {
- template <typename Os>
- static inline Os & apply(Os & os, T const& t)
- {
- os << boost::get<I>(t) << ", ";
- return print_tuple<T, I+1>::apply(os, t);
- }
- };
- template <typename T, size_t S>
- struct print_tuple<T, S, S>
- {
- template <typename Os>
- static inline Os & apply(Os & os, T const&)
- {
- return os;
- }
- };
- int main()
- {
- namespace bg = boost::geometry;
- namespace bgi = bg::index;
- typedef boost::tuple<std::size_t, std::size_t, std::size_t, std::size_t, std::size_t, std::size_t> S;
- typedef bg::model::point<double, 2, bg::cs::cartesian> P;
- typedef bg::model::box<P> B;
- typedef B V;
- //typedef bgi::rtree<V, bgi::linear<16> > RT;
- //typedef bgi::rtree<V, bgi::quadratic<8, 3> > RT;
- //typedef bgi::rtree<V, bgi::rstar<8, 3> > RT;
- typedef bgi::rtree<V, bgi::dynamic_linear > RT;
- //RT tree;
- RT tree(bgi::dynamic_linear(16));
- std::vector<V> vect;
- boost::timer t;
- //insert values
- {
- for ( double x = 0 ; x < 1000 ; x += 1 )
- for ( double y = 0 ; y < 1000 ; y += 1 )
- vect.push_back(B(P(x, y), P(x+0.5, y+0.5)));
- RT tmp(vect, tree.parameters());
- tree = boost::move(tmp);
- }
- B q(P(5, 5), P(6, 6));
- S s;
- std::cout << "vector and tree created in: " << t.elapsed() << std::endl;
- print_tuple<S>::apply(std::cout, bgi::detail::rtree::utilities::statistics(tree)) << std::endl;
- std::cout << boost::get<0>(s) << std::endl;
- BOOST_FOREACH(V const& v, tree | bgi::adaptors::queried(bgi::intersects(q)))
- std::cout << bg::wkt<V>(v) << std::endl;
- // save
- {
- std::ofstream ofs("serialized_vector.bin", std::ios::binary | std::ios::trunc);
- boost::archive::binary_oarchive oa(ofs);
- t.restart();
- oa << vect;
- std::cout << "vector saved to bin in: " << t.elapsed() << std::endl;
- }
- {
- std::ofstream ofs("serialized_tree.bin", std::ios::binary | std::ios::trunc);
- boost::archive::binary_oarchive oa(ofs);
- t.restart();
- oa << tree;
- std::cout << "tree saved to bin in: " << t.elapsed() << std::endl;
- }
- {
- std::ofstream ofs("serialized_tree.xml", std::ios::trunc);
- boost::archive::xml_oarchive oa(ofs);
- t.restart();
- oa << boost::serialization::make_nvp("rtree", tree);
- std::cout << "tree saved to xml in: " << t.elapsed() << std::endl;
- }
- t.restart();
- vect.clear();
- std::cout << "vector cleared in: " << t.elapsed() << std::endl;
- t.restart();
- tree.clear();
- std::cout << "tree cleared in: " << t.elapsed() << std::endl;
- // load
- {
- std::ifstream ifs("serialized_vector.bin", std::ios::binary);
- boost::archive::binary_iarchive ia(ifs);
- t.restart();
- ia >> vect;
- std::cout << "vector loaded from bin in: " << t.elapsed() << std::endl;
- t.restart();
- RT tmp(vect, tree.parameters());
- tree = boost::move(tmp);
- std::cout << "tree rebuilt from vector in: " << t.elapsed() << std::endl;
- }
-
- t.restart();
- tree.clear();
- std::cout << "tree cleared in: " << t.elapsed() << std::endl;
- {
- std::ifstream ifs("serialized_tree.bin", std::ios::binary);
- boost::archive::binary_iarchive ia(ifs);
- t.restart();
- ia >> tree;
- std::cout << "tree loaded from bin in: " << t.elapsed() << std::endl;
- }
- std::cout << "loaded from bin" << std::endl;
- print_tuple<S>::apply(std::cout, bgi::detail::rtree::utilities::statistics(tree)) << std::endl;
- BOOST_FOREACH(V const& v, tree | bgi::adaptors::queried(bgi::intersects(q)))
- std::cout << bg::wkt<V>(v) << std::endl;
- t.restart();
- tree.clear();
- std::cout << "tree cleared in: " << t.elapsed() << std::endl;
- {
- std::ifstream ifs("serialized_tree.xml");
- boost::archive::xml_iarchive ia(ifs);
- t.restart();
- ia >> boost::serialization::make_nvp("rtree", tree);
- std::cout << "tree loaded from xml in: " << t.elapsed() << std::endl;
- }
- std::cout << "loaded from xml" << std::endl;
- print_tuple<S>::apply(std::cout, bgi::detail::rtree::utilities::statistics(tree)) << std::endl;
- BOOST_FOREACH(V const& v, tree | bgi::adaptors::queried(bgi::intersects(q)))
- std::cout << bg::wkt<V>(v) << std::endl;
- return 0;
- }
|