Контрол MousePosition относится к группе UI-компонентов библиотеки и
предназначен для отображения текущих координат курсора мыши над картой.
Он интегрируется как стандартный control и работает поверх объекта
ol.Map, реагируя на события pointermove и преобразуя
координаты в заданную систему отображения.
Основная задача MousePosition — обеспечить непрерывную визуализацию координат точки, над которой находится курсор, с возможностью кастомизации формата, системы координат и способа вывода.
MousePosition реализован как класс
ol.control.MousePosition, входящий в модуль управления
интерфейсом карты.
Он взаимодействует с:
MapViewol/projКонтрол подписывается на события движения указателя и пересчитывает координаты через внутренние механизмы проекций.
MousePosition подключается как обычный control:
import Map from 'ol/Map.js';
import View from 'ol/View.js';
import MousePosition from 'ol/control/MousePosition.js';
const mousePositionControl = new MousePosition();
const map = new Map({
target: 'map',
controls: [
mousePositionControl
],
view: new View({
center: [0, 0],
zoom: 2
})
});
По умолчанию координаты выводятся в проекции карты (обычно EPSG:3857), без форматирования и без явного контейнера стилизации.
MousePosition поддерживает набор опций, определяющих поведение и формат отображения.
Определяет систему координат, в которую будут преобразованы значения перед выводом.
projection: 'EPSG:4326'
Наиболее часто используется:
Функция форматирования координат. Принимает массив координат и возвращает строку.
import {createStringXY} from 'ol/coordinate.js';
coordinateFormat: createStringXY(4)
Где число задаёт количество знаков после запятой.
Пример пользовательской функции:
coordinateFormat: function(coord) {
return `X: ${coord[0].toFixed(2)} | Y: ${coord[1].toFixed(2)}`;
}
CSS-класс контейнера отображения координат.
className: 'mouse-position'
Позволяет интегрировать контрол в сложные интерфейсные системы и применять кастомные стили.
DOM-элемент, в который будет рендериться вывод координат.
target: document.getElementById('coords')
При отсутствии параметра координаты отображаются в стандартной панели управления картой.
Строка, отображаемая при отсутствии координат (например, при выходе курсора за пределы карты).
undefinedHTML: 'координаты недоступны'
import MousePosition from 'ol/control/MousePosition.js';
import {createStringXY} from 'ol/coordinate.js';
const mousePosition = new MousePosition({
coordinateFormat: createStringXY(6),
projection: 'EPSG:4326',
className: 'custom-mouse-position',
undefinedHTML: ' ',
target: document.getElementById('mouse-position')
});
MousePosition не ограничивается текущей проекцией карты. Перед
выводом координаты могут быть преобразованы через
ol/proj.transform.
Внутренний механизм использует следующую логику:
Пример смены системы координат:
projection: 'EPSG:4326'
При этом Web Mercator координаты автоматически преобразуются в географические значения.
Форматирование — ключевой элемент контроля MousePosition.
createStringXY(2)
Результат:
12.34, 56.78
coordinateFormat: function(coord) {
const lon = coord[0];
const lat = coord[1];
return `${lat}° N, ${lon}° E`;
}
coordinateFormat: function(coord) {
if (!coord) return '';
return coord.map(c => c.toFixed(3)).join(' | ');
}
Состояние undefined возникает:
В таких случаях используется undefinedHTML.
undefinedHTML: '---'
MousePosition не ограничивает внешний вид. Контейнер можно стилизовать через CSS:
.custom-mouse-position {
position: absolute;
bottom: 10px;
right: 10px;
background: rgba(0,0,0,0.6);
color: #fff;
padding: 6px 10px;
font-family: monospace;
border-radius: 4px;
}
Класс применяется к внутреннему элементу, создаваемому контролом.
MousePosition часто размещается в отдельных UI-блоках вне карты.
<div id="coords"></div>
<div id="map"></div>
new MousePosition({
target: document.getElementById('coords')
});
Это позволяет отделить визуализацию координат от слоя управления картой.
MousePosition автоматически синхронизируется с картой:
map.controlsПри удалении контрол отключает подписки на события, освобождая ресурсы.
map.removeControl(mousePosition);
Контрол оптимизирован для частых обновлений событий мыши. Основные особенности:
pointermoveПри использовании сложных вычислений внутри
coordinateFormat увеличивается задержка отображения
координат.
projection: 'EPSG:4326'
projection: 'EPSG:3857'
target: document.getElementById('hud')
coordinateFormat: function(c) {
return `Easting: ${c[0]} | Northing: ${c[1]}`;
}
MousePosition тесно связан с объектом View. Изменение
центра, зума или проекции автоматически влияет на отображаемые
координаты.
Если карта использует кастомную проекцию, важно корректно задать
параметр projection, иначе значения будут интерпретированы
неверно.