Системы координат подробно

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

В веб-картографии любое географическое положение описывается через систему координат (Coordinate Reference System, CRS). Это формальная модель, которая задаёт, каким образом реальные земные координаты преобразуются в числовые значения, пригодные для вычислений и отображения на плоскости.

В современных веб-приложениях картографии ключевым элементом является библиотека OpenLayers, которая строит всю работу с картой вокруг строгого разделения между:

  • географическими координатами (широта/долгота),
  • проекционными координатами (плоская система X/Y),
  • внутренними координатами тайлов и пикселей.

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


Географические координаты и эллипсоидальная модель Земли

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

  • широту (latitude),
  • долготу (longitude),
  • иногда высоту (altitude).

Наиболее распространённая система — WGS84 (EPSG:4326). Она используется GPS и большинством геоинформационных сервисов.

Особенности EPSG:4326:

  • координаты выражаются в градусах;
  • долгота изменяется от -180 до 180;
  • широта изменяется от -90 до 90;
  • данные привязаны к эллипсоиду Земли.

В OpenLayers эти координаты считаются «человеческими» и используются для хранения исходных данных, но не для рендеринга карты напрямую.


Проекционные системы координат и плоское представление карты

Для отображения карты на плоском экране требуется переход от сферической модели к плоской проекции. Это преобразование выполняется через проекционные системы координат.

Наиболее важная проекция в веб-картографии:

EPSG:3857 (Web Mercator)

y = (( + ))

Характеристики:

  • используется в большинстве веб-карт (Google Maps, OpenStreetMap);
  • координаты выражаются в метрах;
  • сохраняет углы (конформная проекция);
  • искажает площади на высоких широтах;
  • позволяет удобно работать с тайловыми системами.

Причина популярности заключается в простоте тайлинга: вся поверхность Земли проецируется на квадратную сетку, которую легко разбить на уровни масштабирования.


Внутренние координаты OpenLayers и система ol/proj

В OpenLayers все преобразования координат централизованы в модуле ol/proj.

Основные функции:

  • transform(coord, source, destination)
  • fromLonLat(coord)
  • toLonLat(coord)
  • get() — получение описания проекции
  • addProjection() — добавление кастомной CRS

Пример преобразования координат:

import { transform, fromLonLat, toLonLat } from 'ol/proj';

// Географические координаты (EPSG:4326)
const lonLat = [69.589, 50.283];

// Перевод в Web Mercator (EPSG:3857)
const webMercator = fromLonLat(lonLat);

// Обратное преобразование
const backToLonLat = toLonLat(webMercator);

// Универсальный transform
const custom = transform(lonLat, 'EPSG:4326', 'EPSG:3857');

Внутренняя модель OpenLayers всегда предполагает, что:

  • View работает в одной проекции,
  • все данные приводятся к этой проекции перед отрисовкой.

Система координат представления (View Projection)

Каждая карта в OpenLayers имеет объект View, который определяет:

  • систему координат отображения,
  • центр карты,
  • масштаб (zoom),
  • разрешение (resolution).

Пример:

import Map from 'ol/Map';
import View from 'ol/View';

const view = new View({
  projection: 'EPSG:3857',
  center: fromLonLat([69.589, 50.283]),
  zoom: 10
});

Ключевая идея:

  • View всегда работает в одной проекции,
  • все слои приводятся к ней автоматически,
  • пользователь взаимодействует с картой именно в этой системе координат.

Масштаб, разрешение и связь с координатами

В OpenLayers масштаб карты не хранится напрямую. Вместо него используется resolution.

Связь между ними:

  • zoom → дискретный уровень масштаба
  • resolution → реальное количество метров на пиксель

resolution =

Особенности:

  • при увеличении zoom resolution уменьшается;
  • координатное пространство становится «детальнее»;
  • все слои пересчитываются относительно текущего resolution.

Extent и границы координатного пространства

Extent — это прямоугольная область в координатной системе вида:

[minX, minY, maxX, maxY]

В EPSG:3857:

  • X и Y выражены в метрах,
  • границы ограничены Web Mercator квадратом.

Пример:

import { getView } from 'ol/View';

const extent = view.calculateExtent();

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

  • ограничения перемещения карты,
  • запроса тайлов,
  • фильтрации объектов,
  • оптимизации рендеринга.

Координаты объектов (Feature Geometry)

Каждый геометрический объект в OpenLayers хранит координаты в собственной структуре:

  • Point → [x, y]
  • LineString → [[x1, y1], [x2, y2]]
  • Polygon → массив колец координат

Пример:

import Feature from 'ol/Feature';
import Point from 'ol/geom/Point';
import { fromLonLat } from 'ol/proj';

const feature = new Feature({
  geometry: new Point(fromLonLat([69.589, 50.283]))
});

Важно:

  • геометрия должна соответствовать проекции слоя;
  • несовпадение CRS приводит к смещению объектов;
  • преобразование выполняется при создании или через geometry.transform.

Разделение проекций данных и отображения

Типичная архитектура OpenLayers предполагает две независимые системы:

1. Data Projection (проекция данных)

  • исходные координаты,
  • часто EPSG:4326,
  • используется API и внешними сервисами.

2. View Projection (проекция отображения)

  • EPSG:3857,
  • используется для рендеринга,
  • оптимизирована под тайлы.

Пример загрузки данных:

import GeoJSON from 'ol/format/GeoJSON';

const format = new GeoJSON({
  dataProjection: 'EPSG:4326',
  featureProjection: 'EPSG:3857'
});

Это обеспечивает автоматическое преобразование геометрий при загрузке.


Кастомные системы координат

OpenLayers позволяет регистрировать собственные CRS:

import { register } from 'ol/proj/proj4';
import proj4 from 'proj4';

proj4.defs('EPSG:3395', '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs');

register(proj4);

После регистрации система становится доступной для:

  • View
  • transform
  • ol/source

Кастомные проекции используются в:

  • национальных кадастровых системах,
  • инженерных ГИС,
  • локальных картографических проектах.

Тайловая сетка и её зависимость от координат

TileGrid тесно связан с проекцией EPSG:3857.

Каждый уровень zoom:

  • делит карту на 2^z × 2^z тайлов,
  • каждый тайл имеет фиксированный размер (обычно 256×256 пикселей),
  • координаты тайла вычисляются через проекцию Web Mercator.

Это делает систему масштабируемой и предсказуемой:

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

Типичные ошибки при работе с системами координат

Неправильная работа с CRS приводит к системным ошибкам:

Несовпадение EPSG:4326 и EPSG:3857

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

Двойное преобразование

  • повторный fromLonLat искажается координаты,
  • возникает смещение объектов.

Игнорирование projection в слоях

  • GeoJSON без featureProjection,
  • TileSource без указанной системы.

Несогласованность View и Source

  • карта и данные используют разные CRS без трансформации.

Координатные преобразования в реальном времени

OpenLayers выполняет трансформации:

  • при рендеринге слоёв,
  • при взаимодействии пользователя (drag/zoom),
  • при вычислении hit detection,
  • при работе с событиями pointer.

Все события мыши возвращают координаты в системе View:

map.on('click', (evt) => {
  const coord = evt.coordinate;
});

При необходимости координаты переводятся в географические:

import { toLonLat } from 'ol/proj';

const lonLat = toLonLat(evt.coordinate);

Итоговая модель координатной системы OpenLayers

Архитектура координат в OpenLayers строится вокруг трёх уровней:

  • географический уровень (EPSG:4326),
  • проекционный уровень (EPSG:3857 и кастомные CRS),
  • экранный уровень (пиксели и тайлы).

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