Координатное пространство в веб-картографии строится вокруг нескольких базовых моделей представления точек, где каждая система решает свою задачу: географическую, проекционную или экранную. В контексте HERE Technologies и HERE Maps API ключевым элементом становится согласование широты/долготы с пиксельной и проекционной системами, а также корректное преобразование между ними при взаимодействии с картой.
Базовой системой координат выступает WGS84, в которой любая точка описывается парой значений:
В HERE Maps API географическая точка представляется через объект:
const point = new H.geo.Point(52.5200, 13.4050);
или через альтернативные структуры координат, зависящие от версии API.
Ключевой особенностью WGS84 является независимость от масштаба отображения. Эти координаты не меняются при зуме, панорамировании или смене проекции.
В 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. Она преобразует сферические координаты в плоскость, пригодную для тайловой отрисовки.
Преобразование включает следующие этапы:
Формально проекция может быть представлена как:
y = (( + ))
где φ — широта в радианах.
Эта модель обеспечивает равномерное масштабирование объектов при зуме, но искажения увеличиваются к полюсам.
Одной из ключевых операций является конвертация географических координат в пиксельные координаты контейнера карты.
В HERE Maps API используется метод:
const screenPoint = map.geoToScreen(
new H.geo.Point(52.5200, 13.4050)
);
Результатом является объект пиксельных координат:
{
x: 512,
y: 256
}
Эта операция учитывает:
Пиксельные координаты используются для отрисовки пользовательских слоёв, HTML-оверлеев и кастомных маркеров.
Обратная операция применяется при обработке кликов и взаимодействия с картой:
map.addEventListener('tap', function (evt) {
const geo = map.screenToGeo(
evt.currentPointer.viewportX,
evt.currentPointer.viewportY
);
});
Результатом становится объект географических координат, соответствующий точке взаимодействия.
Особенность преобразования заключается в том, что точность зависит от масштаба: при увеличении zoom погрешность уменьшается.
Экранная система координат описывает положение относительно контейнера карты:
Внутренне используются объекты типа:
const pixel = new H.math.Point(200, 150);
или
const pixel = { x: 200, y: 150 };
Пиксельная система применяется для:
При изменении масштаба карты происходит пересчёт всех координат через матрицы преобразования. Центральная идея заключается в сохранении соответствия между географической точкой и её пиксельным отображением.
Масштабирование можно описать через зависимость:
S = 2^z
где z — уровень масштабирования (zoom level), S — коэффициент увеличения.
Каждое изменение zoom приводит к экспоненциальному изменению плотности отображаемых пикселей.
Часто требуется работа не с точкой, а с областью:
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 используется для:
При обработке пользовательских данных часто требуется нормализация:
Это предотвращает ошибки проекции и некорректное отображение тайлов.
Пример нормализации:
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"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 до сантиметров на высоком.
При создании кастомных слоёв координаты используются как связующее звено между геометрией и визуализацией:
const circle = new H.map.Circle(
new H.geo.Point(52.52, 13.40),
500
);
map.addObject(circle);
Радиус интерпретируется в метрах, а центр автоматически пересчитывается при смене масштаба.
В сложных сценах применяются цепочки трансформаций:
Каждый этап использует собственную систему масштабирования и округления, обеспечивая непрерывность отображения карты при интерактивной работе.