Геоданные в Vega и Vega-Lite строятся вокруг концепции преобразования пространственных данных в экранные координаты через систему проекций и специализированные трансформации. Основу составляют форматы GeoJSON и TopoJSON, которые описывают геометрии объектов — точки, линии и полигоны — в географических координатах (долгота/широта). Визуализация карт в этих библиотеках сводится к двум ключевым задачам: корректное преобразование координат и связывание географической информации с атрибутивными данными.
GeoJSON представляет собой стандарт JSON-структур для описания геометрии:
Point — отдельные координаты (долгота, широта)LineString — линии (маршруты, границы)Polygon — полигоны (страны, регионы)Feature и FeatureCollection — объекты с
атрибутамиПример GeoJSON:
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[71.4, 51.1],
[71.5, 51.1],
[71.5, 51.2],
[71.4, 51.2],
[71.4, 51.1]
]
]
},
"properties": {
"name": "Region A"
}
}
TopoJSON расширяет GeoJSON, уменьшая размер данных за счёт топологического сжатия: общие границы объектов хранятся один раз. Это особенно важно при работе с картами стран, регионов и административных делений.
Vega и Vega-Lite поддерживают загрузку внешних файлов через поле
data.url. Чаще всего используются форматы
.json, .geojson, .topojson.
{
"data": {
"url": "world-110m.json",
"format": {
"type": "topojson",
"feature": "countries"
}
}
}
В случае TopoJSON необходимо указать, какой объект извлекать через
feature. Vega автоматически преобразует топологию в набор
геометрий.
Для GeoJSON:
{
"data": {
"url": "regions.geojson",
"format": {
"type": "geojson"
}
}
}
Ключевой элемент картографии в Vega — система проекций. Географические координаты не могут быть напрямую отображены на плоскости, поэтому применяются математические преобразования.
Наиболее используемые проекции:
mercator — стандартная Web MercatorequalEarth — более корректное распределение
площадейalbersUsa — композитная проекция для СШАnaturalEarth1 — сбалансированная мировая проекцияОпределение проекции в Vega:
{
"projections": [
{
"name": "projection",
"type": "mercator",
"scale": 150,
"translate": [400, 250]
}
]
}
В Vega-Lite:
{
"projection": {
"type": "mercator"
}
}
Карты в Vega строятся через mark "shape" или через
комбинацию geoshape.
Пример отображения стран:
{
"data": {
"url": "world.json",
"format": {
"type": "topojson",
"feature": "countries"
}
},
"mark": "geoshape",
"encoding": {
"color": {
"value": "#cfcfcf"
}
},
"projection": {
"type": "mercator"
}
}
Здесь каждая геометрия автоматически проецируется и рисуется как SVG-путь.
Частая задача — создание хороплет-карт, где регионы окрашиваются по
значениям (население, плотность, экономика). Для этого используется
lookup трансформация.
Пример: соединение геометрии стран с таблицей показателей.
{
"data": {
"url": "world.json",
"format": {
"type": "topojson",
"feature": "countries"
}
},
"transform": [
{
"lookup": "id",
"from": {
"data": {
"url": "population.csv"
},
"key": "country_id",
"fields": ["population"]
}
}
],
"mark": "geoshape",
"encoding": {
"color": {
"field": "population",
"type": "quantitative"
}
},
"projection": {
"type": "equalEarth"
}
}
В этом примере:
lookup связывает геометрию и таблицуcolor отображает числовую шкалуПомимо полигонов, часто визуализируются точки — города, события, объекты.
{
"data": {
"url": "cities.json"
},
"mark": "circle",
"encoding": {
"longitude": { "field": "lon", "type": "quantitative" },
"latitude": { "field": "lat", "type": "quantitative" },
"size": { "value": 50 },
"color": { "value": "red" }
},
"projection": {
"type": "mercator"
}
}
Важно, что для точек не требуется geoshape — достаточно
явного указания координат.
Часто карта включает несколько слоёв: фоновые регионы, поверх которых отображаются точки.
В Vega-Lite это реализуется через layer:
{
"layer": [
{
"data": {
"url": "countries.json",
"format": { "type": "topojson", "feature": "countries" }
},
"mark": "geoshape",
"encoding": {
"color": { "value": "#e0e0e0" }
}
},
{
"data": {
"url": "cities.json"
},
"mark": "circle",
"encoding": {
"longitude": { "field": "lon", "type": "quantitative" },
"latitude": { "field": "lat", "type": "quantitative" },
"size": { "value": 40 },
"color": { "value": "steelblue" }
}
}
],
"projection": {
"type": "mercator"
}
}
Слои рендерятся последовательно, образуя единое визуальное пространство.
Ключевые параметры проекций:
scale — масштаб картыtranslate — смещение центраcenter — географический центр (долгота/широта){
"projection": {
"type": "mercator",
"center": [71.45, 51.17],
"scale": 1200,
"translate": [500, 300]
}
}
Эти параметры позволяют:
Vega и Vega-Lite поддерживают автоматическую подгонку границ через
fit.
{
"projection": {
"type": "mercator",
"fit": {
"type": "FeatureCollection",
"features": { "url": "region.json" }
}
}
}
Это позволяет автоматически масштабировать карту под геометрию без
ручной настройки scale и translate.
Для повышения читаемости карт часто добавляют:
Vega поддерживает генерацию graticule:
{
"data": {
"graticule": true
},
"mark": {
"type": "geoshape",
"stroke": "#cccccc",
"strokeWidth": 0.5
},
"projection": {
"type": "mercator"
}
}
Это создаёт сетку параллелей и меридианов, полезную для ориентации.
В Vega есть два режима работы с геоданными:
Projected geometry (geoshape)
Raw coordinates (longitude /
latitude)
Внутренне Vega преобразует данные через pipeline трансформаций, включая:
geopoint — преобразование точекgeoshape — преобразование геометрийprojection transform — управление системой
координатПри визуализации числовых данных важно учитывать масштаб значений. Часто применяется логарифмическое преобразование:
{
"transform": [
{
"calculate": "log(datum.population + 1)",
"as": "log_pop"
}
],
"mark": "geoshape",
"encoding": {
"color": {
"field": "log_pop",
"type": "quantitative"
}
}
}
Это позволяет избежать доминирования крупных значений и делает распределение визуально сбалансированным.
Геоданные часто хранятся отдельно от визуализации. Vega поддерживает:
При работе с динамическими данными важно учитывать:
Для API-данных:
{
"data": {
"url": "https://example.com/api/geo",
"format": { "type": "json" }
}
}
При работе с высокодетализированными картами возникают проблемы производительности. Основные подходы:
TopoJSON особенно эффективен для карт стран и регионов, так как устраняет дублирование границ.
Хотя базовая задача — отрисовка, Vega позволяет добавлять взаимодействие:
Пример выделения региона:
{
"selection": {
"region": {
"type": "single",
"on": "click",
"fields": ["id"]
}
}
}
И применение в цвете:
"color": {
"condition": {
"selection": "region",
"value": "orange"
},
"value": "#ccc"
}
В более сложных сценариях используются кастомные проекции или трансформации:
Vega позволяет определять пользовательские функции проекции через JavaScript API, что критично для специализированных картографических задач.
Геоданные часто являются частью более сложных визуализаций:
В таких случаях карта становится одним из слоёв общего декларативного описания, а географическая проекция — лишь частным случаем системы координат, интегрированной в общий визуальный pipeline Vega.