分享
L7

L7 是由蚂蚁集团(Ant Group)的可视化团队开发的开源地理数据可视化引擎。它能够在浏览器中使用 GPU(WebGL)高效渲染海量地理数据,并为开发者提供可扩展、灵活的可视化层(Layers)及丰富的交互能力。 访问地址:https://l7.antv.antgroup.com/api/map/map (opens in a new tab)

核心特点包括:

  1. 多地图引擎支持:可与高德、Mapbox、Google Maps 等第三方地图底图集成,也可使用 L7 内置地图底图。
  2. 多层次可视化:点(Point)、线(Line)、面(Polygon)、热力(Heatmap)、Hexbin 等不同类型的 Layer,能够针对不同的数据类型进行可视化。
  3. 3D 场景:支持三维地形与倾斜摄影模型的可视化,实现更逼真的地理场景表达。
  4. 交互与动画:丰富的鼠标事件、交互效果和图形动画,为地理数据分析和展示提供了更多可能性。
  5. 拓展性强:L7 提供了丰富的 API 供开发者自定义图层样式、交互逻辑,从而满足复杂的业务需求。

一、官网效果演示

扫光城市效果

航向动画

模拟水面

丰富的基础控件

二、项目搭建

1. 安装

使用 npm 或 yarn 均可安装 L7 及其相关包:

# npm
npm install @antv/l7 @antv/l7-maps --save
 
# yarn
yarn add @antv/l7 @antv/l7-maps

其中:

  • @antv/l7 是核心包,提供核心渲染和数据可视化能力。
  • @antv/l7-maps 用于集成第三方地图底图,也可以使用 L7 提供的自定义底图。

2. 基本项目结构

本文将以一个简单的 HTML + JavaScript 方式介绍,以便快速演示。

项目目录如下:

.
├── index.html
└── main.js

index.html 中引入打包后的脚本,或者直接通过模块方式引用 map.js,结构示例:

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>L7 世界地图</title>
    <!-- 引入自定义样式 -->
    <link rel="stylesheet" href="./css/style.css" />
  </head>
  <body>
    <div id="map"></div>
 
    <!-- 使用 Vite 的模块导入方式 -->
    <script type="module" src="./js/map.js"></script>
  </body>
</html>

main.js 中的核心逻辑包括:

  1. 引用 L7 相关组件。
  2. 配置场景并将其绑定到 id="map" 的容器上。
  3. 等待场景加载完成后,添加栅格底图或第三方地图底图。
  4. 在场景就绪后,加载并可视化特定的地理数据(如点、线、面、热力等)。

3. 依赖引入

import { RasterLayer, PointLayer, Scene } from "@antv/l7";
import { Map, GaodeMap } from "@antv/l7-maps";

4. 初始化地图场景

初始化地图数据,因为天地图不需要 API Key,所以这里用天地图作为底图,官网的案例用的是高德地图。 Map 提供了一个基础地图背景。如果要自定义底图瓦片(如天地图、谷歌瓦片、高德瓦片等),可以通过 RasterLayer 来加载栅格瓦片服务。

// 创建地图场景
const scene = new Scene({
  id: "map", // 指定地图容器的 HTML 元素 ID
  map: new Map({
    style: "dark",
    center: [105.0, 35.0], // 设置地图中心点为中国的大致中心位置,经度105度,纬度35度
    zoom: 3, // 初始缩放级别,值越大显示的区域越详细
    minZoom: 3, // 最小缩放级别,防止用户过度缩小地图
    maxZoom: 18, // 最大缩放级别,防止用户过度放大地图
  }),
});
 
// 监听地图加载完成事件,添加底图图层
scene.on("loaded", () => {
  // 创建栅格图层作为地图底图
  const layer = new RasterLayer();
  // 设置图层数据源为高德地图的瓦片服务
  // 这里使用的是高德地图的免费瓦片服务,不需要 API Key
  // {1-3} 表示会随机使用 1、2、3 三个服务器以分散负载
  // {x}、{y}、{z} 是瓦片坐标和缩放级别的占位符,会在请求时被替换为实际值
  layer.source("https://webrd0{1-3}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}", {
    parser: {
      type: "rasterTile", // 指定数据类型为栅格瓦片
      tileSize: 256, // 瓦片大小,标准为 256x256 像素
      minZoom: 2, // 瓦片服务支持的最小缩放级别
      maxZoom: 18, // 瓦片服务支持的最大缩放级别
    },
  });
  // 将底图图层添加到场景中
  scene.addLayer(layer);
});

