Методы работы с GeoJSON-слоями

В Leaflet работа с GeoJSON реализуется через фабрику L.geoJSON, которая преобразует стандартный GeoJSON-объект в интерактивный слой карты. Базовая структура слоя позволяет не только отображать геометрию, но и привязывать поведение к каждому объекту.

const geoLayer = L.geoJSON(geojsonData, {
  onEachFeature: function (feature, layer) {
    layer.bindPopup(feature.properties.name);
  }
});

Параметры конфигурации определяют поведение слоя на этапе создания:

  • onEachFeature — обработка каждого объекта
  • style — стилизация геометрии (для LineString и Polygon)
  • pointToLayer — кастомизация отображения точек
  • filter — фильтрация объектов перед добавлением
  • coordsToLatLng — преобразование координат

Метод addData

Метод addData позволяет динамически добавлять новые GeoJSON-данные в уже существующий слой без пересоздания объекта.

geoLayer.addData(newGeoJson);

Поведение метода:

  • объединяет новые объекты с уже загруженными
  • автоматически применяет style, filter, onEachFeature
  • пересчитывает внутреннюю структуру слоёв

Типичный сценарий использования — подгрузка данных с сервера частями (lazy loading или pagination геоданных).


Метод setStyle

setStyle применяется для изменения визуального оформления всех объектов слоя, поддерживающих стилизацию (Polygon, Polyline).

geoLayer.setStyle({
  color: 'blue',
  weight: 3,
  opacity: 0.7
});

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

  • применяется ко всем подходящим геометриям
  • не влияет на Point-слои (Marker)
  • может вызываться многократно без пересоздания слоя

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


Метод resetStyle

resetStyle возвращает стиль объекта к исходному значению, заданному при создании слоя через style.

geoLayer.resetStyle(targetLayer);

Поведение:

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

Часто применяется при обработке hover-состояний или выделения объектов.


Функция onEachFeature

onEachFeature используется для привязки логики к каждому элементу GeoJSON.

L.geoJSON(data, {
  onEachFeature: function (feature, layer) {
    layer.on('click', function () {
      console.log(feature.properties);
    });
  }
});

Ключевые сценарии:

  • добавление popup или tooltip
  • навешивание событий (click, mouseover, mouseout)
  • связывание feature-данных с UI

Особенность заключается в том, что доступ к feature.properties сохраняется на уровне каждого слоя.


Фильтрация данных через filter

Метод filter позволяет ограничить набор отображаемых объектов до их добавления в слой.

L.geoJSON(data, {
  filter: function (feature) {
    return feature.properties.population > 1000;
  }
});

Логика:

  • возвращает true — объект добавляется
  • возвращает false — объект игнорируется
  • выполняется до создания Leaflet-слоёв

Используется для предобработки данных без изменения исходного GeoJSON.


pointToLayer и кастомизация точек

GeoJSON по стандарту не определяет внешний вид точек, поэтому используется pointToLayer.

L.geoJSON(data, {
  pointToLayer: function (feature, latlng) {
    return L.circleMarker(latlng, {
      radius: 6,
      color: 'red'
    });
  }
});

Назначение:

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

coordsToLatLng и преобразование координат

coordsToLatLng позволяет переопределить механизм преобразования координат GeoJSON в координаты Leaflet.

L.geoJSON(data, {
  coordsToLatLng: function (coords) {
    return L.latLng(coords[1], coords[0]);
  }
});

Применение:

  • работа с нестандартными системами координат
  • трансформация данных перед отрисовкой
  • интеграция с внешними геопространственными API

Управление слоями: getLayers и eachLayer

После создания GeoJSON-слоя доступна работа с внутренними подслоями.

geoLayer.eachLayer(function (layer) {
  layer.bindTooltip('Feature');
});

Методы:

  • eachLayer(callback) — итерация по всем дочерним слоям
  • getLayers() — возврат массива всех слоёв
  • getLayer(id) — получение слоя по идентификатору

Эти методы позволяют выполнять массовые операции без повторного парсинга GeoJSON.


Метод clearLayers

clearLayers удаляет все объекты из GeoJSON-слоя, оставляя сам контейнер активным.

geoLayer.clearLayers();

Поведение:

  • очищает внутренний список слоёв
  • не удаляет сам L.geoJSON
  • позволяет повторно загружать данные через addData

Используется при полной перезагрузке геоданных.


getBounds и вычисление границ

Метод getBounds возвращает географические границы всех объектов слоя.

const bounds = geoLayer.getBounds();
map.fitBounds(bounds);

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

  • учитывает все геометрии слоя
  • возвращает LatLngBounds
  • применяется для автофокусировки карты

Динамическое обновление и перерисовка

GeoJSON-слой поддерживает частичное обновление данных без полного пересоздания.

Сценарии обновления:

  • addData для добавления новых объектов
  • setStyle для изменения визуального представления
  • resetStyle для возврата исходного состояния
  • clearLayers для полной очистки перед новой загрузкой

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


Взаимодействие с событиями слоя

Каждый GeoJSON-слой наследует систему событий Leaflet.

geoLayer.on('click', function (e) {
  console.log(e.layer);
});

Поддерживаемые уровни событий:

  • события слоя (click, add, remove)
  • события дочерних объектов
  • проксирование событий через onEachFeature

Это позволяет строить многоуровневую логику взаимодействия с картой без прямого доступа к DOM.