GeoMap в Nivo представляет собой специализированный компонент для визуализации географических данных в виде хороплет-карт, точечных слоёв и комбинированных геопространственных представлений. В основе лежит работа с географическими проекциями, TopoJSON/GeoJSON-структурами и сопоставлением пользовательских данных с географическими объектами через идентификаторы (например, ISO-коды стран или регионов).
Географические карты в Nivo строятся на нескольких ключевых слоях, каждый из которых отвечает за отдельный аспект визуализации:
GeoMap использует декларативную модель: разработчик описывает данные и правила отображения, а библиотека самостоятельно выполняет трансформацию географических координат в экранные.
Основой выступает географическая проекция, чаще всего Mercator или Equal Earth, которая преобразует сферическую поверхность Земли в плоское изображение.
Компонент GeoMap находится в пакете @nivo/geo. В
типичной конфигурации ему передаются два ключевых типа данных:
Географические объекты обычно импортируются из TopoJSON:
import { ResponsiveGeoMap } from '@nivo/geo'
import countries from 'world-countries.json'
Структура features содержит набор объектов формата GeoJSON:
{
"type": "Feature",
"id": "KZ",
"properties": {
"name": "Kazakhstan"
},
"geometry": {
"type": "Polygon",
"coordinates": []
}
}
Пользовательские данные связываются с географическими объектами через идентификатор:
const data = [
{ id: 'KZ', value: 123 },
{ id: 'RU', value: 456 },
{ id: 'CN', value: 789 }
]
Сопоставление происходит автоматически по полю id.
Компонент ResponsiveGeoMap адаптируется под размер
контейнера и является основным способом использования:
<ResponsiveGeoMap
features={countries.features}
data={data}
margin={{ top: 0, right: 0, bottom: 0, left: 0 }}
projectionType="mercator"
fillColor="value"
valueFormat=".2f"
unknownColor="#666666"
borderWidth={0.5}
borderColor="#152538"
/>
Ключевые параметры:
features — географические объектыdata — набор значенийprojectionType — тип проекцииfillColor — правило окрашиванияunknownColor — цвет для объектов без данныхborderColor и borderWidth — стили
границGeoMap поддерживает различные географические проекции, каждая из которых влияет на форму и искажения карты:
Пример настройки:
projectionType="naturalEarth1"
projectionScale={160}
projectionTranslation={[0.5, 0.5]}
Параметры управления проекцией:
projectionScale — масштаб картыprojectionTranslation — смещение центраprojectionRotation — поворот сферы (для
3D-проекций)Один из ключевых механизмов GeoMap — визуальное кодирование данных через цветовые шкалы. Поддерживаются как фиксированные палитры, так и динамическое вычисление цвета.
Пример использования предустановленной схемы:
colors={['#e8f5e9', '#66bb6a', '#1b5e20']}
При использовании fillColor="value" значения
автоматически интерполируются по диапазону.
Дополнительно можно использовать функции:
fillColor={(feature) => {
if (!feature.data) return '#ccc'
return feature.data.value > 100 ? '#2e7d32' : '#81c784'
}}
Связь между географией и данными осуществляется через ключ
id. Это требует строгого соответствия форматов:
При отсутствии совпадения объект считается “без данных” и
окрашивается в unknownColor.
Особенность реализации заключается в том, что GeoMap предварительно индексирует данные для оптимизации поиска, что важно при работе с большими наборами (сотни и тысячи объектов).
GeoMap предоставляет событийную модель для взаимодействия с картой:
onCl ick={(feature) => {
console.log(feature.id, feature.data)
}}
onMouseEn ter={(feature) => {
console.log('hover:', feature.properties.name)
}}
Каждый географический объект передаётся в обработчики с расширенной структурой:
idpropertiesgeometrydata (если есть совпадение)Hover-эффекты часто используются для подсветки регионов:
enableGraticule={true}
graticuleLineColor="#dddddd"
GeoMap построен на концепции слоёв, что позволяет переопределять визуализацию:
layers={[
'features',
'graticule',
'labels',
CustomLayer
]}
Стандартные слои:
Пользовательский слой:
const CustomLayer = ({ features }) => {
return features.map(f => (
<circle
key={f.id}
cx={f.centroid[0]}
cy={f.centroid[1]}
r={3}
fill="red"
/>
))
}
Слои позволяют добавлять поверх карты:
Подписи регионов управляются через label и
labelTextColor:
label="properties.name"
labelTextColor="#000000"
В сложных случаях используется функция:
label={(feature) => feature.properties.name.toUpperCase()}
При большом количестве объектов подписи часто отключаются из-за перегрузки визуального пространства.
GeoMap оптимизирован для работы с большими наборами геоданных, однако производительность зависит от:
Для оптимизации используются:
Рекомендуется предварительная обработка TopoJSON через
topojson-client для уменьшения размера данных.
Graticule — это сетка меридианов и параллелей, которая добавляет географическую читаемость:
enableGraticule={true}
graticuleLineColor="#ccc"
Также доступны настройки:
Эти элементы особенно важны при использовании проекций с искажениями.
GeoMap поддерживает отображение точек поверх карты, что позволяет визуализировать события или метрики:
markers={[
{
markerOffsetX: 0,
markerOffsetY: 0,
coordinates: [69.2401, 53.2145],
data: { value: 100 }
}
]}
Типичные сценарии:
Маркеры могут быть стилизованы через SVG-компоненты.
GeoMap часто используется вместе с:
Интеграция выполняется через общий слой состояния данных, где GeoMap служит визуальной проекцией пространственного распределения.
Отсутствие данных является штатным сценарием. GeoMap обрабатывает его через:
unknownColorПример условного отображения:
if (!feature.data) {
return '#f0f0f0'
}
Это позволяет визуально отделять пустые регионы от активных.
GeoMap поддерживает строгую SVG-стилизацию, где ключевыми параметрами являются:
Важную роль играет согласованность палитры с остальными визуализациями приложения. Обычно используется единая дизайн-система цветов для всех компонентов Nivo.
Часто встречающиеся проблемы:
id между data и featuresКорректная подготовка данных критична для стабильной визуализации.
GeoMap используется в интерфейсах, где важна пространственная интерпретация данных:
Главное преимущество — мгновенное восприятие распределения значений на глобальном или региональном уровне