OpenLayers v3.6.0 升级指南:Draw 绘制交互与 tilegrid 瓦片坐标体系重构详解
前端GIS数据可视化【免费下载链接】openlayersOpenLayers项目地址https://gitcode.com/gh_mirrors/op/openlayers点击查看免费下载本篇文章以 OpenLayers 官方 v3.6.0 变更日志 为主体系统解读该版本对实验性experimental特性的一轮整理ol.interaction.Draw的配置项与事件类型重命名、ol.tilegrid的 XYZ 工厂函数化与瓦片坐标变换规则调整以及ol.source.TileWMS的wrapX行为变更。读完本文你将清楚掌握 v3.5.0 升级到 v3.6.0 时需要修改的每一处代码并能结合当前仓库源码理解这些 API 背后的设计意图与延续至今的实现形态。版本概览40 个 PR 与一次实验特性整理根据官方变更日志v3.6.0 自 v3.5.0 以来共合入40 个 pull request涵盖新特性、缺陷修复与文档改进。该版本的核心动作是对若干实验性功能进行代码库简化因此官方在 Summary 中明确提醒请务必跟随升级说明upgrade notes调整应用代码以保证与最新版本兼容。这轮变更主要集中两大区域ol.interaction.Draw绘制交互配置项minPointsPerRing重命名、事件类型命名空间调整ol.tilegrid瓦片网格体系XYZ构造器替换为静态工厂函数、瓦片坐标变换公式变更、widths选项移除、TileWMS 的wrapX默认值修正。这两部分内容在仓库的 changelog/upgrade-notes.md 中有完全对应的历史升级章节可作为交叉验证的权威依据。下文将逐条展开。ol.interaction.Draw变更minPoints 与事件类型命名minPointsPerRing→minPoints从仅多边形到线、面通用v3.6.0 将 Draw 交互的配置项minPointsPerRing重命名为minPoints并且该选项不再只对多边形polygon绘制生效而是同样适用于线串linestring绘制。旧写法v3.5.0 及之前绘制多边形时只有minPointsPerRing可以限制每一圈ring至少要绘制的点数新写法v3.6.0 起统一使用minPoints线串与多边形均可配置语义更直观、覆盖面更广。从当前仓库源码看这一配置项延续至今。在 src/ol/interaction/Draw.js 中可以看到其文档定义/** * property {number} [minPoints] The number of points that must be drawn */其内部实现在构造器中读取this.minPoints_ options.minPoints ? options.minPoints : ...见 src/ol/interaction/Draw.js。而在完成判定逻辑中线串与多边形的点数校验分别使用了它见 src/ol/interaction/Draw.js/** type {LineCoordType} */ (sketchCoords).length this.minPoints_; ... potentiallyDone sketchCoordsPoly[0].length this.minPoints_;也就是说minPoints决定了绘制到多少个点时才允许结束finish。升级时只需做如下替换即可// 旧写法 new ol.interaction.Draw({ source: vectorSource, type: Polygon, minPointsPerRing: 4 }); // 新写法 new ol.interaction.Draw({ source: vectorSource, type: Polygon, minPoints: 4 });事件类型重命名ol.DrawEvent→ol.interaction.DrawEventv3.6.0 同时将ol.DrawEvent和ol.DrawEventType重命名为ol.interaction.DrawEvent与ol.interaction.DrawEventType。官方特别说明只有当你的代码与 OpenLayers 一起编译compiled together时这项重命名才会对代码产生影响——如果你只是通过全局ol命名空间使用库则无需改动。当前仓库中 Draw 交互的事件体系正是这套命名在 src/ol/interaction/Draw.js 中DrawEventType定义了三个事件类型且DrawEvent继承自 OpenLayers 的基类Eventconst DrawEventType { /** event DrawEvent#drawstart */ DRAWSTART: drawstart, /** event DrawEvent#drawend */ DRAWEND: drawend, /** event DrawEvent#drawabort */ DRAWABORT: drawabort }; export class DrawEvent extends Event { ... }类声明上通过fires DrawEvent标注见 src/ol/interaction/Draw.js并在绘制流程中依次派发drawstart如 src/ol/interaction/Draw.js、drawendL1478、drawabortL1513事件。升级后的监听代码形如draw.on(drawstart, function (evt) { // evt 为 ol.interaction.DrawEvent 实例 // 可通过 evt.feature 获取正在绘制的草图要素 }); draw.on(drawend, function (evt) { // 绘制完成evt.feature 为最终要素 });ol.tilegrid变更XYZ 工厂函数与瓦片坐标体系ol.tilegrid.XYZ构造器 → 静态函数ol.tilegrid.createXYZ()v3.6.0 将ol.tilegrid.XYZ构造器替换为静态函数ol.tilegrid.createXYZ()。新函数接受与旧构造器相同的参数但返回一个普通的ol.tilegrid.TileGrid实例不再有独立的 XYZ 子类类型。当前仓库中该工厂函数位于 src/ol/tilegrid.js其选项类型XYZOptions见 src/ol/tilegrid.js定义了以下参数选项类型默认值说明extentExtentEPSG:3857 全图范围网格范围XYZ 网格原点取该范围的左上角未指定maxResolution时0 级分辨率由一个瓦片恰好覆盖该范围推算maxResolutionnumber由 extent 与 tileSize 推算0 级分辨率maxZoomnumber42最大缩放级别决定网格层级数量如maxZoom为 21 表示 0~21 共 22 级minZoomnumber0最小缩放级别tileSizenumber \| Size[256, 256]瓦片像素尺寸工厂函数内部用resolutionsFromExtentsrc/ol/tilegrid.js按缩放因子 2即每级分辨率减半maxResolution / 2^z生成分辨率数组并据此构造TileGrid。升级迁移示例// 旧写法new ol.tilegrid.XYZ(...) var tileGrid new ol.tilegrid.XYZ({ maxZoom: 22, tileSize: 512 }); // 新写法ol.tilegrid.createXYZ(...) var tileGrid ol.tilegrid.createXYZ({ maxZoom: 22, tileSize: 512 });仓库升级说明中亦保留了类似示例见 changelog/upgrade-notes.mdol.tilegrid.createXYZ({tileSize: 512, maxZoom: 22})可用于渲染瓦片尺寸为 512 的 XYZ 源。内部瓦片坐标变换-y-1→height-y-1v3.6.0 调整了 XYZ 源的内部瓦片坐标方案旧方案y坐标通过-y-1变换为源source使用的坐标新方案y坐标通过height-y-1变换其中height是该瓦片坐标所在缩放级别下瓦片网格的行数。两者在绝大多数常见情形下结果一致因为对全球 XYZ 网格第z级的行数恰为2^z此时-y-1 ≡ 2^z-y-1但新公式在网格范围被extent裁剪、行数不再等于2^z时依然正确。这是一次让坐标变换适配任意网格形状的底层修正普通应用代码无需改动除非你自行实现了瓦片 URL 函数并依赖旧的-y-1语义。widths选项移除WMTS 用sizes其他网格用extentv3.6.0 移除了ol.tilegrid.TileGrid及其子类如 XYZ、WMTS的widths构造选项官方说明该选项不再是 180° 经线处正确换行wrapping所必需的。取而代之的是两条路径ol.tilegrid.WMTS新增sizes选项。其中每一项是一个ol.Size数组第一项为width对应 WMTS capabilities 中的TileMatrixWidth第二项为height对应TileMatrixHeight其他瓦片网格改用extent来限定源source会请求的瓦片范围。从当前仓库实现可以印证这套设计的延续src/ol/tilegrid/WMTS.js 中sizes被定义为每个缩放级别的瓦片行数与列数并在解析 WMTS capabilities 时按矩阵宽高推入src/ol/tilegrid/WMTS.jssizes.push([elt[MatrixWidth], elt[MatrixHeight]])src/ol/tilegrid/TileGrid.js 中extent的语义明确为TileSource源不会请求该范围之外的任何瓦片同时当未配置origin/origins时网格原点自动取 extent 的左上角src/ol/tilegrid/TileGrid.js并在构造时基于 extent 预先计算各层级瓦片范围calculateTileRanges_L232-L233。因此升级时若你此前依赖widths限制请求范围应改为// 旧写法widths // var tileGrid new ol.tilegrid.TileGrid({ ... widths: [2, 4, 8] ... }); // 新写法extent以自定义范围限制瓦片请求 var tileGrid new ol.tilegrid.TileGrid({ extent: [-180, -85, 180, 85], resolutions: resolutions });而对于 WMTS 网格直接通过sizes描述每一矩阵的尺寸即可。ol.source.TileWMS的wrapX默认值从undefined变为truev3.6.0 之前ol.source.TileWMS的wrapX默认值是undefined此时源会发送超出范围out-of-extent的瓦片 BBOX的 WMS 请求。从 v3.6.0 起wrapX只能是true或false新默认值为true官方强调通常不需要应用代码改动但效果是超出范围的瓦片请求不再使用越界 BBOX而是改用平移到真实世界坐标的 BBOX。当前仓库中该默认值逻辑清晰可见src/ol/source/TileWMS.js 定义选项、L100 赋值wrapX: options.wrapX ! undefined ? options.wrapX : true,结合上一节提到的ol/tilegrid.js中的wrapX(tileGrid, tileCoord, projection)辅助函数src/ol/tilegrid.js可以看出这套水平环绕世界的能力在 v3.6.0 后成为瓦片请求流程的默认行为当瓦片中心落在投影范围之外时会自动按世界宽度平移回有效范围。v3.6.0 新特性与修复亮点除升级说明外v3.6.0 的 40 个 PR 还包含大量功能增强与修复按主题归纳如下PR 编号与描述均来自官方 变更日志几何与渲染#3764为ol.geom.Geometry新增intersectsExtent的实现与测试#3711修复并测试ol.color.blend颜色混合#3637 / #3659实现后又回退了ol.renderer.Layer#forEachFeatureAtCoordinate表明该特性当时仍在反复评估中#3718为renderOrder增加断言#3662澄清renderBuffer选项文档。交互Interaction#3757将mapBrowserEvent作为ol.SelectEvent的成员暴露#3673增强ol.interaction.Draw的控制能力例如支持绘制正方形square drawing#3725补充ModifyOptions#pixelTolerance的默认值文档#3740为 select 交互补充fires文档标注。瓦片与网格#3639为ol.tilegrid.TileGrid增加extent支持与上文widths移除直接相关#3722在内部使用正确的TileCoord变换函数#3747 / #3759将tileCoordTransform恢复为成员并标记api#3689修复 WMTSoptionsFromCapabilities在缺少OperationsMetadata段时崩溃的问题。格式Format#3699 / #3739为 WKT 格式增加科学计数法支持并简化其检测逻辑。文档、构建与工程化#3749、#3693、#3694、#3672修正 API 文档、ol.extent.containsExtent文档、升级说明中的拼写与内部链接#3738改进ol.TileUrlFunctionType的文档#3741增强回调/过滤函数参数与返回值文档#3683改进 Map 关于 layers 与 layergroups 的文档#3692支持在 Windows Cygwin 环境下构建#3649收紧serve.js中的正则#3697改用合法的 SPDX license 表达式#3677为示例examples补充 metadata#3665将 proj4js 与投影定义文件加入示例资源#3751测试不再依赖远程服务#3710为ol.extent增加更多测试用例#3732、#3735、#3736、#3682、#3664、#3663、#3709、#3688 等涵盖示例标记修正、按钮失焦绑定方法、WebGLContextAttributes extern 补充、下载页链接等细节。升级自检清单升级到 v3.6.0或阅读历史代码、迁移旧应用时建议对照以下清单逐项排查Draw 交互搜索minPointsPerRing全部替换为minPoints若代码与 OpenLayers 一起编译将ol.DrawEvent/ol.DrawEventType改为ol.interaction.DrawEvent/ol.interaction.DrawEventTypeXYZ 网格搜索new ol.tilegrid.XYZ(改为ol.tilegrid.createXYZ(并确认返回类型按TileGrid使用TileGrid 配置移除widthsWMTS 网格改用sizes宽、高分别对应TileMatrixWidth/TileMatrixHeight其他网格改用extent限制瓦片请求范围TileWMS确认没有依赖发送越界 BBOX的行为wrapX现在固定为布尔值且默认true自定义瓦片 URL 函数确认内部 y 坐标变换不再依赖旧的-y-1公式。以上涉及的历史升级条目可随时回到 changelog/v3.6.0.md 与 changelog/upgrade-notes.md 核对原文对应 API 的现行实现可分别查阅 src/ol/interaction/Draw.js、src/ol/tilegrid.js、src/ol/tilegrid/TileGrid.js、src/ol/tilegrid/WMTS.js 与 src/ol/source/TileWMS.js。总结v3.6.0 是 OpenLayers 在瓦片体系与绘制交互上一次方向明确的整理createXYZ()工厂函数统一了 XYZ 网格的创建方式height-y-1坐标变换让任意范围网格都能正确换算瓦片坐标extent/sizes取代了widthswrapX默认开启则让 WMS 请求始终落在真实世界坐标内同时minPoints与事件类型的重命名进一步统一了 Draw 交互的配置与类型模型。这些变更虽集中在实验性功能上却深刻影响了后续版本中瓦片网格与绘制交互的 API 形态理解这轮升级对阅读 OpenLayers 历史代码与迁移旧工程都很有价值。赞分享前端GIS数据可视化【免费下载链接】openlayersOpenLayers项目地址https://gitcode.com/gh_mirrors/op/openlayers点击查看免费下载相关推荐OpenLayers 10.10.0 版本详解WebGL 文本渲染、智能瓦片绘制与 WMTS 瓦片矩阵限制支持OpenLayers 10.10.0 版本详解WebGL 文本渲染、智能瓦片绘制与 WMTS 瓦片矩阵限制支持 OpenLayers 10.10.0 是一次覆前端GIS数据可视化OpenLayers 4.3.0 升级指南像素拾取、球面测量与交互/矢量瓦片新特性全解析OpenLayers 4.3.0 升级指南像素拾取、球面测量与交互/矢量瓦片新特性全解析 本指南以 OpenLayers v4.3.0 发布说明为核心系统梳前端GIS数据可视化Dear PyGui 绘图系统完整指南Plot 架构、数据序列、坐标轴控制与高级交互Dear PyGui 绘图系统完整指南Plot 架构、数据序列、坐标轴控制与高级交互 Dear PyGui 的 plot 是构建在底层 C 库 ImPlo桌面应用UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

