当前位置: 首页 > article >正文

OpenLayers 加载天地图服务踩坑记:手把手解决 EPSG:4490 坐标系与 axisOrientation 的 ‘enu/neu‘ 之谜

OpenLayers 加载天地图服务踩坑记手把手解决 EPSG:4490 坐标系与 axisOrientation 的 enu/neu 之谜作为一名长期与 WebGIS 打交道的开发者最近在对接国内天地图服务时遇到了一个令人抓狂的问题明明已经按照标准流程注册了 CGCS2000 坐标系EPSG:4490地图却始终无法正常显示要么一片空白要么位置错得离谱。经过一番深入排查发现问题出在 OpenLayers 对 WMS 1.3.0 版本 BBOX 参数的处理逻辑上而axisOrientation属性enu 与 neu成为了解决这个问题的关键钥匙。本文将详细记录这个踩坑过程并给出完整的解决方案。1. 问题现象与初步排查当我们在 OpenLayers 中加载天地图服务时通常会遇到以下两种异常情况地图完全空白控制台没有报错但地图区域一片空白位置严重偏移地图显示出来了但位置完全不对像是被镜像或旋转了这些现象往往出现在使用 EPSG:4490 坐标系加载 WMS 服务时。初步检查代码确认已经正确注册了坐标系import proj4 from proj4; import {register} from ol/proj/proj4; import {Projection, addProjection} from ol/proj; // 注册 EPSG:4490 坐标系 proj4.defs(EPSG:4490, GEOGCS[\China Geodetic Coordinate System 2000\,DATUM[\China_2000\,SPHEROID[\CGCS2000\,6378137,298.257222101,AUTHORITY[\EPSG\,\1024\]],AUTHORITY[\EPSG\,\1043\]],PRIMEM[\Greenwich\,0,AUTHORITY[\EPSG\,\8901\]],UNIT[\degree\,0.0174532925199433,AUTHORITY[\EPSG\,\9122\]],AUTHORITY[\EPSG\,\4490\]]); register(proj4);代码看起来没问题但地图就是不显示。这时候就需要深入理解 OpenLayers 的坐标系处理机制了。2. OpenLayers 坐标系处理机制解析OpenLayers 在处理 WMS 服务时会根据 WMS 版本和坐标系的axisOrientation属性来决定如何构造 BBOX 参数。这里有几个关键点需要理解WMS 1.1.0 与 1.3.0 的区别WMS 1.1.0 使用BBOXxmin,ymin,xmax,ymaxWMS 1.3.0 使用BBOXminx,miny,maxx,maxyaxisOrientation 的作用enu(east-north-up)x 轴指向东y 轴指向北neu(north-east-up)x 轴指向北y 轴指向东OpenLayers 的默认行为对于 EPSG:4326 和 EPSG:4490 等地理坐标系OpenLayers 默认使用enu方向但天地图服务期望的是neu方向提示WMS 1.3.0 规范要求坐标顺序必须与坐标系的轴方向一致这就是问题的根源所在。3. 深入解决方案理解了上述机制后解决方案就清晰了我们需要显式指定 EPSG:4490 坐标系的axisOrientation为neu。以下是完整的解决方案代码// 1. 注册 EPSG:4490 坐标系 proj4.defs(EPSG:4490, GEOGCS[\China Geodetic Coordinate System 2000\,DATUM[\China_2000\,SPHEROID[\CGCS2000\,6378137,298.257222101,AUTHORITY[\EPSG\,\1024\]],AUTHORITY[\EPSG\,\1043\]],PRIMEM[\Greenwich\,0,AUTHORITY[\EPSG\,\8901\]],UNIT[\degree\,0.0174532925199433,AUTHORITY[\EPSG\,\9122\]],AUTHORITY[\EPSG\,\4490\]]); register(proj4); // 2. 创建自定义投影并指定 axisOrientation const projection new Projection({ code: EPSG:4490, units: degrees, axisOrientation: neu // 关键设置 }); // 3. 设置投影范围 projection.setExtent([-180, -90, 180, 90]); projection.setWorldExtent([-180, -90, 180, 90]); // 4. 添加到 OpenLayers 的投影系统 addProjection(projection);这样设置后OpenLayers 在处理 WMS 1.3.0 请求时会自动调整 BBOX 参数的顺序确保与天地图服务期望的顺序一致。4. 完整示例代码下面是一个完整的示例展示如何正确加载天地图的 WMS 服务import ol/ol.css; import Map from ol/Map; import View from ol/View; import TileLayer from ol/layer/Tile; import TileWMS from ol/source/TileWMS; import proj4 from proj4; import {register} from ol/proj/proj4; import {Projection, addProjection} from ol/proj; // 注册 EPSG:4490 坐标系 proj4.defs(EPSG:4490, GEOGCS[\China Geodetic Coordinate System 2000\,DATUM[\China_2000\,SPHEROID[\CGCS2000\,6378137,298.257222101,AUTHORITY[\EPSG\,\1024\]],AUTHORITY[\EPSG\,\1043\]],PRIMEM[\Greenwich\,0,AUTHORITY[\EPSG\,\8901\]],UNIT[\degree\,0.0174532925199433,AUTHORITY[\EPSG\,\9122\]],AUTHORITY[\EPSG\,\4490\]]); register(proj4); // 创建自定义投影 const projection new Projection({ code: EPSG:4490, units: degrees, axisOrientation: neu }); projection.setExtent([-180, -90, 180, 90]); projection.setWorldExtent([-180, -90, 180, 90]); addProjection(projection); // 创建地图 const map new Map({ target: map, layers: [ new TileLayer({ source: new TileWMS({ url: http://t0.tianditu.gov.cn/img_w/wms, params: { LAYERS: img, VERSION: 1.3.0, FORMAT: image/png, CRS: EPSG:4490 }, projection: EPSG:4490 }) }) ], view: new View({ projection: EPSG:4490, center: [116.4, 39.9], // 北京坐标 zoom: 5 }) });5. 常见问题与调试技巧在实际开发中可能会遇到各种变种问题。以下是一些调试技巧检查网络请求打开浏览器开发者工具查看 WMS 请求的 URL确认 BBOX 参数的顺序是否正确对比 WMS 版本尝试将VERSION参数改为1.1.0看看是否能正常显示如果能说明确实是 1.3.0 版本的 BBOX 顺序问题验证坐标系定义使用ol.proj.get(EPSG:4490)检查坐标系的定义确认axisOrientation属性是否为neu坐标转换测试使用ol.proj.transform([116.4, 39.9], EPSG:4326, EPSG:4490)测试坐标转换确认转换结果是否合理注意天地图的不同服务如矢量、影像、注记等可能有不同的 URL 和参数请确保使用正确的服务地址和图层名称。在实际项目中我还发现有些开发者会尝试通过修改 OpenLayers 的源代码来解决这个问题这其实是不推荐的。正确的方式应该是通过配置axisOrientation来解决问题这样既不会破坏 OpenLayers 的内部逻辑又能保证代码的可维护性。

