Работа с геоданными в веб-картах почти всегда опирается на единый обменный формат, позволяющий описывать геометрию, свойства объектов и их структуру без привязки к конкретной библиотеке. В экосистеме OpenLayers таким форматом выступает GeoJSON, который используется для загрузки, отображения и анализа пространственных данных.
GeoJSON представляет собой текстовый формат, основанный на JSON, предназначенный для описания географических объектов: точек, линий, полигонов и их коллекций. Его ключевая особенность — строгая структура и универсальность, благодаря которым данные легко передаются между клиентом и сервером, а также интегрируются в различные картографические системы.
Любой объект GeoJSON строится вокруг нескольких базовых типов:
Минимальный пример точки:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [71.44598, 51.1694]
},
"properties": {
"name": "Пример точки"
}
}
Ключевые элементы:
type определяет тип объектаgeometry содержит пространственные данныеcoordinates задаёт координаты в порядке
[долгота, широта]properties хранит произвольные атрибутыGeoJSON поддерживает несколько базовых типов геометрии:
Используется для одиночных координат.
{
"type": "Point",
"coordinates": [71.44598, 51.1694]
}
Последовательность точек, образующих линию.
{
"type": "LineString",
"coordinates": [
[71.44, 51.16],
[71.45, 51.17],
[71.46, 51.18]
]
}
Замкнутая область.
{
"type": "Polygon",
"coordinates": [
[
[71.44, 51.16],
[71.46, 51.16],
[71.46, 51.18],
[71.44, 51.18],
[71.44, 51.16]
]
]
}
Используются для групп однотипных геометрий, объединённых в один объект.
GeoJSON использует стандарт WGS84 (EPSG:4326). Это означает:
В OpenLayers это важно учитывать, так как многие слои используют проекцию EPSG:3857, и требуется преобразование координат.
В OpenLayers работа с GeoJSON осуществляется через класс
ol/format/GeoJSON, который отвечает за:
import GeoJSON from 'ol/format/GeoJSON';
const format = new GeoJSON();
const features = format.readFeatures(geojsonObject, {
featureProjection: 'EPSG:3857'
});
Здесь происходит ключевой процесс:
Featureconst geojson = format.writeFeatures(features, {
featureProjection: 'EPSG:3857'
});
Этот процесс используется при:
Наиболее распространённый формат загрузки — коллекция объектов:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [71.44, 51.16]
},
"properties": {
"id": 1
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [71.45, 51.17]
},
"properties": {
"id": 2
}
}
]
}
В OpenLayers такая структура напрямую преобразуется в набор объектов слоя:
const source = vectorLayer.getSource();
source.addFeatures(features);
Поле properties играет ключевую роль в прикладных
задачах:
Пример:
"properties": {
"type": "restaurant",
"rating": 4.5,
"name": "Cafe Central"
}
Использование в стиле OpenLayers:
import Style from 'ol/style/Style';
import Circle from 'ol/style/Circle';
import Fill from 'ol/style/Fill';
const styleFunction = (feature) => {
const rating = feature.get('rating');
return new Style({
image: new Circle({
radius: rating * 2,
fill: new Fill({ color: 'blue' })
})
});
};
При работе с GeoJSON часто возникает необходимость преобразования систем координат:
OpenLayers решает это автоматически при указании
featureProjection.
Пример явного контроля:
const format = new GeoJSON();
const features = format.readFeatures(data, {
dataProjection: 'EPSG:4326',
featureProjection: 'EPSG:3857'
});
dataProjection — исходная система координатfeatureProjection — целевая система картыGeoJSON часто поступает с серверов:
fetch('/api/points')
.then(response => response.json())
.then(data => {
const features = format.readFeatures(data, {
featureProjection: 'EPSG:3857'
});
source.addFeatures(features);
});
Типичный сценарий:
В OpenLayers GeoJSON часто используется совместно с
VectorSource:
import VectorSource from 'ol/source/Vector';
const source = new VectorSource({
features: new GeoJSON().readFeatures(geojsonData, {
featureProjection: 'EPSG:3857'
})
});
Такой подход позволяет:
GeoJSON удобен для двустороннего обмена:
Пример сохранения:
const updatedGeoJSON = new GeoJSON().writeFeatures(source.getFeatures(), {
featureProjection: 'EPSG:3857',
dataProjection: 'EPSG:4326'
});
Это позволяет сохранять данные в стандартном формате, совместимом с любыми GIS-системами.
Несмотря на универсальность, GeoJSON имеет особенности:
В задачах с большими объёмами данных часто применяются альтернативы (TopoJSON, векторные тайлы), однако GeoJSON остаётся базовым обменным форматом.
При работе с большими GeoJSON-файлами важно учитывать:
Оптимизационные подходы:
Пример кластеризации:
import Cluster from 'ol/source/Cluster';
const clusterSource = new Cluster({
distance: 40,
source: vectorSource
});
GeoJSON при этом остаётся источником данных, но визуализация становится более эффективной.
Типичный цикл использования GeoJSON в OpenLayers выглядит следующим образом:
GeoJSONVectorSourceЭта модель делает формат универсальным связующим звеном между сервером, клиентом и картографической визуализацией.