В MapLibre GL JS все пользовательские объекты на карте, как правило, представляют собой геометрии в формате GeoJSON. Независимо от того, добавлены ли они через интерактивные инструменты рисования или программно через источники данных, ключевым этапом экспорта является получение актуального состояния слоя данных и преобразование его в переносимый формат.
Любые рисуемые объекты в веб-картах, построенных на MapLibre GL JS, в конечном счёте сводятся к структуре:
FeatureFeatureCollectionPoint, LineString,
PolygonpropertiesСтандартом обмена выступает GeoJSON (RFC 7946), где координаты всегда задаются в системе WGS84 (долгота, широта).
Наиболее распространённый сценарий — использование плагина интерактивного рисования. После добавления фигур в карту их можно извлечь в виде единого набора данных.
const data = draw.getAll();
console.log(data);
Метод возвращает объект формата:
{
"type": "FeatureCollection",
"features": [...]
}
Каждый элемент содержит:
idpropertiesЧасто требуется экспортировать только часть объектов, например только полигоны или только выбранные элементы.
const all = draw.getAll();
const polygons = {
type: "FeatureCollection",
features: all.features.filter(f => f.geometry.type === "Polygon")
};
Или экспорт только выбранных объектов:
const selected = draw.getSelected();
После получения данных их необходимо преобразовать в файл, доступный для скачивания.
function exportGeoJSON(data) {
const json = JSON.stringify(data, null, 2);
const blob = new Blob([json], { type: "application/geo+json" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "map-data.geojson";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
Вызов:
exportGeoJSON(draw.getAll());
Если объекты добавлены не через Draw, а через
GeoJSONSource, используется прямое извлечение данных из
источника.
const source = map.getSource("user-data");
const data = source._data;
Важно учитывать:
_data — внутреннее полеЕсли данные отображаются как векторные или растровые слои, можно извлекать уже отрисованные элементы.
const features = map.queryRenderedFeatures({
layers: ["draw-layer"]
});
Далее требуется преобразовать результат в GeoJSON:
const geojson = {
type: "FeatureCollection",
features: features.map(f => ({
type: "Feature",
geometry: f.geometry,
properties: f.properties
}))
};
Часто требуется экспортировать объекты в пределах текущего viewport.
const bounds = map.getBounds();
const features = map.queryRenderedFeatures({
bbox: [
bounds.getWest(),
bounds.getSouth(),
bounds.getEast(),
bounds.getNorth()
]
});
Перед сохранением данные часто приводят к единому виду:
function cleanFeature(feature) {
const { id, layer, source, state, ...rest } = feature;
return rest;
}
const cleaned = {
type: "FeatureCollection",
features: geojson.features.map(cleanFeature)
};
Хотя MapLibre GL JS работает с GeoJSON, часто требуется преобразование:
const exportData = {
exportedAt: new Date().toISOString(),
data: draw.getAll()
};
function toCSV(features) {
return features.map(f => {
const [lng, lat] = f.geometry.coordinates;
return `${lng},${lat}`;
}).join("\n");
}
GeoJSON не хранит визуальные стили MapLibre GL JS (цвет, толщина линий, заливка). Для сохранения визуального состояния необходимо дополнительно сохранять метаданные.
const styledFeature = {
...feature,
properties: {
...feature.properties,
stroke: "#ff0000",
"stroke-width": 2,
fill: "#00ff00"
}
};
В сложных приложениях экспорт часто делегируется серверу.
fetch("/api/export", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(draw.getAll())
});
Сервер может:
MapLibre GL JS использует стандарт:
При экспорте важно учитывать:
[lng, lat]При работе с тысячами объектов необходимо учитывать производительность.
const all = draw.getAll();
const chunkSize = 500;
for (let i = 0; i < all.features.length; i += chunkSize) {
const chunk = {
type: "FeatureCollection",
features: all.features.slice(i, i + chunkSize)
};
exportGeoJSON(chunk);
}
Иногда требуется фиксировать состояние карты и объектов одновременно.
const snapshot = {
center: map.getCenter(),
zoom: map.getZoom(),
bearing: map.getBearing(),
pitch: map.getPitch(),
features: draw.getAll()
};
Такой формат позволяет восстановить сцену полностью, включая геометрию и вид.
_data без копированияFeatureCollection оболочкиВ реальных приложениях логика экспорта обычно централизуется:
class ExportManager {
constructor(draw) {
this.draw = draw;
}
exportAll() {
const data = this.draw.getAll();
this.download(data);
}
exportSelected() {
const data = this.draw.getSelected();
this.download(data);
}
download(data) {
const blob = new Blob([JSON.stringify(data)], {
type: "application/geo+json"
});
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "export.geojson";
a.click();
URL.revokeObjectURL(url);
}
}