Нахождение геохэш определенной длины в радиусе от точки
У меня есть очки с заданным латлонгом и расстоянием вокруг них - например, { 40.6826048,-74.0288632: 20 миль, 51.5007825,-0.1258957: 100 миль}. Если я выберу фиксированную длину геохеша (скажем, равную ~ 1x1 мили), как я могу найти все записи геохеша этой длины, которые имеют заданный радиус от каждой точки?
Чтобы добавить некоторый фон - причина, по которой я хочу это сделать, заключается в том, чтобы я мог сохранить кэш, снабженный идентификатором geohash, со значением списка точек, для которых данный geohash находится в пределах радиуса (а также соответствует некоторым пользовательским правилам приемлемости). Затем я могу быстро найти геохэш местоположения пользователя, чтобы найти все подходящие точки вокруг него.
2 ответа
Вот как я бы попытался сделать:
Ввод: точка интереса (широта, долгота), радиус запроса
Шаг 1: Найдите МИНИМАЛЬНЫЙ ОГРАНИЧИТЕЛЬНЫЙ прямоугольник (MBR), который полностью содержит QUERY CIRCLE
Шаг 2: Чтобы создать минимальный ограничивающий прямоугольник, сначала рассчитайте его минимальный и максимальный широтный, длинный, используя входные параметры. Пожалуйста, обратитесь к разделам 3.1 и 3.3 Расчет минимальной и максимальной широты долготы - правильный путь
Шаг 3: Использование (minLat, minLon), (maxLat, maxLon)
рассчитать четыре угла MBR NorthWest (maxLat, minLon)
, Юго-запад (minLat, minLon)
, Юго-восток (minLat, maxLon)
Северо-восток (maxLat, maxLon)
Шаг 4: Рассчитайте GeoHash для всех четырех углов MBR
Пример: для точки в Нью-Йорке, скажем, (40.75798, -73.991516), расстояние: 800 метров и длина GeoHash: 12
- Северо-Западный
dr5ru
j4477kd
- Юго-Запад:
dr5ru
46ne2ux
- Юго-Восток:
dr5ru
6ryw0cp
- Северо-восток:
dr5ru
mpfq534
Шаг 5: Из этих GeoHashes вычислите префикс Query Bounding Box(MBR): dr5ru
Это даст вам более грубый GeoHash, который полностью содержит нашу MBR и, следовательно, область запроса. Другими словами, все точки проиндексированы dr5ru, что дает 32 GeoHashes из dr5ru0 - dr5ruz
Заключительный этап:
Чтобы найти точные сетки (или) GeoHashes, которые соответствуют нашему кругу запросов (точнее, квадрату (MBR)), мы должны выбрать из этих 32 GeoHashes, представляя повторяющуюся матрицу (4X8), используя 2D Array.
В нашем примере: мы получаем dr5ru
+ J, M, H, K, 5, 7, 4, 6
, Все эти GeoHashes представляют точки, которые within
800 метров от центральной точки запроса, за исключением очень немногих геохэшей, которых нельзя было избежать из-за рассмотрения MBR вместо идеального круга.
ОБЩИЙ ПРОЦЕСС В ОДНОМ ГИФЕ: (Шаг 1- 5)
ЗАКЛЮЧИТЕЛЬНЫЙ ЭТАП:
Важно: пожалуйста, найдите использование 4 x 8 Grid для GeoHash. Он варьируется для каждого символа по длине GeoHash. Для длины ODD это 8 x 4, для четного транспонирования 4 X 8. В нашем случае мы внутри
dr5ru
(5 + 1, 6-е разрешение) и, следовательно, мы используем 4 X 8
Посмотрите на это -> ProximityHash.
ProximityHash генерирует набор геохешей, которые покрывают круглую область, учитывая координаты центра и радиус. У него также есть дополнительная возможность использовать GeoRaptor, который создает наилучшую комбинацию геохешей на различных уровнях для представления круга, начиная с самого высокого уровня и итерируя до получения оптимальной смеси. Точность результатов остается такой же, как и у начального уровня геохэш-памяти, но размер данных значительно уменьшается, что повышает скорость и производительность.