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

时间:2016-04-22 18:26:22

标签: java geospatial geo

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

当前实施

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

使用redis zset功能,我可以查询也在半径范围内传递的广告系列列表。这将返回属于当前半径的我(0,n)广告系列。

当前的实施缺陷

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

潜在改进实施

我正在考虑这个问题,但我不确定如何把它放在一起。我认为更好的解决方案是在具有不同精度的有序集合中创建一个geohashes列表,实质上为每个条目创建一个geo哈希框。现在的问题是,我不是百分之百地确定如何将它们放在一起,或者它是否能像我想要的那样工作。我真的在寻找指导,如果这可以工作,如果有人把这样的东西放在一起。我想我可以使用一个简单的排序集来完成这个,然后按照排序集中条目的精度来屏蔽这些位。但是,在处理大量广告系列时,我可以看到这是一个问题。不确定它是否可以使用不同精度的多个整数或O符号如何在这个上运行。我需要它尽可能快,因为我每天要处理大约4亿个请求。

备注

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

我调查过的原始图书馆。允许单箱查询。

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 个答案:

答案 0 :(得分:1)

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

相关问题