Я пытаюсь зарегистрировать классы геометрии 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>
?
Эта проблема существует в 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
Если у вас есть предложения или вы нашли ошибку, не стесняйтесь связаться с разработчиками в списке рассылки или сообщить об ошибке Вот.
В этом конкретном случае не было ошибки с моим кодом адаптера. На самом деле, все это было в сообщении об ошибке для начала:
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));
Я не могу поверить, что это вызвало у меня три часа поисков. Надеюсь, это кому-нибудь поможет.