Хранение OGRPoint в Boost.Geometry rtree

Я пытаюсь зарегистрировать классы геометрии OGR с Boost.Geometry, чтобы в конечном итоге использовать их в RTree Boost.Geometry. С этой целью я следовал руководству / примеру в документации Boost.Geometry и зарегистрировал OGRPoint, используя BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET макрос:

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(
OGRPoint,
double,
boost::geometry::cs::spherical_equatorial<boost::geometry::degree>,
getX,
getY,
setX,
setY)

Мой простой тестовый драйвер просто создает RTree с boost::geometry::model::box Indexable:

typedef bg::model::box<OGRPoint> OGRBox;
typedef std::pair <OGRBox, unsigned> Value;

bgi::rtree<Value, bgi::rstar<16>> rtree;
OGRPoint testP0(12.0, 18.0),
testP1(1.2, 1.8);

rtree.insert(std::make_pair(OGRBox(testP0, testP0), 0));
rtree.insert(std::make_pair(OGRBox(testP1, testP1), 1));

Тем не менее, я застрял с ошибкой компиляции, которая сводится к утверждению в Boost:

../../../../include/boost/geometry/index/rtree.hpp:576:398: note:   cannot convert 'boost::geometry::index::rtree<Value, Options, IndexableGetter, EqualTo, Allocator>::insert(const Range&)::PASSED_OBJECT_IS_NOT_A_RANGE576::assert_arg<std::pair<boost::geometry::model::box<OGRPoint>, int> >()' (type 'mpl_::failed************ (boost::geometry::index::rtree<Value, Options, IndexableGetter, EqualTo, Allocator>::insert(const Range&) [with Range = std::pair<boost::geometry::model::box<OGRPoint>, int>; Value = std::pair<boost::geometry::model::box<OGRPoint>, unsigned int>; Parameters = boost::geometry::index::rstar<16ul>; IndexableGetter = boost::geometry::index::indexable<std::pair<boost::geometry::model::box<OGRPoint>, unsigned int> >; EqualTo = boost::geometry::index::equal_to<std::pair<boost::geometry::model::box<OGRPoint>, unsigned int> >; Allocator = std::allocator<std::pair<boost::geometry::model::box<OGRPoint>, unsigned int> >]::PASSED_OBJECT_IS_NOT_A_RANGE::************)(std::pair<boost::geometry::model::box<OGRPoint>, int>)') to type 'mpl_::assert<false>::type {aka mpl_::assert<false>}'
BOOST_MPL_ASSERT_MSG((detail::is_range<Range>::value), PASSED_OBJECT_IS_NOT_A_RANGE, (Range));

Есть ли что-то еще, что мне нужно сделать, как реализация Boost.Range для boost::geometry::model::box<OGRPoint>?

3

Решение

Эта проблема существует в Boost 1.56 и старше.

Есть 3 перегрузки rtree::insert():

rtree::insert(value_type const&)
rtree::insert(Iter first, Iter last)
rtree::insert(Range const&) // 1.56 and older

В Boost 1.56 и старше, когда объект типа отличается от value_type передается в insert() Функция-член rtree рассматривает его как Range (объект типа, адаптированный к одному из понятий Boost.Range). Сообщение об ошибке выдается во время компиляции, когда параметр не является Range.

В Boost 1.57 ваш код должен работать, потому что функция теперь распознает параметры, конвертируемые в value_type, Теперь 3-я перегрузка это:

rtree::insert(ConvertibleOrRange const&) // 1.57

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

3

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

В этом конкретном случае не было ошибки с моим кодом адаптера. На самом деле, все это было в сообщении об ошибке для начала:

typedef std::pair <OGRBox, unsigned> Value;

Обратите внимание unsigned,

Ошибка, однако, гласит:

std::pair<boost::geometry::model::box<OGRPoint>, int>

Да, int. Решение состоит в том, чтобы использовать конструктор std::pair<OGRBox, unsigned> напрямую или добавить u на число буквальное, как это:

rtree.insert(std::make_pair(OGRBox(testP0, testP0), 0u));

Я не могу поверить, что это вызвало у меня три часа поисков. Надеюсь, это кому-нибудь поможет.

1

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