2010-04-25 3 views
21

Кто-нибудь знает, хороший и простой в использовании в производственном коде R-tree реализации? (На самом деле, любые реализации - R*, R+ или PR-tree было бы здорово)C++ R - требуется реализация дерева

Это не имеет значения, если это реализация шаблона или библиотеки, но некоторые реализации, которые Google нашли выглядят очень разочаровывает ...

ответ

13
+0

Я до сих пор считаю, что эти версии не хватает в versatibility, но, хорошо, выглядит нормально использовать –

+0

Bother версии нужен выбор времени компиляции в размерности данных что делает их бесполезными (для меня). –

+5

@MichaelNett: Значит, вы занижены, потому что реализации с открытым исходным кодом, о которых я говорил, бесполезны для вас? –

7

Я обновил реализацию найденную в http://www.superliminal.com/sources/sources.htm для поддержки более широкого диапазона типов данных.

Вы можете найти свою версию на GitHub: https://github.com/nushoin/RTree

Оригинальная версия является общественным достоянием, как и моя.

+0

Опять же, выбор размерности данных должен быть исправлен во время компиляции ... –

4

spatialindex обеспечивает хороший интерфейс для различных типов пространственных (и пространственно-временных) индексных структур, включая R, R *, TPR деревьев на http://libspatialindex.github.com/

+0

Библиотека доступна как для библиотек libgpl, так и для mit, что довольно круто. – arthur

+0

Это очень хорошо, если не быть потокобезопасным. – Richard

21

Вы можете также проверить на rtree варианты, представленную Boost.Geometry библиотека:

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

реализация Boost.Geometry rtree позволяет хранить значения произвольного типа в пространственном индексе и выполнение сложных запросов. Параметры, такие как максимальные элементы узла, могут передаваться как параметры компиляции или времени выполнения. Он поддерживает семантику перемещения C++ 11, также эмулируемую на компиляторах pre-C++ 11 благодаря Boost.Move. Он также поддерживает устройства для выделения состояний, которые позволяют, например, для хранения rtree в общей памяти с использованием Boost.Interprocess. И это быстро.

С другой стороны, в настоящее время постоянное хранилище еще не поддерживается, поэтому, если вам нужно больше, чем пространственный индекс в памяти, вы должны, вероятно, проверить одну из других упомянутых библиотек.

Быстрый пример:

Пожалуй, наиболее распространенный случай использования при сохранении некоторых геометрических объектов в контейнере и их ограничительные коробки с некоторыми идентификаторами в пространственном индексе. В случае 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; 
} 
+2

+1 для примера с библиотекой Boost – djondal

+0

Вам все еще нужно постоянное хранилище?Моя магистерская диссертация будет на R-деревьях, и я планирую также работать над реалиями. Могу ли я помочь? –

+0

@NikosAthanasiou Да, это все еще запланировано, но у меня недостаточно свободного времени для работы над ним. Есть еще несколько вещей, помимо постоянной поддержки хранения, которую я планировал. Конечно, любая помощь приветствуется. Пожалуйста, свяжитесь с нами в списке рассылки Boost.Geometry. –

Смежные вопросы