Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • 技术文档

  • 算法

  • 工作总结

    • 时区校正
    • 上传下载文件方式总结
    • web异常监控和分析
    • 前端优化指南
    • http缓存机制
    • 静态资源灰度发布
    • 浏览器原理及渲染机制
    • Chrome DevTools 渲染分析实战
    • Layout Thrashing(布局抖动)
    • Composite Layer(合成层)
    • 全局设置滚动条样式好吗?
    • 虚拟列表如何避免Layout和Paint
    • 前端安全知识
    • 安全(同源策略 / CSP / CORS)
    • 浏览器安全模型
    • 从chrome v8 讲安全
    • WebAssembly(Wasm)
    • XSS → JIT → 沙箱逃逸
    • 微前端总结
    • websocket聊天
    • Uni-app基础知识
    • react16高级特性
    • react16基础知识总结
    • vue2常见原理总结
    • vue2基础知识总结
    • webpack优化实践
    • webpack基础应用知识总结
    • Agent Skills是什么?跟MCP Workflow Command Prompt的关系。
    • 从cnn到transformer全解大模型
    • 什么是 Encoder 和 Decoder 结构
    • GPT 为什么能“看懂”问题
    • GPT 是怎么学会数学的
    • GIS 基础三件套
    • GIS必会知识点
    • 100 万点地图怎么渲染?
      • 一、最基础方案:WebGL 渲染
      • 二、第二层优化:空间分层(LOD)
      • 三、第三层优化:Vector Tile(核心)
      • 四、第四层优化:点位聚合(Cluster)
      • 五、第五层优化:数据分块加载
      • 六、第六层优化:GPU Instancing
      • 七、真实生产架构(标准答案)
      • 八、标准答案
      • 九、如果继续深挖(高级)
        • 1 Mapbox GL 为什么快?
        • 2 GeoJSON 为什么慢?
        • 3 deck.gl 为什么能支持百万点?
    • GIS空间索引的实现
    • Cesium 从入门到精通:实战指南
    • OpenLayers 从零到精通:2025-2026实战指南
    • Mapbox GL JS 从零到精通:2025-2026实战指南
    • Cesium、OpenLayers 和 Mapbox GL JS 的关系、区别
    • 容器领域必学的黄金组合
    • 小程序笔记
    • 小程序工程模板设计
    • 地图标绘--射线法来计算点在多边形内
  • 实用技巧

  • 收藏夹

  • 技术
  • 工作总结
mamingjuan
2026-03-06
目录

100 万点地图怎么渲染?

其实想考你三件事:

渲染技术
数据分层
性能架构
1
2
3

# 一、最基础方案:WebGL 渲染

如果用普通 DOM / SVG / Canvas:

100 万节点 = 浏览器直接崩
1

所以必须用 GPU 渲染。

常见库:

  • Mapbox GL JS
  • deck.gl

它们本质是:

WebGL → GPU 并行绘制
1

渲染流程:

数据 → Buffer → GPU → Shader → 渲染
1

GPU 可以一次绘制 几十万 ~ 几百万点。

例如:

deck.gl ScatterplotLayer
1

支持:

百万级点位
1

# 二、第二层优化:空间分层(LOD)

100 万点 没必要全部画。

地图通常采用:

LOD (Level Of Detail)
1

不同 zoom 层级加载不同数据。

例如:

zoom 数据
5 城市级
8 区县
12 POI
16 单点

也就是:

远 → 少
近 → 多
1
2

# 三、第三层优化:Vector Tile(核心)

真正的生产系统不会直接加载 100 万 GeoJSON。

而是:

Vector Tile
1

原理:

地图切成瓦片
1
z/x/y
1

每个 tile 只加载 当前屏幕数据。

例如:

屏幕最多 20 个 tile
1

每个 tile:

2000 点
1

最终:

20 * 2000 = 40000
1

而不是:

1000000
1

这就是互联网地图核心架构。

VectorTile 技术:

  • Mapbox
  • OpenLayers

# 四、第四层优化:点位聚合(Cluster)

当 zoom 很小的时候:

一个城市可能有 50000 点
1

用户根本看不清。

所以需要:

Cluster
1

例如:

5000点 → 1个圆
1

显示:

5000
1

放大后:

5000 → 20 cluster
1

再放大:

cluster → 单点
1

很多库内置:

  • Mapbox GL JS
  • deck.gl

# 五、第五层优化:数据分块加载

不要:

一次返回 100 万
1

应该:

分页 + tile
1

后端通常:

PostGIS
1

按 bbox 查询:

SELECT * 
FROM points
WHERE ST_Intersects(...)
1
2
3

# 六、第六层优化:GPU Instancing

百万点最强优化是:

Instanced Rendering
1

原理:

一次 draw call
渲染 N 个实例
1
2

而不是:

draw → 1000000 次
1

很多库内部已经实现:

  • deck.gl

# 七、真实生产架构(标准答案)

一个 百万点地图系统架构:

数据层
   ↓
PostGIS
   ↓
Tile Server
   ↓
VectorTile
   ↓
MapboxGL / deck.gl
   ↓
WebGL GPU 渲染
1
2
3
4
5
6
7
8
9
10
11

优化策略:

VectorTile
LOD
Cluster
Instancing
1
2
3
4

# 八、标准答案

如果需要在地图上渲染 100 万点位,我通常会从三个层面优化:

第一是渲染层,使用 WebGL 方案,比如 Mapbox GL 或 deck.gl,让 GPU 批量渲染点位,而不是 DOM 或 Canvas。

第二是数据层,通过 VectorTile 按地图瓦片加载数据,避免一次加载全部数据。屏幕通常只会显示几十个 tile,每个 tile 只包含几千个点。

第三是可视化优化,比如在低 zoom 层级使用 cluster 聚合点位,在高 zoom 层级再展示真实点。

同时 WebGL 层会使用 instanced rendering 减少 draw call,从而支持百万级点位流畅渲染。


# 九、如果继续深挖(高级)

可能会问:

# 1 Mapbox GL 为什么快?

答案:

VectorTile + WebGL
1

# 2 GeoJSON 为什么慢?

因为:

一次加载全部
1

# 3 deck.gl 为什么能支持百万点?

因为:

GPU Instancing
1
上次更新: 2026/03/06, 03:40:06
GIS必会知识点
GIS空间索引的实现

← GIS必会知识点 GIS空间索引的实现→

Copyright © 2015-2026 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式