Конвертация координат

Координатное пространство в веб-картографии строится вокруг нескольких базовых моделей представления точек, где каждая система решает свою задачу: географическую, проекционную или экранную. В контексте HERE Technologies и HERE Maps API ключевым элементом становится согласование широты/долготы с пиксельной и проекционной системами, а также корректное преобразование между ними при взаимодействии с картой.


Базовой системой координат выступает WGS84, в которой любая точка описывается парой значений:

  • широта (latitude) — угол относительно экватора
  • долгота (longitude) — угол относительно нулевого меридиана

В HERE Maps API географическая точка представляется через объект:

const point = new H.geo.Point(52.5200, 13.4050);

или через альтернативные структуры координат, зависящие от версии API.

Ключевой особенностью WGS84 является независимость от масштаба отображения. Эти координаты не меняются при зуме, панорамировании или смене проекции.


Объектная модель GeoCoordinates

В JavaScript API координаты инкапсулируются в специализированные объекты, обеспечивающие единообразную работу с картографическими сущностями:

const coords = { lat: 52.5200, lng: 13.4050 };
map.setCenter(coords);

или

const coords = new H.geo.Point(52.5200, 13.4050);
map.setCenter(coords);

Разница между форматами заключается в уровне абстракции: простые литералы используются в пользовательском коде, тогда как объекты HERE обеспечивают расширенную совместимость с геометрическими операциями.


Проекция Web Mercator

Внутреннее представление карты основано на проекции Web Mercator. Она преобразует сферические координаты в плоскость, пригодную для тайловой отрисовки.

Преобразование включает следующие этапы:

  • широта ограничивается диапазоном приблизительно ±85.0511°
  • долгота нормализуется к диапазону ±180°
  • выполняется логарифмическое преобразование оси Y

Формально проекция может быть представлена как:

y = (( + ))

где φ — широта в радианах.

Эта модель обеспечивает равномерное масштабирование объектов при зуме, но искажения увеличиваются к полюсам.


Преобразование географических координат в экранные

Одной из ключевых операций является конвертация географических координат в пиксельные координаты контейнера карты.

В HERE Maps API используется метод:

const screenPoint = map.geoToScreen(
    new H.geo.Point(52.5200, 13.4050)
);

Результатом является объект пиксельных координат:

{
  x: 512,
  y: 256
}

Эта операция учитывает:

  • текущий zoom level
  • центр карты
  • размер viewport
  • применённую проекцию

Пиксельные координаты используются для отрисовки пользовательских слоёв, HTML-оверлеев и кастомных маркеров.


Обратное преобразование: экран → география

Обратная операция применяется при обработке кликов и взаимодействия с картой:

map.addEventListener('tap', function (evt) {
    const geo = map.screenToGeo(
        evt.currentPointer.viewportX,
        evt.currentPointer.viewportY
    );
});

Результатом становится объект географических координат, соответствующий точке взаимодействия.

Особенность преобразования заключается в том, что точность зависит от масштаба: при увеличении zoom погрешность уменьшается.


Работа с пиксельными координатами

Экранная система координат описывает положение относительно контейнера карты:

  • начало координат: левый верхний угол
  • ось X: вправо
  • ось Y: вниз

Внутренне используются объекты типа:

const pixel = new H.math.Point(200, 150);

или

const pixel = { x: 200, y: 150 };

Пиксельная система применяется для:

  • позиционирования UI-слоёв
  • расчёта hit-test объектов
  • анимации маркеров
  • отрисовки canvas-оверлеев

Геометрические преобразования и масштабирование

При изменении масштаба карты происходит пересчёт всех координат через матрицы преобразования. Центральная идея заключается в сохранении соответствия между географической точкой и её пиксельным отображением.

Масштабирование можно описать через зависимость:

S = 2^z

где z — уровень масштабирования (zoom level), S — коэффициент увеличения.

Каждое изменение zoom приводит к экспоненциальному изменению плотности отображаемых пикселей.


Bounding box и преобразование границ

Часто требуется работа не с точкой, а с областью:

const bounds = new H.geo.Rect(
    52.1, 13.1, 52.6, 13.7
);

Такая структура описывает прямоугольную область, которая может быть конвертирована в экранные координаты:

const topLeft = map.geoToScreen(bounds.getTopLeft());
const bottomRight = map.geoToScreen(bounds.getBottomRight());

Bounding box используется для:

  • ограничения области отображения
  • фильтрации объектов
  • кластеризации маркеров

Нормализация координат

При обработке пользовательских данных часто требуется нормализация:

  • долгота приводится к диапазону [-180, 180]
  • широта ограничивается диапазоном [-85.0511, 85.0511]

Это предотвращает ошибки проекции и некорректное отображение тайлов.

Пример нормализации:

function normalizeLat(lat) {
    return Math.max(-85.0511, Math.min(85.0511, lat));
}

function normalizeLng(lng) {
    return ((lng + 180) % 360 + 360) % 360 - 180;
}

Конвертация между форматами данных

В реальных приложениях координаты часто приходят в разных форматах:

  • массив [lat, lng]
  • объект {latitude, longitude}
  • строка "lat,lng"
  • HERE-объект H.geo.Point

Приведение к единому формату:

function toPoint(input) {
    if (input instanceof H.geo.Point) return input;

    if (Array.isArray(input)) {
        return new H.geo.Point(input[0], input[1]);
    }

    if (input.lat !== undefined) {
        return new H.geo.Point(input.lat, input.lng || input.lon);
    }

    if (typeof input === 'string') {
        const [lat, lng] = input.split(',').map(Number);
        return new H.geo.Point(lat, lng);
    }
}

Привязка координат к событиям карты

При работе с интерактивными слоями преобразование координат становится частью событийной модели:

map.addEventListener('pointermove', (evt) => {
    const geo = map.screenToGeo(evt.currentPointer.viewportX,
                                evt.currentPointer.viewportY);

    const pixel = map.geoToScreen(geo);
});

Таким образом формируется двусторонняя связь между пользовательским вводом и географическим пространством.


Погрешности и особенности точности

Точность преобразования зависит от нескольких факторов:

  • уровень zoom
  • широта (на высоких широтах искажения выше)
  • плотность тайлов
  • внутренние округления координат

На практике минимальная единица измерения смещается от метров на низком zoom до сантиметров на высоком.


Координаты в пользовательских слоях

При создании кастомных слоёв координаты используются как связующее звено между геометрией и визуализацией:

const circle = new H.map.Circle(
    new H.geo.Point(52.52, 13.40),
    500
);
map.addObject(circle);

Радиус интерпретируется в метрах, а центр автоматически пересчитывается при смене масштаба.


Композиция преобразований

В сложных сценах применяются цепочки трансформаций:

  1. GeoCoordinates → Web Mercator
  2. Web Mercator → Tile coordinates
  3. Tile coordinates → Screen pixels

Каждый этап использует собственную систему масштабирования и округления, обеспечивая непрерывность отображения карты при интерактивной работе.