Cesium加载wms服务不进行切片加载
Cesium加载wms服务不进行切片加载常见情况下我们会通过WebMapServiceImageryProvider这个类加载geoserver发布出来的wms服务图层。/** * WMS服务图层 * param {string} url 底图对应的类型 * param {string} layers 图层名 */exportdefaultclassWMSLayerextendsCesium.WebMapServiceImageryProvider{constructor(url:string,layers:string,parameters{}){super({url,layers,parameters:{transparent:true,format:image/png,...parameters,},tilingScheme:newCesium.WebMercatorTilingScheme(),enablePickFeatures:false,});};};但是当图层具有文字标识的时候就会出现同一个几何被裁切出现多个标识的情况这个问题出现的原因是Cesium将wms服务切分成了256*256大小的瓦片进行叠加满足三维展示的需要。解决思路将wms图层按照Cesium当前视角下的最大经纬度范围和当前视图像素值加载出一整张图片在Cesium地球上进行叠加。获取视角下经纬度范围getScreenScope(){constrectanglethis.viewer.camera.computeViewRectangle();if(!rectangle){return;}this.rectanglerectangle;const{north,east,south,west,}rectangle;constsouthwestthis.getMetricCoordinates(Cesium.Math.toDegrees(west),Cesium.Math.toDegrees(south));constnortheastthis.getMetricCoordinates(Cesium.Math.toDegrees(east),Cesium.Math.toDegrees(north));return[...southwest,...northeast].join(,);};同时转换为EPSG:3857坐标系getMetricCoordinates(lngitude:number,latitude:number){constsourceProjectionEPSG:4326;consttargetProjectionEPSG:3857;constdegreesproj4(sourceProjection,targetProjection,[lngitude,latitude]);returndegrees;};获取当前视窗像素值const{width,height,}this.viewer.canvas.getBoundingClientRect();this.widthMath.ceil(width);this.heightMath.ceil(height);并且在每次视角变化结束时加载新的图片替换当前图层叠加新的图层。这里我们使用SingleTileImageryProvider这个类来实现图层的叠加。其中去需要注意的是每次移除和叠加图层的时候要保障前后图层处在同一个层级(index)并保持前后一些属性不变。完成代码importproj4fromproj4;import*asCesiumfromcesium;exportdefaultclassNoTileWMSLayer{viewer:Cesium.Viewer;width:number;height:number;baseUrl:string;layerName:string;index:number;rectangle?:Cesium.Rectangle;layer?:Cesium.ImageryLayer;constructor(viewer:Cesium.Viewer,options:{baseUrl:string,layerName:string,}){this.viewerviewer;this.baseUrloptions.baseUrl;this.layerNameoptions.layerName;this.indexthis.viewer.imageryLayers.length;const{width,height,}this.viewer.canvas.getBoundingClientRect();this.widthMath.ceil(width);this.heightMath.ceil(height);this.addLayer();(this.viewerasany).cameraChanged.push((){this.addLayer();});};private_show:booleantrue;getshow():boolean{returnthis._show;};setshow(isShow:boolean){constoldthis._show;if(isShow!old){this._showisShow;this.onShowChange();}};privateonShowChange(){if(this.layer){this.layer.showthis.show;}};private_splitDirection:Cesium.SplitDirectionCesium.SplitDirection.NONE;getsplitDirection():Cesium.SplitDirection{returnthis._splitDirection;};setsplitDirection(splitDirection:Cesium.SplitDirection){constoldthis._splitDirection;if(splitDirection!old){this._splitDirectionsplitDirection;this.onSplitDirectionChange();}};privateonSplitDirectionChange(){if(this.layer){this.layer.splitDirectionthis.splitDirection;}};getMetricCoordinates(lngitude:number,latitude:number){constsourceProjectionEPSG:4326;consttargetProjectionEPSG:3857;constdegreesproj4(sourceProjection,targetProjection,[lngitude,latitude]);returndegrees;};getScreenScope(){constrectanglethis.viewer.camera.computeViewRectangle();if(!rectangle){return;}this.rectanglerectangle;const{north,east,south,west,}rectangle;constsouthwestthis.getMetricCoordinates(Cesium.Math.toDegrees(west),Cesium.Math.toDegrees(south));constnortheastthis.getMetricCoordinates(Cesium.Math.toDegrees(east),Cesium.Math.toDegrees(north));return[...southwest,...northeast].join(,);};addLayer(){constbboxthis.getScreenScope();constoldLayerthis.layer;constparams{transparent:true,format:image/png,service:WMS,version:1.1.1,request:GetMap,layers:this.layerName,bbox,width:this.width,height:this.height,srs:EPSG:3857,};consturlParamsnewURLSearchParams();Object.entries(params).forEach(([key,value]){urlParams.append(key,String(value));});consturl${this.baseUrl}?${urlParams.toString()};this.indexthis.layer?this.viewer.imageryLayers.indexOf(this.layer):this.index;this.layerthis.viewer.imageryLayers.addImageryProvider(newCesium.SingleTileImageryProvider({url,rectangle:this.rectangle,tileWidth:this.width,tileHeight:this.height,}),Math.min(this.index,this.viewer.imageryLayers.length));if(this.layer){this.layer.showthis.show;this.layer.splitDirectionthis.splitDirection;}if(oldLayer){this.viewer.imageryLayers.remove(oldLayer);}};};通过这个方式加载就可以得到一个完整的wms服务constleftLayernewNoTileWMSLayer(window.mapViewer,{baseUrl:你的geoserver地址,layerName:你的图层名,});leftLayer.splitDirectionCesium.SplitDirection.LEFT;

相关新闻

3个关键步骤掌握BG3ModManager:专业级《博德之门3》模组管理解决方案

3个关键步骤掌握BG3ModManager:专业级《博德之门3》模组管理解决方案

3个关键步骤掌握BG3ModManager:专业级《博德之门3》模组管理解决方案 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 在《博德之门3》的…

2026/10/24 4:32:32 阅读更多 →
软考高级认证深度对比:系统规划与管理师 vs 信息系统项目管理师

软考高级认证深度对比:系统规划与管理师 vs 信息系统项目管理师

1. 项目概述:一场关于高级认证的深度抉择在IT技术与管理领域深耕多年,我经常被同行或后辈问到同一个问题:“系统规划与管理师和信息系统项目管理师,这两个高级资格认证,到底哪个更好考?” 这绝不是一个可以…

2026/10/24 4:42:38 阅读更多 →
高强度塑钢打包带的优势是什么

高强度塑钢打包带的优势是什么

高强度塑钢打包带的优势是什么在工业包装领域,高强度塑钢打包带的出现给货物打包带来了极大的便利。青岛昌瑞工业品有限公司作为行业内表现突出的企业,其生产的高强度塑钢打包带具有诸多显著优势。卓越的物理性能高强度塑钢打包带最大的亮点在于它卓越的…

2026/10/25 5:25:51 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/25 11:19:54 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/24 18:34:36 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/25 10:02:42 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/25 3:12:30 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/24 21:09:59 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/25 10:02:43 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/25 7:47:32 阅读更多 →