GeoJSON представляет собой текстовый формат обмена географическими данными, основанный на JSON. В рамках веб-картографии он используется для описания объектов, их геометрии и свойств в стандартизированном виде.
Основные типы объектов GeoJSON:
Feature — объект с геометрией и набором атрибутов
FeatureCollection — коллекция объектов
Геометрии:
Структура Feature:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [30.5, 50.5]
},
"properties": {
"name": "Объект",
"id": 1
}
}
Структура FeatureCollection:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [30.5, 50.5]
},
"properties": {
"name": "A"
}
}
]
}
В OpenLayers работа с GeoJSON реализуется через модуль форматов, где
основным инструментом выступает класс
ol/format/GeoJSON.
Он выполняет две ключевые операции:
Ключевая особенность заключается в преобразовании между:
ol/geom/*ol/FeatureОсновной класс для работы с GeoJSON:
import GeoJSON from 'ol/format/GeoJSON';
Создание экземпляра:
const geojsonFormat = new GeoJSON();
Поддерживаемые операции:
readFeature()readFeatures()readGeometry()writeFeature()writeFeatures()writeGeometry()Чтение одного объекта:
const feature = geojsonFormat.readFeature(geojsonObject);
Чтение коллекции:
const features = geojsonFormat.readFeatures(geojsonObject);
При чтении выполняется:
ol.FeaturepropertiesНаиболее распространённый сценарий — загрузка GeoJSON в источник данных слоя.
import VectorSource from 'ol/source/Vector';
const source = new VectorSource({
features: geojsonFormat.readFeatures(geojsonObject)
});
или более компактно:
const source = new VectorSource({
features: new GeoJSON().readFeatures(geojsonObject)
});
Далее источник подключается к векторному слою:
import VectorLayer from 'ol/layer/Vector';
const layer = new VectorLayer({
source: source
});
GeoJSON по спецификации использует координаты в WGS84
(EPSG:4326), тогда как карты OpenLayers часто работают в
EPSG:3857.
Несоответствие устраняется параметрами:
const features = geojsonFormat.readFeatures(geojsonObject, {
dataProjection: 'EPSG:4326',
featureProjection: 'EPSG:3857'
});
dataProjection — исходная система координат GeoJSON featureProjection — целевая система координат карты
Игнорирование проекций приводит к смещению объектов и некорректному отображению.
Возможна работа только с геометрией без Feature:
const geometry = geojsonFormat.readGeometry(geojsonGeometryObject);
Применение:
Обратное преобразование выполняется методами
writeFeature и writeFeatures.
Запись одного объекта:
const geojson = geojsonFormat.writeFeature(feature);
Запись массива:
const geojson = geojsonFormat.writeFeatures(features);
Результат — строка JSON или объект (в зависимости от параметров).
При сериализации также требуется указание проекций:
const geojson = geojsonFormat.writeFeatures(features, {
dataProjection: 'EPSG:4326',
featureProjection: 'EPSG:3857'
});
Здесь выполняется обратное преобразование:
const geometryGeoJSON = geojsonFormat.writeGeometry(geometry);
Используется при:
Конструктор ol.format.GeoJSON поддерживает
параметры:
const format = new GeoJSON({
featureProjection: 'EPSG:3857',
dataProjection: 'EPSG:4326',
geometryName: 'geometry'
});
Параметр geometryName определяет поле, где хранится
геометрия, если структура отличается от стандартной.
GeoJSON позволяет хранить произвольные атрибуты в
properties. OpenLayers сохраняет их без изменений.
Пример:
const feature = new Feature({
geometry: new Point([0, 0]),
name: 'Объект',
type: 'marker'
});
При сериализации:
const json = geojsonFormat.writeFeature(feature);
результат:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [0, 0]
},
"properties": {
"name": "Объект",
"type": "marker"
}
}
OpenLayers поддерживает прямой парсинг строкового JSON:
const features = geojsonFormat.readFeatures(geojsonString);
Внутри выполняется:
Чаще всего GeoJSON поступает с сервера:
fetch('/data/points.geojson')
.then(response => response.json())
.then(data => {
const features = geojsonFormat.readFeatures(data);
source.addFeatures(features);
});
Важный аспект — контроль ошибок формата данных, так как некорректный GeoJSON приводит к исключениям при парсинге.
При работе с крупными коллекциями:
Оптимизация достигается через:
При работе с GeoJSON в OpenLayers учитываются особенности стандарта:
[x, y] (долгота,
широта)На практике ошибки возникают из-за:
featureProjectiondataProjectionКорректная работа формата напрямую зависит от согласованности системы координат и структуры входных данных.