Прежде всего я хотел бы сказать, что я не заинтересован в использовании Redis или любой другой пространственной БД. Я пытаюсь сделать очень упрощенный запрос диапазона геохэша в памяти, и я использую следующее программное обеспечение для вычисления геохэша: geohash-int C, и у меня есть оболочка Cython для вызова этих API в Python 3.6. Я использую SortedList для хранения геохэшей, и моя цель — создать простой диапазон геохэшей запрос в памяти.
#GeoHash is a Cython wrapper of external C geohash library (link provided)
from geo import GeoHash
from sortedcontainers import SortedList
import numpy as np
import time
minLat = 27.401436
maxLat = 62.54858
minLo = -180.0
maxLo = 179.95000000000002
latGrid = np.arange(minLat,maxLat,0.05)
lonGrid = np.arange(minLo,maxLo,0.05)
geoHash = GeoHash()
print(latGrid.shape,lonGrid.shape)
gridLon,gridLat = np.meshgrid(lonGrid,latGrid)
grid_points = np.c_[gridLon.ravel(),gridLat.ravel()]
sl = SortedList()
geohash1 = {}
t0 = time.time()
for grid_point in grid_points:
lon = grid_point[0]
lat = grid_point[1]
geohash = geoHash.encode(lon,lat,26)
bitsOriginal = geohash["bits"]
sl.add(bitsOriginal)
neighbors = geoHash.get_neighbors(geohash)
for k,v in neighbors.items():
bits1 = v["bits"]
sl.add(bits1)
t1 = time.time()
print(t1-t0)
lonTest = 172.76843
latTest = 61.560745
geohashTest = geoHash.encode(lonTest,latTest,26)
bitsTest = geohashTest["bits"]
Я хочу сделать следующее
it = sl.irange(bitsTest-window,bitsTest+window)
Мой вопрос: как мне рассчитать окно? Я хочу, чтобы окно было в пределах 0,1 градуса или любого другого окна, которое я укажу. Я понятия не имею, как рассчитать окно. Весь пакет geohash работает очень быстро, и меня интересуют только приблизительные совпадения для моего запроса. Я считаю, что моя контрольная точка должна находиться в диапазоне набора входных данных, для которого я рассчитал геохэши, но я понятия не имею, как получить диапазон геохэшей для моей точки запроса. Может кто-нибудь помочь?
ОБНОВЛЕНИЕ Предлагаемый ответ хорош, но имеет сложность O(N). Если существует сложность порядка O(log N), это было бы приемлемо.