本文介绍了Cesium中四种常见地理数据格式(GeoJSON、TopoJSON、KML、CZML)的加载方法。GeoJSON和TopoJSON使用GeoJsonDataSource加载,KML使用KmlDataSource加载,而CZML则使用CzmlDataSource加载。每种格式都提供了相应的JavaScript代码示例,展示如何加载数据源、添加到视图并进行视图定位。特别地,CZML还支持相机跟踪特定实体的功能。这些数据源组件为在Cesium中处理各类地理数据提供了统一接口。

原视频教程,点这里查看

一、数据源(DataSources)

数据源是Cesium中用于加载和管理地理数据的组件。它可以处理多种格式的数据,包括GeoJSON、TopoJSON、KML和CZML。

加载GeoJSON数据

GeoJSON是一种编码各种地理数据结构的JSON格式。以下是如何加载GeoJSON数据的示例:

constgeoJsonData ={
  "type":"FeatureCollection",
  "features":[
    {
      "type":"Feature",
      "geometry":{
        "type":"Point",
        "coordinates":[-122.39,47.5]
      }
    }
  ]
};
constgeoJsonPromise =Cesium.GeoJsonDataSource.load(geoJsonData);
geoJsonPromise.then(function(dataSource) {
  viewer.dataSources.add(dataSource);
  viewer.zoomTo(dataSource);
});

代码功能解读

这段代码实现了在Cesium地图引擎中加载并显示一个GeoJSON格式的地理数据点,具体功能分解如下:


定义GeoJSON数据

const geoJsonData = {
  "type": "FeatureCollection",
  "features": [{
    "type": "Feature",
    "geometry": {
      "type": "Point",
      "coordinates": [-122.39, 47.5]
    }
  }]
};
  • 数据结构geoJsonData是一个符合GeoJSON标准的对象,包含一个点要素(Point)。
  • 坐标[-122.39, 47.5]表示西雅图附近的经纬度(经度-122.39,纬度47.5)。

加载GeoJSON数据

const geoJsonPromise = Cesium.GeoJsonDataSource.load(geoJsonData);
  • 方法调用Cesium.GeoJsonDataSource.load()是Cesium提供的API,用于解析GeoJSON数据并返回一个Promise对象。
  • 异步处理:返回的geoJsonPromise需通过.then()处理加载完成后的逻辑。

添加数据源并缩放到目标

geoJsonPromise.then(function(dataSource) {
  viewer.dataSources.add(dataSource);
  viewer.zoomTo(dataSource);
});
  • 数据源添加viewer.dataSources.add(dataSource)将解析后的GeoJSON数据添加到Cesium的Viewer实例中。
  • 视图缩放viewer.zoomTo(dataSource)自动调整地图视图以完整显示加载的GeoJSON要素(此处为单个点)。

关键对象说明

  • Cesium.Viewer:Cesium的核心地图容器,需提前初始化(代码中未展示,假设已存在)。
  • GeoJsonDataSource:Cesium中专门处理GeoJSON数据的类,支持点、线、面等几何类型。

注意事项

  1. 依赖检查:确保Cesium库已正确引入,且viewer实例已初始化。
  2. 错误处理:建议通过.catch()补充Promise的异常处理逻辑。
  3. 扩展性:若需加载远程GeoJSON文件,可将geoJsonData替换为URL字符串。

二、加载TopoJSON数据

TopoJSON是GeoJSON的一种扩展,它通过整合共享边来减少数据冗余。加载TopoJSON数据的步骤与GeoJSON类似,但需要指定TopoJSON数据源:

consttopoJsonPromise =Cesium.GeoJsonDataSource.load('path/to/topojson.data');
topoJsonPromise.then(function(dataSource) {
  viewer.dataSources.add(dataSource);
  viewer.zoomTo(dataSource);
});

代码功能解读

以下代码片段实现了使用Cesium库加载TopoJSON格式的地理数据,并将其添加到3D地球视图中:

const topoJsonPromise = Cesium.GeoJsonDataSource.load('path/to/topojson.data');
topoJsonPromise.then(function(dataSource) {
  viewer.dataSources.add(dataSource);
  viewer.zoomTo(dataSource);
});

实现步骤解析

数据加载阶段
Cesium.GeoJsonDataSource.load()方法创建了一个Promise对象,用于异步加载位于指定路径的TopoJSON文件。该方法会自动处理GeoJSON/TopoJSON格式转换。

