2

我在 ES 中有两个 geo_shapes。我需要弄清楚的是了解其中一个形状(绿色)是否包含或与另一个(红色)相交的最佳方法。请参阅下面三种不同情况的可视化表示:

案例一:易于检测 - 使用绿色形状坐标进行 Geoshape 查询,“relation” = “within”</p>

案例二:也不是问题 - 使用绿色形状坐标使用“relation” = “INTERSECTS”进行 Geoshape 查询</p>

案例三:是一个真正的问题 - 使用绿色形状坐标我尝试使用“relation”=“INTERSECTS”进行 Geoshape 查询,结果返回红色形状......这是错误的 - 这些形状彼此不相交(我想是的)即使其中一方相互接触……

有什么办法可以避免这里的假阳性结果?还有其他建议如何解决此任务吗?

PS坐标是精确的(例如:13.335594692338)。没有像 tree_levels 或精度这样的额外映射...

在此处输入图像描述

4

1 回答 1

5

使用 geoshape 存储在 Elasticsearch 中的每个多边形都被转换为字符串列表。为了缩小这个解释的范围,我假设您在 Elasticsearch 中存储的多边形正在使用 geohash 存储(这是 geoshape 类型的默认值)。

我不想深入细节,但看看这张图片

地理哈希

此描述取自 Elasticsearch 文档(细节不匹配,但您需要了解全局):

Geohashes 将世界划分为一个由 32 个单元组成的网格(4 行 8 列),每个单元由一个字母或数字表示。g 单元覆盖格陵兰岛的一半、冰岛的全部和大不列颠的大部分地区。每个单元格可以进一步分为另外32个单元格,可以再分为32个单元格,以此类推。gc cell覆盖爱尔兰和英格兰,gcp覆盖伦敦大部分地区和英格兰南部部分地区,gcpuuz94k是白金汉宫的入口,精确到5米左右。

您的多边形被投影到矩形列表中,每个矩形都用一个字符串(geohash)表示。此投影的精度取决于树级别。我不知道 Elasticsearch 的默认树级别是什么,但如果您发现误报,它似乎对您来说太低了。

8 级的树将世界分割成大小为 的矩形 38.2m x 19.1m。如果你的多边形的边缘穿过这个矩形的中间,它可能会也可能不会(取决于实现)将此矩形的 geohash 表示分配给你的多边形。

要解决您的问题,您需要增加树级别以满足您的需求(更多关于映射here)。请注意,尽管索引的大小会大大增加(也取决于形状的大小和复杂性)。例如,存储 1000 个区域大小的多边形(有些具有 100 个点),树级别为 8 - 索引大小约为 600-700MB。

请记住,无论您选择什么树级别,您总是冒着得到一些误报的风险,因为geohash 永远不会 100% 精确地表示您的形状。这是精度与性能的权衡,geohash 是性能明智的选择

于 2016-08-10T18:44:32.623 回答