我在ES里有两个geo_shapes。我需要弄清楚的是最好的方法来理解其中一个形状(绿色)是否包含或与另一个(红色)相交。请参阅以下三种不同案例的视觉表现:
Case I:易于检测--使用Green shape坐标进行带有“relation”=“I”的Geoshape查询
案例二:也没有问题--使用绿色形状坐标,使用“relation”=“INTERSECTS”进行Geoshape查询。
案例三:这是一个真正的问题--使用绿色形状坐标,我尝试使用“relation”=“INTERSECTS”进行一个Geoshape查询,并且返回红色形状作为结果…,这个结果是假的--这个形状彼此不相交(我认为是这样),即使其中一方是相互接触的…。
有办法避免这里的假阳性结果吗?对于如何解决这个问题,还有其他建议吗?
P.S.坐标精确(例如: 13.335594692338)。没有像tree_levels或精度这样的附加映射.

发布于 2016-08-10 18:44:32
使用geoshape存储在Elasticsearch中的每个多边形都被转换成一个字符串列表。为了缩小这个解释的范围,我将假设您在Elasticsearch中存储的多边形是使用Geo散列存储( geoshape类型的默认值)。
我不想谈太多的细节,但是看看这张照片

这个描述摘自Elasticsearch文档(细节不匹配,但您需要了解全局):
Geohashes将世界划分为一个由32个单元格组成的网格--4行8列--每个单元格用一个字母或数字表示。G细胞覆盖了格陵兰岛的一半,冰岛的所有地区,大英国的大部分地区。每个细胞可以进一步分裂成另一个32个细胞,这些细胞可以再分裂成另一个32个细胞,等等。gc单元覆盖爱尔兰和英格兰,gcp覆盖伦敦大部分地区和部分英格兰南部,gcpuuz94k是白金汉宫的入口,精确到5米。
您的多边形正在被投影到矩形列表中,每个矩形都由一个字符串(Geo散列)表示。这个投影的精度取决于树的水平。我不知道Elasticsearch的默认树级别是什么,但是如果您发现了假阳性,它似乎对您来说太低了。
树级为8 把世界分割成大小的矩形 38.2m x 19.1m。如果多边形的边缘穿过这个矩形的中间,它可能会也可能不会(取决于实现)将这个矩形的地理哈希表示分配给你的多边形。
为了解决您的问题,您需要,增加树级以满足您的需要(更多关于映射这里)。注意,尽管索引的大小会大幅度增加(也取决于形状的大小和复杂性)。例如,存储1000个区域大小多边形(有些有100个点),树级为8-索引大小约为600至700 an。
请记住,无论您选择何种树级,您总是有可能得到一些假阳性,因为地理散列永远不会100%精确地表示您的形状。这是一个精确的与性能的权衡,而地散列是性能明智的选择。
https://stackoverflow.com/questions/38880369
复制相似问题