2016-04-22 68 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圖的單元格都有一個顏色。然後只需檢查點的顏色。