Maps 地图
@lark-ui/core
const cloudflareLocations = [
  { city: "San Francisco", iata: "SFO", lat: 37.77, lon: -122.42 },
  { city: "London", iata: "LHR", lat: 51.51, lon: -0.13 },
  { city: "Singapore", iata: "SIN", lat: 1.35, lon: 103.82 },
  // ...more locations
];

<BubbleMap
  echarts={echarts}
  geoJson={geoJson}
  data={cloudflareLocations}
  lng="lon"
  lat="lat"
  name="city"
  value={() => 1}
  bubbleColor="#F6821F"
  minRadius={8}
  maxRadius={8}
  tooltipFormatter={(row) =>
    "<strong>" + row.city + "</strong> " + row.iata
  }
/>

安装

BubbleMap 和 ChoroplethMap 需要将 echarts 作为 peer dependency 安装。GlobeMap 会将内置的 Natural Earth 陆地遮罩直接渲染为 SVG,既不使用 WebGL,也不依赖 ECharts。平面地图的使用方需要自行提供 GeoJSON;地图组件不会自动获取地图数据,也不使用地图瓦片。

npm install echarts

统一导出

import { BubbleMap, ChoroplethMap, GlobeMap } from "@lark-ui/core";

按需导出

import { BubbleMap, ChoroplethMap, GlobeMap } from "@lark-ui/core/components/chart";

用法

import { BubbleMap, ChoroplethMap, type MapGeoJson } from "@lark-ui/core";
import * as echarts from "echarts/core";
import { MapChart, ScatterChart } from "echarts/charts";
import { TooltipComponent, VisualMapComponent } from "echarts/components";
import { CanvasRenderer } from "echarts/renderers";

echarts.use([
  MapChart,
  ScatterChart,
  TooltipComponent,
  VisualMapComponent,
  CanvasRenderer,
]);

// Load GeoJSON in your app and pass it to map components.
const geoJson = world as MapGeoJson;

const colos = [
  { iata: "SFO", city: "San Francisco", lat: 37.77, lon: -122.42, requests: 1200 },
  { iata: "LHR", city: "London", lat: 51.5, lon: -0.12, requests: 1500 },
];

const countries = [
  { country: "United States of America", requests: 4200 },
  { country: "Germany", requests: 3100 },
];

export default function Example() {
  return (
    <>
      <BubbleMap
        echarts={echarts}
        geoJson={geoJson}
        data={colos}
        lng="lon"
        lat="lat"
        name="city"
        value="requests"
      />

      <ChoroplethMap
        echarts={echarts}
        geoJson={geoJson}
        data={countries}
        name="country"
        value="requests"
      />
    </>
  );
}

示例

气泡地图

按经纬度绘制原始数据行。value 访问器用于控制气泡的相对大小。

<BubbleMap
  echarts={echarts}
  geoJson={geoJson}
  data={colos}
  lng="lon"
  lat="lat"
  name="city"
  value="requests"
  minRadius={8}
/>

分级设色地图

按数值对区域进行着色。数据行通过 name 与 GeoJSON 要素进行关联(与要素的 nameProperty 匹配,默认值为 "name")。

<ChoroplethMap
  echarts={echarts}
  geoJson={geoJson}
  data={countries}
  name="country"
  value="requests"
/>

Lark 可用性区域

无需 WebGL 即可绘制地理标记。带斜线的中性色陆地、透明海洋、在地平线处淡出的标记以及密集的地理辅助线,都呼应了 Lark 营销主页上的地球样式,同时让蓝色位置保持醒目。这些示意位置取自主要网络枢纽城市,并使用 IATA 代码;拖动地球或将其聚焦后,可用方向键查看隐藏半球上的点位。

Use the arrow keys to rotate the globe.
  • SFO: San Francisco
  • LAX: Los Angeles
  • SEA: Seattle
  • DFW: Dallas
  • ORD: Chicago
  • IAD: Ashburn
  • EWR: New York
  • GRU: São Paulo
  • EZE: Buenos Aires
  • LHR: London
  • AMS: Amsterdam
  • CDG: Paris
  • FRA: Frankfurt
  • MAD: Madrid
  • DXB: Dubai
  • LOS: Lagos
  • JNB: Johannesburg
  • BOM: Mumbai
  • SIN: Singapore
  • HKG: Hong Kong
  • NRT: Tokyo
  • ICN: Seoul
  • SYD: Sydney
