检查一个 geohash 是不是与另一个 geohash 相交

Posted

技术标签:

【中文标题】检查一个 geohash 是不是与另一个 geohash 相交【英文标题】:Checking if a geohash intersects another geohash检查一个 geohash 是否与另一个 geohash 相交 【发布时间】:2016-08-16 12:04:39 【问题描述】:

我有一个问题,我需要检查 geohash 是否属于具有动态半径/框的其他点列表。我目前正在做的是获取包含 lat/lon 的 ortb 投标请求消息,并使用 redis 检查哪些活动将与 ortb 的设备 lat/lon 匹配。如果我使用固定半径进行查询,这可以正常工作。问题是我想根据人口密度存储具有动态半径的活动。

当前的实现

在 3.2 版本的 redis 中,您可以使用内置命令将 geohashes 存储在 zset 中。这会将 lat/lon 转换为 52 位 geohash。

使用 redis zset 功能,我可以查询同样通过半径的活动列表。这将返回我 (0,n) 属于当前半径的广告系列。

当前实施的缺陷

我遇到的问题是广告系列具有动态半径。因此,例如 1 个活动的半径可能为 3 英里,而另一个活动的半径可能为 20 英里。由于我需要通过单个半径,因此我只需通过 5 英里,但这将排除来自 20 英里半径的请求。

可能改进的实施

我正在考虑这个问题,但不知道如何将它放在一起。我认为更好的解决方案是在排序集中具有不同精度的地理哈希列表,基本上为每个条目创建一个地理哈希框。现在的问题是,我不能 100% 确定如何将它们组合在一起,或者它是否能按我的意愿工作。我真的在寻找指导,如果这可行,如果有人把这样的东西放在一起。我想我可以使用一个简单的排序集来完成此操作,然后将位掩码到排序集中条目的精度。但是,在处理大量广告系列时,我可以看到这是一个问题。不确定它是否适用于不同精度的多个整数,或者 O 表示法如何在这个整数上工作。我需要它尽可能快,因为我每天要处理大约 4+0 亿个请求。

备注

我希望我在这个问题上做得不错,因为这是一个很难描述的问题。我也看过不少图书馆,但我认为它们不会为我解决问题。我已经开始编写自己的实现,但其复杂性很快让我头疼。

我调查的原始库。允许单框查询。

https://github.com/kungfoo/geohash-java

这个看起来更有希望,但我不确定它是否真的可以搜索多个框。

https://github.com/davidmoten/geo

这是地理哈希的出色概述。不知道为什么它位于 IP,但我很高兴找到它。

http://23.239.12.206:8000/posts/2014-04-05-geohash-proximity-pt2.html

【问题讨论】:

【参考方案1】:

您可以尝试加权 voronoi 图和多边形测试中的点。一个简单而快速的解决方案可能是位图,加权 voronoi 图的每个单元格都有颜色。然后简单地检查点的颜色。

【讨论】:

以上是关于检查一个 geohash 是不是与另一个 geohash 相交的主要内容,如果未能解决你的问题,请参考以下文章

从一个表中选择所有元素,并检查它们是不是与另一个表匹配

核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配

php通过geohash算法实现查找附近的商铺

python geohash怎么安装

GeoHash

如何检查时间段是否与另一个时间段重叠,而与AM / PM无关