Pregunta

¿Alguien sabe una buena y fácil de usar en el código de producción aplicación R-tree? (En realidad, cualquier implementaciones - R*, R+ o PR-tree serían grandes)

No importa si se trata de una plantilla o implementación de la biblioteca, pero algunas implementaciones que Google ha encontrado aspecto muy decepcionante ...

Otros consejos

También puede revisar la rtree variantes proporcionada por la biblioteca Boost.Geometry:

http: // www. boost.org/doc/libs/release/libs/geometry/doc/html/geometry/spatial_indexes.html

Boost.Geometry aplicación RTree permite valores de tipo arbitrario almacenar en el índice espacial y la realización de consultas complejas. Parámetros como elementos de nodo máximo pueden ser pasados ??como parámetros de compilación o de tiempo de ejecución. Es compatible con C ++ 11 semántica movimiento también emulados en la pre-compiladores de C ++ 11 gracias a Boost.Move. También es compatible con asignadores con estado que permite, por ejemplo, para almacenar el rtree en una memoria compartida utilizando Boost.Interprocess. Y es rápido.

En el lado negativo, actualmente almacenamiento persistente aún no está apoyada por lo que si se necesita más que en memoria índice espacial probablemente debería marcar una de las otras bibliotecas mencionadas.

ejemplo rápida:

Probablemente el más común es el caso de uso cuando vaya a guardar algunos objetos geométricos en un recipiente y sus cuadros delimitadores con algunos ids en el índice espacial. En caso de Boost.Geometry RTree esto podría tener este aspecto:

#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;
}

He actualizado la aplicación que se encuentra en http://www.superliminal.com/sources/sources.htm para apoyar una gama más amplia de tipos de datos.

Se puede encontrar mi versión en github: https://github.com/nushoin/RTree

La versión original es de dominio público, como es la mía.

spatialindex proporciona una interfaz agradable para diferentes tipos de estructuras de índice espacial (y espacio-temporal) incluyendo R, R *, árboles TPR a http://libspatialindex.github.com/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top