相关文章:

OpenLayers 加载天地图服务踩坑记:手把手解决 EPSG:4490 坐标系与 axisOrientation 的 ‘enu/neu‘ 之谜

OpenLayers 加载天地图服务踩坑记:手把手解决 EPSG:4490 坐标系与 axisOrientation 的 enu/neu 之谜 作为一名长期与 WebGIS 打交道的开发者,最近在对接国内天地图服务时,遇到了一个令人抓狂的问题:明明已经按照标准流程注册了 CG…...

Simulink Autosar开发:手把手教你配置PortParameter实现参数通信(附ARXML解析)

Simulink Autosar开发:手把手教你配置PortParameter实现参数通信(附ARXML解析) 在汽车电子软件开发中,AUTOSAR标准已经成为行业通用架构。其中,参数通信机制是软件组件(SWC)间数据交互的核心功能之一。本文将深入探讨基…...

从分页计算到金额处理:盘点C#取整函数在真实项目里的5个高频应用场景

从分页计算到金额处理:C#取整函数的5个实战应用场景 在开发电商后台时,我发现一个有趣的现象:当用户浏览商品列表时,系统显示"共37件商品,每页10条,当前第4页"。这个简单的分页功能背后&#xff…...

【Flink实战指南】基于Table API与SQL Client的Catalog统一管理实践

1. 为什么需要统一管理Catalog? 在Flink的实际应用中,我们经常会遇到这样的场景:数据分散在不同的存储系统中,比如Hive、MySQL、Kafka等。每次操作这些数据时,都需要手动指定对应的连接信息,不仅效率低下&a…...

星穹铁道抽卡数据分析:3步掌握你的欧气规律

星穹铁道抽卡数据分析:3步掌握你的欧气规律 【免费下载链接】star-rail-warp-export Honkai: Star Rail Warp History Exporter 项目地址: https://gitcode.com/gh_mirrors/st/star-rail-warp-export 想知道你的抽卡运气到底怎么样吗?星穹铁道跃迁…...

番茄小说下载器终极指南:3步打造你的永久离线图书馆

