我在OS X上使用boost 1.56,通过自制软件安装。
我遇到了编译问题 - 具体来说,我似乎无法从boost :: geometry :: index :: rtree中删除值。
这是我到目前为止提出的代码:
#include <iostream>
#include <vector>
#include <string>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/index/rtree.hpp>
namespace bg = boost::geometry;
namespace bgm = bg::model;
namespace bgi = bg::index;
typedef bgm::point<float, 2, bg::cs::spherical_equatorial<bg::degree> > Point;
typedef bgm::box<Point> Box;
typedef std::pair<Box, int> BoxIdPair;
int main(int argc, char** argv) {
bgi::rtree<BoxIdPair, bgi::rstar<16>> tree;
// Some tree filling code excised from here for the sake of a minimal example.
BoxIdPair b1 = std::make_pair(Box(Point(24, 19), Point(35, 26)), 100);
BoxIdPair b2 = std::make_pair(Box(Point(41, 112), Point(54, 148)), 150);
BoxIdPair b3 = std::make_pair(Box(Point(34, 24), Point(36, 100)), 92);
BoxIdPair b4 = std::make_pair(Box(Point(21, 8), Point(43, 15)), 8);
tree.insert(b1);
tree.insert(b2);
tree.insert(b3);
tree.insert(b4);
while (!tree.empty()) {
std::cout << "Tree contains " << tree.size() << "box-id values." << std::endl;
// 1. Choose arbitrary BoxIdPair to be the leader of a new canopy.
// Remove it from the tree. Insert it into the canopy map, with its corresponding id.
Point origin(0.0, 0.0);
std::vector<BoxIdPair> result_set;
tree.query(bgi::nearest(origin, 1), std::back_inserter(result_set));
Box b = result_set[0].first;
int id = result_set[0].second;
tree.remove(result_set[0]); // This is the line that is giving me difficulty, I think.
// Additional code cut for minimal example
}
}
此代码无法编译! 具体来说,这是调用:
clang++ -g -std=c++11 -L/usr/local/Cellar/boost/1.56.0/lib -I/usr/local/Cellar/boost/1.56.0/include test.cc -o test
以下是编译器发出的错误(为了简洁起见,链接到pastebin): http://pastebin.com/d7E0A4Ee
三个相关错误是:
test.cc:71:10: note: in instantiation of member function 'boost::geometry::index::rtree<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2,
boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int>, boost::geometry::index::rstar<16, 4, 4, 32>,
boost::geometry::index::indexable<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> >,
boost::geometry::index::equal_to<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> >,
std::__1::allocator<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> > >::remove' requested here
tree.remove(result_set[0]);
^
/usr/local/Cellar/boost/1.56.0/include/boost/geometry/strategies/concepts/within_concept.hpp:183:21: note: candidate template ignored: couldn't infer template argument 'ApplyMethod'
static void apply(ApplyMethod const&)
test.cc:71:10: note: in instantiation of member function 'boost::geometry::index::rtree<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2,
boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int>, boost::geometry::index::rstar<16, 4, 4, 32>,
boost::geometry::index::indexable<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> >,
boost::geometry::index::equal_to<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> >,
std::__1::allocator<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> > >::remove' requested here
tree.remove(result_set[0]);
^
/usr/local/Cellar/boost/1.56.0/include/boost/mpl/assert.hpp:83:5: note: candidate function [with C = false] not viable: no known conversion from 'boost::mpl::failed
************(boost::geometry::nyi::not_implemented_error<boost::geometry::info::BOX, boost::geometry::info::BOX, void>::THIS_OPERATION_IS_NOT_OR_NOT_YET_IMPLEMENTED::************)(types<boost::geometry::info::BOX,
boost::geometry::info::BOX, void>)' to 'typename assert<false>::type' (aka 'mpl_::assert<false>') for 1st argument
int assertion_failed( typename assert<C>::type );
test.cc:71:10: note: in instantiation of member function 'boost::geometry::index::rtree<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2,
boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int>, boost::geometry::index::rstar<16, 4, 4, 32>,
boost::geometry::index::indexable<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> >,
boost::geometry::index::equal_to<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> >,
std::__1::allocator<std::__1::pair<boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, int> > >::remove' requested here
tree.remove(result_set[0]);
^
/usr/local/Cellar/boost/1.56.0/include/boost/geometry/algorithms/detail/relate/relate.hpp:282:1: note: candidate template ignored: substitution failure [with MatrixOrMask =
boost::mpl::vector<boost::geometry::detail::relate::static_mask<'T', '*', 'F', '*', '*', 'F', '*', '*', '*'>, boost::geometry::detail::relate::static_mask<'*', 'T', 'F', '*', '*', 'F', '*', '*', '*'>,
boost::geometry::detail::relate::static_mask<'*', '*', 'F', 'T', '*', 'F', '*', '*', '*'>, boost::geometry::detail::relate::static_mask<'*', '*', 'F', '*', 'T', 'F', '*', '*', '*'>, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, Geometry1 = boost::geometry::model::box<boost::geometry::model::point<float, 2,
boost::geometry::cs::spherical_equatorial<boost::geometry::degree> > >, Geometry2 = boost::geometry::model::box<boost::geometry::model::point<float, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree> >
>]
relate(Geometry1 const& geometry1,
^
任何人都有可能出错的想法?我很神秘。
答案 0 :(得分:2)
我看了你的代码,看起来很好。您刚刚使用选择的坐标系统遇到了限制,您的坐标尚未得到完全支持。
您可以通过更改坐标来验证这一点(这会使数据变得有趣,但这是关于编译成功的原因)。请参阅此测试程序,该程序显示删除项目的不同等效方法:
<强> Live On Coliru 强>
#include <iostream>
#include <vector>
#include <string>
#include <boost/geometry.hpp>
#include <boost/geometry/io/io.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/index/distance_predicates.hpp>
#include <boost/geometry/index/predicates.hpp>
#include <boost/geometry/index/rtree.hpp>
namespace bg = boost::geometry;
namespace bgi = bg::index;
namespace bgm = bg::model;
//typedef bgm::point<float, 2, bg::cs::spherical_equatorial<bg::degree> > Point;
typedef bgm::point<float, 2, bg::cs::cartesian> Point;
typedef bgm::box<Point> Box;
typedef std::pair<Box, int> BoxIdPair;
int main() {
using Tree = bgi::rtree<BoxIdPair, bgi::rstar<16> >;
Tree tree;
// Some tree filling code excised from here for the sake of a minimal example.
tree.insert({ { Point(24, 19), Point(35, 26) }, 100 });
tree.insert({ { Point(41, 112), Point(54, 148) }, 150 });
tree.insert({ { Point(34, 24), Point(36, 100) }, 92 });
tree.insert({ { Point(21, 8), Point(43, 15) }, 8 });
while (!tree.empty()) {
std::cout << "Tree contains " << tree.size() << " box-id values." << std::endl;
// 1. Choose arbitrary BoxIdPair to be the leader of a new canopy.
// Remove it from the tree. Insert it into the canopy map, with its
// corresponding id.
Point origin(0.0, 0.0);
auto first = bgi::qbegin(tree, bgi::nearest(origin, 1)),
last = bgi::qend(tree);
if (first != last) {
tree.remove(*first); // assuming single result
}
}
std::cout << "Tree emptied\n";
}
注意不要将基于迭代器的
remove()
与迭代器一起用于同一个rtree ,因为remove()
可能会使它们失效。注意所有
remove()
重载最终都会在内部推迟到raw_remove
。
我不完全确定为什么它不起作用。似乎没有为这个特定的几何组合定义一个确定索引操作是否为 interruptible
的特征。
更新感谢Adam的评论,我们知道这是因为内部within()
用于决定在树遍历期间应检查哪个节点。并且within(box, box)
目前尚未针对非笛卡尔坐标系实施。