【Cesium入门教程】第六课:四种常见的地理数据格式GeoJSON、TopoJSON、KML 、CZML在Cesium中的使用
本文介绍了四种常见的地理数据格式及其在Cesium中的使用方法:1) GeoJSON - 基于JSON的地理数据格式,支持点线面等几何图形;2) TopoJSON - GeoJSON的拓扑扩展,通过共享边界减少冗余;3) KML - XML格式的地理标记语言,广泛用于Google Earth;4) CZML - JSON子集,支持动态地理数据可视化,可实现对象随时间变化的动画效果。文中提供了每种格
本文介绍了四种常见的地理数据格式及其在Cesium中的使用方法:
- GeoJSON - 基于JSON的地理数据格式,支持点线面等几何图形;
- TopoJSON - GeoJSON的拓扑扩展,通过共享边界减少冗余;
- KML - XML格式的地理标记语言,广泛用于Google Earth;
- CZML - JSON子集,支持动态地理数据可视化,可实现对象随时间变化的动画效果。
原视频教程,点这里查看
一、Geojson数据
Geojson是一种对各种地理数据结构进行编码的JSON数据格式。GeoJson支持点线面等多种几何图形,type表示要素类型,coordinates表示坐标数据,坐标通常是WSG-84.
在index.html中引入turf:
<script src="https://unpkg.com/@turf/turf/turf.min.js"></script>
代码解读
该代码引入Turf.js库,这是一个用于地理空间分析的JavaScript库。通过CDN方式加载Turf.js的最小化版本(turf.min.js),使开发者能够在浏览器环境中直接使用Turf提供的各种地理空间计算功能。
核心特性
Turf.js提供超过100种地理空间工具函数,包括缓冲区计算、点线面关系判断、距离测量等。该库采用GeoJSON作为标准数据格式,支持各类空间分析操作。
典型应用场景
- 计算两点间地理距离
- 生成多边形缓冲区
- 判断点与多边形的位置关系
- 进行路径规划与空间分析
- 处理地理围栏相关逻辑
const linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]]);
console.log(linestring1)
// 把geoJson对象转换成了实体entity
const data = Cesium.GeoJsonDataSource.load(linestring1)
data.then(res => {
viewer.entities.add(res.entities.values[0])
viewer.zoomTo(res.entities.values[0])
})
代码功能解读
以下代码实现了将GeoJSON格式的线数据(LineString)转换为Cesium中的实体(Entity),并在地图上显示和缩放至该实体:
// 使用Turf.js创建GeoJSON格式的线数据(LineString)
const linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]]);
console.log(linestring1); // 输出GeoJSON对象到控制台
// 将GeoJSON对象转换为Cesium实体
const data = Cesium.GeoJsonDataSource.load(linestring1);
data.then(res => {
viewer.entities.add(res.entities.values[0]); // 将转换后的实体添加到Cesium场景
viewer.zoomTo(res.entities.values[0]); // 将视图缩放到该实体
});
核心组件说明
Turf.js LineStringturf.lineString()方法创建了一个GeoJSON线要素,坐标数组格式为[经度, 纬度]。示例中的线包含四个节点:[-24,63]、[-23,60]、[-25,65]、[-20,69]。
Cesium数据加载Cesium.GeoJsonDataSource.load()异步加载GeoJSON数据,返回Promise对象。转换过程自动处理坐标参考系和几何类型。
实体添加与视图控制res.entities.values[0]获取转换后的第一个实体(线要素)。通过viewer.entities.add()添加到场景,viewer.zoomTo()确保实体在视图中可见。
关键注意事项
- 异步处理:
load()返回Promise,需使用.then()或async/await处理结果。 - 坐标顺序:GeoJSON默认使用
[经度, 纬度],与Cesium的Cartographic格式一致。 - 错误处理:实际应用中建议添加
.catch()处理加载失败情况。

