Получение & quot; Indexable является недействительным & quot; при вставке элемента в boost :: geometry :: index :: rtree

Я инициализирую свой rtree с

namespace boostGEO = boost::geometry;
typedef boostGEO::model::point<double, 2, boostGEO::cs::cartesian> point;
typedef boostGEO::model::box<point> box;
typedef std::pair<box, std::pair<int, int>> edgesValue;
boostGEO::index::rtree< edgesValue, boostGEO::index::rstar<16> > tree();

И тогда я заполняю это так

for( int i = 0; i < items.size(); i++ )
{
Item* item = items.at(i);
std::vector<ItemRelation> relations = item->getRelations();

point ps1( item->x, item->y );
Item* relatedItem;
for( int j = 0; j < relations.size(); j++ )
{
relatedItem = relations.at(j);
point ps2( relatedItem->x, relatedItem->y );
box bounds( ps1, ps2 );
edgesTree.insert( std::make_pair( bounds, std::make_pair(item->id, relatedItem->id) ) );
}
}

Item-> x и Item-> y являются двойными, а Item-> id является целым числом.
Когда я запускаю свой код, я получаю следующую ошибку:

/opt/bp/boost_1_58_0/boost/geometry/index/rtree.hpp:1248: void boost::geometry::index::rtree<Value, Options, IndexableGetter, EqualTo, Allocator>::raw_insert(const value_type&) [with Value = std::pair<boost::geometry::model::box<boost::geometry::model::point<double, 2ul, boost::geometry::cs::cartesian> >, std::pair<int, int> >; Parameters = boost::geometry::index::rstar<16ul>; IndexableGetter = boost::geometry::index::indexable<std::pair<boost::geometry::model::box<boost::geometry::model::point<double, 2ul, boost::geometry::cs::cartesian> >, std::pair<int, int> > >; EqualTo = boost::geometry::index::equal_to<std::pair<boost::geometry::model::box<boost::geometry::model::point<double, 2ul, boost::geometry::cs::cartesian> >, std::pair<int, int> > >; Allocator = std::allocator<std::pair<boost::geometry::model::box<boost::geometry::model::point<double, 2ul, boost::geometry::cs::cartesian> >, std::pair<int, int> > >; boost::geometry::index::rtree<Value, Options, IndexableGetter, EqualTo, Allocator>::value_type = std::pair<boost::geometry::model::box<boost::geometry::model::point<double, 2ul, boost::geometry::cs::cartesian> >, std::pair<int, int> >]: Assertion `(detail::is_valid(m_members.translator()(value)))&&("Indexable is invalid")' failed.

Может ли кто-нибудь дать мне подсказку, что пошло не так? Понятия не имею.

1

Решение

Ты имел ввиду

boostGEO::index::rtree<edgesValue, boostGEO::index::rstar<16> > tree;

(обратите внимание на недостающие символы?). Смотрите также Самый неприятный разбор: почему не A a (()); Работа?


Помимо этого я не видел такой проблемы:

Жить на Колиру

#include <boost/geometry.hpp>
#include <boost/geometry/geometry.hpp>
#include <string>

using namespace boost;
namespace boostGEO = boost::geometry;
typedef boostGEO::model::point<double, 2, boostGEO::cs::cartesian> point;
typedef boostGEO::model::box<point> box;
typedef std::pair<box, std::pair<int, int> > edgesValue;

struct Item;
using ItemRelation = Item*;

struct Item {
double x, y;
int id;
std::vector<ItemRelation> _rel;
std::vector<ItemRelation> getRelations() const { return {}; }
};

int main() {
Item item1  { 1, 2, 1, {} },
item2  { 1, 4, 2, {} },
item3  { 1, 6, 2, {} },
item4  { 2, 1, 4, {} },
item5  { 2, 3, 5, {} },
item6  { 2, 5, 5, {} };

std::vector<Item*> items { &item1, &item2, &item3, &item4, &item5, &item6, };

item3._rel = { &item1, &item2 };
item6._rel = { &item4, &item5 };

boostGEO::index::rtree<edgesValue, boostGEO::index::rstar<16> > edgesTree;

for (size_t i = 0; i < items.size(); i++) {
Item *item = items.at(i);
std::vector<ItemRelation> relations = item->getRelations();

point ps1(item->x, item->y);
Item *relatedItem;
for (size_t j = 0; j < relations.size(); j++) {
relatedItem = relations.at(j);
point ps2(relatedItem->x, relatedItem->y);
box bounds(ps1, ps2);
edgesTree.insert(std::make_pair(bounds, std::make_pair(item->id, relatedItem->id)));
}
}
}
0

Другие решения

Ошибка подтверждения информирует вас о том, что границы значения, которое вы пытаетесь вставить, недопустимы. То есть для некоторого измерения максимальная координата Бокса меньше минимальной координаты. Вы можете проверить это перед вставкой нового значения в дерево:

if (bg::get<0>(ps1) > bg::get<0>(ps2) || bg::get<1>(ps1) > bg::get<1>(ps2))
{
std::cerr << "invalid bounds" << std::endl;
continue;
}

В будущем вы должны научиться отлаживать вашу программу. Отладчик остановится в месте, где утверждение не выполнено. Вы можете использовать стек вызовов, чтобы перейти к rtree::insert позвонить в main функция. Тогда вы сможете увидеть, что на самом деле вы пытаетесь вставить в дерево.

0

По вопросам рекламы [email protected]