Echarts世界流向图

【前言】
Echarts----世界流向图 demo

【效果图】
效果图如下:在这里插入图片描述
【CODE】
code如下:

 /*
    图中相关城市经纬度,根据需求添加数据
    关于国家的经纬度,可以用首都的经纬度或者其他城市的经纬度
*/
var geoCoordMap = {
    '南宁': [108.479, 23.1152],
    '广州': [113.5107, 23.2196],
    '重庆': [107.7539, 30.1904],
    '芬兰': [24.909912, 60.169095], 
    '美国': [-100.696295, 33.679979], 
    '日本': [139.710164, 35.706962], 
    '韩国': [126.979208, 37.53875], 
    '瑞士': [7.445147, 46.956241],
    '东南亚': [117.53244, 5.300343], 
    '澳大利亚': [135.193845, -25.304039], 
    '德国': [13.402393, 52.518569], 
    '英国': [-0.126608, 51.208425], 
    '加拿大': [-102.646409, 59.994255]
};

/* 
    记录下起点城市和终点城市的名称,以及权重
    数组第一位为终点城市,数组第二位为起点城市,以及该城市的权重,就是图上圆圈的大小
 */

// 重庆
var CQData = [
    [{name: '芬兰'}, {name: "重庆",value: 30}],
    [{name: '德国'}, {name: "重庆",value: 30}],
    [{name: '英国'}, {name: "重庆",value: 30}],
    [{name: '重庆'}, {name: "英国",value: 30}]
];

// 广州
var GZData = [
    [{name: '日本'}, {name: "广州",value: 30}],
    [{name: '东南亚'}, {name: "广州",value: 30}]
];

// 南宁
var NNData = [
    [{name: '南宁'}, {name: "加拿大",value: 30}],
    [{name: '南宁'}, {name: "美国",value: 100}],
    [{name: '南宁'}, {name: "澳大利亚",value: 95}],
    [{name: '南宁'}, {name: "瑞士",value: 30}]
];

// 小飞机的图标,可以用其他图形替换
var planePath = 'path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705.06,1318.313z';

// 获取地图中起点和终点的坐标,以数组形式保存下来
var convertData = function(data) {
    var res = []; 
    for(var i = 0; i < data.length; i++) {
        var dataItem = data[i];
        var fromCoord = geoCoordMap[dataItem[1].name];
        var toCoord = geoCoordMap[dataItem[0].name];
        if(fromCoord && toCoord) {
            res.push([{
                coord: fromCoord // 起点坐标
            }, {
                coord: toCoord // 终点坐标
            }])
        }
    }
    return res;
}

var color  = ['#9ae5fc', '#dcbf71'];    // 自定义图中要用到的颜色
var series = [];                        // 用来存储地图数据

/*
    图中一共用到三种效果,分别为航线特效图、飞机航线图以及城市图标涟漪图。
    要用到setOption中的series属性,并且对每个城市都要进行三次设置。
*/
[['重庆', CQData],['广州', GZData],['南宁', NNData]].forEach(function(item, i) {
    series.push({
        // 白色航线特效图
        type: 'lines',    
        zlevel: 1,                    // 用于分层,z-index的效果
        effect: {
            show: true,               // 动效是否显示
            period: 6,                // 特效动画时间
            trailLength: 0.7,         // 特效尾迹的长度
            color: '#fff',            // 特效颜色
            symbolSize: 3             // 特效大小
        },
        lineStyle: {
            normal: {                 // 正常情况下的线条样式
                color: color[0],
                width: 0,             // 因为是叠加效果,要是有宽度,线条会变粗,白色航线特效不明显
                curveness: -0.2       // 线条曲度
            }
        },
        data: convertData(item[1])    // 特效的起始、终点位置
    }, {  // 小飞机航线效果
        type: 'lines',
        zlevel: 2,
        //symbol: ['none', 'arrow'],   // 用于设置箭头
        symbolSize: 10,
        effect: {
            show: true,
            period: 6,
            trailLength: 0,
            symbol: planePath,         // 特效形状,可以用其他svg pathdata路径代替
            symbolSize: 15             
        },
        lineStyle: {
            normal: {
                color: color[0],
                width: 1,
                opacity: 0.6,
                curveness: -0.2
            }
        },
        data: convertData(item[1])     // 特效的起始、终点位置,一个二维数组,相当于coords: convertData(item[1])
    }, { // 散点效果
        type: 'effectScatter',         
        coordinateSystem: 'geo',       // 表示使用的坐标系为地理坐标系
        zlevel: 3,
        rippleEffect: {
            brushType: 'stroke'        // 波纹绘制效果
        },
        label: {
            normal: {                  // 默认的文本标签显示样式
                show: true,
                position: 'left',      // 标签显示的位置
                formatter: '{b}'       // 标签内容格式器
            }
        },
        itemStyle: {
            normal: {
                color: color[0]
            }
        },
        data: item[1].map(function(dataItem) {
            return {
                name: dataItem[1].name,
                value: geoCoordMap[dataItem[1].name],  // 起点的位置
                symbolSize: dataItem[1].value / 8,  // 散点的大小,通过之前设置的权重来计算,val的值来自data返回的value
            };
        })
    });
});

