3D视角下的全球新冠肺炎实时分布

2024-02-25 09:18

本文主要是介绍3D视角下的全球新冠肺炎实时分布,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从新冠肺炎发生以来,诸多平台都提供了新冠肺炎实时信息,例如:百度,QQ,抖音,贴吧等,多数是以二维地图和统计图表来展示实时疫情信息,下面我们介绍如何制作3D视角下的全球疫情实时信息平台,信息主体为全球各国的新冠累计确诊人数,使用的平台是SuperMap iClient3D 10i for WebGL。

1.数据准备

(1)底图

使用世界行政区划图,SuperMap iDesktop范例数据下就有名为“World”的世界各国行政区划矢量面数据。首先我们得保证“World”数据各国名称的翻译,与我们之后需要对接的实时数据中各国名称翻译一致,待修改为一致后,在属性中删除掉不需要的字段(减小数据量),然后把“World”数据导出为GeoJson。

(2)实时新冠肺炎数据

这里使用的是该服务https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5,这个服务不足之处在于,只有中国的新冠肺炎数据是实时的,外国的并没有实时更新,如果是项目需求的话,建议找更好的实时数据服务,或者跟本地卫健委合作。

先来一张成果图:

在这里插入图片描述

2.功能实现

系统总体设计为,点击三维球面任何一个国家的行政区面,右上角信息框弹出,并显示该国家的新冠累计确诊人数。

(1)解析实时数据

我们向上面提到的地址发请求,然后解析返回回来的数据,并且将需要的数据以Key-Value的形式存储起来,其中Key为国家名称,Value为确诊人数,实现代码如下:

    var diseaseArray={};//以Key-Value形式存储返回所需要的结果,其中Key为国家名称,Value为确诊人数$.ajax({type: "get",url: "https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5",dataType:"json",success: function (result) {var resultObj = JSON.parse(result.data);//返回结果转成易解析的key-value形式var diseaseData=resultObj.areaTree;for(var i=0;i<diseaseData.length;i++){var name=diseaseData[i].name;var confirm=diseaseData[i].total.confirm;diseaseArray[name]=confirm;}//获取各国确诊人数,并以key-value形式添加到diseaseArray},error: function (msg) {console.log(msg);}})

(2)创建三维球

