C++ 如何查询框是否在rtree中 问题:

C++ 如何查询框是否在rtree中 问题:,c++,boost,boost-geometry,C++,Boost,Boost Geometry,为什么查找框是否在rtree中的查询返回空结果 解释 拿绳子 LINESTRING(1 1, 2 2) 和两个多边形 POLYGON((0 0,0 1,1 1,1 0,0 0)) POLYGON((0 0,0 3,3 3,3 0,0 0)) 我可以使用boost::geometry::witin()来查询线条字符串是否在任一多边形内(并且可以工作) 但是,如果我创建一个多边形的rtree,并在linestring周围放置一个框,查询框是否在内,rtree返回一个空结果 例子 下面的示例显示了

为什么查找
是否在
rtree
中的查询返回空结果

解释 拿绳子

LINESTRING(1 1, 2 2)
和两个多边形

POLYGON((0 0,0 1,1 1,1 0,0 0))
POLYGON((0 0,0 3,3 3,3 0,0 0))
我可以使用
boost::geometry::witin()
来查询线条字符串是否在任一多边形内(并且可以工作)

但是,如果我创建一个多边形的
rtree
,并在
linestring
周围放置一个
,查询
是否在
内,
rtree
返回一个空结果

例子 下面的示例显示了工作的
bg::in(line,polygon)
,以及非工作的
rtree.query(bgi::in(line_box1),…)

void rtree_in(){
typedef bgm::pointpoint;
typedef bgm::box;
typedef bgm::linestring行;
typedef-bgm::多边形;
typedef std::对值;
bgi::rtree-rtree;
std::向量结果;
多边形poly1;
多边形多边形2;
第1行;
bg::read_wkt(“多边形((0,01,11,10,0))”,poly1);
bg::read_wkt(“多边形((0,03,33,30,0))”,poly2);
bg::read_wkt(“LINESTRING(11,22)”,第1行;

std::cout当调用(geom1,geom2)内的自由函数
如果
geom1
geom2
内,则返回TRUE。但当您阅读有关使用
内的
作为谓词的参考时

生成一个定义值和几何关系的谓词。如果bg::within(Indexable,Geometry)返回true,则查询将返回值


因此,您试图检查
可索引
是否在
几何体
内,结果为false[可索引为rect,几何体为line]。您应该使用rtree在
内使用
包含
谓词,而不是
包含
谓词等价于
bg::内(几何体,可索引)
然后您的代码按预期工作。

是的,这似乎是解决方案,尽管目前给出的推理对我来说并不直观。我将回到绘图板,再次尝试理解它。
void rtree_within() {

  typedef bgm::point< double, 2, bg::cs::cartesian > point;
  typedef bgm::box<point> box;
  typedef bgm::linestring<point> line;
  typedef bgm::polygon<point> polygon;

  typedef std::pair<box, unsigned> value;

  bgi::rtree<value, bgi::quadratic<16> > rtree;
  std::vector<value> result_s;

  polygon poly1;
  polygon poly2;
  line line1;

  bg::read_wkt("POLYGON((0 0,0 1,1 1,1 0,0 0))", poly1);
  bg::read_wkt("POLYGON((0 0,0 3,3 3,3 0,0 0))", poly2);
  bg::read_wkt("LINESTRING(1 1, 2 2)", line1);

  std::cout << "line2 in poly1: " << bg::within(line1, poly1) << std::endl;
  std::cout << "line2 in poly3: " << bg::within(line1, poly2) << std::endl;

  // boxes to insert into rtree
  box poly_box1 = bg::return_envelope<box>( poly1 );
  rtree.insert(std::make_pair(poly_box1, 0));

  box poly_box2 = bg::return_envelope<box>( poly2 );
  rtree.insert(std::make_pair(poly_box2, 2));

  // box around the line
  box line_box1 = bg::return_envelope<box>( line1 );

  std::cout << "poly_box1: " << bg::wkt( poly_box1 ) << std::endl; // returns 0
  std::cout << "poly_box2: " << bg::wkt( poly_box2 ) << std::endl; // returns 1
  std::cout << "line_box1: " << bg::wkt( line_box1 ) << std::endl;

  rtree.query(bgi::within( line_box1 ), std::back_inserter( result_s ));
  std::cout << "line_box1 within rtree - size: " << result_s.size() << std::endl;
  // result_s is empty (size == 0)

}