серия статей
В эпоху мобильного Интернета появляется все больше и больше LBS-приложений, таких как соседние дамы и сестры в программах для знакомств, ближайшие магазины для гурманов в программах на вынос, автомобили рядом с программами для такси и т. д. Как все виды XX поблизости понимают это?
Вы все знаете, что географическое положение на Земле представлено двумерными долготой и широтой, диапазоном долготы (-180, 180), диапазоном широты (-90, 90), пока мы определяем долготу и широту точка, которую мы можем назвать на земле.
Например, беря такси, наиболее интуитивно понятной операцией является запись и обновление местоположения каждой машины в режиме реального времени, а затем, когда мы ищем машину, искать машину, которая находится в r километрах от нас (координаты x0, y0) в базе данных и используйте следующий SQL:
select cart from position where x0-r < x < x0+r and y0-r < y < y0+r
Но в чем проблема?
- 1. Проблемы с производительностью запроса, если параллелизм высокий и объем данных большой, такой запрос уничтожит базу данных.
- 2. Этот запрос представляет собой прямоугольное посещение, а не круговое посещение с радиусом r километров, центром которого является я.
- 3. Проблема точности, мы знаем, что земля не плоская система координат, а сфера, такой вид прямоугольного расчета будет иметь большую погрешность в расчете на большие расстояния.
Сегодня мы говорим об использовании Redis для решения близлежащих задач.
Геолокация Redis
Заказ
Redis добавил обработку географического местоположения после версии 3.2, которая предоставляет 6 команд, связанных с географическим местоположением.
- GEOADD добавляет заданный пространственный элемент (широта, долгота, имя) к указанному ключу
- GEOPOS возвращает позицию (долготу и широту) всех заданных элементов позиции из ключа
- ГЕОРАСП возвращает расстояние между двумя заданными местоположениями.
- GEORADIUS центрируется на заданной широте и долготе и возвращает все элементы местоположения, которые находятся в пределах заданного максимального расстояния от центра.
- GEORADIUSBYMEMBER похож на GEORADIUS
- GEOHASH возвращает представление Geohash одного или нескольких элементов местоположения.
использовать
Добавить географическое положение
geo add key longitude latitude member [longitude latitude member ...]
如添加杭州北京上海的地理位置
127.0.0.1:6379> geoadd city 120.20000 30.26667 hangzhou 116.41667 39.91667 beijing 121.47 31.23 shanghai
Получить информацию о геолокации
Команда geopos может получить координаты широты и долготы любого элемента в коллекции, и вы можете получить более одного элемента за раз.
127.0.0.1:6379> geopos city hangzhou beijing shanghai
1) 1) "120.15000075101852417"
2) "30.2800007575645509"
2) 1) "116.39999896287918091"
2) "39.90000009167092543"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
127.0.0.1:6379> geopos city hangzhou
1) 1) "120.15000075101852417"
2) "30.2800007575645509"
Рассчитать расстояние
Единицами расстояния могут быть м, км, мл, футы, представляющие метры, километры, мили и футы соответственно.
127.0.0.1:6379> geodist city shanghai hangzhou km
"164.5694"
127.0.0.1:6379> geodist city beijing hangzhou km
"1122.7998"
Получить набор местоположений с географической информацией для указанного диапазона элементов
использоватьGEORADIUSBYMEMBER
Команда для поиска ближайших мест
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
例如查找距离杭州300km以内的城市的10个城市按距离排序
127.0.0.1:6379> GEORADIUSBYMEMBER city hangzhou 300 km WITHCOORD WITHDIST WITHHASH ASC COUNT 10
1) 1) "hangzhou"
2) "0.0000"
3) (integer) 4054134257390783
4) 1) "120.15000075101852417"
2) "30.2800007575645509"
2) 1) "shanghai"
2) "164.5694"
3) (integer) 4054803462927619
4) 1) "121.47000163793563843"
2) "31.22999903975783553"
Команда возвращает дополнительную информацию, если заданы следующие параметры:
- WITHDIST: при возврате элемента позиции также возвращается расстояние между элементом позиции и центром. Единица измерения расстояния соответствует единице дальности, заданной пользователем.
- WITHCOORD : также возвращает долготу и широту элемента position.
- WITHHASH : возвращает необработанную отсортированную оценку множества элемента position, закодированную геохэшем, в виде 52-битного целого числа со знаком.
- ASC : В соответствии с положением центра верните элемент положения от ближнего к дальнему. DESC : В соответствии с положением центра, вернуть элемент позиции из дальнего в ближний.
Получить хеш-значение элемента
Возможно, вы также заметили, что есть командаGEOHASH
, чем он занимается
127.0.0.1:6379> geohash city hangzhou
1) "wtmkq069cc0"
127.0.0.1:6379> geohash city beijing
1) "wx4fbxxfke0"
На самом деле возвращается строка в кодировке base32, рассчитанная goehash для широты и долготы элемента. можно подключить черезПерейдите прямо на geohash.org/${hash}…Стандартное закодированное значение геохэша.
Принцип RedisGeo
Структура хранилища RedisGeo
Его структура хранения в основном использует упорядоченную структуру Redis, а его оценка представляет собой 52-битное целочисленное значение GeoHash.
127.0.0.1:6379> ZRANGE city 0 -1 WITHSCORES
1) "hangzhou"
2) "4054134257390783"
3) "shanghai"
4) "4054803462927619"
5) "beijing"
6) "4069885360207904"
Принцип геохеша
Принцип относительно прост для понимания: основная идея состоит в том, чтобы преобразовать сферу в сферу, а блок — в точку.
В основном делится на три этапа
- Преобразование 3D-земли в 2D-координаты
- Преобразование двумерных координат в одномерные блоки точек
- Наконец, преобразуйте одномерный точечный блок в двоичный и закодируйте его с помощью base32.
Подробный принципиальный анализ можно найти в этой статье.Анализ основных принципов GeoHash
Другая геообработка
В настоящее время многие механизмы хранения данных поддерживают обработку Geo, например MongoDB, MySql, PgSql, Elasticsearch и т. д. Заинтересованные читатели могут изучить его.
Справочная статья
Эта статья также опубликована в общедоступной учетной записи WeChat [Trail News]. Пожалуйста, отсканируйте код, чтобы следовать!