2010-04-25 36 views
21

¿Alguien sabe una buena y simple de usar en el código de producción R-tree implementación? (En realidad, cualquier implementación - R*, R+ o PR-tree serían grandes)C++ R - implementación del árbol deseada

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

Respuesta

13
+0

todavía creo que estas versiones carecen de versatibility, pero, bueno, parece bien usar –

+0

Bother versiones necesitan una opción de tiempo de compilación de la dimensionalidad de datos que los hace inútiles (para mí). –

+5

@MichaelNett: ¿Estás bajando la votación porque las implementaciones de código abierto a las que me he referido te son inútiles? –

4

spatialindex proporciona una interfaz agradable a los diferentes tipos de estructuras de indexación espacial (y espacio-temporal) incluyendo R, R *, árboles TPR en http://libspatialindex.github.com/

+0

La biblioteca está disponible en las licencias libgpl y mit, lo cual es genial – arthur

+0

Es bastante perfecto, excepto por no ser seguro para subprocesos. – Richard

21

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

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

aplicación Boost.Geometry RTree permite el almacenamiento de valores de tipo arbitrario en el índice espacial y la realización de consultas complejas. Los parámetros como los elementos de nodo máximo se pueden pasar como parámetros de compilación o tiempo de ejecución. Es compatible con la semántica de movimiento C++ 11 también emulada en compiladores anteriores a C++ 11 gracias a Boost.Move. También es compatible con asignadores con estado que permiten, p. para almacenar el rtree en una memoria compartida usando Boost.Interprocess. Y es rápido.

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

Ejemplo rápido:

Probablemente el caso de uso más común es 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; 
} 
+2

+1 para dar un ejemplo con la biblioteca de Boost – djondal

+0

¿Aún necesita almacenamiento persistente?Mi tesis de maestría estará en R-Trees y planeo trabajar en implementaciones también. ¿Podría ser de alguna ayuda? –

+0

@NikosAthanasiou Sí, todavía está planeado pero no tengo suficiente tiempo libre para trabajar en él. También hay algunas cosas más además del soporte de almacenamiento persistente que planeé. Por supuesto, se agradece cualquier ayuda. Por favor contáctenos en la lista de correo de Boost.Geometry. –

Cuestiones relacionadas