加载多个线geojson以及删除datasources的方法:
const multiline = turf.multiLineString([[[8, 8], [10, 10]], [[1, 1], [5, 5]]]);
Cesium.GeoJsonDataSource.load(multiline).then(res => {
data = res
viewer.dataSources.add(data);
viewer.zoomTo(data);
})
viewer.dataSources.remove(data)
功能解读
该代码片段实现了在Cesium地图上加载和显示GeoJSON格式的多线段数据,并进行基本的视图控制和数据管理操作。以下是逐行解析:
代码分解
创建多线段GeoJSON数据
const multiline = turf.multiLineString([[[8, 8], [10, 10]], [[1, 1], [5, 5]]]);
- 使用Turf.js库的
multiLineString方法创建包含两条线段的GeoJSON对象 - 第一条线段坐标对:
[8,8]到[10,10] - 第二条线段坐标对:
[1,1]到[5,5]
加载并显示数据
Cesium.GeoJsonDataSource.load(multiline).then(res => {
data = res
viewer.dataSources.add(data);
viewer.zoomTo(data);
})
- 通过
Cesium.GeoJsonDataSource.load()异步加载GeoJSON数据 - 加载完成后将返回的数据源实例赋值给变量
data - 通过
viewer.dataSources.add()将数据源添加到地图视图 viewer.zoomTo()自动调整视角至包含全部线段的合适范围
移除数据源
viewer.dataSources.remove(data)
- 从地图中移除先前加载的线段数据源
- 注意:此操作需要确保
data变量已正确赋值且作用域可用
注意事项
- 需要提前初始化Cesium的
viewer对象 - Turf.js库需单独引入
- 移除操作建议放在回调函数内以避免时序问题
- 坐标采用WGS84经纬度格式(经度,纬度)
二、topoJson数据
TopoJSON 是 GeoJSON 按拓扑学编码后的扩展形式,是由 D3 的作者 Mike Bostock 制定的。
相比 GeoJSON 直接使用 Polygon、Point 之类的几何体来表示图形的方法,TopOJSON 中的每一个几何体都是通过将共享边(被称为arcs)整合后组成的。TopOJSON 拓扑表示共享一个称为弧的位置序列的一个或多个几何。
TOPOJSON 作为 GeoJSON 的扩展,支持多种几何类型:
Point,LineString,Polygon,MultiPoint,MultiLineString,MultiPolygon 和 GeometryCollection。
TopoJSON 中的几何可能包含其他属性,以对非几何数据进行编码。Mapshaper和arcgis都采用过这种拓扑格式。
TopOJSON消除了冗余,共享的弧段仅存储一次,允许将相关的几何有效地存储在同一文件中。例如,内蒙古自治区和辽宁省之间的共享边界仅存储一次,而不是在两个省都重复。

const promise = Cesium.GeoJsonDataSource.load('/src/assets/usa.topojson')
viewer.dataSources.add(promise)
viewer.zoomTo(promise):
promise.catch(function(error) {
console.error('加载失败:', error);
});

三、Kml
KML全称:Keyhole Markup Language,是基于XML(eXtensible Markup Language,可扩展标记语言)语法标准的一种标记语言(markuplanguage),采用标记结构,含有嵌套的元素和属性。
由Google(谷歌(页面存档备份,存于互联网档案馆))旗下的Keyhole公司发展并维护,用来表达地理标记。
根据KML语言编写的文件则为KML文件,格式同样采用的XML文件格式,应用于Google地球相关软件中(Google Earth,Google Map, Google Maps for mobile…),用于显示地理数据(包括点、线、面、多边形,多面体以及模型…)。
而现在很多GIS相关企业也追随Google开始采用此种格式进行地理数据的交换。
const promise = Cesium.KmlDataSource.load('/src/assets/gdp2008.kmz')
console.log(promise)
viewer.dataSources.add(promise)

四、动态数据格式CZML
CZML是JSON的子集,这意味着一个有效的CZML文档也是一个有效的JSON文档。具体来说,CZML文档包含一个JSON数组,其中数组中的每个对象字面量元素都是一个CZMLPacket。CZML包描述场景中单个对象的图形属性,例如单个飞机。
这种数据格式,使得Cesium具备实现动态数据的能力。
CZML包含点、线、地标、模型等一些图形元素,并指明了这些元素如何随时间而变化。

viewer = new Cesium.Viewer('cesiumContainer', {
shouldAnimate: true // 开启场景动画
})
//Cesium.CzmDataSource
data.then(res => {
viewer.dataSources.add(res);
let entity = res.entities.getById("Vehicle")
viewer.trackedEntity = entity; //trackedEntity 可以实现一直移动相机跟踪entity目标
})
代码功能解读
这段代码使用Cesium库创建了一个3D地球视图,并加载动态数据源实现实体跟踪功能。以下是逐部分解析:
创建Cesium Viewer
viewer = new Cesium.Viewer('cesiumContainer', {
shouldAnimate: true // 开启场景动画
})
cesiumContainer:HTML页面中用于承载3D场景的DOM元素IDshouldAnimate: true:启用场景自动渲染循环,使动态效果(如实体移动、相机飞行)能够平滑播放
加载数据源并跟踪实体
data.then(res => {
viewer.dataSources.add(res);
let entity = res.entities.getById("Vehicle")
viewer.trackedEntity = entity;
})
data.then():处理异步加载完成的数据源(通常为CZML或GeoJSON格式)viewer.dataSources.add(res):将解析后的数据源添加到场景中res.entities.getById("Vehicle"):从数据源中获取ID为"Vehicle"的特定实体viewer.trackedEntity = entity:启用相机自动跟踪,使视图始终跟随目标实体移动
关键特性说明
- 动态跟踪:当"Vehicle"实体位置发生变化时,相机视角会自动调整保持该实体在视野中心
- 数据驱动:通过CZML等时间动态数据格式,可实现实体轨迹回放等时空可视化效果
- 性能优化:
shouldAnimate参数控制渲染策略,设置为true时持续渲染,适合动态场景
典型应用场景
- 车辆/飞行器轨迹追踪
- 实时监控系统
- 时空数据可视化演示
- 动态模拟演练系统

如有收获,点个赞吧!
关注我,学习三维GIS开发不迷路
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)