<GlobeMap
  markers={cloudflareAvailabilityLocations}
  landColor="var(--text-color-lark-inactive)"
  landHatchSpacing={8}
  oceanColor="transparent"
  showGraticule
  markerColor="var(--color-lark-brand)"
  markerRadius={8}
  autoRotate
/>

自定义工具提示

当默认的名称/数值工具提示不够用时,请提供 tooltipFormatter。格式化函数返回的是由 ECharts 渲染的 HTML,因此请对用户提供的值进行转义。

<BubbleMap
  echarts={echarts}
  geoJson={geoJson}
  data={colos}
  lng="lon"
  lat="lat"
  name="city"
  value="requests"
  tooltipFormatter={(row) =>
    "<strong>" + row.city + "</strong><br />" + row.requests.toLocaleString()
  }
/>

API 参考

BubbleMap

属性类型默认值说明
echarts*typeof echarts-由使用方导入的 ECharts 核心实例(传入以便 tree-shaking)。需要 `MapChart`、`ScatterChart`、`TooltipComponent`,以及通过 `echarts.use([...])` 注册的渲染器。
geoJson*MapGeoJson-用作陆地区底图的 GeoJSON `FeatureCollection`。
mapNamestring-可选的、稳定的 ECharts 地图注册名。当同一份 GeoJSON 在多次挂载时被解析为新的对象实例时,请设置该属性,以复用同一个全局 ECharts 注册。
data*T[]-原始数据行。经纬度、数值和名称通过下面的访问器读取。
lng*MapAccessor<T, number>-经度访问器(`T` 的键名或 `(row) => number`)。
lat*MapAccessor<T, number>-纬度访问器(`T` 的键名或 `(row) => number`)。
value*MapAccessor<T, number>-数值访问器——用于决定气泡大小。
nameMapAccessor<T, string>-可选的名称访问器——默认工具提示会使用它。
minRadiusnumber-最小气泡半径,单位为 px。默认:`6`。
maxRadiusnumber-最大气泡半径,单位为 px。默认:`26`。
bubbleSize(value: number) => number-显式指定的气泡半径 `(value) => px`。会覆盖默认的 `minRadius`/`maxRadius` 缩放。
bubbleColorMapStyle<T, string>-气泡填充色——可以是固定值,也可以是 `(row) => color`。默认为图表蓝色。
bubbleBorderColorMapStyle<T, string>-气泡边框颜色——可以是固定值,也可以是 `(row) => color`。默认:`transparent`。
bubbleBorderWidthMapStyle<T, number>-气泡边框宽度——可以是固定值,也可以是 `(row) => px`。默认:`0`。
center[number, number]-地图中心,格式为 `[longitude, latitude]`。默认为自动适配。
zoomnumber-缩放级别——会乘以自动适配得到的缩放比例。默认:`1.25`。
roamboolean-启用拖拽平移和滚轮缩放。默认:`false`。
projectionMapProjection | null-地理投影。默认为限制纬度的墨卡托投影(扁平 2D 网页地图效果)。可传入其他 d3-geo 投影来覆盖,或传入 `null` 使用 ECharts 原生的等距圆柱投影绘图。请使用稳定的引用(模块级或经过 memo 缓存):每次渲染都创建新对象会重建视图,并重置已平移或缩放的地图。
showTooltipboolean-显示工具提示。默认:`true`。
valueFormat(value: number) => string-默认工具提示中数值的格式化方式。默认:`toLocaleString()`。
tooltipFormatter(row: T) => string-自定义某一行的工具提示内容。返回由 ECharts 自带工具提示渲染的 HTML 字符串。**谨慎使用**:返回值会作为 HTML 注入。请对任何用户提供的字符串进行转义,以避免 XSS。
aspectRationumber | string-容器宽高比,写作 `width / height`(例如 `1.7` 或 `"16 / 9"`)。高度由渲染后的宽度推导,使地图铺满画框而不留黑边。默认为显示窗口的投影宽高比,使陆地刚好铺满边缘。也可传入 `height` 来固定像素高度。
heightnumber-固定的图表高度,单位为像素。设置后覆盖 `aspectRatio`。留空则按宽高比计算尺寸(默认行为),使地图填满容器。
classNamestring--
isDarkModeboolean--

ChoroplethMap

