本文介绍了四种常见的地理数据格式及其在Cesium中的使用方法:

  1. GeoJSON - 基于JSON的地理数据格式,支持点线面等几何图形;
  2. TopoJSON - GeoJSON的拓扑扩展,通过共享边界减少冗余;
  3. KML - XML格式的地理标记语言,广泛用于Google Earth;
  4. 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 LineString
turf.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变量已正确赋值且作用域可用

注意事项

  1. 需要提前初始化Cesium的viewer对象
  2. Turf.js库需单独引入
  3. 移除操作建议放在回调函数内以避免时序问题
  4. 坐标采用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元素ID
  • shouldAnimate: 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:启用相机自动跟踪,使视图始终跟随目标实体移动

关键特性说明

  1. 动态跟踪:当"Vehicle"实体位置发生变化时,相机视角会自动调整保持该实体在视野中心
  2. 数据驱动:通过CZML等时间动态数据格式,可实现实体轨迹回放等时空可视化效果
  3. 性能优化shouldAnimate参数控制渲染策略,设置为true时持续渲染,适合动态场景

典型应用场景

  • 车辆/飞行器轨迹追踪
  • 实时监控系统
  • 时空数据可视化演示
  • 动态模拟演练系统

如有收获,点个赞吧!
关注我,学习三维GIS开发不迷路

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