// 显示终点位置,类似于上面最后一个效果,放在外面写,是为了防止被循环执行多次
series.push({
    type: 'effectScatter',
    coordinateSystem: 'geo',
    zlevel: 3,
    rippleEffect: {
        brushType: 'stroke'
    },
    label: {
        normal: {
            show: true,
            position: 'left',
            formatter: '{b}'
        }
    },
    symbolSize: function(val) {
        return val[2] / 8;
    },
    itemStyle: {
        normal: {
            color: color[1]
        }
    },
    data: [{  
        // 这里面的数据,由于一开始就知道终点位置是什么,所以直接写死,如果通过ajax来获取数据的话,还要进行相应的处理
        name: "重庆",
        value: [107.7539, 30.1904, 30],
        label: {
            normal: {
                position: 'top'
            }
        }
    }, {
        name: '广州',
        value: [113.5107, 23.2196, 30],
        label: {
            normal: {
                position: 'right'
            }
        }
    }, {
        name: '南宁',
        value: [108.479, 23.1152, 30]
    }]
});

// 最后初始化世界地图中的相关数据
var option= ({
    backgroundColor: '#404a59',
    title: {
        show:'false'
    },
    geo: {
        map: 'world',       // 与引用进来的地图js名字一致
        roam: false,        // 禁止缩放平移
        itemStyle: {        // 每个区域的样式 
            normal: {
                areaColor: '#ff8800'
            },
            emphasis: {
                areaColor: 'red'
            }
        },
        regions: [{        // 选中的区域
            name: 'China',
            selected: true,
            itemStyle: {   // 高亮时候的样式
                emphasis: {
                    areaColor: '#7d7d7d'
                }
            },
            label: {    // 高亮的时候不显示标签
                emphasis: {
                    show: false
                }
            }
        }]
    },
    series: series,   // 将之前处理的数据放到这里
    textStyle: {
        fontSize: 12
    }
});

/* 然后就没有然后了,全剧终! */

感谢 Thanks!!!

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要使用 Echarts 实现全球地流向迁移,你可以按照以下步骤进行操作: 1. 首先,确保你已经引入了 Echarts 的库文件。你可以从 Echarts 官网下载最新版本的库文件,并将其引入到你的项目中。 2. 创建一个 HTML 容器,用于显示地。例如,你可以在 HTML 文件中添加一个 `<div>` 元素,并设置其 id 属性为一个唯一的值,以便在 JavaScript 中引用。 3. 在 JavaScript 中,使用 Echarts 的 API 来配置和绘制地。首先,创建一个 Echarts 实例,并将其与 HTML 容器关联起来。然后,使用 Echarts 提供的配置项来定义地的样式和数据。 4. 在配置项中,指定地的类型为 'map',并设置地的名称和样式。例如,你可以选择 'world' 作为地的名称,并设置地的背景颜色、边界线颜色等。 5. 定义地的数据。对于迁移,你需要提供每个国家/地区的名称和迁移数据。迁移数据通常表示从一个国家/地区到另一个国家/地区的人口流动量。 6. 在配置项中,使用 Echarts 的系列配置项来定义地的系列。对于流向迁移,你可以使用 'lines' 系列来表示迁移线,使用 'effectScatter' 系列来表示迁移起点和终点的圆点。 7. 针对 'lines' 系列,设置线的样式、起点和终点的坐标、线的数值等。针对 'effectScatter' 系列,设置圆点的样式、圆点的坐标等。 8. 最后,使用 Echarts 的实例对象调用 `setOption` 方法,将配置项应用于地,并在 HTML 容器中显示地。 这是一个基本的框架,你可以根据自己的需求进一步定制和优化。具体的代码实现细节可以参考 Echarts 的官方文档和示例。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值