ceisum 加载geojson_使用 Cesium 动态加载 GeoJSON 数据

本文讲述了如何使用Cesium动态加载GeoJSON地震数据并按时间显示。通过设置entity的availability属性,控制对象的显示时间。文章提到了两种实现方式,包括通过GeoJsonDataSource和逐个读取feature对象添加到场景中,并强调了深度思考的重要性。
摘要由CSDN通过智能技术生成

前言

需求是这样的,我需要在地图中显示 08 年到现在的地震情况,地震都是发生在具体的时间点的,那么问题就来了,如何实现地震情况按照时间动态渲染而不是一次全部加载出来。

一、 方案分析

这里面牵扯到两个问题:第一个是如何加载 GeoJSON 格式的数据,其实也就是矢量数据,因为矢量数据之间是可以任意转换的;第二个是如何让加载的数据根据自身的时间显示。

所以就有两种解决问题的思路了:第一种,一次加载 GeoJSON 中所有数据,然后逐个设置显示时间;第二种,逐个加载 GeoJSON 中数据,并设置每个对象的显示时间。

下面我们就一步步来实现解决方案。

二、 解决方案

先来看一下整体效果:

7212ed2ef48217cefe6af0bda6f44aa3.gif

2.1 加载 GeoJSON 数据

在Cesium基础使用介绍一文中已经介绍了如何加载多种格式矢量数据,加载 GeoJSON 数据已经写出了两种方式,第一种是整体读取的,明显无法满足我们的需求,那么就只能寻求第二种方式了:

Cesium.GeoJsonDataSource.load('data/earthquake.geojson').then(function(dataSource) {

viewer.dataSources.add(dataSource);

var entities = dataSource.entities.values;

for (var i = 0; i < entities.length; i++) {

var entity = entities[i];

entity.billboard = undefined;

entity.point = new Cesium.PointGraphics({

color: Cesium.Color.RED,

pixelSize: 10

});

}

});

这里需要注意一个细节,地震数据为点状数据,需要先设置 entity.billboard = undefined,而后再设置 entity.point 来显示点状元素,否则会显示一个图标而不是点。

这样看上去是逐一添加了点状元素,但是我们的问题并没有解决,所有地震点还是全部显示出来了,并没有按照时间显示。

2.2 空间对象按照时间显示

查阅了很多资料,发现可以通过设置对象的 availability 属性来控制对象的显示时间,这正是我需要的,于是修改如下:

Cesium.GeoJsonDataSource.load('data/earthquake.geojson').then(function(dataSource) {

viewer.dataSources.add(dataSource);

var entities = dataSource.entities.values;

for (var i = 0; i < entities.length; i++) {

var entity = entities[i];

entity.billboard = undefined;

entity.point = new Cesium.PointGraphics({

color: Cesium.Color.RED,

pixelSize: 10

});

entity.availability = new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({

start: Cesium.JulianDate.fromIso8601(entity.properties.date),

stop: addDay(Cesium.JulianDate.fromIso8601(entity.properties.date))

})]);

}

});

});

可以看到只是多加了 entity.availability = ... 一项,这样就能够按照时间显示,主要是其中的 start 和 stop 属性,控制显示的时间范围。date 是 GeoJSON 中数据的一个字段,格式为 '2008-01-01',当然你也可以使用其他格式,在此处进行自定义处理即可,addDay 用于控制显示一天,此处不用多考虑。

2.3 GeoJSON 的另外一种读取方式

写到这里问题已经解决了,但是这里再说一个小插曲。刚开始的时候我将 availability 属性直接写到了 point 里,无法得到结果,于是怀疑是此方法走不通,又思考和搜索了片刻,找到了另一种读取 GeoJSON 的方法,如下:

Cesium.loadJson('data/boundary/earthquake.geojson').then(function(jsonData) {

for (var i =0 ;i<=jsonData.features.length; i++) {

var ifeature = jsonData.features[i];

viewer.entities.add({

position: Cesium.Cartesian3.fromDegrees(ifeature.geometry.coordinates[0], ifeature.geometry.coordinates[1]),

availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({

start: Cesium.JulianDate.fromIso8601(ifeature.properties.date),

stop: addDay(Cesium.JulianDate.fromIso8601(ifeature.properties.date))

})]),

point: {

pixelSize: 10,

color: Cesium.Color.RED

}

});

}

});

这同样能达到效果,这就是刚开始讨论时描述的逐个读取数据,这与前一种方式不同的是此处读取到的是逐个的 feature 对象(前一种直接读取 entity 对象),根据 feature 生成 entity 对象,再使用 viewer.entities.add 将对象添加到场景中,每个对象单独根据时间设置 availability 属性,这样同样达到了效果。

当此种方式达到效果的时候,再回头来看第一种方式豁然开朗,读取到的 entity 就是一个真实的 entity 对象,于是将 availability 从 point 中移出到外面便达到了效果。

2.4 问题分析

