2016-04-22 64 views
0

我有一个问题,我需要检查geohash是否落入其他具有动态半径/方框的点的列表中。我目前所做的是获取包含纬度/经度的ortb出价请求消息,并使用redis来检查哪些广告系列与ortb的设备经纬度匹配。这工作正常,如果我用固定半径查询。问题是我想用动态半径存储与人口密度相关的广告系列。检查geohash是否与另一个geohash相交

目前执行

在3.2版本中,你必须使用内置的命令来存储geohashes在zset的能力redis的的。这将纬度/经度转换为52位地理散列。

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

当前实现弊端

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

潜在改进执行

我在想这个问题,但我不知道如何把它在一起。我认为更好的解决方案是在不同精度的有序集合中创建地理杂凑列表,为每个条目创建一个地理哈希框。现在的问题是,我不能100%确定如何将其放在一起,或者如果它能按我的意愿工作。我真的很想找到指导,如果这能行得通,而且有人把这样的东西放在一起。我想我可以使用一个简单的有序集合来完成这个工作,然后在有序集合中的条目精确度下对这些位进行掩码。但是,在处理大量广告系列时,我可以看到这是一个问题。不完全确定它是否可以处理不同精度的多个整数,或者O符号如何处理这个问题。我需要它尽可能快,因为我每天处理大约4亿个请求。

注意

我希望我做这个问题的一个体面的工作,因为它是一个描述相当复杂的问题。我也看过不少图书馆,但我认为他们不会为我解决问题。我已经开始编写自己的实现,但复杂性很快就让我头疼。

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

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

这个看起来更有前途,但我不知道是否会实际上给搜索多个箱子的能力。

https://github.com/davidmoten/geo

这里是geohasing杰出的概述。不知道为什么它位于IP,但我很高兴我找到了它。

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

回答

1

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