【CesiumJS入门】(5)GooJSON的加载、更新、监听与销毁——GeoJsonDataSource应用

news/2024/11/8 0:49:22/

前言

本篇,我们将较完整得介绍Cesium中GeoJSON/TopoJSON相关的方法。

GeoJSON规范地址:RFC 7946: The GeoJSON Format (rfc-editor.org)
GeoJSON在线绘制:geojson.io

CesiumJS提供了一个名为DataSource的类,它主要是用来加载和展示矢量数据,包括但不限于 GeoJSON、KML、TopoJSON、CZML等格式的数据。而今天,我们将介绍DataSource的一个子类GeoJsonDataSource。让我们直入主题,写一个包括了GeoJSON数据的加载、更新、销毁、监听等方法的类。

一、准备

准备GeoJSON文件,你可以在我上面提供的在线绘制网站直接绘制,也可以从这个项目的代码仓库里下载:src/assets/geojson

// 将这些文件引入:
import pointSample from '@/assets/geojson/point.json' // 示例点要素
import lineSample from '@/assets/geojson/line.json' // 示例线要素
import polygonSample from '@/assets/geojson/polygon.json' // 示例面要素
import collectionSample from '@/assets/geojson/collection.json' // 示例要素集合

二、加载

把类的框架写出来,让后向里面加入第一个方法,load()

class CesiumGeoJSON {constructor(data, options, callback) {this.data = data;this.options = options;this.dataSource = null;// 初始化 GeoJSON 数据源this.init(callback);}// 初始化 GeoJSON 数据源init(callback) {Cesium.GeoJsonDataSource.load(this.data, this.options).then((dataSource) => {this.dataSource = dataSourceviewer.dataSources.add(this.dataSource);// this.dataSource.describe = ''// this.dataSource.credit = ''// dataSource.show = true // boolean - Whether to show// dataSource.name = '' // string - The name of the data sourceviewer.zoomTo(this.dataSource)callback && callback(this.dataSource) // 触发回调函数}).catch((error) => {console.error('矢量数据加载发生了一些错误:', error);})}
}

从上面的代码可以看出,我们在创建和初始化这个类的实例对象时,可以提供3个参数:

  • data —— GeoJSON或TopoJSON的数据源,可以是string、object或Cesium的Resource格式。
  • options —— 加载数据源时的可选项:GeoJsonDataSource.LoadOptions
  • callback —— 回调函数,将加载完成的矢量数据(dataSource)暴露出去供调用
// 调用:实例化然后就直接加载
const jsonInstance= new CesiumGeoJSON(collectionSample)

在这里插入图片描述

三、更新(重新加载)

在实际生产中,我们可能需要修改数据源,达到一个更新数据、重新加载的效果。那么就让我们向CesiumGeoJSON类中加入下述方法:

  // 更新(重新加载)数据源async update(newData, options) {if (this.dataSource == null) {throw new Error('矢量数据未加载或已被销毁');}if (typeof newData == 'object') {// 使用 Cesium.Resource 对象创建一个新的 GeoJSON 数据源,这么做才能触发changeEventconst resource = new Cesium.Resource({url: URL.createObjectURL(new Blob([JSON.stringify(newData)], { type: 'application/json' }))});return await this.dataSource.load(resource, options)} else {return await this.dataSource.load(newData, options)}}

调用:

// 实例化然后就直接加载
constjsonInstance = new CesiumGeoJSON(collectionSample)// 调用:2秒后更新数据
setTimeout(() => {jsonInstance.update(pointSample)
}, 2000);

在这里插入图片描述

四、新增(不替换已有的数据)

如果我需要向数据集中额外添加新的矢量数据呢?那就添加这个方法:

   // 新增(不替换已有的数据)数据源async add(newData, options) {if (this.dataSource == null) {throw new Error('矢量数据未加载或已被销毁');}// 使用 Cesium.Resource 对象创建一个新的 GeoJSON 数据源,这么做才能触发changeEventconst resource = new Cesium.Resource({url: URL.createObjectURL(new Blob([JSON.stringify(newData)], { type: 'application/json' }))});// 重新加载数据源return await this.dataSource.process(resource, options);}

在上一步的基础上再调用,加入线数据:

// 实例化后加载
constjsonInstance = new CesiumGeoJSON(collectionSample)setTimeout(() => {jsonInstance.update(pointSample)jsonInstance.add(lineSample) // 调用:添加数据
}, 2000);

在这里插入图片描述

五、监听

