LineString

LineString в OpenLayers представляет собой геометрический объект, описывающий ломаную линию, состоящую из упорядоченного набора точек. В библиотеке OpenLayers он реализован классом ol/geom/LineString и используется для отображения маршрутов, треков, дорог, траекторий движения и любых линейных объектов на карте.


Создание геометрии LineString

Базовый способ создания линии заключается в передаче массива координат в конструктор:

import LineString from 'ol/geom/LineString';

const line = new LineString([
  [30.5, 50.45],
  [30.52, 50.46],
  [30.55, 50.47]
]);

Каждая точка представляет собой массив [x, y], где значения интерпретируются в зависимости от системы координат карты (обычно EPSG:3857 или EPSG:4326).


Координаты и система координат

LineString не хранит информацию о проекции, но полностью зависит от неё в контексте карты.

Наиболее распространённые системы:

  • EPSG:4326 — географические координаты (долгота, широта)
  • EPSG:3857 — проекция Web Mercator, используемая большинством тайловых карт

Корректная работа с линиями требует согласования координат слоя и геометрии:

import {fromLonLat} from 'ol/proj';

const line = new LineString([
  fromLonLat([30.5, 50.45]),
  fromLonLat([30.52, 50.46])
]);

Основные методы LineString

Класс LineString предоставляет набор методов для управления координатами и анализа геометрии.

Получение координат

const coords = line.getCoordinates();

Возвращает массив координат текущей линии.


Установка координат

line.setCoordinates([
  [0, 0],
  [10, 10],
  [20, 15]
]);

Полностью заменяет существующую геометрию.


Добавление точки

line.appendCoordinate([25, 18]);

Добавляет новую вершину в конец линии.


Вставка координаты

line.insertCoordinate(1, [5, 5]);

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


Удаление точки

line.removeCoordinate([10, 10]);

Удаляет первую найденную координату.


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

LineString сам по себе не отображается на карте. Для визуализации он помещается в Feature:

import Feature from 'ol/Feature';
import LineString from 'ol/geom/LineString';

const line = new LineString([
  [0, 0],
  [1000000, 1000000]
]);

const feature = new Feature({
  geometry: line
});

Добавление в Vector Layer

Для отображения линии используется векторный слой:

import VectorLayer from 'ol/layer/Vector';
import VectorSource from 'ol/source/Vector';

const source = new VectorSource({
  features: [feature]
});

const layer = new VectorLayer({
  source: source
});

Стилизация LineString

Визуальное представление линии управляется через style:

import Style from 'ol/style/Style';
import Stroke from 'ol/style/Stroke';

const style = new Style({
  stroke: new Stroke({
    color: 'blue',
    width: 3
  })
});

feature.setStyle(style);

Параметры Stroke:

  • color — цвет линии
  • width — толщина
  • lineDash — пунктир
  • lineCap — форма концов линии (round, square, butt)
  • lineJoin — соединения сегментов (round, bevel, miter)

Геометрические преобразования

LineString поддерживает трансформации координат через функции ol/proj:

import {transform} from 'ol/proj';

const transformed = new LineString(
  line.getCoordinates().map(coord =>
    transform(coord, 'EPSG:3857', 'EPSG:4326')
  )
);

Чаще используется трансформация при создании или отображении данных из внешних источников (GeoJSON, API, GPS-треки).


Вычисление длины линии

Для расчёта реальной длины линии используется модуль ol/sphere:

import {getLength} from 'ol/sphere';

const length = getLength(line);

Результат возвращается в метрах (при использовании EPSG:3857).

Особенности:

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

Редактирование LineString

OpenLayers предоставляет интерактивное редактирование через Modify interaction:

import Modify from 'ol/interaction/Modify';

const modify = new Modify({
  source: source
});

map.addInteraction(modify);

Поддерживаются операции:

  • перемещение вершин
  • добавление новых сегментов
  • удаление точек (при соответствующей конфигурации)

Создание динамических линий

LineString часто используется для построения маршрутов в реальном времени:

const coords = [];

const line = new LineString(coords);

function addPoint(coord) {
  coords.push(coord);
  line.setCoordinates(coords);
}

При каждом обновлении геометрии слой автоматически перерисовывается.


Работа с большими наборами координат

При обработке длинных треков критично учитывать производительность:

  • уменьшение количества точек (simplify)
  • использование буферизации данных
  • отключение лишних перерисовок слоя

Упрощение геометрии:

const simplified = line.simplify(100);

Взаимодействие с GeoJSON

LineString напрямую совместим с форматом GeoJSON:

import GeoJSON from 'ol/format/GeoJSON';

const format = new GeoJSON();

const feature = format.readFeature({
  type: 'Feature',
  geometry: {
    type: 'LineString',
    coordinates: [
      [30, 50],
      [31, 51]
    ]
  }
});

При экспорте:

const geojson = format.writeFeature(feature);

События и изменение геометрии

LineString может быть источником изменений при редактировании:

line.on('change', function () {
  const coords = line.getCoordinates();
});

События позволяют отслеживать:

  • добавление точек
  • изменение формы линии
  • интерактивное редактирование пользователем

Особенности интерполяции сегментов

Между точками LineString строит прямые сегменты. Для кривых линий требуется дополнительная интерполяция:

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

Типичные сценарии использования

LineString применяется для:

  • отображения маршрутов транспорта
  • GPS-треков и логов перемещения
  • построения дорог и рек
  • визуализации сетевых связей
  • анализа геометрических путей

Ограничения модели LineString

При работе с геометрией учитываются особенности:

  • отсутствие кривых сегментов (только прямые отрезки)
  • зависимость точности от плотности координат
  • необходимость внешних инструментов для сложной геометрии
  • потенциальные проблемы производительности при тысячах точек