Ежедневно работаем с Национальной системой пространственных данных (НСПД). Интерфейс удобный, данные актуальные, но есть один нюанс: координаты в НСПД хранятся в проекции EPSG:3857 (Web Mercator), а все привычные карты — Яндекс, 2ГИС, Google — ожидают WGS84 в градусах.
Что получилось — расширение для Chrome/Firefox, которое:
- Автоматически парсит координаты из URL НСПД
- Конвертирует EPSG:3857 → WGS84 прямо в браузере
- Показывает плавающую панель с готовыми ссылками на 5 картографических сервисов
- Обновляет координаты в реальном времени при навигации по карте
Главная математика — преобразование Web Mercator в градусы. Формулы стандартные, но есть нюанс с калибровкой под специфику НСПД:
const SEMI_MAJOR_AXIS = 6378137.0;
// Калибровочная точка — проверили на реальном объекте
const CALIBRATION = {
wgs84: { lat: 51.715703, lon: 39.227681 },
nspd: { x: 4366832.143757161, y: 6748857.580453986 }
};// Вычисляем поправочный коэффициент по Y
const CAL_IDEAL_Y = Math.log(
Math.tan(Math.PI/4 + (CALIBRATION.wgs84.lat * Math.PI/180)/2)
) * SEMI_MAJOR_AXIS;
const Y_SCALE_FACTOR = CAL_IDEAL_Y / CALIBRATION.nspd.y;function webMercatorToWgs84(x, y) {
const lon = (x / SEMI_MAJOR_AXIS) * 180 / Math.PI;
const yCorrected = y * Y_SCALE_FACTOR; // Применяем поправку
const latRad = 2 * Math.tan(Math.exp(yCorrected / SEMI_MAJOR_AXIS)) - Math.PI/2;
return {
lat: latRad * 180 / Math.PI,
lon
};
}
Почему калибровка нужна: НСПД использует слегка модифицированную проекцию, чистая математика даёт погрешность ~10-15 метров. Одна контрольная точка сводит ошибку к сантиметрам.
Отслеживание изменений координат
НСПД — SPA-приложение. При перемещении по карте URL меняется через history.pushState, страница не перезагружается. Нужно отслеживать изменения в реальном времени. Простое решение — переопределить нативные методы history и слушать popstate:
function initUrlTracking(callback) {
// Перехватываем pushState/replaceState
['pushState', 'replaceState'].forEach(method => {
const original = history[method];
history[method] = function(...args) {
original.apply(this, args);
setTimeout(callback, 50); // Небольшая задержка для обновления URL
};
});// Слушаем кнопки назад/вперёд
window.addEventListener('popstate', callback);
}// Использование
initUrlTracking(() => {
const data = parseNspdCoordinates();
if (data) updatePanel(data);
});
Этого достаточно для 95% случаев. Для 100% надёжности добавили MutationObserver как fallback.

Расширение для Национальной системы пространственных данных (nspd.gov.ru) автоматически извлекает координаты из URL, конвертирует EPSG:3857 → WGS84 и предоставляет готовые ссылки для открытия точки на популярных картографических сервисах.
Затраты времени: ~4 часа на первую версию, +2 часа на отладку SPA-навигации.
Результат: 300 строк JavaScript, которые экономят 10-15 секунд на каждом переходе от НСПД к внешним картам. При интенсивной работе окупается за день.