Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке Geospatial типи в Redis?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Geospatial-типи в Redis - набір команд, які дозволяють зберігати географічні координати (довготу й широту) і виконувати швидкі геопросторові запити - наприклад, пошук найближчих точок чи обчислення відстані; окремого "гео-типу" немає, геодані зберігаються всередині Sorted Set (ZSet), де score кодує координати (Geohash). **Ключове:** пошук працює через діапазонні операції за score, що дає складність O(log N); основні команди - `GEOADD` (додати точку), `GEODIST` (відстань між точками), `GEOSEARCH` (пошук у радіусі чи прямокутній області).Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Geospatial** типи в Redis - це набір команд, що дозволяють зберігати й обробляти **географічні координати (довготу й широту)**, а також виконувати швидкі **геопросторові запити** - наприклад, пошук найближчих точок чи обчислення відстані між ними. Redis не має окремого "гео-типу" даних - геодані зберігаються всередині **Sorted Set (ZSet)**, де score використовується для кодування координат. ### Як це влаштовано Кожна геолокація - це пара `(довгота, широта)`, яка перетворюється на спеціальний числовий код (Geohash). Цей код зберігається як **score** у відсортованій множині (ZSet). Таким чином Redis може: - додавати точки на карту, - знаходити найближчі точки до заданої, - обчислювати відстані, - фільтрувати за радіусом. ### Основні команди | Команда | Опис | |---|---| | `GEOADD key longitude latitude member [longitude latitude member ...]` | додати одну чи кілька точок | | `GEOPOS key member [member ...]` | отримати координати точки | | `GEODIST key member1 member2 [unit]` | обчислити відстань між точками | | `GEORADIUS key longitude latitude radius unit [options]` | знайти точки в радіусі (застаріла, замінена на GEOSEARCH) | | `GEOSEARCH key FROMMEMBER <member> BYRADIUS <radius> <unit>` | знайти точки навколо іншої точки | | `GEOSEARCH key FROMLONLAT <lon> <lat> BYBOX <width> <height> <unit>` | пошук за областю (прямокутником) | | `GEOHASH key member [member ...]` | отримати геохеші (у вигляді коротких рядків) | ### Приклад ```bash GEOADD cities 37.618423 55.751244 "Moscow" GEOADD cities 30.31413 59.93863 "Saint-Petersburg" GEODIST cities "Moscow" "Saint-Petersburg" km ``` Результат: ```javascript 633.4789 ``` ### Приклад пошуку в радіусі ```bash GEOADD shops 37.6 55.7 "Shop1" 37.65 55.75 "Shop2" 37.7 55.8 "Shop3" GEOSEARCH shops FROMLONLAT 37.61 55.74 BYRADIUS 10 km WITHDIST ``` Результат: ```javascript 1) "Shop1" (0.4 km) 2) "Shop2" (5.7 km) 3) "Shop3" (9.8 km) ``` ### Одиниці вимірювання Підтримуються: - `m` - метри - `km` - кілометри - `mi` - милі - `ft` - фути ### Внутрішня будова - Кожна точка зберігається в **ZSet**, де `score` - це 52-бітне геокодоване значення (Geohash). - Redis використовує алгоритм **Mercator projection** для наближеного перетворення координат у числа. - Пошук працює через діапазонні операції за score, що робить його дуже швидким - **O(log N)**. ### Застосування - Пошук найближчих магазинів, точок доставки чи водіїв. - Геоаналітика - густина точок, активність за регіонами. - Ігрові та логістичні системи з геолокацією. - Відстеження об'єктів у реальному часі. ### Приклад практичного кейсу ```bash GEOADD couriers 37.61 55.75 "Courier:101" GEOADD couriers 37.63 55.76 "Courier:102" GEOSEARCH couriers FROMMEMBER "Courier:101" BYRADIUS 2 km WITHDIST ``` Можна миттєво знайти всіх кур'єрів у радіусі 2 км від заданого.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.