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 ...

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

scroll top