首页/新闻资讯/正文详情

OpenLayers 3.1.0 发布详解:WebGL 点渲染、UTFGrid 交互与样式体系全面升级

发布时间:2026/9/24 4:54:44 来源:云帆数科 栏目:资讯中心
OpenLayers 3.1.0 发布详解:WebGL 点渲染、UTFGrid 交互与样式体系全面升级
前端GIS数据可视化【免费下载链接】openlayersOpenLayers项目地址https://gitcode.com/gh_mirrors/op/openlayers点击查看免费下载导读本文基于 OpenLayers 官方发布说明 changelog/v3.1.0.md系统梳理 3.1.0 版本在 WebGL 渲染、UTFGrid 交互、样式系统与工程化构建四个方向的核心变化并逐一解读官方升级注意事项。全文结合当前仓库源码src/ol/与examples/给出可对照的实现证据与示例帮助从 3.0.x 升级的开发者快速掌握新 API 的用法、底层原理与迁移要点。版本概览214 个合并 PR 带来的能力跃升3.1.0 是 OpenLayers 3 系列的首个次版本自 3.0.0 起共合并 214 个 Pull Request是当时规模最大的一次功能迭代。官方发布说明 changelog/v3.1.0.md 将本版本的核心看点归纳为以下几点WebGL 渲染器开始支持点要素point渲染矢量点图层从此可以借助 GPU 管线获得更高性能的绘制路径对应源码实现见 src/ol/renderer/webgl/PointsLayer.js。UTFGrid 交互支持可以通过 UTFGrid 编码的瓦片数据实现要素的拾取与交互如鼠标悬停显示国家/地区信息对应实现见 src/ol/source/UTFGrid.js 与完整示例 examples/utfgrid.js。样式可指定替代几何alternate geometries进行渲染一个要素的样式可以不使用要素自身的几何而改用其他几何或几何函数对应实现见 src/ol/style/Style.js。支持模块加载器加载库构建编译产物支持 UMD 格式可被 Browserify、RequireJS 等模块加载器直接引用。点要素符号化能力扩展星形、方形、十九边形enneadecagon乃至任意正多边形/类正多边形均可作为点符号核心实现为ol.style.RegularShape见 src/ol/style/RegularShape.js。升级指南四个必须关注的 API 变化3.1.0 与 3.0.0 保持 API 向后兼容常规升级无痛但官方在升级说明中特别列出了以下四个需要留意的行为变化1.ol.source.ImageStatic不再强制要求imageSize如果你使用静态图片图层源ol.source.ImageStatic且不需要对图片做特殊缩放则不再需要提供imageSize选项。图片的实际尺寸会在加载完成后自动确定并据此计算分辨率避免手动声明尺寸与实际像素不符带来的变形问题。从当前源码看这一设计被完整保留并进一步演化src/ol/source/static.js 中的createLoader在图片加载完成后用extent的宽高除以图片真实像素宽高来推导分辨率const resolutionX getWidth(extent) / image.width; const resolutionY getHeight(extent) / image.height; const resolution resolutionX ! resolutionY ? [resolutionX, resolutionY] : resolutionY; return {image, extent, resolution, pixelRatio: 1};也就是说现代版本的ol.source.ImageStatic见 src/ol/source/ImageStatic.js只需提供url与imageExtent图片在地图坐标系中的[left, bottom, right, top]范围即可正确渲染当 x、y 两个方向分辨率不同时还会返回非均匀分辨率数组形式以精确对应图片像素。2. 事件解绑改为ol.Observable.unByKey(key)此前需要在对象实例上调用obj.unByKey(key)解除事件监听3.1.0 起推荐也支持直接调用静态方法ol.Observable.unByKey(key)。key由on()/once()返回用于唯一标识一个监听器。当前源码中该方法位于 src/ol/Observable.js 第 185 行附近作为模块级导出函数存在并且支持传入单个 key 或 key 数组数组场景对应on()以事件类型数组注册的情况export function unByKey(key) { if (Array.isArray(key)) { for (let i 0, ii key.length; i ii; i) { unlistenByKey(key[i]); } } else { unlistenByKey(/** type {import(./events.js).EventsKey} */ (key)); } }典型用法const key map.on(moveend, onMoveEnd); // ... 之后解除监听 ol.Observable.unByKey(key); // 或等效地map.unByKey(key)3.format.writeFeatures(features)对全部要素格式统一返回字符串在 3.1.0 之前部分要素格式的writeFeatures(features)返回的是文档节点DOM 节点而非字符串官方认为这属于缺陷并予以修正。3.1.0 起所有要素格式的writeFeatures(features)方法一律返回字符串如需 DOM 节点应使用对应的 Node 版本方法。当前源码中文本型格式的基类 src/ol/format/TextFeature.js 已明确将返回值类型标注为string/** * Encode an array of features as string. * param {Arrayimport(../Feature.js).default} features Features. * param {import(./Feature.js).WriteOptions} [options] Write options. * return {string} Encoded features. * api */ writeFeatures(features, options) { return this.writeFeaturesText(features, this.adaptOptions(options)); }因此升级后若你的代码依赖旧行为如直接对返回值调用 DOM API需要改用writeFeaturesNode()之类的方法或先把返回的字符串交给解析器处理。4.dispatchChangeEvent()更名为changed()对象主动派发变更事件的方法由obj.dispatchChangeEvent()改拼为obj.changed()。官方提示该方法仍属不稳定 API但其语义与实现延续至今changed()会递增对象的修订号revision并派发change事件见 src/ol/Observable.js 第 72 行附近/** * Increases the revision counter and dispatches a change event. * api */ changed() { this.revision_; this.dispatchEvent(EventType.CHANGE); }一个典型的应用场景是修改样式如RegularShape的填充色后主动调用图层的changed()触发重绘示例见 examples/regularshape.js 中的颜色切换逻辑document.getElementById(color-changer).addEventListener(click, function () { styles.square .getImage() .setFill(new Fill({color: colors[currentColor % colors.length]})); vectorLayer.changed(); currentColor; });新特性深挖四个方向的核心能力WebGL 渲染器支持点要素渲染3.1.0 之前 WebGL 渲染器主要面向图层级绘制本版本通过 src/ol/renderer/webgl/PointsLayer.js 等实现引入了点要素的 GPU 渲染路径为海量点数据的流畅绘制奠定了基础。在 3.1.0 时代这通常配合ol.layer.Vector的 WebGL 渲染模式使用如今仓库中的 WebGL 相关实现已进一步扩展见 src/ol/renderer/webgl/VectorLayer.js但在现代示例中仍有大量 WebGL 点图层用法如 examples/webgl-points-layer.js其数据路径可追溯到本版本的这一初始支持。UTFGrid轻量级瓦片交互数据UTFGrid 是一种将交互数据编码进瓦片网格的机制每个瓦片附带一份字符网格grid、一份键表keys与可选的属性数据data通过字符编码压缩体积配合底图实现点击/悬停即可查询要素属性的交互体验无需请求矢量要素服务。当前实现 src/ol/source/UTFGrid.js 中的数据类型定义如下/** * typedef {Object} UTFGridJSON * property {Arraystring} grid The grid. * property {Arraystring} keys The keys. * property {Objectstring, Object} [data] Optional data. */构造选项Options包括选项默认值说明preemptivetrue是否按瓦片可见性提前加载。为true时响应更快但流量更大若设为false懒加载必须给forDataAtCoordinateAndResolution传true作为request参数否则永远不会有数据被加载jsonpfalse是否通过 JSONP 回调加载 TileJSON适用于服务端不支持 CORS 的场景tileJSON—直接提供 TileJSON 配置对象与url二选一url—提供 TileJSON 配置的端点与tileJSON二选一wrapXtrue是否在水平方向环绕世界zDirection0当分辨率落在整数层级之间时选择更高或更低 zoom 层级瓦片的策略源码中两者都不提供时直接抛错src/ol/source/UTFGrid.js第 335 行附近throw new Error(Either url or tileJSON options must be provided);核心查询 API为forDataAtCoordinateAndResolution(coordinate, resolution, callback, request)其内部流程是用当前分辨率确定 zoom 层级 → 取对应瓦片坐标 → 必要时触发瓦片加载 → 调用tile.forDataAtCoordinate(coordinate, callback, request)同步或异步回调坐标处的数据。字符解码采用 UTFGrid 标准编码code 93与code 35两档偏移修正后减 32。完整可运行示例见 examples/utfgrid.js底图与交互网格使用同一个 Mapbox 地理分类数据源pointermove时调用forDataAtCoordinateAndResolution查询所在国家命中后展示国旗与国名const gridSource new UTFGrid({ url: https://api.tiles.mapbox.com/v4/mapbox.geography-class.json?secureaccess_token key, }); // ... const displayCountryInfo function (coordinate) { const viewResolution /** type {number} */ (view.getResolution()); gridSource.forDataAtCoordinateAndResolution(coordinate, viewResolution, function (data) { mapElement.style.cursor data ? pointer : ; if (data) { flagElement.src data:image/png;base64, data[flag_png]; nameElement.innerHTML data[admin]; } infoOverlay.setPosition(data ? coordinate : undefined); }); }; map.on(pointermove, function (evt) { if (evt.dragging) return; displayCountryInfo(map.getEventCoordinate(evt.originalEvent)); });示例中还通过gridSource.getTemplate()对应源码第 375 行附近的getTemplate()方法说明了如何结合 Mustache 模板渲染 TileJSON 中的template字段。样式系统替代几何与 RegularShape 符号化样式覆盖要素几何alternate geometry3.1.0 允许样式在渲染时使用替代几何——既可以是另一个Geometry对象也可以是要素上的某个属性名或一个接收 feature 并返回几何的函数。当前 src/ol/style/Style.js 中的setGeometry()第 404 行附近完整实现了这三种形态setGeometry(geometry) { if (typeof geometry function) { this.geometryFunction_ geometry; } else if (typeof geometry string) { this.geometryFunction_ function (feature) { // 从 feature.get(geometry) 取几何 }; } else if (!geometry) { this.geometryFunction_ defaultGeometryFunction; } else if (geometry ! undefined) { this.geometryFunction_ function () { return geometry; // 固定的几何对象 }; } this.geometry_ geometry; }由此衍生出很多实用技巧例如用ol.geom.Polygon.fromExtent(extent)见 src/ol/geom/Polygon.js 第 452 行附近把范围快速构造成多边形再配合样式几何函数实现框选高亮等效果。RegularShape星形、方形与任意正多边形ol.style.RegularShape是本版本点符号化的核心。其选项Options见 src/ol/style/RegularShape.js如下选项类型说明pointsnumber多边形边数对星形来说为角数星形实际顶点数为points * 2radiusnumber多边形/星形外接半径radius2number第二个半径。只有同时提供radius与radius2时才会生成星形否则生成正多边形anglenumber起始角弧度默认0时形状的一个顶点朝上rotationnumber整体旋转弧度顺时针为正默认0rotateWithViewboolean是否随视图旋转默认falsescalenumber \| Size缩放默认1若只需一维缩放优先调整radius/radius2displacementArraynumber像素位移[x, y]正值向右、向上默认[0, 0]fillFill填充样式strokeStroke描边样式在生成路径的createPath_()第 617 行附近中可以看到星形的绘制原理——当radius2存在时顶点数翻倍并按奇偶交替使用外半径与内半径const radius2 this.radius2_ undefined ? radius : this.radius2_; if (this.radius2_ ! undefined) { points * 2; } const startAngle this.angle_ - Math.PI / 2; const step (2 * Math.PI) / points; for (let i 0; i points; i) { const angle0 startAngle i * step; const radiusC i % 2 0 ? radius : radius2; context.lineTo(radiusC * Math.cos(angle0), radiusC * Math.sin(angle0)); }配套示例 examples/regularshape.js 给出了非常直观的用法合集points: 4加angle: Math.PI / 4得到旋转 45° 的方形radius与radius2同时提供得到五角星points: 5, radius: 10, radius2: 4radius2: 0配合points: 4得到十字形用scale: [1, 0.5]可将正方形压成矩形多个RegularShape放在一个Style[]中配合displacement可实现堆叠符号。示例中points: Infinity的特殊写法源码第 620 行if (points Infinity) context.arc(...)还可以直接绘制圆形。此外3.1.0 为RegularShape补充了getPoints()、getRadius()、getRadius2()、getAngle()等公开 getter见 src/ol/style/RegularShape.js 第 312、321、343 行附近并支持setRadius2()等 setter——修改后内部会自动调用render()重绘形状画布。工程化UMD 构建与模块加载器兼容3.1.0 引入对 UMDUniversal Module Definition构建产物的支持编译后的库既可作为全局脚本直接引入也可被 Browserify、RequireJS 等 CommonJS/AMD 模块加载器require。这一能力与闭包编译器构建任务如config/jsdoc之外的构建脚本配合为后续 npm 发布与模块化使用铺平了道路。其他值得关注的改进除上述核心能力外214 个 PR 中还包含一批对日常开发影响较大的改动ol.layer.Vector新增renderBuffer选项为矢量图层渲染预留缓冲区缓解要素在视图边缘被裁剪的问题。ol.geom.Polygon.fromExtent(extent)从范围直接构造多边形src/ol/geom/Polygon.js 第 452 行附近空范围会抛出Cannot create polygon from empty extent。OverviewMap 控件新增鹰眼图控件。GetFeatureInfo 格式新增ol.format.GetFeatureInfo便于与 WMS GetFeatureInfo 响应对接。交互可激活/停用active成为ol.Object属性交互支持程序化激活与停用Select交互支持自定义mousemove条件函数Draw支持程序化结束绘制。事件与 API 清理updatefeature事件更名为changefeatureol.Feature#setStyle接受null属性变更事件携带旧值移除beforepropertychange事件。数据源细节TileJSON 源新增wrapXBingMaps 新增maxZoomXYZ 源支持自定义tileSizeWMTS 的requestEncoding允许直接传字符串矢量源clear()性能优化、addFeatures使用批量插入。GML 格式增加版本化解析GML2/GML3 分离、科学计数法坐标支持以及仅 boundedBy要素的容错解析。DOM 渲染器矢量渲染矢量要素可在 DOM 渲染器下绘制为不支持 Canvas 的旧环境提供兜底路径。迁移建议与兼容性小结3.1.0 相对 3.0.0保持 API 向后兼容常规升级无需改动代码仅四个点需要留意ImageStatic的imageSize变为可选、推荐使用ol.Observable.unByKey、writeFeatures统一返回字符串、dispatchChangeEvent更名为changed。升级后建议优先验证三类场景静态图片图层分辨率计算方式变化、要素格式导出返回值类型变化、样式动态更新依赖changed()触发重绘。本文所涉特性的现代实现均可直接在当前仓库中查看UTFGrid 见 src/ol/source/UTFGrid.js、RegularShape 见 src/ol/style/RegularShape.js、样式几何覆盖见 src/ol/style/Style.js、静态图片源见 src/ol/source/ImageStatic.js配套示例见 examples/utfgrid.js 与 examples/regularshape.js。完整变更条目清单可翻阅仓库 changelog 目录下的历史发布说明如 changelog/v3.0.0.md、changelog/v3.1.0.md以及 changelog/upgrade-notes.md 中的跨版本升级要点。赞分享前端GIS数据可视化【免费下载链接】openlayersOpenLayers项目地址https://gitcode.com/gh_mirrors/op/openlayers点击查看免费下载相关推荐OpenLayers 8.2.0 版本解读WebGL 图案填充、RenderFeature 矢量渲染与样式表达式体系全面升级OpenLayers 8.2.0 版本解读WebGL 图案填充、RenderFeature 矢量渲染与样式表达式体系全面升级 本指南基于 OpenLayers前端GIS数据可视化OpenLayers 6.12.0 发布解析WebGL 渲染增强、Modify 交互修复与渲染稳定性改进OpenLayers 6.12.0 发布解析WebGL 渲染增强、Modify 交互修复与渲染稳定性改进 导读 OpenLayers 6.12.0 是 6.x前端GIS数据可视化OpenLayers WebGL三维地图渲染实战从平面到立体的视觉升级OpenLayers WebGL三维地图渲染实战从平面到立体的视觉升级 你是否曾经对着平面地图想象城市的立体轮廓是否希望在网页上展示具有真实感的三维地形效果前端GIS数据可视化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