我们隐藏掉导航控件,隐藏掉太阳,星空背景和三维球面,着重体现世界行政区划面,代码如下:

    var viewer = new Cesium.Viewer('cesiumContainer',{navigation:false//隐藏导航控件});var scene = viewer.scene;scene.globe.show=false;//隐藏三维球体scene.sun.show=false;//隐藏太阳scene.skyBox.show=false;//隐藏天空盒

(3)分段专题图来体现各国疫情实况

加载json数据,读取各个国家对应面节点,以及各个国家名称,通过polygon类型的entity来构造面。entity的name指定成需要展示的各国新冠确诊人数信息,这样选中entity后,infobox就会在右上角自动弹出,并且展示name中设置的信息,entity的颜色按照各国新冠确诊人数来区分。这里需要提到的一个点是,某个国家的矢量面数据,可能是由多个面组合而成,即MultiPolygon,在解析面数据的时候需要区分该国的矢量面是一个面还是多个面。具体代码如下:

		 Cesium.loadJson('world_data.json').then(function(jsonData) {var polygonfeatures=jsonData.features;for(var i=0;i<polygonfeatures.length;i++){var polygonfeature=polygonfeatures[i].geometry.coordinates;//各国的面要素for(var j=0;j<polygonfeature.length;j++){if(polygonfeature.length>1)//该国家矢量面由多个面对象组合而成的情况{var feature=polygonfeature[j][0];var points=[];var name=polygonfeatures[i].properties.COUNTRY;var color=null;if(diseaseArray.hasOwnProperty(name)){//判断该国是否有确诊病例var confirm=diseaseArray[name];//获取确诊人数name=name+"确诊人数是:"+confirm;//name中信息将会直接展示到infobox中if(Number(confirm)>10000)//按确诊人数不同,面的颜色也不同{color=new Cesium.Color(102/255, 2/255,8/255, 1);}else if(Number(confirm)>500 && Number(confirm)<=10000){color=new Cesium.Color(140/255, 13/255,13/255, 1);}else if(Number(confirm) <=500 && Number(confirm)>100){color=new Cesium.Color(204/255, 41/255,41/255, 1);}else if(Number(confirm) <=100 && Number(confirm)>10){color=new Cesium.Color(255/255, 123/255,105/255, 1);}else{color=new Cesium.Color(255/255, 170/255,133/255, 1);}}else{name=name+":没有确认病例";color=new Cesium.Color(1, 1,1,1)}for(var k=0;k<feature.length;k++)//读取每个面的节点信息,并存进数组{						 var x=feature[k][0];var y=feature[k][1];var z=0;points.push(x);points.push(y);points.push(z);						 }if(points[0]!=undefined)//面节点异常判断{var redPolygon = viewer.entities.add({//构造面实体name : name,													 polygon : {hierarchy : Cesium.Cartesian3.fromDegreesArrayHeights(points),perPositionHeight : true,material : color,outline:true,outlineColor : Cesium.Color.BLACK,heightReference:Cesium.HeightReference.CLAMP_TO_GROUND}});}}else//该国家矢量面仅由一个面对象构成的情况{						var feature=polygonfeature[0];var points=[];var name=polygonfeatures[i].properties.COUNTRY;if(diseaseArray.hasOwnProperty(name)){var confirm=diseaseArray[name];name=name+"确诊人数是:"+confirm;if(Number(confirm)>10000){color=new Cesium.Color(102/255, 2/255,8/255, 1);}else if(Number(confirm)>500 && Number(confirm)<=10000){color=new Cesium.Color(140/255, 13/255,13/255, 1);}else if(Number(confirm) <=500 && Number(confirm)>100){color=new Cesium.Color(204/255, 41/255,41/255, 1);}else if(Number(confirm) <=100 && Number(confirm)>10){color=new Cesium.Color(255/255, 123/255,105/255, 1);}else{color=new Cesium.Color(255/255, 170/255,133/255, 1);}}else{name=name+":没有确认病例";color=new Cesium.Color(1, 1,1,1)}for(var k=0;k<feature.length;k++){						 var x=feature[k][0];var y=feature[k][1];var z=0;points.push(x);points.push(y);points.push(z);}if(points[0]!=undefined){var redPolygon = viewer.entities.add({name : name,polygon : {hierarchy : Cesium.Cartesian3.fromDegreesArrayHeights(points),perPositionHeight : true,material : color,outline:true,outlineColor : Cesium.Color.BLACK,heightReference:Cesium.HeightReference.CLAMP_TO_GROUND}});}}}}}).otherwise(function(error) {});

(4)添加图例

直接上图例样式代码:

<style type="text/css">.linear{position: absolute;bottom: 10px;right: 0px;z-index: 1;width: 300px;height: 10px;border-radius: 5px;background-image: linear-gradient(to right, rgb(255,255,255) 16%, rgb(255,170,133) 16%,rgb(255,170,133) 32%,rgb(255,123,105) 32%,rgb(255,123,105) 48%, rgb(204,41,41) 48%, rgb(204,41,41) 65%, rgb(104,13,13) 65%,rgb(104,13,13) 82%, rgb(102,2,8) 82%);}
</style><div class="linear"></div>
<p style="position: absolute;right: 248px;bottom: 20px;color: white;z-index: 1;">0</p>
<p style="position: absolute;right: 197px;bottom: 20px;color: white;z-index: 1;">10</p>
<p style="position: absolute;right: 146px;bottom: 20px;color: white;z-index: 1;">100</p>
<p style="position: absolute;right: 93px;bottom: 20px;color: white;z-index: 1;">500</p>
<p style="position: absolute;right: 30px;bottom: 20px;color: white;z-index: 1;">10000</p>

范例代码可以在超图技术资源中心下载,http://support.supermap.com.cn/,搜索“全球新冠确诊实时分布图”,再点击“超图代码”即可下载

这篇关于3D视角下的全球新冠肺炎实时分布的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745047

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

全球AI产品Top100排行榜

Web Top50的榜单里,AIGC类型的应用占比52%,遥遥领先。AIGC类型包括图像、视频、音乐、语音等的内容生成和编辑。音乐生成应用Suno在过去六个月中的排名跃升最为显著,从第36位上升至第5位。排名第二大类是通用对话/AI聊天/角色扮演类型的应用,占比20%,包括常见的ChatGPT、Claude、Character.ai等。其他是AI写作(8%)、AI搜索/问答(6%)、Agent/

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

三.海量数据实时分析-FlinkCDC实现Mysql数据同步到Doris

FlinkCDC 同步Mysql到Doris 参考:https://nightlies.apache.org/flink/flink-cdc-docs-release-3.0/zh/docs/get-started/quickstart/mysql-to-doris/ 1.安装Flink 下载 Flink 1.18.0,下载后把压缩包上传到服务器,使用tar -zxvf flink-xxx-

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加速产品创新:3D打印技术如同一把钥匙,为模具企业解锁了快速迭代产品设计的可能。企业能够迅速将创意转化为实体模型,缩短产品从设计到市场的周期,抢占市场先机。 强化定制化服务:面