229.Android13 实测通过!BL 解锁 + Root + 分区刷写 + EDL 救砖手册

229.Android13 实测通过!BL 解锁 + Root + 分区刷写 + EDL 救砖手册

摘要 本文面向具备一定Linux基础的开发者,系统性地阐述安卓刷机与维修的底层原理。内容涵盖Bootloader解锁、分区表结构、Fastboot协议、Recovery模式、Magisk Root原理及EDL救砖方案。通过一个完整的Python脚本实现Fastboot协议的底层通信,并结合真实维修案例(系统崩溃、基…

2026/9/24 5:18:44 阅读更多 →
如何用编程实现任务自动化

如何用编程实现任务自动化

很多人以为自动化开发门槛很高,其实核心逻辑很简单:固定重复的操作交给代码执行,人工只负责配置、监控和异常处理。下面从思路、常用方案、实战示例、避坑点完整讲解。 一、自动化实现通用流程 1. 梳理目标:明确哪些操作需要自动化…

2026/9/24 5:17:44 阅读更多 →
自动驾驶测试必修课:一文读懂MIL、SIL、PIL、HIL四种在环验证方法

自动驾驶测试必修课:一文读懂MIL、SIL、PIL、HIL四种在环验证方法

/* 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:17:44 阅读更多 →

最新新闻

Linux/Android车机CarPlay协议模拟器开发实战

Linux/Android车机CarPlay协议模拟器开发实战

/* 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 6:42:37 阅读更多 →
ARM7+μC/OS-II焊接机控制系统:任务划分、时序优化与稳定性实战

ARM7+μC/OS-II焊接机控制系统:任务划分、时序优化与稳定性实战

/* 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 6:42:37 阅读更多 →
Multisim仿真MOS管电源开关电路:从N-MOS到P-MOS实战解析

Multisim仿真MOS管电源开关电路:从N-MOS到P-MOS实战解析

/* 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 6:42:37 阅读更多 →
STM32串口烧录完全指南:不用仿真器,FlyMCU+USB转TTL也能玩转

STM32串口烧录完全指南:不用仿真器,FlyMCU+USB转TTL也能玩转

/* 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 6:42:37 阅读更多 →
glb压缩踩坑实录

glb压缩踩坑实录

目录 gltf-pipeline 压缩后变粗糙了: gltf-transform/cli 高保真压缩: 解压缩: gltf-pipeline 安装 : sudo npm install -g gltf-pipeline gltf-pipeline -i yotown-202605291542.glb -o out_draco_highprec.glb \ --draco.compressionLevel=7 --draco.quantizePos…

2026/9/24 6:41:37 阅读更多 →
测试markdown时间:21:1

测试markdown时间:21:1

21.1

2026/9/24 6:41:37 阅读更多 →

日新闻

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

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

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

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →