cesium 中的 KmlDataSource KmlDataSource简介KmlDataSource是 Cesium 中用于解析 KML / KMZ 文件的数据源类它实现了DataSource接口。KMLKeyhole Markup Language 2.2是 Google Earth 常用的地理标注格式Cesium 解析后会把每一个要素转成Entity线、点、面、图标等统一放到entities集合中管理。它同时支持kml/ovkml纯文本的 KML 文件kmz/ovkmzzip 压缩包形式的 KMLCesium 内部会自动解压包内的图片、图标等相对资源也能一并解析。基本使用加载文件URL最简单的方式是直接传一个文件地址load返回一个 Promiseviewer.dataSources.add(Cesium.KmlDataSource.load(../../SampleData/facilities.kmz,{camera:viewer.scene.camera,canvas:viewer.scene.canvas,}));三种数据形态重点load的第一个参数支持三种类型它们的含义完全不同传入类型含义注意事项stringURL 地址不是文件内容传字符串会被当成 URL 去请求这是最常见报错的原因Blob二进制文件数据KMZ / ovkmz 压缩包可直接传 BlobCesium 会自动判断 zip 并解压Document已经解析好的 XML 文档适合先用DOMParser校验完 XML 再交给 Cesium// 1. 字符串URLawaitCesium.KmlDataSource.load(/data/xxx.ovkml);// 2. BlobKMZ / ovkmzconstblobawaitfetch(/data/xxx.ovkmz).then((r)r.blob());constdsawaitCesium.KmlDataSource.load(blob,{sourceUri:/data/xxx.ovkmz,});// 3. XML Documentovkmlconsttextawait(awaitfetch(/data/xxx.ovkml)).text();constdocnewDOMParser().parseFromString(text,application/xml);constdsawaitCesium.KmlDataSource.load(doc,{sourceUri:/data/xxx.ovkml,});注意把 KML 文本字符串直接传给load会被当成 URL 请求导致加载失败甚至抛RuntimeError。加载选项 LoadOptionssourceUri解析 KML 内相对路径图片、图标等的基准 URLclampToGround几何要素线、面是否贴地默认falsescreenOverlayContainer屏幕叠加层ScreenOverlay挂载的容器camera/canvasKML 的 NetworkLink 等特性需要相机参数时传入viewer.scene.camera和viewer.scene.canvas。挂载到地图viewer.dataSources.add(ds);// 显示图层viewer.dataSources.remove(ds,false);// 移除显示false 表示不销毁可重新加回viewer.dataSources.contains(ds);// 判断图层是否已挂载解析结果解析完成后数据源上可以拿到所有要素和相关信息ds.entities/ds.entities.values要素集合每个要素是一个Entityentity.namePlacemark 的名称如 YL_58entity.polyline/entity.polygon/entity.point/entity.billboard对应的图形对象entity.parentMultiGeometry拆出来的多个 entity 共享同一个 parent即原 Placemark可用于把同一条线的高亮整组处理entity.kmlKmlFeatureData包含 author、link 等 KML 元数据。数据源本身还提供事件errorEvent解析过程中出错时触发loadingEvent开始/结束加载时触发changedEvent底层数据变化时触发unsupportedNodeEvent遇到不支持的 KML 节点时触发。修改样式Cesium 里所有样式字段都是 Property修改时要用属性类包装constnowCesium.JulianDate.now();// 读取当前线宽constwidthentity.polyline.width?.getValue(now);// 修改线宽和颜色entity.polyline.widthnewCesium.ConstantProperty(8);entity.polyline.materialnewCesium.ColorMaterialProperty(Cesium.Color.fromCssColorString(#ffd400));// 面的填充 / 描边entity.polygon.materialnewCesium.ColorMaterialProperty(Cesium.Color.fromCssColorString(#ffd400).withAlpha(0.45));entity.polygon.outlinenewCesium.ConstantProperty(true);entity.polygon.outlineColornewCesium.ConstantProperty(Cesium.Color.fromCssColorString(#ffd400));常见问题传字符串报错 / RuntimeError字符串被当成 URL而不是文件内容改为传 Blob 或 Document。一条长线显示成一段一段源数据里MultiGeometry把折线拆成了多段LineString每段是一个 entity可以用entity.parent分组把同一 Placemark 的段一起高亮。KMZ 内的图标不显示要把整个 KMZ Blob 交给 Cesium 解析而不是手动解压只取doc.kml文本否则包内相对资源无法解析。参考资料:KmlDataSourceKmlDataSource

相关新闻

最新新闻

ESP32高精度信号输出方案:DDSM Driver HAT硬件解析与UART-JSON通信实战

ESP32高精度信号输出方案:DDSM Driver HAT硬件解析与UART-JSON通信实战

1. 项目缘起:为什么需要一块DDSM Driver HAT? 如果你玩过ESP32,并且尝试过用它驱动一些需要精确时序控制的数字设备,比如WS2812B灯带、步进电机驱动器或者某些特定协议的显示屏,那你大概率遇到过同一个问题&#xff1a…

2026/8/2 9:41:37
双通道隔离USB转RS485转换器设计:从芯片选型到PCB布局实战

双通道隔离USB转RS485转换器设计:从芯片选型到PCB布局实战

1. 项目概述:从USB到工业现场的双向桥梁最近在做一个工业数据采集的项目,手头一堆RS485接口的传感器和PLC,但我的开发主力机是一台没有原生串口的笔记本电脑。这大概是很多工控、嵌入式开发者和硬件爱好者的日常困境。市面上虽然有成品的USB转…

2026/8/2 9:41:37
Mac微信防撤回终极解决方案:3分钟实现消息永久保留

Mac微信防撤回终极解决方案:3分钟实现消息永久保留

Mac微信防撤回终极解决方案:3分钟实现消息永久保留 【免费下载链接】WeChatIntercept 微信防撤回插件,一键安装,MAC可用,支持最新v4.1.10微信 项目地址: https://gitcode.com/gh_mirrors/we/WeChatIntercept 还在为错过重要…

2026/8/2 9:41:37
Unity触发器失效?5个配置雷区与解决方案详解

Unity触发器失效?5个配置雷区与解决方案详解

1. 项目概述:为什么你的触发器总是不工作? 在Unity里做交互,触发器(Trigger)绝对是高频使用的功能。无论是角色进入一个区域触发剧情,还是拾取一个道具,都离不开它。但很多开发者,尤…

2026/8/2 9:41:37
终极ThinkPad风扇控制指南:如何通过TPFanCtrl2实现完美散热与静音平衡

终极ThinkPad风扇控制指南:如何通过TPFanCtrl2实现完美散热与静音平衡

终极ThinkPad风扇控制指南:如何通过TPFanCtrl2实现完美散热与静音平衡 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 作为一名ThinkPad用户,你…

2026/8/2 9:41:37
树莓派Pico驱动2.66英寸电子墨水屏:SPI通信与MicroPython实战

树莓派Pico驱动2.66英寸电子墨水屏:SPI通信与MicroPython实战

1. 项目概述:Pico e-Paper 2.66 是什么? 如果你手头有一块树莓派 Pico 或者类似的 RP2040 开发板,又恰好对低功耗、类纸显示效果感兴趣,那么“Pico e-Paper 2.66”这个项目绝对值得你花时间折腾一下。简单来说,这就是一…

2026/8/2 9:36:37