STP模型查看器 — 图灵ECAD
STP模型查看器 — 图灵ECAD

一、效果预览二、功能简介模型查看器,图灵ECAD 系列的第一个工具。▍STP 导入导出拖进来就能看,改完还能导出,轻量格式双向通行。▍三维视图,指哪看哪平移、旋转、缩放顺手;上、下、左、右、前、后、轴测,七… · 2026/9/24 4:54:44

codeburn 接入 Zerostack:基于累计 Token 总量的 Rust 编码 Agent 用量解析实现
codeburn 接入 Zerostack:基于累计 Token 总量的 Rust 编码 Agent 用量解析实现

【免费下载链接】codeburn Free, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn 项目地址: https://gitcode.com/gh_mirrors/co/cod… · 2026/9/24 4:54:38

LangChain第六节-模型工具调用(了解)
LangChain第六节-模型工具调用(了解)

工具调用在后面学习智能体的时候会重点讲到,现在只做了解即可 大模型工具调用(Tool Calling)可以扩展模型能力,使模型突破纯文本生成的限制,与外部系统和功能进行交互。 在 LangChain 框架中,这一功能也被称… · 2026/9/24 4:54:38

Jev :Agent 又慢又贵的根因,是决策环节的冗余调用?
Jev :Agent 又慢又贵的根因,是决策环节的冗余调用?

