CesiumJS поддерживает работу с геопространственными данными в различных форматах, включая GeoJSON и его топологически оптимизированное расширение — TopoJSON. Последний представляет собой формат, в котором геометрия объектов хранится не как независимые координатные наборы, а как общая топологическая структура. Это позволяет значительно уменьшать размер данных и устранять дублирование границ между соседними полигонами.
TopoJSON особенно полезен при визуализации административных границ, карт стран, регионов и других объектов, где множество геометрий имеют общие ребра.
В отличие от GeoJSON, где каждая геометрия содержит собственные координаты, TopoJSON вводит понятие арков (arcs) — общих сегментов линий.
Ключевые особенности:
Базовая идея заключается в переходе от:
Feature → Geometry → Coordinates
к структуре:
Topology → Arcs → Shared Geometries
Типичный TopoJSON-файл включает несколько ключевых элементов:
type: "Topology" — объявление форматаobjects — набор геометрических объектовarcs — массив координатных цепочекtransform — параметры деквантования координатПример структуры:
{
"type": "Topology",
"transform": {
"scale": [0.0001, 0.0001],
"translate": [0, 0]
},
"objects": {
"regions": {
"type": "GeometryCollection",
"geometries": [
{
"type": "Polygon",
"arcs": [[0, 1]]
}
]
}
},
"arcs": [
[[10, 10], [20, 10], [20, 20], [10, 20], [10, 10]]
]
}
CesiumJS не использует TopoJSON напрямую как первичный формат данных. Обычно применяется промежуточное преобразование в GeoJSON или использование утилит декодирования.
Основной подход:
GeoJsonDataSourceДля преобразования используется библиотека
topojson-client.
import * as topojson from "topojson-client";
fetch("regions.topojson")
.then(res => res.json())
.then(topoData => {
const geojson = topojson.feature(
topoData,
topoData.objects.regions
);
return Cesium.GeoJsonDataSource.load(geojson);
})
.then(dataSource => {
viewer.dataSources.add(dataSource);
viewer.zoomTo(dataSource);
});
Ключевая функция:
topojson.feature(topology, object)
Она разворачивает топологическую структуру в стандартный GeoJSON FeatureCollection.
После преобразования данные могут быть визуализированы стандартными средствами Cesium:
const viewer = new Cesium.Viewer("cesiumContainer");
Cesium.GeoJsonDataSource.load(geojson, {
stroke: Cesium.Color.BLUE,
fill: Cesium.Color.CYAN.withAlpha(0.4),
strokeWidth: 2
}).then(dataSource => {
viewer.dataSources.add(dataSource);
viewer.zoomTo(dataSource);
});
При работе с такими данными в CesiumJS важно учитывать:
Одно из ключевых преимуществ TopoJSON — квантование координат.
Формула деквантования:
x = x0 + (quantizedX * scaleX)
y = y0 + (quantizedY * scaleY)
Где:
scale задаёт шаг дискретизацииtranslate задаёт смещение координатной системыЭто уменьшает размер файлов до 80% по сравнению с GeoJSON при сложных административных картах.
TopoJSON может содержать несколько слоёв данных:
Пример доступа к объекту:
const countries = topoData.objects.countries;
const geojsonCountries = topojson.feature(topoData, countries);
Далее каждый слой может быть загружен отдельно в Cesium как
самостоятельный DataSource.
При интеграции больших TopoJSON наборов данных применяются следующие стратегии:
1. Ленивая загрузка
2. Разделение на тайлы
3. Предобработка
4. Кэширование GeoJSON
async function loadRegion(url) {
const topo = await fetch(url).then(r => r.json());
const geo = topojson.feature(topo, topo.objects.region);
const ds = await Cesium.GeoJsonDataSource.load(geo, {
stroke: Cesium.Color.YELLOW,
fill: Cesium.Color.ORANGE.withAlpha(0.3)
});
viewer.dataSources.add(ds);
return ds;
}
| Характеристика | GeoJSON | TopoJSON |
|---|---|---|
| Дублирование границ | есть | отсутствует |
| Размер файла | больше | меньше |
| Скорость декодирования | выше | ниже |
| Подходит для Cesium | напрямую | через конвертацию |
При работе с TopoJSON в связке с CesiumJS часто возникают следующие проблемы:
Базовая проверка:
if (!topoData || topoData.type !== "Topology") {
throw new Error("Invalid TopoJSON structure");
}
CesiumJS использует WGS84 как базовую систему координат. TopoJSON обычно хранит данные в:
При загрузке через GeoJSON необходимо обеспечить соответствие WGS84, иначе визуализация будет смещена.
В системах на базе CesiumJS TopoJSON выполняет роль промежуточного оптимизированного слоя хранения геометрии, который снижает нагрузку на сеть и ускоряет доставку данных, но требует дополнительного этапа декодирования перед рендерингом в 3D-сцене.