  // 监听数据源的变化watch() {if (this.dataSource == null) {throw new Error('矢量数据未加载或已被销毁');}// 监听数据源变化事件this.dataSource.changedEvent.addEventListener(this._changedEvent);// 监听错误事件this.dataSource.errorEvent.addEventListener(this._errorEvent);}// 数据源变化的事件_changedEvent(dataSource) {console.log('矢量数据源已被修改:', dataSource);}// 数据错误的事件_errorEvent(err) {console.error('矢量数据加载发生了一些错误:', err);}

六、销毁

  // 销毁数据源和监听器destroy() {if (this.dataSource == null) {throw new Error('矢量数据未加载或已被销毁');}// 取消所有监听器this.dataSource.changedEvent.removeEventListener(this.changedEvent);this.dataSource.errorEvent.removeEventListener(this.errorEvent)// 移除数据源viewer.dataSources.remove(this.dataSource);this.dataSource = null;console.log('CesiumGeoJSON has been destroyed.');}

0. 最后

代码提交记录:
feat: 新增GeoJSON相关方法 · 0f31b7e · ReBeX/cesium-tyro-blog - Gitee.com
fix: 优化数据源更新方法 · 411ab3f · ReBeX/cesium-tyro-blog - Gitee.com


http://www.ppmy.cn/news/456149.html

相关文章

小米摄像头外接喇叭

小米摄像头喇叭声音太小,距离远点就听不到。找了一个笔记本的USB无源音箱,这样的就可以。 剪掉一个喇叭下来就好了,像这样,然后撕掉摄像头底座胶帽,用螺丝刀拆开摄像头,找到喇叭,喇叭是装在底座…

树莓派装机接入显示屏开机黑屏

树莓派4B 用的2k电脑显示屏,HDMI接上开机后闪一下,然后就黑屏了。 新装的官网64位,粗略感觉显示屏分辨率问题。 1. 把sd卡插入电脑 打开boot,找到config.txt 2. 定义分辨率 把以下插入第一行 hdmi_force_hotplug1 hdmi_grou…

2k2实用球员_NBA2K Online2实用平民球员推荐:上篇

歪?歪?老乡们都在吧?这里是菜狗子选手诸葛维奇的球员攻略贴,不删档测试已经开了一周了,不知道各位老哥对游戏的体验怎么样呢?作为资深平民玩家,菜奇坦言自己本身真的是个纯正的菜狗子,技术绝对在众多MVP的平均水平之下,但就算如此菜奇仍然敢在这里做球员推荐,就是遵循…

超分重建数据集 DIV2K Flickr2K 下载地址【有效分享】

🥇 版权: 本文由【墨理学AI】原创、首发、各位大佬、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ ❤️【专栏:数据集整理】❤️ 之【有效拒绝假数据】 👋 Follow me &…

小米34寸2k显示器打开hdmi,同时开启144hdz和解决屏幕过白的问题

小米34寸2k显示器打开hdmi,同时开启144hdz和解决屏幕过白的问题 环境介绍: 项目值电脑MacBook Pro (15-inch, 2018)操作系统mac os Big Sur显示器小米曲面显示器 34英寸 正文: 打开HIDPI: 关闭SIP可以参考macOS 开启或关闭 SIP - 少数派, 这里我就不再追溯了 打开终端在终…

露出真容,小米家用摄像头拆解,看看有什么

一、拆解 底座橡皮圈拆掉后,露出四个螺丝钉,这是第一步 2. 拧掉螺丝钉,打开底座,露出内部结构,初睹真容 3. 仔细看,第一眼看到一个大的正德出品的电机 其中的接线: 紫白两线为开机控制按钮粗线…

Liunx开发工具:git和gdb

目录 一. git的功能和使用 1.1 git的功能 1.2 git三板斧 1.3 git使用中的其他问题 二. 使用gdb调试代码 2.1 生成带有调试信息的可执行程序 2.2 gdb调试代码的方法 一. git的功能和使用 1.1 git的功能 git是一块开源、免费的版本管理系统,能够高效敏捷地处…

单机手机游戏的成功规律

单机手机游戏的成功规律 愤怒的小鸟、割绳子、小鳄鱼爱洗澡、宝石迷阵、三重镇、俄罗斯方块、数独、水果忍者、神庙逃亡、真实赛车。 一 相同点 1 原创 :原创游戏 ≠ 游戏好玩 每个人都喜欢没玩过的手机游戏,对于每个人而言,没玩过的就…