两种方式都能达到效果,而我在刚开始的时候对细节、对 cesium 的各个对象并没有理解的那么透彻,只是看到了表面现象,当研究的稍微深入的时候对整个 cesium 框架也就有了更多的理解,于是条条道路通罗马。

三、 总结

本文简单介绍了如何动态的根据时间加载 GeoJSON 对象,一定要保持深度思考的习惯,凡事不能只看到表面,应该多一些深入的思考。

### 回答1: 要在Cesium加载GeoJSON数据,您可以按照以下步骤操作: 1. 将GeoJSON文件加载Cesium中。您可以使用Cesiumload方法来加载文件,如下所示: ``` Cesium.load('/path/to/your/geojson/file.geojson').then(function(data) { // Do something with the data }); ``` 2. 解析GeoJSON数据。您可以使用CesiumGeoJsonDataSource来解析数据,如下所示: ``` var dataSource = new Cesium.GeoJsonDataSource(); dataSource.load('/path/to/your/geojson/file.geojson').then(function() { // Do something with the data source }); ``` 3. 将数据源添加到场景中。您可以使用Cesium的viewer对象来添加数据源,如下所示: ``` viewer.dataSources.add(dataSource); ``` 4. 设置点的样式。您可以使用Cesium的点图形来设置点的样式,如下所示: ``` dataSource.entities.point = { pixelSize: 10, color: Cesium.Color.RED }; ``` 以上是加载GeoJSON数据的基本步骤,您可以根据自己的需求进行调整和修改。 ### 回答2: Cesium是一款开源的地图可视化引擎,能够快速高效地展示地理数据,支持多种数据格式。GeoJSON是一种常用的地理数据格式,可用于描述地图上的点、线和面等要素。Cesium提供了丰富的API,能够便捷地加载GeoJSON数据,并在地图上展示。 要加载GeoJSON数据,首先需要将数据转换为Cesium可识别的格式。Cesium支持将GeoJSON转换为Cesium的Entities、Primitives和Imagery Layers等形式,其中Entities是最常用的一种形式。通过CesiumGeoJsonDataSource对象可以实现将GeoJSON数据加载为Entities,并在地图上展示。 接下来,我们可以通过Cesium内置的Viewer对象,创建一个基础地图,并将GeoJSON数据添加到地图上。下面是一段示例代码: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); //创建Viewer对象,将地图加载到'cesiumContainer'元素中 var dataSource = new Cesium.GeoJsonDataSource('myData'); //创建GeoJsonDataSource对象,并指定数据名称为'myData' var promise = dataSource.load('myPoints.geojson'); //通过load方法加载GeoJSON数据文件 viewer.dataSources.add(dataSource); //将数据源添加到Viewer中 promise.then(function() { viewer.zoomTo(dataSource); }); //当数据加载完毕,将Viewer缩放至图层范围 ``` 在上面的代码中,我们首先创建了一个Viewer对象,并将它加载到HTML元素'cesiumContainer'中。然后,创建一个GeoJsonDataSource对象,并通过load方法加载GeoJSON数据文件'myPoints.geojson'。将数据源添加到Viewer中后,使用promise.then()回调函数,在数据加载完成后将Viewer缩放至图层范围。 需要注意的是,GeoJSON数据中的属性信息将自动转换为Cesium的Entity属性,并可用于自定义标签、颜色和大小等信息。此外,通过调用Entity的show和position属性,可以方便地控制Entity的显示状态和位置。 ### 回答3: Cesium是一款开源的WebGIS平台,支持加载geojson数据GeoJson是一种基于JavaScript对象表示法(JSON)的地理数据交换格式,它能够将矢量地理数据以一种简单、轻量级的方式表示出来。 在Cesium中,加载GeoJson数据可以通过以下步骤实现: 1.创建数据源 首先,我们需要创建一个Cesium.GeoJsonDataSource对象,用于加载GeoJson数据。我们可以使用以下代码创建一个空的GeoJson数据源: var dataSource = new Cesium.GeoJsonDataSource(); 2.加载GeoJson数据 接下来,我们需要读取包含GeoJson数据的URL并加载这些数据。可以使用Cesiumload方法读取GeoJson文件并将其加载数据源中。以下是加载GeoJson数据并将其添加到数据源的示例代码: Cesium.load('path/to/geojson.json').then(function (geojson) { dataSource.load(geojson); }) 3.显示GeoJson数据 一旦我们将GeoJson数据添加到数据源中,就可以将其添加到场景中显示。以下是将GeoJson数据添加到场景中的示例代码: viewer.dataSources.add(dataSource); 完成这些步骤后,应该可以在Cesium应用程序中看到已加载GeoJson数据。 总而言之,Cesium支持加载GeoJson数据,只需要使用Cesium.GeoJsonDataSource对象方法读取、加载和显示GeoJson数据即可。这种方法使得加载大规模点数据的展示和分析变得简单,方便且易于操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值