欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

战疫情-用地图揭秘“逆行者”

程序员文章站 2022-07-15 22:37:59
...

疫情发生以后,全国人民几乎都听从号召,在家自我隔离,但是,却有这么一批人,被称作“逆行者”,他们就是全国各省前往湖北支援的医护人员,他们赶去疫情的中心点,不畏艰苦和困难,铸成了隔离病毒的“新的长城”。下面我们将介绍,如何在地图上揭秘各省“逆行者”数据,信息主体为全国各省支援湖北的医护人员人数,使用的平台是SuperMap iClient3D 10i for WebGL。

1.数据准备

(1)底图

使用全国行政区划图,SuperMap iDesktop范例数据下就有名为“China Province pg”的全国行政区划矢量面数据,删除不必要的属性字段后,直接将其导出成GeoJson。

以全国各省的省名制作三维标签专题图,然后生成s3m缓存,这里选择该方式来制作标签,而不是前端使用lable实*作,是因为前两天研发说优化了文本s3m缓存和文本地图缓存在WebGL上面的显示效果,我赶紧找研发同事要了WebGL临时版本,测试发现,果然文本显示得很清晰,而以前版本文本会发虚,特别是计算机分辨率设置成125%时尤为严重。

(2)尾迹线效果数据

制作全国各省分别流向湖北的动态尾迹线效果,我们需要各省的中心点坐标,这儿我们直接用各省面数据的内点,可通过iDesktop中“类型转换”-“面转点”实现。

(3)全国各省支援湖北医护人员数量数据

该数据来源于长江日报,其中不包含解放军医疗队人数,截止日期是2月15号,本文并不对该数据真实性和准确性负责。将该数据编辑到各省点数据的属性中后,将点数据导出成GeoJson。

先来一张成果图:

战疫情-用地图揭秘“逆行者”

2.功能实现

(1)创建三维球

我们隐藏掉导航控件,隐藏掉太阳,星空背景和三维球面,并将场景背景色改为蓝色,整体的行政区划面呈一个曲面,禁止信息框和隐藏选择提示,这样鼠标点击面实体时,界面上不会有任何提示,代码如下:

    var viewer = new Cesium.Viewer('cesiumContainer',{
		navigation:false,//隐藏导航控件
		infoBox:false,//禁止信息框
		selectionIndicator : false//隐藏选择提示
	});
    var scene = viewer.scene;
	viewer.scene.backgroundColor = new Cesium.Color(5/255, 27/255, 51/255, 255/255);//设置场景背景色
	scene.globe.show=false;//隐藏三维球体
	scene.sun.show=false;//隐藏太阳
	scene.skyBox.show=false;//隐藏天空盒

(2)打开标签专题图

先将标签专题图用iserver发布成三维服务,然后打开该服务数据,代码如下:

	var promise = scene.open("http://localhost:8090/iserver/services/3D-China_Province_pg/rest/realspace");//打开标签专题图服务
        Cesium.when(promise,function(layers){
     
     })//服务加载完成的回调,在回调中加载行政区划面,尾迹线和代表医护人员人数的圆圈

(3)添加行政区划面

该段代码添加到上面的回调中,代码如下:

Cesium.loadJson('China_Data.json').then(function(jsonData) { 
						 
			    var polygonfeatures=jsonData.features;//各省面要素集合
				var color=new Cesium.Color(26/255, 59/255, 90/255, 255/255);//面颜色
				var linecolor=new Cesium.Color(54/255, 96/255, 146/255, 255/255);//面边框线颜色
						 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=[];
									
									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)//面节点异常判断
									{
													viewer.entities.add({//构造面实体
																		 
																 polygon : {
																	 hierarchy : Cesium.Cartesian3.fromDegreesArrayHeights(points),
																	 perPositionHeight : true,
																	 material : color,
																	 outline:true,
																	 outlineColor : linecolor
																 }
																 
															 });
									}
								}
								else
								{						
									var feature=polygonfeature[0];
									var points=[];
									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)
									{
															 viewer.entities.add({
																 polygon : {
																		 hierarchy : Cesium.Cartesian3.fromDegreesArrayHeights(points),
																		 perPositionHeight : true,
																		 material : color,
																		 outline:true,
																		 outlineColor : linecolor
																 }
															 });
									}
								}
								
							}
							 
						 }
			}).otherwise(function(error) {
			});

(4)添加尾迹线和代表各省支援湖北医护人员数量的圆

尾迹线由各省指向湖北,医护人员数量决定圆圈的半径,代码如下:

var ellipsecolor=new Cesium.Color(50/255, 173/255, 180/255, 100/255);//圆圈颜色
			Cesium.loadJson('China_Doc.json').then(function(DocData) {
				for(var i=0;i<DocData.features.length;i++)
				{
					var point=DocData.features[i].geometry.coordinates;//各省除湖北外的内点坐标
					var DocCount=DocData.features[i].properties.Doc;
					var points=[];
					if(DocCount<200)//为了保证圆圈在小比例尺下也能看到,最小值取200
					{
						DocCount=200;
					}
					var R=parseInt(DocCount/100)*15000;//医护人员数量确定圆圈半径
					points.push(point[0]);
					points.push(point[1]);
					points.push(112.866487619079);//湖北内点坐标,是固定的
					points.push(31.1766459770616);
					viewer.entities.add({ // 尾迹线
					                polyline: {
					                    width: 5,
										hMax:100000,
					                    positions: Cesium.Cartesian3.fromDegreesArray(points),
					                    material: new Cesium.PolylineTrailMaterialProperty({ // 尾迹线材质
					                        color: Cesium.Color.fromCssColorString("rgba(118, 233, 241, 1.0)"),
					                        trailLength : 0.6,
					                        period : 3.0
					                    })
					                }
					            });
					
					    viewer.entities.add({//圆圈
					    position: Cesium.Cartesian3.fromDegrees(point[0],point[1]),
					    ellipse : {
					        semiMinorAxis : R,
					        semiMajorAxis : R,
							height: 10000.0,
					        material : ellipsecolor
					    }
					});
					
				}
			})

semiMinorAxis : R,
semiMajorAxis : R,
height: 10000.0,
material : ellipsecolor
}
});

				}
			})

范例代码可以在超图技术资源中心下载,http://support.supermap.com.cn/,搜索“逆行者”,再点击“超图代码”即可下载

相关标签: 三维GIS