属性类型默认值说明
echarts*typeof echarts-由使用方导入的 ECharts 核心实例(传入以便 tree-shaking)。需要 `MapChart`、`VisualMapComponent`、`TooltipComponent`,以及通过 `echarts.use([...])` 注册的渲染器。
geoJson*MapGeoJson-按数值着色的 GeoJSON `FeatureCollection`,其中的区域会被分级设色。
mapNamestring-可选的、稳定的 ECharts 地图注册名。当同一份 GeoJSON 在多次挂载时被解析为新的对象实例时,请设置该属性,以复用同一个全局 ECharts 注册。
data*T[]-原始数据行。区域键名和数值通过下面的访问器读取。
name*MapAccessor<T, string>-区域键访问器(`T` 的键名或 `(row) => string`)。每一行会与 `nameProperty` 等于该值的 GeoJSON 要素关联。
value*MapAccessor<T, number>-数值访问器——用于决定区域的填充色。
namePropertystring-用于关联的 GeoJSON 要素属性。默认:`"name"`。真实数据通常用 ISO 代码属性来匹配会更可靠(例如 `"iso_a2"`)。
colorRangestring[]-顺序色阶(由低到高)。默认为 Lark 分级设色地图的蓝色系,已调校为与无数据填充色明显区分。颜色分布在整条连续渐变上。
noDataColorstring-没有匹配数据行的区域所使用的填充色。默认为中性的陆地灰色。
showLegendboolean-显示 visualMap 颜色图例。默认:`false`。
showTooltipboolean-显示工具提示。默认:`true`。
valueFormat(value: number) => string-默认工具提示中数值的格式化方式。默认:`toLocaleString()`。
tooltipFormatter(row: T) => string-自定义某一行的工具提示内容。返回由 ECharts 自带工具提示渲染的 HTML 字符串。**谨慎使用**:返回值会作为 HTML 注入。请对任何用户提供的字符串进行转义,以避免 XSS。
center[number, number]-地图中心,格式为 `[longitude, latitude]`。默认为自动适配。
zoomnumber-缩放级别——会乘以自动适配得到的缩放比例。默认:`1.25`。
roamboolean-启用拖拽平移和滚轮缩放。默认:`false`。
projectionMapProjection | null-地理投影。默认为限制纬度的墨卡托投影(扁平 2D 网页地图效果)。可传入其他 d3-geo 投影来覆盖,或传入 `null` 使用 ECharts 原生的等距圆柱投影绘图。请使用稳定的引用(模块级或经过 memo 缓存):每次渲染都创建新对象会重建视图,并重置已平移或缩放的地图。
aspectRationumber | string-容器宽高比,写作 `width / height`(例如 `1.7` 或 `"16 / 9"`)。高度由渲染后的宽度推导,使地图铺满画框而不留黑边。默认为显示窗口的投影宽高比,使区域刚好铺满边缘。也可传入 `height` 来固定像素高度。
heightnumber-固定的图表高度,单位为像素。设置后覆盖 `aspectRatio`。留空则按宽高比计算尺寸(默认行为),使地图填满容器。
classNamestring--
isDarkModeboolean--

GlobeMap

属性类型默认值说明
landColorstring-斜线填充陆地的描边颜色。默认为 Lark 地图区域的中性色。
landHatchSpacingnumber-陆地斜线之间的间距,单位为 view-box 像素。默认:`10`。
oceanColorstring-陆地和经纬网底层的填充色。默认为 Lark 基础表面色。
markersGlobeMapMarker[]-绘制在陆地上方的地理点位。接近地平线的点位会淡出,背面的点位会被隐藏。
markerColorstring-标记的默认填充色。默认为 Lark 图表蓝色。
markerRadiusnumber-标记的默认半径,单位为 view-box 像素。默认:`7`。
defaultRotationnumber[]-地球的初始旋转,格式为 `[longitude, latitude, roll]`。
autoRotateboolean-让地球持续水平旋转。默认:`false`。
autoRotateSpeednumber-水平自动旋转速度,单位为度/秒。默认:`4`。
showGraticuleboolean-绘制经纬辅助线。默认:`false`。
showTooltipboolean-显示 Lark 样式的标记工具提示。默认:`true`。
heightnumber-固定的组件高度。否则地球会采用正方形宽高比。
classNamestring--
isDarkModeboolean--