OpenLayers изначально ориентирован на работу с пространственными данными в различных системах координат (CRS — Coordinate Reference System). Библиотека поддерживает большое количество EPSG-кодов «из коробки», однако этого недостаточно для проектов, использующих локальные, кастомные или редкие проекции.
Proj4js выступает как универсальный движок математических преобразований координат между различными системами. В связке с OpenLayers он обеспечивает расширение списка поддерживаемых проекций и точное преобразование геометрии между ними.
Ключевая особенность интеграции заключается в том, что OpenLayers делегирует математическую часть преобразований Proj4js, сохраняя при этом собственную систему управления проекциями, источниками данных и отображением карты.
Взаимодействие строится на разделении обязанностей:
OpenLayers:
ol/proj)Proj4js:
Интеграция реализуется через «мост», который подключает Proj4js к внутреннему реестру OpenLayers.
Интеграционный слой подключается отдельно от основной библиотеки.
import proj4 from 'proj4';
import { register } from 'ol/proj/proj4';
После этого выполняется регистрация:
register(proj4);
Этот вызов связывает внутреннюю систему OpenLayers с функциями Proj4js, позволяя использовать пользовательские определения координатных систем.
Proj4js использует строковое описание проекций. Эти определения регистрируются до создания карты.
import proj4 from 'proj4';
import { register } from 'ol/proj/proj4';
register(proj4);
proj4.defs(
'EPSG:32636',
'+proj=utm +zone=36 +datum=WGS84 +units=m +no_defs'
);
После регистрации система OpenLayers получает возможность работать с данным EPSG-кодом как с полноценной проекцией.
После добавления определения проекции она становится доступной через стандартный API OpenLayers:
import Projection from 'ol/proj/Projection';
const projection = new Projection({
code: 'EPSG:32636',
units: 'm'
});
OpenLayers не выполняет математические вычисления напрямую, а передаёт задачу Proj4js через зарегистрированный адаптер.
Проекция может быть назначена на уровне представления карты
(View):
import Map from 'ol/Map';
import View from 'ol/View';
const map = new Map({
target: 'map',
view: new View({
projection: 'EPSG:32636',
center: [500000, 4649776],
zoom: 5
})
});
Координаты центра интерпретируются уже в пространстве указанной системы координат.
OpenLayers предоставляет универсальный механизм трансформации через
ol/proj.
import { transform } from 'ol/proj';
const wgs84 = [37.6173, 55.7558];
const utm = transform(
wgs84,
'EPSG:4326',
'EPSG:32637'
);
Функция использует Proj4js, если одна из систем координат
зарегистрирована через register(proj4).
При загрузке GeoJSON или других форматов координаты автоматически приводятся к системе карты.
import GeoJSON from 'ol/format/GeoJSON';
const format = new GeoJSON();
const features = format.readFeatures(geojsonObject, {
dataProjection: 'EPSG:4326',
featureProjection: 'EPSG:32636'
});
Здесь происходит двойное преобразование:
dataProjection — исходная система данныхfeatureProjection — система отображения картыProj4js используется для вычислений, если CRS выходит за пределы стандартного набора OpenLayers.
После вызова:
register(proj4);
OpenLayers начинает использовать Proj4js как провайдер для:
forward transformation (из географической в
проекционную систему)inverse transformation (обратное преобразование)Каждая проекция кэшируется внутри ol/proj, что снижает
количество повторных вычислений.
Proj4js позволяет описывать сложные системы, включая локальные датумы:
proj4.defs(
'EPSG:3006',
'+proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs'
);
Такие определения особенно важны при работе с национальными кадастровыми системами, где стандартные EPSG-наборы недостаточны.
Если обе проекции зарегистрированы через Proj4js, OpenLayers способен выполнять прямую трансформацию:
import { transform } from 'ol/proj';
const result = transform(
[100000, 200000],
'EPSG:32636',
'EPSG:3006'
);
В этом случае цепочка вычислений полностью делегируется Proj4js.
При использовании серверных слоёв критически важно совпадение CRS клиента и источника данных.
import TileLayer from 'ol/layer/Tile';
import TileWMS from 'ol/source/TileWMS';
const layer = new TileLayer({
source: new TileWMS({
url: 'https://example.com/wms',
params: {
LAYERS: 'layer_name',
CRS: 'EPSG:32636'
}
})
});
При несовпадении систем координат OpenLayers выполняет reprojection на стороне клиента, используя Proj4js.
Интеграция с Proj4js добавляет вычислительную нагрузку, особенно при:
Оптимизация достигается через:
transform() вызововНа практике часто возникают следующие проблемы:
Отсутствие регистрации Proj4js
Несовпадение EPSG-кодов
Неверный порядок координат
[lon, lat], а не
[lat, lon]Отсутствие dataProjection в GeoJSON
OpenLayers хранит все зарегистрированные CRS в глобальном реестре:
proj4.defsregister(proj4)ol/proj.get(code)Это позволяет централизованно управлять всеми используемыми системами координат в приложении без дублирования логики преобразований.
Две наиболее распространённые системы:
OpenLayers по умолчанию оптимизирован под EPSG:3857, однако при подключении Proj4js возможно свободное переключение между системами без ограничений на структуру данных.
Интеграция OpenLayers и Proj4js строится на:
proj4.defsregister(proj4)ol/proj как единой точки
трансформаций