Точность измерений

Измерительные операции в картографических приложениях используются для вычисления расстояний, длин маршрутов, площадей полигонов, размеров объектов и координатных смещений. Несмотря на визуальную простоту подобных вычислений, точность результатов зависит от множества факторов:

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

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


Координатная система WGS84

MapLibre GL JS работает с координатами в системе WGS84, которая является мировым стандартом для GPS и веб-картографии.

Каждая точка задаётся двумя значениями:

[longitude, latitude]

Пример:

const point = [37.6176, 55.7558];

Здесь:

  • 37.6176 — долгота;
  • 55.7558 — широта.

Особенность географических координат заключается в том, что они выражаются в градусах, а не в метрах. Поэтому нельзя напрямую вычислять расстояние между двумя точками через обычную теорему Пифагора.

Неправильный подход:

const dx = lon2 - lon1;
const dy = lat2 - lat1;

const distance = Math.sqrt(dx * dx + dy * dy);

Подобный расчёт даёт результат в градусах и становится всё менее точным по мере удаления от экватора.


Влияние проекции Mercator

Для отображения карты MapLibre GL JS использует веб-проекцию Mercator.

Она обладает важным свойством:

  • сохраняет углы;
  • искажает площади;
  • искажает расстояния.

Чем ближе объект расположен к полюсам, тем сильнее проявляются искажения.

Например:

  • 1° долготы на экваторе ≈ 111 км;
  • 1° долготы возле 60° широты ≈ 55 км;
  • возле полюсов расстояние стремится к нулю.

Поэтому измерения непосредственно в экранных координатах практически всегда приводят к ошибкам.


Геодезические расстояния

Наиболее корректный способ измерения расстояния между двумя точками заключается в расчёте длины дуги на поверхности земного эллипсоида.

На практике часто используется сферическая модель Земли.

Радиус Земли:

const EARTH_RADIUS = 6371008.8;

Для вычислений применяется формула гаверсинусов.


Формула гаверсинусов

Формула позволяет вычислить расстояние между двумя точками по их широте и долготе.

d=2R()

Где:

  • R — радиус Земли;
  • φ — широта;
  • λ — долгота.

Пример реализации:

function haversineDistance(start, end) {
    const R = 6371008.8;

    const lat1 = start[1] * Math.PI / 180;
    const lat2 = end[1] * Math.PI / 180;

    const dLat = (end[1] - start[1]) * Math.PI / 180;
    const dLon = (end[0] - start[0]) * Math.PI / 180;

    const a =
        Math.sin(dLat / 2) ** 2 +
        Math.cos(lat1) *
        Math.cos(lat2) *
        Math.sin(dLon / 2) ** 2;

    const c = 2 * Math.atan2(
        Math.sqrt(a),
        Math.sqrt(1 - a)
    );

    return R * c;
}

Использование:

const distance = haversineDistance(
    [37.6176, 55.7558],
    [30.3141, 59.9386]
);

console.log(distance);

Результат возвращается в метрах.


Использование Turf.js для точных измерений

Наиболее распространённым инструментом для измерений совместно с MapLibre GL JS является библиотека Turf.js.

Подключение:

<script src="https://unpkg.com/@turf/turf@latest/turf.min.js"></script>

Расчёт расстояния:

const from = turf.point([37.6176, 55.7558]);
const to = turf.point([30.3141, 59.9386]);

const distance = turf.distance(
    from,
    to,
    { units: 'kilometers' }
);

console.log(distance);

Преимущества:

  • высокая точность;
  • поддержка различных единиц измерения;
  • готовые геодезические алгоритмы;
  • совместимость с GeoJSON.

Измерение длины линии

Линейные объекты редко состоят из двух точек.

Обычно маршрут представляет собой набор вершин:

const route = {
    type: "Feature",
    geometry: {
        type: "LineString",
        coordinates: [
            [37.6176, 55.7558],
            [37.5, 55.8],
            [37.3, 55.9]
        ]
    }
};

Длина вычисляется суммированием всех сегментов.

Через Turf.js:

const length = turf.length(
    route,
    {
        units: 'kilometers'
    }
);

console.log(length);

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


Влияние количества вершин на точность

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

Маршрут:

A ----------- B

обычно оказывается менее точным, чем:

A --- C --- D --- E --- B

Причина заключается в том, что реальная дорога имеет изгибы.

При недостаточном количестве вершин линия начинает срезать повороты.

Следствие:

  • уменьшается измеряемая длина;
  • растёт ошибка;
  • теряется геометрическая точность.

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


Измерение площади полигона

Площадь является одной из наиболее чувствительных к проекции характеристик.

Пример полигона:

const polygon = {
    type: "Feature",
    geometry: {
        type: "Polygon",
        coordinates: [[
            [37.6, 55.7],
            [37.7, 55.7],
            [37.7, 55.8],
            [37.6, 55.8],
            [37.6, 55.7]
        ]]
    }
};

