diff options
Diffstat (limited to 'src/boost/libs/geometry/index/example/serialize.cpp')
-rw-r--r-- | src/boost/libs/geometry/index/example/serialize.cpp | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/boost/libs/geometry/index/example/serialize.cpp b/src/boost/libs/geometry/index/example/serialize.cpp new file mode 100644 index 00000000..11ce08bc --- /dev/null +++ b/src/boost/libs/geometry/index/example/serialize.cpp @@ -0,0 +1,168 @@ +// 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; +} |