Как мы сделали браузерное расширение для НСПД: от идеи до релиза
Исследования

Как мы сделали браузерное расширение для НСПД: от идеи до релиза

Ежедневно работаем с Национальной системой пространственных данных (НСПД). Интерфейс удобный, данные актуальные, но есть один нюанс: координаты в НСПД хранятся в проекции 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 секунд на каждом переходе от НСПД к внешним картам. При интенсивной работе окупается за день.

Скачать расширение для GoogleChrome