Расчёт площади:

const area = turf.area(polygon);

console.log(area);

Результат возвращается в квадратных метрах.


Почему площадь особенно подвержена ошибкам

Для площади ошибка возрастает быстрее, чем для расстояния.

Причины:

  1. Искажение проекции.
  2. Неточные координаты вершин.
  3. Самопересечение полигона.
  4. Неправильный порядок обхода вершин.
  5. Недостаточная детализация границ.

Даже небольшая ошибка в координатах может привести к существенному отклонению итоговой площади.


Точность GPS-координат

Во многих приложениях измерения основаны на данных GPS.

Типичная точность:

Условия Погрешность
Открытая местность 3–5 м
Городская среда 5–15 м
Плотная застройка 10–30 м
Помещение десятки метров

Полученная координата уже содержит некоторую ошибку.

Если измеряется расстояние между двумя GPS-точками:

navigator.geolocation.getCurrentPosition(
    position => {
        console.log(
            position.coords.accuracy
        );
    }
);

Свойство:

position.coords.accuracy

указывает радиус возможной ошибки в метрах.


Ошибки измерения коротких дистанций

Особенно заметны ошибки при измерении небольших расстояний.

Пример:

  • фактическое расстояние — 7 м;
  • ошибка GPS первой точки — ±4 м;
  • ошибка GPS второй точки — ±4 м.

Итоговая погрешность может оказаться больше самой измеряемой дистанции.

Поэтому для коротких расстояний желательно использовать:

  • RTK-приёмники;
  • геодезическое оборудование;
  • локальные системы позиционирования.

Измерение по экранным координатам

MapLibre GL JS предоставляет методы преобразования между координатами карты и экраном.

Преобразование в пиксели:

const pixel =
    map.project([37.6176, 55.7558]);

Обратное преобразование:

const lngLat =
    map.unproject([200, 300]);

Однако расстояние между пикселями:

const dx = p2.x - p1.x;
const dy = p2.y - p1.y;

const pixels =
    Math.sqrt(dx * dx + dy * dy);

не является реальным расстоянием на поверхности Земли.

Такой расчёт подходит лишь для:

  • пользовательского интерфейса;
  • измерений элементов экрана;
  • визуальных эффектов.

Влияние масштаба карты

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

Например:

Zoom Размер пикселя
3 километры
10 десятки метров
18 сантиметры

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


Использование функции meterInMercatorCoordinateUnits

Для задач трёхмерной визуализации применяется класс:

maplibregl.MercatorCoordinate

Пример:

const mercator =
    maplibregl.MercatorCoordinate
        .fromLngLat(
            [37.6176, 55.7558],
            0
        );

const scale =
    mercator.meterInMercatorCoordinateUnits();

Метод возвращает коэффициент пересчёта метров в координаты Mercator.

Это особенно важно при работе с:

  • 3D-моделями;
  • пользовательскими слоями WebGL;
  • анимациями объектов;
  • геопространственными вычислениями.

Накопление ошибок при длинных маршрутах

Каждый сегмент маршрута содержит небольшую погрешность.

Если длина маршрута составляет:

1000 сегментов

то суммарная ошибка может оказаться значительной.

Поэтому рекомендуется:

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

Сглаживание GPS-трека

Пример удаления аномальных точек:

const filtered = points.filter(
    point => point.speed < 50
);

Более сложные методы:

  • фильтр Калмана;
  • медианный фильтр;
  • скользящее среднее;
  • сплайн-интерполяция.

После обработки точность измерений длины маршрута обычно существенно возрастает.


Самопересекающиеся полигоны

Некорректная геометрия может приводить к ошибочным результатам измерения площади.

Пример проблемной фигуры:

X
 \\
  \\
  / /
 /
X

При наличии самопересечений разные алгоритмы могут возвращать различные результаты.

Проверка:

const kinks = turf.kinks(polygon);

Если найдено пересечение:

kinks.features.length > 0

геометрию необходимо исправить до вычисления площади.


Погрешности округления координат

GeoJSON хранит координаты в виде чисел с плавающей запятой.

Полная запись:

37.617683123456

Округлённая запись:

37.6177

Для большинства веб-карт используется точность:

Знаков после запятой Точность
3 около 100 м
4 около 10 м
5 около 1 м
6 около 10 см
7 около 1 см

Чрезмерное округление может заметно ухудшать результаты измерений.


Практические рекомендации по обеспечению высокой точности

Для измерения расстояний:

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

Для измерения площадей:

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

Для GPS-данных:

  • учитывать параметр accuracy;
  • фильтровать шум;
  • удалять выбросы;
  • усреднять координаты при длительном наблюдении.

Для профессиональных ГИС-систем:

  • использовать высокоточные геоданные;
  • контролировать качество геометрии;
  • учитывать ограничения используемой проекции;
  • регулярно проводить валидацию результатов измерений.