AMap + echarts、google map + d3.js分别实现数据可视化中的飞线图(迁徙图)

首先肯定是给出demo啦:
演示demo

直接到左侧选择框中选择View taxi flow里面随便选个日期

总体介绍

最近由于工作室项目需要做一个数据可视化平台,这个平台最终是交由国外人使用的。而国内的高德地图在国外是访问很慢,所以只能使用Google map进行实现(尝试过用AMap去实现,后面改回来)
回归主题:今天要讲的是迁徙图分别用两个平台进行实现

  • AMap + eCharts.js 实现迁徙图
  • Google map + D3.js 实现迁徙图

首先先来谈一下为什么都是在map上面进行数据可视化,但是实现迁徙图的技术不同(一个用eCharts、一个用d3)?!先来讲一下高德地图(AMap)和谷歌地图实现的技术区别吧(Google map)。
在这里插入图片描述
上面是高德地图,高德地图的实现是基于canvas进行实现的,显示效果都在这个画板上显示。接下来我们看一下谷歌地图是怎么实现的?
在这里插入图片描述

可以发现谷歌地图是由一张张图片拼接而成的,两者之间谁优谁劣不说,但是实现方式不同。正由于二者实现方式不同,所以飞线图实现方式也会有不同。

在github上面仅有开发echarts-amap中间插件(当然还有百度地图的echarts-bmap),并没有一个项目作为echarts和google map的中间件。这个项目给我的时间仅仅只有5天,所以不可能也没有能力去写这个插件。所以只能另外找资料实现google map + d3.js 飞线。


一、用echarts + amap 实现飞线,首先看一下效果图

在这里插入图片描述
这里有1000+条飞线数据,这是我随机找广州景区互相生成的假数据。因为既然今天讲到了两种技术实现飞线,那么顺带展示一下两个技术的性能区别,以1000条为例子。这个是怎么实现的呢?!我大概分成以下几步来进行分析:

  • 引入echarts-amap插件,如果是非vue框架的,去找一下echarts-amap插件(我没有用,所以无法提供)。如果是vue框架的话,npm i echarts-amap --save-dev进行安装,然后在项目中require(‘eharts-amap’)就行了。
  • 找到飞线所需的echarts配置
  • 初始化echarts,然后进行设置series,就和普通的echarts图标的流程一样,以下我给出例子。

下面是整个流程需要的代码,拿走就可以了。

let mychart = this.$echarts.init($('#' + id)[0]), // 初始化echarts到目标块中
	mychart.serOption({
     amap: {
        zoom: 10,
        zooms: [3, 20],
        mapStyle: 'amap://styles/darkblue', //地图主题
        center: [113.25, 23.1], //中心点
        lang: 'en',
        resizeEnable: true
      },
      animation: false,
      series: []
	});
// 以下对象的一个例子
FlyLineOption: {
	name: 'name',
	lineColor: '#fff',
	fromName: 'fromName',
	toName: 'toName',
	fromLngLat: [123, 23],
	toLngLat: [123, 23],
	value: 1,
	symbolColor: '#000'
}

// 以下是echartsoption配置对象
{
      name: FlyLineOption.name,
      coordinateSystem: "amap",
      type: "lines",
      zlevel: 1,
      effect: {
        show: true,
        period: 6,
        trailLength: 0.7,
        color: "#fff",
        symbolSize: 3
      },
      lineStyle: {
        normal: {
          color: FlyLineOption.lineColor,
          width: 0,
          curveness: 0.2
        }
      },
      data: [
        {
          fromName: FlyLineOption.fromName,
          toName: FlyLineOption.toName,
          coords: [FlyLineOption.fromLngLat, FlyLineOption.toLngLat],
          value: FlyLineOption.value
        }
      ]
    },
    {
      name: FlyLineOption.name,
      coordinateSystem: "amap",
      type: "lines",
      zlevel: 2,
      symbol: ["none", "arrow"],
      symbolSize: 10,
      lineStyle: {
        normal: {
          c
  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
是的,three.js和tween.js可以一起使用,实现复杂的动画效果,包括飞线动画。以下是一个简的例子,演示了如何使用three.js和tween.js创建一条飞线动画: ```javascript // 创建three.js场景 var scene = new THREE.Scene(); // 创建相机 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; // 创建渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建飞线路径 var curve = new THREE.CatmullRomCurve3([ new THREE.Vector3(-10, 0, 0), new THREE.Vector3(-5, 5, 0), new THREE.Vector3(0, 0, 0), new THREE.Vector3(5, -5, 0), new THREE.Vector3(10, 0, 0) ]); // 创建飞线材质 var material = new THREE.LineBasicMaterial({ color: 0xffffff }); // 将飞线路径转换为几何体 var geometry = new THREE.Geometry(); geometry.vertices = curve.getPoints(50); // 创建飞线网格 var line = new THREE.Line(geometry, material); scene.add(line); // 创建飞线动画 var tween = new TWEEN.Tween({t:0}) .to({t:1}, 5000) // 5秒钟 .onUpdate(function() { // 根据tween的进度计算飞线的位置 var position = curve.getPoint(this.t); // 更新飞线网格的位置 line.position.copy(position); }) .start(); // 渲染场景 function render() { requestAnimationFrame(render); TWEEN.update(); // 更新tween动画 renderer.render(scene, camera); } render(); ``` 在这段代码,我们首先创建了一个three.js场景、相机和渲染器。然后,我们创建了一个CatmullRomCurve3曲线,用于定义飞线路径,并将其转换为three.js几何体。接下来,我们创建了一个TWEEN.Tween对象,将其起始值设置为0,结束值设置为1,表示飞线动画的进度。在Tween对象的 onUpdate 回调函数,我们根据飞线路径计算当前进度对应的位置,并将飞线网格的位置更新为该位置。最后,我们创建了一个渲染函数,用于在每帧更新Tween动画和渲染场景。 希望这个例子可以帮助你了解如何使用three.js和tween.js创建飞线动画。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值