OpenLayers 实现网格色斑图:WebGL 叠加层方案

气象、环境类业务里常见一种数据:规则经纬度网格(每个格点一个数值)。要在地图上画成色斑图,还要可选网格线、格点数值、鼠标取值------用 OpenLayers 自己从零写 WebGL 图层成本不低。

我开源了一个小库 grid-webgl-openlayers,思路很简单:不替你创建 Map,只往现有 ol/Map 上叠加图层

示例效果图

js 复制代码
ol/Map<br/>底图 + View + 控件
    └── grid-webgl-openlayers 叠加
        ├── ChoroplethLayer   WebGL 色斑图
        └── GridValueLayer    Canvas2D 格点数值

底图、投影、控件仍由业务方管理;库只负责 addLayer。

数据格式

JSON 描述一块矩形网格即可

json 复制代码
{
  "startLat": 26,
  "endLat": 34.45,
  "startLon": 97.25,
  "endLon": 108.65,
  "latStep": 0.05,
  "lonStep": 0.05,
  "latCount": 170,
  "lonCount": 229,
  "ds": [[8.37, 9, 9.72], [7.12, 8.01]]
}
  • ds[row][col]:从南往北、从西往东
  • -9999 表示无数据,不参与渲染和拾取

最小示例

js 复制代码
npm install grid-webgl-openlayers ol
js 复制代码
import Map from "ol/Map"
import View from "ol/View"
import TileLayer from "ol/layer/Tile"
import OSM from "ol/source/OSM"
import { GridMapView } from "grid-webgl-openlayers"
import "ol/ol.css"

const map = new Map({
  target: "map",
  view: new View({ projection: "EPSG:4326", center: [105, 30], zoom: 6 }),
  layers: [new TileLayer({ source: new OSM() })],
})

const overlay = await GridMapView.create({
  map,
  dataUrl: "/data/arrayData.json",
  showChoropleth: true,  // 色斑图
  showGrid: false,         // 网格线
  showLabels: true,        // 格点数值
})

// 鼠标悬停取值
overlay.onPointerMove(({ value, lon, lat }) => {
  if (value != null) console.log(value, lon, lat)
})

几行代码就能在 OSM 底图上叠色斑图。

自定义图例(模式分为色带色块)

支持不规则数值-颜色映射:

js 复制代码
const colorRamp = [
  [-9999, [0, 0, 0, 0]],              // 无数据透明
  [0,     [232, 245, 233, 255]],
  [7.5,   [129, 199, 132, 255]],
  [47.6,  [27, 94, 32, 255]],
  [9999,  [0, 0, 0, 0]],
]

await GridMapView.create({ map, dataUrl, colorRamp })

实现要点

  1. WebGL 色斑:ImageCanvas 自定义图层 + Fragment Shader 按经纬度采样格点值,再查 1D 色带纹理上色。
  2. LOD 降采样:缩放级别低时合并格点,避免百万格点拖慢帧率。
  3. 格点标注:Canvas2D 按像素间距稀疏绘制,避免文字堆叠。
  4. 图例面板:双滑块过滤显示数值区间,setDisplayRange(min, max) 即可。

Vue 3 也有组件:GredGridMap、GredLegendPanel。

在线预览

小结

若你已有 OpenLayers 地图,只需加载规则网格 JSON,用 GridMapView.create() 叠加 WebGL 色斑图和格点标注,比从零写 Shader 省事很多。欢迎 Star 和 Issue。

相关推荐
supermapsupport6 天前
SuperMap iClient3D for WebGL 交互式栅格信息查询
webgl·supermap
八荒启·交互动画8 天前
# Web特效020—让 Web 特效真正动起来:时间循环应该怎么接
前端·webgl·网页特效·八荒启-交互动画·八荒启
八荒启·交互动画8 天前
Web特效019-Web特效的定义与边界核心算法手写一遍:先跑起来,再谈高级效果
前端·webgl·网页特效·八荒启-交互动画·八荒启
八荒启·交互动画9 天前
Web特效011—Web特效的定义与边界为什么忽快忽慢:时间、频率与采样的秘密
webgl·网页特效·八荒启-交互动画·八荒启·web特效
八荒启·交互动画9 天前
Web特效008—一个 `getContext(‘webgl‘)`,浏览器到底交出了什么?
webgl·八荒启-交互动画
xhload3d10 天前
图扑智慧工厂 | 继电器产线仿真态势管控平台
物联网·低代码·webgl·数字孪生·可视化·智慧工厂·工业互联网·hightopo
新的瑞拉公主14 天前
Unity游戏发布微信小游戏:从构建到提审
unity·webgl·微信小游戏·开放数据域
慧都小妮子15 天前
实时大屏掉帧排查:WebGL 图表库选型的 5 项可实测检查
webgl·scichart.js·实时大屏掉帧·前端图表选型
❀͜͡傀儡师15 天前
移动端 360° 商品展示方案:从 20MB 雪碧图到 800KB 丝滑视频
ffmpeg·webgl·sprite
平行云16 天前
国产GPU云渲染适配实战:驱动兼容、编码调优与多路并发
unity·ue5·webrtc·webgl·实时云渲染·云桌面·像素流送