番茄小说下载器终极指南:3步打造你的永久离线图书馆 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader fanqienovel-downloader 是一款强大的开源工具,专门用于下载番茄…...

如何通过游戏化编程轻松掌握代码技能?CodeCombat完全指南

如何通过游戏化编程轻松掌握代码技能?CodeCombat完全指南 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 你是否曾经觉得学习编程就像破解一个复杂密码,枯燥的语法和抽象的…...

Docker技术入门与实战【2.0】

11.3 TomcatTomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下普遍使用,是开发和调试JSP程序的首选。Tomcat最初是由Sun的软件构架师詹姆斯邓肯戴维森开发的。后来在他的…...

Phi-3.5-mini-instruct快速验证:3条shell命令确认vLLM服务健康状态与可用性

Phi-3.5-mini-instruct快速验证:3条shell命令确认vLLM服务健康状态与可用性 1. 模型简介 Phi-3.5-mini-instruct 是一个轻量级的开放模型,属于Phi-3模型家族。它基于高质量的训练数据构建,包括合成数据和经过筛选的公开网站数据&#xff0c…...

Obsidian中完美播放B站视频的终极解决方案:Media Extended B站插件完整指南

Obsidian中完美播放B站视频的终极解决方案:Media Extended B站插件完整指南 【免费下载链接】mx-bili-plugin 项目地址: https://gitcode.com/gh_mirrors/mx/mx-bili-plugin 你是否厌倦了在Obsidian笔记中只能粘贴B站链接而无法直接播放视频的困扰&#xff…...

DOCA-OFED:高性能网络堆栈的进化与实战指南

1. 从MLNX_OFED到DOCA-OFED:网络堆栈的进化之路在数据中心和云计算领域,网络性能的优化一直是技术演进的核心课题。记得我第一次接触InfiniBand网络时,MLNX_OFED(Mellanox OpenFabrics Enterprise Distribution)作为行…...

避坑指南:UE5 Cesium加载本地3D Tileset时,模型位置跑偏了怎么办?

UE5 Cesium加载本地3D Tileset位置校正实战指南 当你在UE5项目中兴奋地导入精心准备的倾斜摄影模型,却发现它们像迷路的孩子一样散落在错误的地理位置时,这种挫败感我深有体会。去年在重建某历史街区数字孪生项目时,我们团队就曾为此耗费了两…...

如何利用AFL++进行高效模糊测试:发现软件漏洞的终极指南

如何利用AFL进行高效模糊测试:发现软件漏洞的终极指南 【免费下载链接】AFLplusplus The fuzzer afl is afl with community patches, qemu 5.1 upgrade, collision-free coverage, enhanced laf-intel & redqueen, AFLfast power schedules, MOpt mutators, un…...

告别虚拟机!手把手教你用WSL2+SDL在Ubuntu上跑通LVGL 9.0模拟器

告别虚拟机!手把手教你用WSL2SDL在Ubuntu上跑通LVGL 9.0模拟器 在嵌入式GUI开发领域,LVGL(Light and Versatile Graphics Library)凭借其轻量级特性和丰富的组件库,已成为许多开发者的首选。但对于Windows平台的开发者…...

Cesium标绘进阶:从静态Entity到动态Primitive的性能优化指南

Cesium标绘进阶:从静态Entity到动态Primitive的性能优化指南 当你的Cesium场景开始加载成千上万的动态标绘对象时,是否遇到过明显的性能下降?帧率骤降、交互卡顿、内存占用飙升——这些常见问题往往源于对Entity API的过度依赖。本文将带你深…...

ChanlunX缠论插件:让复杂的技术分析变得简单直观

ChanlunX缠论插件:让复杂的技术分析变得简单直观 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾为缠论分析的复杂性而头疼?面对密密麻麻的K线图,手动识别顶底…...

h5maker:3步搭建专业级H5页面,零代码实现营销创意

h5maker:3步搭建专业级H5页面,零代码实现营销创意 【免费下载链接】h5maker h5编辑器类似maka、易企秀 账号/密码:admin 项目地址: https://gitcode.com/gh_mirrors/h5/h5maker 还在为快速制作H5页面而烦恼吗?营销活动需要…...

告别“单车智能”瓶颈:用V2X技术让你的车“看见”红绿灯和行人(附国内试点城市清单)

V2X技术:让自动驾驶突破单车智能的感知边界 清晨七点半的上海内环高架上,一辆开启自适应巡航的轿车正以60公里时速行驶。突然,前方施工区域出现临时变道,传统雷达系统因视野遮挡未能及时识别——这是单车智能的典型困境。而在三公…...

你的手机能看Netflix高清吗?一个App快速查询Widevine L1/L2/L3等级

