誰かが本番コードで使用するのに良くて簡単なことを知っていますかR-tree
実装? (実際には、任意の実装-R*, R+
またはPR-tree
素晴らしいことだ)
それがテンプレートまたはライブラリの実装であるかどうかは関係ありませんが、Googleが見つけたいくつかの実装は非常に残念に見えます...
http://www.superliminal.com/sources/sources.htm でR-Treesコードを確認してください
また、チェックしてください
http://www.virtualroadside.com/blog/index.php/2008/10/04/r-tree-implementation-for-cpp/
Boost.Geometryライブラリによって提供されるrtreeバリアントを確認することもできます。
http://www.boost.org/doc/libs/release/libs/geometry/doc/html/geometry/spatial_indexes.html
Boost.Geometry rtreeの実装により、任意のタイプの値を空間インデックスに格納し、複雑なクエリを実行できます。最大ノード要素などのパラメーターは、コンパイル時または実行時のパラメーターとして渡すことができます。 Boost.Moveのおかげで、C++ 11以前のコンパイラでもエミュレートされたC++ 11移動セマンティクスをサポートします。また、ステートフルアロケータをサポートします。 Boost.Interprocessを使用してrtreeを共有メモリに保存します。そして、それは速いです。
欠点としては、現在永続ストレージはまだサポートされていないため、メモリ内の空間インデックス以上のものが必要な場合は、他の言及されているライブラリの1つを確認する必要があります。
簡単な例:
おそらく最も一般的な使用例は、いくつかのジオメトリックオブジェクトをコンテナに格納し、それらの境界ボックスをいくつかのIDとともに空間インデックスに格納する場合です。 Boost.Geometry rtreeの場合、これは次のようになります。
#include <boost/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <vector>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
/* The definition of my_object type goes here */
int main()
{
typedef bg::model::point<float, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef std::pair<box, size_t> value;
std::vector<my_object> objects;
/* Fill objects */
// create the R* variant of the rtree
bgi::rtree< value, bgi::rstar<16> > rtree;
// insert some values to the rtree
for ( size_t i = 0 ; i < objects.size() ; ++i )
{
// create a box
box b = objects[i].calculate_bounding_box();
// 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));
return 0;
}
http://www.superliminal.com/sources/sources.htm にある実装を更新して、より広範囲のデータ型をサポートしました。
私のバージョンはgithubで見つけることができます: https://github.com/nushoin/RTree
元のバージョンは私のものと同様にパブリックドメインです。
spatialindexは、R、R *、TPRツリーなどのさまざまなタイプの空間(および時空間)インデックス構造への優れたインターフェイスを提供します http://libspatialindex.github.com/