5. 添加数据图层(以 PointLayer 气泡图为例)

接下来,需要将外部数据(如 GeoJSON、CSV、PostGIS 等)通过 PointLayer、LineLayer、PolygonLayer 等进行可视化。示例中,从远程获取一份 GeoJSON 格式数据,将 capacity 作为可视化映射字段,并以圆形气泡的方式呈现出来。

// 监听地图场景加载完成事件,添加数据图层
// 注意:这里有两个 loaded 事件监听器,第一个用于添加底图,第二个用于添加数据点
scene.on("loaded", () => {
  // 从远程服务器获取 GeoJSON 格式的地理数据
  // 这里使用 fetch API 进行网络请求
  fetch("https://gw.alipayobjects.com/os/basement_prod/337ddbb7-aa3f-4679-ab60-d64359241955.json")
    .then((res) => res.json()) // 将响应转换为 JSON 格式
    .then((data) => {
      // 过滤数据,只保留 capacity 属性大于 800 的特征点
      // 这里的 capacity 可能表示城市人口、景点容量等数值
      data.features = data.features.filter((item) => {
        return item.properties.capacity > 800;
      });
 
      // 创建一个点图层用于展示数据
      const pointLayer = new PointLayer({})
        .source(data) // 设置数据源,使用上面获取并过滤后的 GeoJSON 数据
        .shape("circle") // 设置点的形状为圆形,L7 还支持其他形状如 square(方形)、triangle(三角形)等
        .size("capacity", [0, 16]) // 根据 capacity 属性值映射点的大小,范围从 0 到 16 像素
        .color("capacity", [
          // 根据 capacity 属性值映射点的颜色,使用渐变色
          "#FF5733", // 橙红色
          "#FF7F50", // 珊瑚色
          "#FFA07A", // 浅鲑鱼色
          "#FFBF00", // 琥珀色
          "#FFD700", // 金色
          "#FFFF00", // 黄色
        ])
        .active(true) // 启用交互功能,鼠标悬停或点击时会有反馈
        .style({
          opacity: 0.8, // 增加不透明度,使气泡在地图上更加醒目
          strokeWidth: 1, // 添加细边框,增强可见性
        });
 
      // 将创建好的点图层添加到地图场景中进行显示
      scene.addLayer(pointLayer);
    });
});
  • shape("circle"):指定点形状为圆;可选值如 “square”、“triangle”等。
  • size("capacity", [minSize, maxSize]):数值映射到点大小。
  • color("capacity", [渐变色数组]):数值映射到颜色梯度。
  • active(true):开启鼠标悬停或点击的交互。
  • style({...}):配置点的不透明度、描边等样式。

运气项目后,就可以看到如下的地图效果了。

三、总结

L7 提供了开箱即用的地图可视化能力,与前端常见框架(React、Vue 等)结合非常灵活。如果仅需绘制常规的二维数据、2.5D 效果或轻量级 3D 场景,L7 往往能带来更高效的开发体验,相比基于 Three.js 或 Cesium 更轻量、易用。

Cesium、Three.js 更偏向 3D 场景和高精度三维地形渲染,而 L7 则在二维、2.5D 和基础 3D 场景渲染上更加高效且简单,尤其是与地理数据处理、交互等结合时非常便捷。

如果你有以下需求场景,L7 通常是更好的选择:

  • 想快速搭建二维/2.5D 地图可视化项目,内置常见图层类型(点、线、面、热力等)
  • 对倾斜摄影或简单 3D 场景有需求,但无需超复杂的交互或大规模三维模型加载
  • 需要丰富的地图交互,快速做分析、展示场景