C ++ R - Baum-Implementierung gesucht [geschlossen]
Frage
Hat jemand eine gute und einfach zu Einsatz in der Produktion Code R-tree
Implementierung wissen? (Eigentlich jeder Implementierungen - R*, R+
oder PR-tree
wäre toll)
Es spielt keine Rolle, ob es sich um eine Vorlage oder Bibliothek Implementierung ist, aber einige Implementierungen, dass Google gefunden Blick sehr enttäuschend ...
Lösung
Überprüfen R-Trees-Code auf http://www.superliminal.com/sources/sources. htm
auch überprüfen
http: / /www.virtualroadside.com/blog/index.php/2008/10/04/r-tree-implementation-for-cpp/
Andere Tipps
Sie können auch die RTREE Besuche Varianten der Boost.Geometry Bibliothek zur Verfügung gestellt:
http: // www. boost.org/doc/libs/release/libs/geometry/doc/html/geometry/spatial_indexes.html
Boost.Geometry RTREE Implementierung erlaubt Werten beliebigen Typs in den räumlichen Index Speicherung und komplexe Abfragen durchführen. Parameter wie die maximale Knotenelemente können als Kompilierung oder Laufzeit-Parameter übergeben werden. Es unterstützt C ++ 11 bewegen Semantik auch auf Pre-C emuliert ++ 11 Compiler dank Boost.Move. Es unterstützt auch die Stateful Verteilern ermöglicht z.B. zum Speichern der RTREE in einem gemeinsam genutzten Speicher verwendet Boost.Interprocess. Und es ist schnell.
Auf der Kehrseite, die derzeit persistenter Speicher ist noch nicht so unterstützt, wenn Sie mehr benötigen, als im Speicher räumlicher Index, den Sie wahrscheinlich einer der anderen genannten Bibliotheken überprüfen sollten.
Schnell Beispiel:
Der wohl häufigste Anwendungsfall ist, wenn Sie speichern einige geometrischen Objekte in einem Container und ihre Begrenzungskästen mit einigen ids im räumlichen Index. Im Fall von Boost.Geometry RTree dies könnte wie folgt aussehen:
#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;
}
ich die Umsetzung in http://www.superliminal.com/sources/sources.htm ein breiteres Spektrum von Datentypen zu unterstützen.
Sie können meine Version auf GitHub finden: https://github.com/nushoin/RTree
Die Originalversion ist public domain, als meine.
spatialindex bietet eine schöne Oberfläche, um verschiedene Arten von räumlichen (und räumlich-zeitlichen) Indexstrukturen einschließlich R, R *, TPR Bäume unter