summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/geometry/index/example/serialize.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/geometry/index/example/serialize.cpp')
-rw-r--r--src/boost/libs/geometry/index/example/serialize.cpp168
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;
+}