Формат TopoJSON и работа с геоданными

Геоданные как основа картографической визуализации

Географические данные в визуализации представляют собой структурированное описание пространственных объектов: стран, регионов, административных границ, береговых линий, маршрутов и точек интереса. В веб-визуализации они чаще всего описываются через GeoJSON, однако при увеличении масштаба данных возникает проблема избыточности и дублирования геометрий.

Формат TopoJSON решает эту проблему за счёт топологического представления данных, где общие границы объектов хранятся один раз и переиспользуются между соседними полигонами. Это делает формат особенно эффективным при работе с картами стран, регионов и административных делений.


Отличие GeoJSON и TopoJSON

GeoJSON описывает каждый географический объект независимо. Например, граница между двумя странами будет продублирована в обоих объектах.

TopoJSON вводит понятие топологии, где:

  • линии (arcs) хранятся отдельно;
  • полигоны собираются из этих линий;
  • общие границы не дублируются;
  • данные подвергаются упрощению без потери связности.

Ключевая идея заключается в переходе от геометрии объектов к структуре связей между ними.


Структура TopoJSON-файла

TopoJSON документ содержит несколько основных компонентов:

  • objects — набор географических объектов (страны, регионы и т.д.);
  • arcs — массив координатных цепочек;
  • transform — параметры масштабирования и смещения;
  • bbox — ограничивающий прямоугольник.

Пример упрощённой структуры:

{
  "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

Arcs представляют собой последовательности точек, которые могут быть переиспользованы несколькими объектами.

Особенности:

  • каждая линия хранится один раз;
  • направление линии имеет значение;
  • отрицательный индекс arc означает обратный порядок точек;
  • полигоны строятся как комбинации arcs.

Это позволяет значительно уменьшить размер данных при больших наборах геометрий.


Преобразование координат: transform

Поле transform позволяет хранить координаты в сжатом виде. Вместо абсолютных значений используются целочисленные индексы, которые преобразуются в реальные координаты через формулу:

x = x_{scaled} scale_x + translate_x

y = y_{scaled} scale_y + translate_y

Такой подход снижает размер файла и повышает эффективность передачи данных.


Использование TopoJSON в Vega-Lite

Vega-Lite напрямую не работает с TopoJSON как с финальным форматом визуализации. Вместо этого используется предварительное преобразование в GeoJSON через библиотеку topojson-client.

Основной рабочий процесс:

  1. загрузка TopoJSON;
  2. извлечение нужного объекта;
  3. конвертация в GeoJSON;
  4. передача результата в Vega-Lite.

Пример преобразования:

import { feature } from "topojson-client";

fetch("countries.topojson")
  .then(res => res.json())
  .then(topology => {
    const geojson = feature(topology, topology.objects.countries);
    return geojson;
  });

Связка TopoJSON и Vega-Lite

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 поддерживает различные картографические проекции, которые определяют, как координаты сферы отображаются на плоскости.

Основные типы:

  • mercator — стандартная веб-карта;
  • equalEarth — сохранение площадей;
  • albersUsa — США с акцентом на регионы;
  • orthographic — глобусное отображение.

Проекция влияет на восприятие расстояний, площадей и форм.


Фильтрация и работа с атрибутами

TopoJSON сам по себе не содержит логики визуализации, но хранит атрибуты объектов в properties. После конвертации эти данные становятся доступны в Vega-Lite.

Пример:

"encoding": {
  "color": {
    "field": "properties.gdp",
    "type": "quantitative"
  },
  "tooltip": [
    { "field": "properties.name", "type": "nominal" },
    { "field": "properties.gdp", "type": "quantitative" }
  ]
}

Таким образом, геометрия отделяется от аналитических данных, что позволяет использовать один и тот же слой для разных визуализационных задач.


Снижение размера данных и оптимизация

TopoJSON обеспечивает значительное уменьшение объёма данных за счёт:

  • устранения дублирования границ;
  • целочисленного кодирования координат;
  • упрощения геометрии;
  • переиспользования arcs.

Это особенно критично при визуализации:

  • глобальных карт;
  • высокодетализированных регионов;
  • интерактивных веб-карт с частой перерисовкой.

Практическая модель обработки геоданных в Vega-экосистеме

Типичный pipeline выглядит следующим образом:

  • источник данных (shapefile, GeoJSON, OSM);
  • конвертация в TopoJSON;
  • хранение и доставка в сжатом виде;
  • клиентская декомпрессия;
  • преобразование в GeoJSON;
  • визуализация через Vega-Lite.

Такая архитектура разделяет задачи хранения, передачи и рендеринга.


Роль TopoJSON в масштабируемых визуализациях

При увеличении количества геометрических объектов линейное хранение (GeoJSON) становится неэффективным. TopoJSON сохраняет топологию, что позволяет:

  • уменьшить сетевой трафик;
  • ускорить загрузку карт;
  • снизить нагрузку на парсинг JSON;
  • обеспечить консистентность границ.

Эти свойства делают формат стандартом де-факто для сложных картографических приложений, интегрируемых с Vega и Vega-Lite.