回调处理阶段
当Promise解析成功后,执行.then()回调函数。参数dataSource包含已解析的地理数据,此时通过viewer.dataSources.add()将数据源添加到Cesium的3D地球实例中。

视图调整阶段
viewer.zoomTo(dataSource)自动调整相机视角,使加载的地理数据完整显示在视口范围内。该操作包括计算数据的地理边界并适配最佳观察距离。

关键特性说明

  • 异步加载:采用Promise模式避免界面阻塞,适合处理大型地理数据集
  • 格式兼容:虽然方法名为GeoJsonDataSource,但实际支持TopoJSON格式的自动转换
  • 视图联动zoomTo方法实现了数据加载后的智能视角定位,无需手动计算边界

典型应用场景

该代码适用于以下情形:

  • 在Cesium三维地球中叠加行政区划数据
  • 可视化地理分析结果(如热力图区域)
  • 动态加载用户上传的自定义地理数据集

注意:实际使用时需确保viewer为有效的Cesium.Viewer实例,且文件路径可访问。

三、加载KML数据

KML是Google Earth使用的地理数据格式。在Cesium中加载KML数据,可以使用KmlDataSource

constkmlPromise =Cesium.KmlDataSource.load('path/to/placemark.kml');
kmlPromise.then(function(dataSource) {
  viewer.dataSources.add(dataSource);
  viewer.zoomTo(dataSource);
});

功能说明

这段代码用于在Cesium中加载KML文件(一种地理标记格式),并将数据添加到地图视图中,同时自动缩放到数据范围。

代码解读

const kmlPromise = Cesium.KmlDataSource.load('path/to/placemark.kml');
  • Cesium.KmlDataSource.load:异步加载指定的KML文件(路径需替换为实际文件地址)。
  • kmlPromise:返回一个Promise对象,表示KML数据加载的异步操作。
kmlPromise.then(function(dataSource) {
  viewer.dataSources.add(dataSource);
  viewer.zoomTo(dataSource);
});
  • .then():Promise解析成功后执行的回调函数,参数dataSource为加载的KML数据。
  • viewer.dataSources.add(dataSource):将KML数据添加到Cesium的Viewer实例中。
  • viewer.zoomTo(dataSource):自动调整视角,使加载的KML数据完整显示在视野内。

注意事项

  • 需确保viewer是已初始化的Cesium Viewer实例。
  • KML文件路径需正确(支持本地或远程URL)。
  • 错误处理可通过.catch()追加,例如网络请求失败或文件解析错误。

四、加载CZML数据

CZML是专为Cesium设计的动态数据格式,它使用JSON数组来描述随时间变化的图形属性:

constczmlPromise =Cesium.CzmlDataSource.load('path/to/document.czml');
czmlPromise.then(function(dataSource) {
  viewer.dataSources.add(dataSource);
  viewer.trackedEntity = dataSource.entities.getById('ID_of_Entity');
});

在上述示例中,除了加载CZML数据源,我们还设置了trackedEntity,这允许相机自动跟踪数据源中的特定实体。

代码功能解读

这段代码使用Cesium库加载并显示CZML格式的数据源,同时追踪特定实体。CZML是Cesium的一种数据格式,用于描述动态场景和时间序列数据。

代码实现细节

const czmlPromise = Cesium.CzmlDataSource.load('path/to/document.czml');

这行代码创建一个CZML数据源的加载Promise。Cesium.CzmlDataSource.load()方法异步加载指定路径的CZML文件,返回一个Promise对象。路径可以是相对路径或绝对URL。

czmlPromise.then(function(dataSource) { viewer.dataSources.add(dataSource);

当CZML文件加载成功后,Promise解析为数据源对象。数据源被添加到Cesium的Viewer实例中,使场景显示CZML描述的所有实体。

viewer.trackedEntity = dataSource.entities.getById('ID_of_Entity'); });

设置Viewer追踪特定的实体。通过数据源的entities集合和实体ID获取目标实体,将其设为追踪对象。摄像机将自动跟随该实体的移动。

关键点说明

  • 异步加载机制:使用Promise处理CZML文件的异步加载
  • 数据源管理:通过Viewer的dataSources集合管理多个数据源
  • 实体追踪:trackedEntity属性控制摄像机的自动追踪行为
  • 错误处理:实际应用中应添加catch处理加载失败情况

典型应用场景

这段代码适用于:

  • 可视化动态地理数据
  • 展示飞行器轨迹
  • 模拟传感器覆盖范围
  • 任何需要时间序列地理空间数据的应用
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