Географические данные в визуализации представляют собой структурированное описание пространственных объектов: стран, регионов, административных границ, береговых линий, маршрутов и точек интереса. В веб-визуализации они чаще всего описываются через GeoJSON, однако при увеличении масштаба данных возникает проблема избыточности и дублирования геометрий.
Формат TopoJSON решает эту проблему за счёт топологического представления данных, где общие границы объектов хранятся один раз и переиспользуются между соседними полигонами. Это делает формат особенно эффективным при работе с картами стран, регионов и административных делений.
GeoJSON описывает каждый географический объект независимо. Например, граница между двумя странами будет продублирована в обоих объектах.
TopoJSON вводит понятие топологии, где:
Ключевая идея заключается в переходе от геометрии объектов к структуре связей между ними.
TopoJSON документ содержит несколько основных компонентов:
Пример упрощённой структуры:
{
"type": "Topology",
"objects": {
"countries": {
"type": "GeometryCollection",
"geometries": [
{
"type": "Polygon",
"arcs": [[0, 1, 2]],
"properties": { "name": "Exampleland" }
}
]
}
},
"arcs": [
[[0, 0], [10, 0], [10, 10]],
[[10, 10], [0, 10]],
[[0, 10], [0, 0]]
],
"transform": {
"scale": [0.1, 0.1],
"translate": [0, 0]
}
}
Arcs представляют собой последовательности точек, которые могут быть переиспользованы несколькими объектами.
Особенности:
Это позволяет значительно уменьшить размер данных при больших наборах геометрий.
Поле transform позволяет хранить координаты в сжатом
виде. Вместо абсолютных значений используются целочисленные индексы,
которые преобразуются в реальные координаты через формулу:
x = x_{scaled} scale_x + translate_x
y = y_{scaled} scale_y + translate_y
Такой подход снижает размер файла и повышает эффективность передачи данных.
Vega-Lite напрямую не работает с TopoJSON как с финальным форматом
визуализации. Вместо этого используется предварительное преобразование в
GeoJSON через библиотеку topojson-client.
Основной рабочий процесс:
Пример преобразования:
import { feature } from "topojson-client";
fetch("countries.topojson")
.then(res => res.json())
.then(topology => {
const geojson = feature(topology, topology.objects.countries);
return geojson;
});
Vega-Lite ожидает данные в формате GeoJSON FeatureCollection для
географических слоёв. После конвертации данные используются через mark
geoshape.
Пример спецификации:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"url": "countries.geojson",
"format": {
"type": "json"
}
},
"mark": "geoshape",
"projection": {
"type": "mercator"
},
"encoding": {
"color": {
"field": "properties.population",
"type": "quantitative"
}
}
}
Vega-Lite поддерживает различные картографические проекции, которые определяют, как координаты сферы отображаются на плоскости.
Основные типы:
Проекция влияет на восприятие расстояний, площадей и форм.
TopoJSON сам по себе не содержит логики визуализации, но хранит
атрибуты объектов в properties. После конвертации эти
данные становятся доступны в Vega-Lite.
Пример:
"encoding": {
"color": {
"field": "properties.gdp",
"type": "quantitative"
},
"tooltip": [
{ "field": "properties.name", "type": "nominal" },
{ "field": "properties.gdp", "type": "quantitative" }
]
}
Таким образом, геометрия отделяется от аналитических данных, что позволяет использовать один и тот же слой для разных визуализационных задач.
TopoJSON обеспечивает значительное уменьшение объёма данных за счёт:
Это особенно критично при визуализации:
Типичный pipeline выглядит следующим образом:
Такая архитектура разделяет задачи хранения, передачи и рендеринга.
При увеличении количества геометрических объектов линейное хранение (GeoJSON) становится неэффективным. TopoJSON сохраняет топологию, что позволяет:
Эти свойства делают формат стандартом де-факто для сложных картографических приложений, интегрируемых с Vega и Vega-Lite.