Найти тему
HowToSchool

SD-EP3: Что находится поблизости?

Как знакомые нам сервисы Google Maps и Yandex Maps предлагают нам то, что мы обычно ищем и сортируют результаты поиска по расстоянию от текущего нашего местоположения?

Давайте разбираться на примере поиска ближайших ресторанов...

Есть два ключевых сервиса:

- Business Service:

  • добавление/удаление/обновление информации о ресторанах
  • предоставление детальной информации о ресторане клиентам

- Local Based Service:

  • возвращение списка близлежащих ресторанов на основе текущего местоположения и заданного радиуса

Первое над чем надо подумать, над тем, как организовать хранение адресов ресторанов чтобы сервис Local Based Service мог эффективно их искать.

Хранить широту и долготу каждого ресторана? Придется во время поиска ресторанов рассчитывать расстояние между ресторанами и текущем местоположением пользователя, что не совсем эффективно.

Один из способов ускорить поиск — это использовать алгоритм геохеширования [1]

Идея заключается в следующем:

1. Делим планету на 4 части (см. диаграмму выше), где

  • диапазон широты [-90, 0] = 0
  • диапазон широты[90, 0] = 1
  • диапазон долготы[-180, 0] = 0
  • диапазон долготы[180, 0] = 1

2. Далее каждый квадрант делим еще на четыре части и по такому же принципу присваиваем биты долготы и широты.

3. В процессе добавление ресторана в нашу системы мы генерируем его геохеш и записываем в базу данных.

Когда мы захотим найти все рестораны на территории Европы и Азии мы просто можем сформировать такой запрос:

SELECT * FROM geohash_index WHERE geohash LIKE `11%`

Геохеш имеет свои недостатки и ограничения, есть и другие более эффективные алгоритмы, но это уже другая история...

СПРАВОЧНЫЕ МАТЕРИАЛЫ:

[1] Geohash: https://en.wikipedia.org/wiki/Geohash