ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

OpenLayers v3.6.0 升级指南:Draw 绘制交互与 tilegrid 瓦片坐标体系重构详解

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),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表