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

相关文章

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队