你的手机能看Netflix高清吗?一个App快速查询Widevine L1/L2/L3等级 每次打开Netflix准备追剧,却发现画面糊得像打了马赛克?这可能是你的手机Widevine等级在作祟。作为流媒体画质的隐形守门人,Widevine DRM的三个等级直接决定了你能…...

大数据平台的数据治理质量监控与元数据管理

大数据平台的数据治理质量监控与元数据管理 在数字化转型的浪潮中,大数据平台已成为企业核心竞争力的重要支撑。随着数据量的爆炸式增长,数据治理的复杂性和挑战性也日益凸显。数据治理质量监控与元数据管理作为保障数据价值的关键环节,直接…...

从面试官视角拆解:什么样的科研项目陈述能让导师眼前一亮?(附遥感/GIS/地信案例)

科研项目陈述的艺术:如何让导师在面试中记住你的研究价值 当二十多位面试者依次完成自我介绍后,导师们往往只对其中两三个人的项目陈述留有印象——这种现象在保研夏令营和考研复试中屡见不鲜。不同于简历上静态的文字描述,面对面的项目陈述是…...

LabML实验追踪器深度解析:从基础指标到自定义可视化

LabML实验追踪器深度解析:从基础指标到自定义可视化 【免费下载链接】labml 🔎 Monitor deep learning model training and hardware usage from your mobile phone 📱 项目地址: https://gitcode.com/gh_mirrors/la/labml LabML是一款…...

告别FTP下载焦虑:手把手教你用FileZilla绿色版搞定国家青藏高原科学数据中心1km降水数据

科研数据高效获取指南:FileZilla绿色版全流程解析与实战技巧 第一次接触FTP下载科研数据时,我盯着屏幕上闪烁的命令行界面足足发呆了十分钟——明明已经拿到了数据中心的访问权限,却卡在了最后一步的数据传输环节。这种挫败感想必很多科研工作…...

GetQzonehistory:一键拯救你消失的青春记忆!QQ空间历史说说终极备份指南

GetQzonehistory:一键拯救你消失的青春记忆!QQ空间历史说说终极备份指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经在深夜翻看QQ空间&#xff0c…...

布拉格相位匹配项

液晶光栅PVG。 衍射效率计算。 (胆甾相)液晶光栅PVG(偏振体积光栅)这玩意儿在AR眼镜和全息显示里特别火,尤其胆甾相液晶那个螺旋结构,能把光的偏振玩出花来。今天咱们就掰开揉碎了说说它的衍射效率到底怎么算——别怕,…...

MQCloud消息追踪与审计:如何实现全链路消息监控与追溯

MQCloud消息追踪与审计:如何实现全链路消息监控与追溯 【免费下载链接】mqcloud RocketMQ企业级一站式服务平台 项目地址: https://gitcode.com/gh_mirrors/mq/mqcloud 在分布式系统架构中,消息中间件扮演着至关重要的角色,而消息的可…...

Kubebox部署方案对比:可执行文件、Docker、Kubernetes内服务等5种方式详解

Kubebox部署方案对比:可执行文件、Docker、Kubernetes内服务等5种方式详解 【免费下载链接】kubebox ⎈❏ Terminal and Web console for Kubernetes 项目地址: https://gitcode.com/gh_mirrors/ku/kubebox Kubebox是一款功能强大的Kubernetes终端和Web控制台…...

Focus编辑器多文件编辑技巧:掌握工作区管理的5个核心方法

Focus编辑器多文件编辑技巧:掌握工作区管理的5个核心方法 【免费下载链接】focus A simple and fast text editor 项目地址: https://gitcode.com/gh_mirrors/fo/focus Focus是一款轻量级且高效的文本编辑器,专为提升多文件编辑效率而设计。本文将…...

OLAINDEX架构揭秘:Laravel框架下的OneDrive目录索引实现原理

OLAINDEX架构揭秘:Laravel框架下的OneDrive目录索引实现原理 【免费下载链接】OLAINDEX ✨ Another OneDrive Directory Index 项目地址: https://gitcode.com/gh_mirrors/ol/OLAINDEX OLAINDEX是一款基于Laravel框架开发的OneDrive目录索引工具,…...

MZmine 3:开源质谱数据分析平台的革命性架构与多维度应用

MZmine 3:开源质谱数据分析平台的革命性架构与多维度应用 【免费下载链接】mzmine3 mzmine source code repository 项目地址: https://gitcode.com/gh_mirrors/mz/mzmine3 MZmine 3作为新一代开源质谱数据处理平台,通过模块化架构重构与算法优化…...