Нахождение геохэш определенной длины в радиусе от точки

У меня есть очки с заданным латлонгом и расстоянием вокруг них - например, { 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

  • Северо-Западный dr5ruj4477kd
  • Юго-Запад: dr5ru46ne2ux
  • Юго-Восток: dr5ru6ryw0cp
  • Северо-восток: dr5rumpfq534

Шаг 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)

Общий процесс


ЗАКЛЮЧИТЕЛЬНЫЙ ЭТАП:

GeoHash

Важно: пожалуйста, найдите использование 4 x 8 Grid для GeoHash. Он варьируется для каждого символа по длине GeoHash. Для длины ODD это 8 x 4, для четного транспонирования 4 X 8. В нашем случае мы внутри dr5ru (5 + 1, 6-е разрешение) и, следовательно, мы используем 4 X 8

Посмотрите на это -> ProximityHash.

ProximityHash генерирует набор геохешей, которые покрывают круглую область, учитывая координаты центра и радиус. У него также есть дополнительная возможность использовать GeoRaptor, который создает наилучшую комбинацию геохешей на различных уровнях для представления круга, начиная с самого высокого уровня и итерируя до получения оптимальной смеси. Точность результатов остается такой же, как и у начального уровня геохэш-памяти, но размер данных значительно уменьшается, что повышает скорость и производительность.

Другие вопросы по тегам