Agent 每走一步都在做判断:这条消息紧急吗、这个工单转给哪个部门、这条命令该直接执行还是先问人。这些题的答案就是个结构化结论——是/否、A 还是 B——模型根本不需要写一段话来推理。 Agent每做一次判断,就得把整段上下文喂给大模型、等它生成一整段… · 2026/9/24 5:30:56

ENSP校园网组网实战:从VLAN规划到静态路由的完整配置指南
ENSP校园网组网实战:从VLAN规划到静态路由的完整配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:30:32

ESP32-C3小彩屏翻页时钟:从硬件选型到动画实现
ESP32-C3小彩屏翻页时钟:从硬件选型到动画实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:30:26

MemOS 参数记忆(Parametric Memory)全解析:Memory³ 架构中的隐式知识载体与 LoRA 能力模块设计
MemOS 参数记忆(Parametric Memory)全解析:Memory³ 架构中的隐式知识载体与 LoRA 能力模块设计

人工智能大模型Agent 记忆AI AgentRAG知识图谱dsh-plugin 【免费下载链接】MemOS Self-evolving memory OS for LLM & AI Agents: ultra-persistent memory, hybrid-retrieval, and cross-task skill reuse, with 35.24% token savings and DeepSeek Harness support. 项目… · 2026/9/24 5:30:20

20MB Rust数据库工具dbx:83种数据库协议原生支持
20MB Rust数据库工具dbx:83种数据库协议原生支持

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:30:07

226.Fastboot/ADB/EDL/BROM 四大协议机制与适用场景精讲
226.Fastboot/ADB/EDL/BROM 四大协议机制与适用场景精讲

摘要 本文面向具备一定计算机基础的开发者与维修工程师,系统性地阐述安卓手机刷机与维修的底层原理。文章从安卓分区表结构、Bootloader引导流程、Fastboot与Recovery协议等核心机制出发,结合高通与联发科两大平台的实战案例,提供完整的ADB/Fastboot脚本与Python自动化工具… · 2026/9/24 5:29:55

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码