В экосистеме веб-картографии GeoJSON выступает универсальным форматом описания геометрии и атрибутов объектов. В Leaflet он является базовым стандартом для импорта и экспорта пространственных данных.
Структура GeoJSON опирается на несколько ключевых типов:
Leaflet интерпретирует GeoJSON напрямую через L.geoJSON,
преобразуя данные в соответствующие слои карты.
Особенность взаимодействия заключается в автоматическом маппинге типов:
Дополнительно поддерживаются обработчики onEachFeature,
pointToLayer, filter, позволяющие
модифицировать процесс конвертации без изменения исходного формата.
Внутренние объекты Leaflet могут быть сериализованы обратно в
GeoJSON. Основной механизм реализован через метод
toGeoJSON().
Поддерживаемые сущности:
L.MarkerL.PolylineL.PolygonL.LayerGroupL.FeatureGroupПринцип преобразования основан на обходе вложенной структуры слоёв и сборе геометрии в стандартизированное представление.
const geojson = layer.toGeoJSON();
При использовании FeatureGroup происходит рекурсивная
агрегация всех дочерних слоёв:
const group = L.featureGroup([marker, polyline, polygon]);
const data = group.toGeoJSON();
В результате формируется единый FeatureCollection.
Дополнительные свойства можно внедрять через опцию
properties внутри слоя:
const marker = L.marker([51.5, 0.1], {
title: 'Object A'
});
marker.feature = {
type: 'Feature',
properties: {
name: 'Object A',
category: 'point'
}
};
Загрузка GeoJSON в Leaflet реализуется через L.geoJSON,
который выполняет преобразование геометрии в слои карты.
L.geoJSON(data, {
style: function (feature) {
return { color: 'blue' };
},
onEachFeature: function (feature, layer) {
layer.bindPopup(feature.properties.name);
}
}).addTo(map);
Механизм трансформации включает:
Фильтрация объектов выполняется на этапе загрузки:
filter: function (feature) {
return feature.properties.visible === true;
}
Leaflet использует внутренний формат координат:
LatLng: [latitude, longitude]GeoJSON использует противоположный порядок:
[longitude, latitude]Несоответствие компенсируется автоматически при использовании
L.geoJSON, однако при ручной обработке требуется строгий
контроль порядка координат.
Пример некорректной интерпретации:
// Ошибка: перепутан порядок
L.marker([lng, lat]);
Корректная форма:
L.marker([lat, lng]);
Внутреннее представление координат основано на классе
L.LatLng, который обеспечивает нормализацию значений и
поддержку операций расстояний и преобразований.
Leaflet оперирует системой координат через CRS (Coordinate Reference System). Наиболее распространённые:
При работе с GeoJSON предполагается EPSG:4326, однако отображение на карте почти всегда выполняется в EPSG:3857.
Инициализация карты с альтернативной CRS:
const map = L.map('map', {
crs: L.CRS.EPSG4326
});
Преобразование координат выполняется автоматически при отрисовке, но при взаимодействии с внешними системами может потребоваться явная трансформация.
Leaflet предоставляет методы:
project(latlng) — перевод в пиксельные координатыunproject(point) — обратное преобразованиеПомимо GeoJSON часто используются форматы KML и GPX. Leaflet не поддерживает их нативно, но применяются специализированные плагины.
Одним из распространённых решений является
leaflet-omnivore, обеспечивающий парсинг различных
форматов:
omnivore.kml('data.kml').addTo(map);
omnivore.gpx('track.gpx').addTo(map);
Процесс преобразования включает:
TopoJSON представляет собой расширение GeoJSON, в котором геометрия хранится в виде топологических связей. Это уменьшает размер данных за счёт устранения дублирования координат.
Для работы используется предварительная декомпрессия:
const geojson = topojson.feature(topology, topology.objects.layer);
L.geoJSON(geojson).addTo(map);
Преобразование выполняется через библиотеку
topojson-client.
WKT (Well-Known Text) используется в ряде GIS-систем для текстового описания геометрии:
POINT (30 10)
LINESTRING (30 10, 10 30, 40 40)
Leaflet не поддерживает WKT напрямую, поэтому требуется промежуточное преобразование:
Конвертация обычно выполняется через вспомогательные библиотеки,
после чего результат передаётся в L.geoJSON.
Leaflet-слои могут быть сериализованы для хранения состояния карты.
Основной механизм:
toGeoJSON() — экспортL.geoJSONДополнительно сериализуются:
Пример полного цикла:
const saved = layer.toGeoJSON();
const restored = L.geoJSON(saved, {
onEachFeature: function (feature, layer) {
layer.bindPopup(feature.properties.name);
}
});
Маркерные объекты преобразуются в GeoJSON как Point, при
этом координаты извлекаются из внутреннего LatLng.
Полилинии и полигоны преобразуются через последовательность узлов:
Многосоставные объекты сохраняют структуру:
При экспортировании учитывается замыкание контуров полигона, если оно было задано при создании слоя.
Во многих архитектурах используется промежуточный формат между Leaflet и сервером. GeoJSON выступает транспортным слоем, однако нередко вводятся расширения:
Пример расширенного объекта:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [30.5, 50.5]
},
"properties": {
"id": 123,
"status": "active",
"updated": 1710000000
}
}
При обмене с API происходит нормализация:
propertiesВ системах с высокой нагрузкой преобразование форматов часто переносится на серверную сторону. Причины:
Типичный pipeline:
Leaflet в таком случае получает уже готовые данные и выполняет только визуализацию.
При работе с большими наборами геометрии преобразование форматов становится критическим фактором.
Основные оптимизации:
simplify для уменьшения количества
вершинMarkerClusterLayerGroupДополнительный эффект оказывает уменьшение глубины вложенности
FeatureCollection, так как обход структуры влияет на время
парсинга и отрисовки.
При больших объёмах данных предпочтение отдается потоковой загрузке и поэтапному добавлению слоёв в карту.