gpt4 book ai didi

c++ - 如何查询一个框是否在rtree中

转载 作者:行者123 更新时间:2023-11-28 04:37:03 24 4
gpt4 key购买 nike

问题

为什么我查找 box 是否在 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 周围放置一个 box,查询 box 位于 中,rtree 返回空结果。

例子

这是一个示例,显示了工作 bg::within(line, polygon) 和非工作 rtree.query(bgi::within( line_box1 ), ... )

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)

}

最佳答案

当您调用自由函数 within(geom1,geom2) 时,如果 geom1geom2 内,则返回 TRUE。但是,当您阅读有关使用 within 作为谓词

的引用资料时

Generate a predicate defining Value and Geometry relationship. Value will be returned by the query if bg::within(Indexable, Geometry) returns true.

因此您正在尝试检查 indexable 是否在 geometry 内部,结果为 false [indexable 是 rect,geometry 是 line]。您应该使用 contains 谓词而不是 within 使用 rtree。 contains 谓词等同于 bg::within(Geometry, Indexable) 那么您的代码将按预期工作。

关于c++ - 如何查询一个框是否在rtree中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51112526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com