查询与 boost::geometry::index::rtree 的交集

Posted

技术标签:

【中文标题】查询与 boost::geometry::index::rtree 的交集【英文标题】:Query for intersection with boost::geometry::index::rtree 【发布时间】:2015-10-13 11:05:41 【问题描述】:

我有 boost::geometry::index::rtree 的三个维度中轴对齐框的实例。我已经在 1.54 版本的 boost 中使用了点交叉点。像魅力一样工作。好吧,我还想查询与线(射线,截面)的交集,这似乎得到了 boost 1.59 的支持(错误,有一些小故障,但仍然令人印象深刻)。不幸的是,正如我所说,我使用的是 1.54 版。我现在没有任何机会改变它。所以问题是:如何在 boost 1.54 中扩展几何。所以它支持与rtree中的边界框的截面相交?我必须专攻哪些模板?我还有什么需要做的吗?想法? thb

【问题讨论】:

查看高度相关:***.com/questions/32457920/…;关于链接的提升邮件列表的讨论开始了。也许你可以称重 称重?如果您提到“一些故障”,我提到了提升 1.59。部分交叉点,很可能我已经认识到问题的根源,但是我看不到解决问题的明确方法。使它适用于所有可以想到的维度,它需要某种模板魔法,我无法理解。我看到的问题在于算法\segment_intersection.hpp ::box_segment_intersection::apply。我认为,它不能以这种简单的方式分解为维度。但像往常一样——也许我不对…… 顺便说一句,我还需要一个“平面”交叉口。好吧,一旦我弄清楚了段交叉点,那只是一个类比。 我也忘记在我的问题中提到“请”和“嗨”这两个词。我道歉... 首先greetings and thanks are discouraged as noise。其余的,您正在寻找扩展库。进入邮件列表。 @AdamWulkiewicz 有时在这里,但不如列表中的那么好。 【参考方案1】:

如果您将bgi::intersects() 谓词传递到查询中,rtree 会在内部调用bg::intersects(),后者调用bg::disjoint()。并且这些空间关系检查针对 QueryGeometry/Box 和 QueryGeometry/Indexable 进行了测试。例如。如果您要存储 Box,则 rtree 会在内部调用 bg::intersects(Box, QueryGeometry)

如果 QueryGeometry 类型适用于 Boost.Geometry 概念之一,例如Segment,但该功能根本没有在您使用的 Boost 版本中实现,您可以看到如何在最新版本的 Boost 中为组合概念实现算法。例如。 disjoint(Box, Segment) 在这里实现:https://github.com/boostorg/geometry/blob/master/include/boost/geometry/algorithms/detail/disjoint/segment_box.hpp。然后你大概可以在 Boost 1.54 中找到对应的地方,把这段代码放在那里。虽然 AFAIR 目录和文件结构自 1.54 以来发生了变化。我想您也可以尝试将整个 1.59 Boost.Geometry 代码与 Boost 1.54 一起使用,但当然不能保证它会起作用。正如@sehe 在 cmets 中指出的那样,disjoint/intersects 对于 1.59 中的 Box/Segment 组合存在错误。

如果 QueryGeometry 不是库支持的几何类型,这是 AFAIU 您的情况,例如Frustum、Cone、Plane、Ray 等,您可以简单地重载 bg::intersects()bg::disjoint() 以用于 rtree 想要调用的类型组合,在本例中为您的 QueryGeometry 和 Box。更多信息请参见:Boost Geometry/Spatial Query Shapes

【讨论】:

以上是关于查询与 boost::geometry::index::rtree 的交集的主要内容,如果未能解决你的问题,请参考以下文章

聚合与分组查询,F与Q查询

哪个查询更有效?内部联接与子查询?总和案例与拥有

SQL之复杂查询与视图

SQL之复杂查询与视图

嵌套查询与连接查询的区别是啥

BQ API ::查询与插入('查询')作业