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

相关文章

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要