planetary.js——生成动态地球的有趣插件

2024-01-19 23:30

本文主要是介绍planetary.js——生成动态地球的有趣插件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

时间:2020-5-13

前言(背景):
最近,笔者的个人网站的搭建接近完成,其中用到了一个比较有趣的插件planetary.js。它的作用是,可以生成一个性能(UI)良好可交互的地球。话不多说,先上个我的个人网站(www.zksky.top)的UI效果图(笔者觉得效果还不错):

test1

一、前期准备

在官网上下载,并在HTML中引入相关文件。笔者只用到了下列三个文件。

    <script src='./palnetary/d3.v3.min.js'></script><script src='./palnetary/topojson.v1.min.js'></script><script src='./palnetary/planetaryjs.min.js'></script>

在HTML中设置画布:

<canvas id="globe"></canvas>

二、js代码实现

1、全局变量
var globe = planetaryjs.planet();
//在planetaryjs中的中国坐标
var China = [250, -20, 0];
//获取dom元素
var canvas = document.getElementById("globe");
2、planetaryjs配置函数
function initGlobe() {//加载我们的自定义“autorotate”插件,配置地球旋转角度globe.loadPlugin(autorotate(10));//配置生成地球的颜色globe.loadPlugin(planetaryjs.plugins.earth({topojson: { file: "data/world-110m-withlakes.json" },oceans: { fill: '#000040' },land: { fill: '#1b72b0' },borders: { stroke: '#000055', lineWidth: 1, type: 'internal' }}));//配置鼠标拖动事件globe.loadPlugin(planetaryjs.plugins.drag({onDragStart() {this.plugins.autorotate.pause();},onDragEnd() {this.plugins.autorotate.resume();}}))//加载点插件,并配置颜色//ttl是显示的时间长短,//angle是ping的最大角度(它将在其TTL范围内增长到此大小);默认为5//可以在每个数据点中配置,如不配置。则采用这里的默认配置globe.loadPlugin(planetaryjs.plugins.pings({color: "yellow", ttl: 2000, angle: 3}))//加载亮点addPingsThing();//页面中加载globe的大小和位置globeLcation();//绘制globe的cavasglobe.draw(canvas);//地球旋转的初始位置globe.projection.rotate(China);//监听窗口大小变化window.addEventListener("resize", () => globeLcation());
}

下面的几个函数都在上述初始化函数initGlobe()中进行了调用和配置。

3、自定义autorotate插件,配置地球旋转角度函数
function autorotate(dps) {return function (planet) {var lastTick = null;var paused = false;planet.plugins.autorotate = {//为后面的按空格键暂停功能做准备pause: function () {paused = true;},resume: function () {paused = false;},ispaused: function () {return paused;}};//并将钩子配置到其生命周期的某些部分。planet.onDraw(function () {if (paused || !lastTick) {lastTick = new Date();} else {var now = new Date();var delta = now - lastTick;//此插件使用内置投影(由D3提供)//每次我们画地球仪时都要旋转。var rotation = planet.projection.rotate();rotation[0] += dps * delta / 1000;if (rotation[0] >= 180)rotation[0] -= 360;planet.projection.rotate(rotation);lastTick = now;}});};
};
4、加载json文件中的经纬度点函数
function addPingsThing() {//数据点在data文件夹下的life.json文件中d3.json("data/life.json", (error, data) => {if (error) return console.error(error);setInterval(() => {for (const point of data.life) {globe.plugins.pings.add(经度, 维度, { color: "white",ttl: 3000, angle: 5 });}}, 3000);})
}
5、动态改变生成地球的大小和位置

通过监听监听窗口大小,动态改变生成地球的大小和位置。其目的是,自动适配手机端和PC端的显示器。

function globeLcation() {const vw = window.innerWidth;//返回较大的那个值,通过下列式子 转换成了最大值为500,最小值为300const diam = Math.max(300, Math.min(500, vw - (vw * .6)));const radius = diam / 2;canvas.width = diam;canvas.height = diam;globe.projection.scale(radius).translate([radius, radius]);var vpx = -0.2 * diam + 220;$(".visitor-body").css("padding-top", vpx + "px");$(".visitor-body").css("padding-bottom", vpx + "px");
}
6、监听空格键。

按下时地球停滞在中国上方。再次按下空格,继续转动。

/*** 监听空格键,按下时地球停在中国上方* 再次按下,继续转动*/
$(document).keydown(function (event) {if (event.keyCode == 32) {var paused = globe.plugins.autorotate.ispaused();if (paused == false) {globe.projection.rotate([250, -20, 0]);globe.plugins.autorotate.pause();} else if (paused == true) {globe.plugins.autorotate.resume();}//去掉PC端固有的空格,下滑事件return false;}
});

后记

笔者的个人网站主页是:https://www.zksky.top/。
想看笔者实现的简单效果的朋友,欢迎访问!

这篇关于planetary.js——生成动态地球的有趣插件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math