Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дипломна Робота ПІ-42 Ціцерський Іван.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.06 Mб
Скачать
  1. 2. Огляд використовуваних алгоритмів

Кластеризація може значно збільшити продуктивність при відображенні великого числа гео-об'єктів[3].

Багато Java бібліотек для інтерактивних карт надають можливість кластеризації гео-об'єктів на стороні клієнта. При кластеризації на стороні клієнта з сервера виходять окремі точки, які потім обробляються в браузері або мобільному додатку для об'єднання в кластер. Це робить розмір відповіді сервера величезним, займаючи час і пам'ять на стороні клієнта. Їли використовується кластеризація на стороні сервера, розмір відповіді сервера значно менше - дані про декілька кластерах замість тисяч окремих точок. Це швидше і споживає набагато менше пам'яті на стороні клієнта.

Для реалізування кластеризації гео-об’єктів на карті використоймо Geohash.

Geohash - це алфавітно-цифровий рядок, що представляє географічні координати, широту і довготу.

  1. 3. Опис та використання алгоритмів у розробці географічних компонент

Спочатку весь світ ділиться навпіл вертикально. Лівій половині присвоюється бінарне значення 0, а правою - значення 1. Якщо точка, координати якої кодуються, потрапляє в праву половину, ми додаємо 1 до бінарним значенням Geohash:

Рис. 1 .1. – Розподіл півкуль на координати .

Далі, алгоритм геокодування Geohash ділить карту горизонтально на 2 половини і привласнює бінарне значення 1 верхній половині, а нижній - 0. Точка, координати якої ми вибрали для прикладу в Geohash, розташована у верхній половині, через це ми додаємо 1 до бінарного значенням Geohash. На даному етапі бінарне значення Geohash нашої точки - 11:

Рис. 3.2 – Розподіл нових координатів

Ми продовжуємо ділити осередки на половини вертикально і горизонтально, кожен раз додаючи до бінарним значенням Geohash 0 або 1. Кожен раз, коли ми додаємо біт до бінарним значенням Geohash, точність підвищується:

Рис. 3.3. Відображення кінцевого результату пошуку нашої точки

Бінарне значення Geohash необхідно перевести в рядок, кодовану в Base 32. Кожні 5 біт перетворюються в символ, використовуючи таблицю символів.

Geohash розбиває карту світу на осередки, кожна з яких представляє один кластер. Довжина префікса Geohash рядки безпосередньо пов'язана зі ступенем наближення (zoom). Для кращої візуалізації, середнє арифметичне значення всіх координат в осередку буде місцем розміщення іконки кластера - замість розміщення іконки в центрі осередку. Припустимо, географічні координати зберігаються в таблиці GEO_POINT:

CREATE TABLE GEO_POINT (

  GEO_POINT_ID SERIAL PRIMARY KEY,

  LATITUDE_DEG FLOAT8 NOT NULL,

  LONGITUDE_DEG FLOAT8 NOT NULL,

  GEOHASH VARCHAR (12) NOT NULL,

  COUNTRY_CODE VARCHAR (2)

);

CREATE INDEX I_GEO_POI_LAT_LON ON GEO_POINT (LATITUDE_DEG, LONGITUDE_DEG);

CREATE INDEX I_GEO_POI_GEOHASH ON GEO_POINT (GEOHASH);

Щоб сформувати кластери з видимих ​​в поточній області перегляду (viewport) точок, може використовуватися наступний SQL запит:

SELECT AVG (GP.LATITUDE_DEG) AS LATITUDE_DEG,

          AVG (GP.LONGITUDE_DEG) AS LONGITUDE_DEG,

          COUNT (*) AS QUANTITY,

          SUBSTRING (GP.GEOHASH FROM 1 FOR: precision) AS GEOHASH_PREFIX,

          GP.COUNTRY_CODE AS COUNTRY_CODE

     FROM GEO_POINT GP

    WHERE GP.LATITUDE_DEG BETWEEN: south_west_lat AND: north_east_lat

      AND GP.LONGITUDE_DEG BETWEEN: south_west_lon AND: north_east_lon

 GROUP BY GEOHASH_PREFIX,

          COUNTRY_КОДЕ

south_west_lat / south_west_lon - широта / довгота нижньої лівої вершини обмежувального прямокутника області перегляду (viewport);

north_east_lat / north_east_lon - широта / довгота верхній правій вершини обмежувального прямокутника області перегляду (viewport);

precision - так як кількість символів в Geohash коді прямо пов'язане з розміром кластера, значення даного параметра залежить від відстані між нижній лівій і верхній правій вершиною (діагональ обмежувального прямокутника області перегляду).

Цей запит поверне координати розміщення іконки кластера і кількість об'єктів в кожному кластері. Гео-об'єкти групуються в кластери по Geohash префіксу і країні. Гео-об'єкти, які розташовані поруч, але в різних країнах, що не будуть об'єднані в один кластер, навіть маючи однаковий Geohash префікс. Для цього колонка COUNTRY_CODE була додана в GROUP BY.