- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Boost C++ 库找到在 rtree 中索引的所有元素,这些元素与带孔的多边形的外环相交但不完全在任何孔内。
我知道如何让元素与外环相交:
// Constructing the exterior ring polygon
Boost2dRing p;
for (int i = 0; i < numPunts; i++)
{
x = Punts.at(i).x;
y = Punts.at(i).y;
p.push_back(Boost2dPoint(x, y));
}
// Getting the intersecting elements with that polygon
m_RTree.query(bgi::intersects(p), std::back_inserter(res));
...
// Constructing the polygon for the inner ring (hole)
Boost2dRing p;
for (int i = 0; i < numPuntsHole; i++)
{
x = PuntsHole.at(i).x;
y = PuntsHole.at(i).y;
pHole.push_back(Boost2dPoint(x, y));
}
// Now I try to get the elements inside completely this polygon but I get a compilation error
m_RTree.query(bgi::within(pHole), std::back_inserter(res));
错误信息:
error C2664: 'int boost::mpl::assertion_failed(boost::mpl::assert::type)': cannot convert argument 1 from 'boost::mpl::failed ************(__cdecl boost::geometry::strategy::within::services::default_strategy::NOT_IMPLEMENTED_FOR_THESE_TYPES::* ***********)(boost::mpl::assert_::types)' to 'boost::mpl::assert::type' 1> with 1> [ 1> Geometry1=Boost2dBox, 1> Geometry2=Boost2dRing, 1>
GeometryContained=Boost2dBox, 1>
GeometryContaining=Boost2dRing 1> ] note: No constructor could take the source type, or constructor overload resolution was ambiguous
有什么实现这个目标的提示吗?
最佳答案
within 谓词未针对您选择的几何操作数实现。
但是,您可以用很多 更少的工作做您想做的事。例如,假设您有戒指:
Boost2dRing exterior, interior;
bg::read_wkt("POLYGON((0.1 0.1,0.1 0.5,0.5 0.5,0.5 0.1,0.1 0.1))", exterior);
bg::read_wkt("POLYGON((0.2 0.2,0.2 0.4,0.4 0.4,0.4 0.2,0.2 0.2))", interior);
现在,Boost Geometry 有了一个 Polygon 的概念这是一个外环和(多个)内环:
A polygon is A polygon is a planar surface defined by one exterior boundary and zero or more interior boundaries (OGC Simple Feature Specification)
所以,让我们改用它:
bg::reverse(interior);
Boost2dPolygon polygon;
polygon.outer() = exterior;
polygon.inners().push_back(interior);
Note that the orientation of the inner ring is inverted.
或者,实际上,直接使用构造函数:
Boost2dPolygon polygon({exterior, interior});
或者,甚至立即从 WKT 读取它:
bg::read_wkt("POLYGON((0.1 0.1,0.1 0.5,0.5 0.5,0.5 0.1,0.1 0.1) (0.2 0.2,0.4 0.2,0.4 0.4,0.2 0.4,0.2 0.2))", polygon);
现在你可以一次查询:
std::vector<RTree::value_type> res;
m_RTree.query(bgi::intersects(polygon), std::back_inserter(res));
给定以下 sample()
树内容:
using RTree = bgi::rtree<std::pair<Boost2dBox, std::string>, bgi::rstar<16> >;
RTree sample() {
RTree tree;
std::pair<std::string, std::string> items[] = {
{ "BOX(0.2 0.2,0.2 0.4,0.4 0.4,0.4 0.2,0.2 0.2)", "ok" },
{ "BOX(0.28 0.28,0.28 0.32,0.32 0.32,0.32 0.28,0.28 0.28)", "within gap" },
{ "BOX(0.28 0.28,0.28 0.32,0.36 0.32,0.36 0.28,0.28 0.28)", "small overlap" },
{ "BOX(2 2,2 4,4 4,4 2,2 2)", "outside exterior" },
};
for (auto& item : items) {
Boost2dBox box;
bg::read_wkt(item.first, box);
checks("box", box);
tree.insert({box, item.second});
}
return tree;
}
我们可以手动测试:
RTree const m_RTree = sample();
std::cout << "Sample tree:\n";
for (auto& value : m_RTree) {
std::cout << " - " << std::quoted(value.second) << ": " << bg::wkt(value.first) << "\n";
Boost2dMultiPolygon mp;
if (bg::intersection(polygon, value.first, mp))
std::cout << " (intersection is " << bg::wkt(mp) << ")\n";
}
哪个打印
Sample tree:
- "ok": POLYGON((0.2 0.2,0.2 0.4,0.4 0.4,0.4 0.2,0.2 0.2))
(intersection is MULTIPOLYGON(((0.2 0.2,0.2 0.4,0.4 0.4,0.4 0.2,0.2 0.2),(0.25 0.25,0.35 0.25,0.35 0.35,0.25 0.35,0.25 0.25))))
- "within gap": POLYGON((0.28 0.28,0.28 0.32,0.32 0.32,0.32 0.28,0.28 0.28))
(intersection is MULTIPOLYGON())
- "small overlap": POLYGON((0.28 0.28,0.28 0.32,0.36 0.32,0.36 0.28,0.28 0.28))
(intersection is MULTIPOLYGON(((0.35 0.32,0.36 0.32,0.36 0.28,0.35 0.28,0.35 0.32))))
- "outside exterior": POLYGON((2 2,2 4,4 4,4 2,2 2))
(intersection is MULTIPOLYGON())
并验证与树查询比较的结果:
m_RTree.query(bgi::intersects(polygon), std::back_inserter(matches));
std::cout << "Intersecting with: ";
for (auto& match : matches) std::cout << " " << std::quoted(match.second) << " ";
打印:
Intersecting with: "ok" "small overlap"
查看全部 Live On Coliru
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/multi_polygon.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/multi_polygon.hpp>
#include <boost/geometry/core/cs.hpp>
#include <boost/geometry/arithmetic/arithmetic.hpp>
#include <boost/geometry/algorithms/within.hpp>
#include <boost/geometry/algorithms/intersects.hpp>
#include <boost/geometry/algorithms/envelope.hpp>
#include <boost/geometry/algorithms/intersection.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <boost/geometry/index/predicates.hpp>
#include <boost/geometry/index/adaptors/query.hpp>
#include <boost/geometry/io/io.hpp>
#include <iostream>
#include <fstream>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
using Boost2dPoint = bg::model::d2::point_xy<double>;
using Boost2dRing = bg::model::ring<Boost2dPoint>;
using Boost2dPolygon = bg::model::polygon<Boost2dPoint>;
using Boost2dMultiPolygon = bg::model::multi_polygon<Boost2dPolygon>;
using Boost2dBox = bg::model::box<Boost2dPoint>;
template <typename G> void checks(std::string name, G& geom) {
std::cout << name << ": " << bg::wkt(geom) << "\n";
std::string reason;
if (!bg::is_valid(geom, reason)) {
std::cout << name << ": " << reason << "\n";
bg::correct(geom);
std::cout << bg::wkt(geom) << "\n";
if (!bg::is_valid(geom, reason)) {
std::cout << name << " corrected: " << reason << "\n";
}
}
}
using RTree = bgi::rtree<std::pair<Boost2dBox, std::string>, bgi::rstar<16> >;
RTree sample() {
RTree tree;
std::pair<std::string, std::string> items[] = {
{ "BOX(0.2 0.2,0.2 0.4,0.4 0.4,0.4 0.2,0.2 0.2)", "ok" },
{ "BOX(0.28 0.28,0.28 0.32,0.32 0.32,0.32 0.28,0.28 0.28)", "within gap" },
{ "BOX(0.28 0.28,0.28 0.32,0.36 0.32,0.36 0.28,0.28 0.28)", "small overlap" },
{ "BOX(2 2,2 4,4 4,4 2,2 2)", "outside exterior" },
};
for (auto& item : items) {
Boost2dBox box;
bg::read_wkt(item.first, box);
checks("box", box);
tree.insert({box, item.second});
}
return tree;
}
int main() {
Boost2dPolygon polygon;
bg::read_wkt("POLYGON((0.1 0.1,0.1 0.5,0.5 0.5,0.5 0.1,0.1 0.1) (0.25 0.25,0.35 0.25,0.35 0.35,0.25 0.35,0.25 0.25))", polygon);
checks("polygon", polygon);
RTree const m_RTree = sample();
std::cout << "Sample tree:\n";
for (auto& value : m_RTree) {
std::cout << " - " << std::quoted(value.second) << ": " << bg::wkt(value.first) << "\n";
Boost2dMultiPolygon mp;
if (bg::intersection(polygon, value.first, mp))
std::cout << " (intersection is " << bg::wkt(mp) << ")\n";
}
std::cout << "\n";
std::vector<RTree::value_type> matches;
m_RTree.query(bgi::intersects(polygon), std::back_inserter(matches));
std::cout << "Intersecting with: ";
for (auto& match : matches) std::cout << " " << std::quoted(match.second) << " ";
std::cout << "\n";
}
关于c++ - 在多边形内查找 Boost rtree 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537734/
我测试了 boost.geometry.index.rtree (boost 1.59 www.boost.org) 和 superliminal.RTree ( http://superlimina
我正在尝试在 python 中剪辑空间数据,但是当我运行我的代码时...... europe = gpd.clip(worldmap, europe_bound_gdf) ...我收到错误: ( Im
这是我的代码片段。我正在尝试为顶点类对象 RTreeVertex 创建一个 rtree 树。 class Entity { public: int num; public: Entity(in
我想完全理解 Java 上的二维 RTree,但我在解释中迷路了,我希望有人能告诉我它们是如何工作的。 我对他们的了解是这样的: 您从具有最大条目数 M 的节点列表开始,当您尝试获得更多值时,您必须拆
我正在尝试了解 RTree 算法的基础知识,并且正在尝试弄清楚它是如何执行搜索的,例如1 公里内的所有餐厅。我们会将所有对象存储在数据库中的矩形中,然后我们(可能)会根据我们当前的位置构建一个查询矩形
我需要构建一个 R树使用给定的数据点。我已经搜索了 R 树的实现。当给定矩形坐标作为输入时,我发现所有实现都构建了 r 树。当给定数据点本身时,我需要构建 r 树(它可以是一维的)。代码应该负责创建包
我很疑惑。考虑以下代码,稍微改编自 http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/spatial_index
我一直在尝试调试使用 Pythons RTree version 0.8.2 的软件包中的一些奇怪行为. 为了跟踪问题,我需要每隔几分钟序列化一次 RTree 实例,当问题发生时我可以得到一个非常准确
我正在关注 boost geometry rtree文档。我能够使用一个框执行空间查询,以检索与其相交的 rtree 元素列表。 我想知道是否有一种方法可以在 rtree 和另一个 rtree(相同类
我使用 OpenCv 进行图像分类。训练后我将模型保存到 *.yaml.gz。然后我将这个文件添加到嵌入式资源中。现在我需要从资源加载模型,但 OpenCv 只允许从文件或字符串加载。 HMODULE
我正在 heroku 上部署一个 GIS 应用程序。我在我的电脑上开发了它,当我部署它时,rtree 不见了。我无法通过 pip 安装它,因为 pip 安装有问题,正如 rtree 开发人员自己所说的
我正在尝试使用Rtree并面对这种奇怪的行为:INSERT语句在普通表中正常工作,但在rtree表中却失败了: 这个例子很好用: DROP TABLE IF EXISTS ltssoffsets; C
我想使用 Boost C++ 库找到在 rtree 中索引的所有元素,这些元素与带孔的多边形的外环相交但不完全在任何孔内。 我知道如何让元素与外环相交: // Constructing the ext
经过一些阅读后,我了解到层次结构遍历虽然可能在 boost rtree 中并未得到官方支持。我有几个不同的用例,我可以在没有层次结构遍历的情况下进行管理,但我不确定效率。因此,我正在寻求有关 boos
将新框插入 rtree 时,我想首先检查树中是否已经存在相同的框。如果是,我只想获取该值,否则我需要插入一个新值。执行此操作的最佳(即最有效)方法是什么? 我可以通过调用 nearest(box,1)
我正在尝试在我的一个项目中使用 boost::geometry 的 rtree DS,但我发现很难浏览文档。某些方法的文档很少,我找不到足够的例子。现在,我正在尝试构建示例程序,以便进一步构建它。 因
Pickling Rtree 看起来并不简单,因为它是一个 ctypes 包装器。 This comment在 SO 秒假设。 但是,在(很多)旧的@sgillies post (这个库的作者),在评
我在 5 维空间中有大约 10 K 个点。我们可以假设这些点随机分布在空间 (0,0,0,0,0) 和 (100,100,100,100,100) 中。显然,整个数据集可以很容易地驻留在内存中。 我想
Boost rtree 为某些与段查询的交集给出了错误的交集结果。在这种情况下,边界框是 y=0 处的 y 平面 10x10 正方形。我正在查询从 (2, 1, 0) 到 (2, 1, 10) 的 z
我有一个城市的简化 map ,其中有街道作为线串,地址作为点。我需要找到从每个点到任何街道线的最近路径。我有一个执行此操作的工作脚本,但它在多项式时间内运行,因为它嵌套了 for 循环。对于 150
我是一名优秀的程序员,十分优秀!