ArcGIS地图结合eCharts 实现迁徙图

基于ArcGIS API for JavaScript,以ArcGIS Server提供的服务为底图,实现eCharts的迁徙图。

效果如下:


首先下载ArcGIS地图扩展,扩展在github上,网址:https://github.com/wandergis/arcgis-echarts3


下载完成后,可以查看作者提供的example,里面有两个示例,但并未提供使用教程,而且实例可能并不能成功打开,这与我们的环境配置有关。

下面是实现迁徙图的具体步骤:

1.配置Echarts3Layer.js

将src文件夹拷贝至ArcGIS API for JavaScript配置路径下,为了便于引用,拷贝到与init.js处于同一级目录。笔者的路径为:D:\program\Web\webapps\arcgis_js_api\library\3.23\3.23,



2.创建一个项目

创建一个项目,将ArcGIS扩展中的dist文件夹和libs文件夹拷贝到项目文件夹中,在项目文件夹新建一个html文件。

3.引入js和css文件

要求引入的文件有三个。引入文件一定要按照一定的顺序,否则会出错。main.js一定要在引入init.js之前引入

<link  rel="stylesheet"  type="text/css" href="http://localhost:8080/arcgis_js_api/library/3.23/3.23/esri/css/esri.css" />
<script src="dist/main.js"></script>
<script src="http://localhost:8080/arcgis_js_api/library/3.23/3.23/init.js"></script>

4.加载ArcGIS服务地图

与ArcGIS API for JavaScript中加载的方法一样,没有改变,此处我们使用官方提供的底图 basemap:"osm"

var map;
require(["esri/map","eCharts/Echarts3Layer"],function (Map,Echarts3Layer) {
    map=new Map("mapDiv",{
        basemap:"osm",
        logo:false,
        zoom:5,
        center:[100,30]
    })

5.加载eChart

在加载ArcGIS服务代码下添加以下代码,将eCharts添加到图层

map.on('load',function () {
    //eChart添加到图层
    var overlay = new Echarts3Layer(map, echarts);
    var chartsContainer = overlay.getEchartsContainer();
    var myChart = overlay.initECharts(chartsContainer);

    option = {
        //设置配置选项
    }

    myChart.setOption(option);
}

6.加载数据

var geoCoordMap = {
'上海': [ 121.4648, 31.2891],
'东莞': [ 113.8953, 22.901],
'东营': [ 118.7073, 37.5513],
'中山': [ 113.4229, 22.478],
'临汾': [ 111.4783, 36.1615],
'临沂': [ 118.3118, 35.2936],
'丹东': [ 124.541, 40.4242],
'丽水': [ 119.5642, 28.1854],
'乌鲁木齐': [ 87.9236, 43.5883],
'佛山': [ 112.8955, 23.1097],
'保定': [ 115.0488, 39.0948],
'兰州': [ 103.5901, 36.3043],
'包头': [ 110.3467, 41.4899],
'北京': [ 116.4551, 40.2539],
'北海': [ 109.314, 21.6211],
'南京': [ 118.8062, 31.9208],
'南宁': [ 108.479, 23.1152],
'南昌': [ 116.0046, 28.6633],
'南通': [ 121.1023, 32.1625],
'厦门': [ 118.1689, 24.6478],
'台州': [ 121.1353, 28.6688],
'合肥': [ 117.29, 32.0581],
'呼和浩特': [ 111.4124, 40.4901],
'咸阳': [ 108.4131, 34.8706],
'哈尔滨': [ 127.9688, 45.368],
'唐山': [ 118.4766, 39.6826],
'嘉兴': [ 120.9155, 30.6354],
'大同': [ 113.7854, 39.8035],
'大连': [ 122.2229, 39.4409],
'天津': [ 117.4219, 39.4189],
'太原': [ 112.3352, 37.9413],
'威海': [ 121.9482, 37.1393],
'宁波': [ 121.5967, 29.6466],
'宝鸡': [ 107.1826, 34.3433],
'宿迁': [ 118.5535, 33.7775],
'常州': [ 119.4543, 31.5582],
'广州': [ 113.5107, 23.2196],
'廊坊': [ 116.521, 39.0509],
'延安': [ 109.1052, 36.4252],
'张家口': [ 115.1477, 40.8527],
'徐州': [ 117.5208, 34.3268],
'德州': [ 116.6858, 37.2107],
'惠州': [ 114.6204, 23.1647],
'成都': [ 103.9526, 30.7617],
'扬州': [ 119.4653, 32.8162],
'承德': [ 117.5757, 41.4075],
'拉萨': [ 91.1865, 30.1465],
'无锡': [ 120.3442, 31.5527],
'日照': [ 119.2786, 35.5023],
'昆明': [ 102.9199, 25.4663],
'杭州': [ 119.5313, 29.8773],
'枣庄': [ 117.323, 34.8926],
'柳州': [ 109.3799, 24.9774],
'株洲': [ 113.5327, 27.0319],
'武汉': [ 114.3896, 30.6628],
'汕头': [ 117.1692, 23.3405],
'江门': [ 112.6318, 22.1484],
'沈阳': [ 123.1238, 42.1216],
'沧州': [ 116.8286, 38.2104],
'河源': [ 114.917, 23.9722],
'泉州': [ 118.3228, 25.1147],
'泰安': [ 117.0264, 36.0516],
'泰州': [ 120.0586, 32.5525],
'济南': [ 117.1582, 36.8701],
'济宁': [ 116.8286, 35.3375],
'海口': [ 110.3893, 19.8516],
'淄博': [ 118.0371, 36.6064],
'淮安': [ 118.927, 33.4039],
'深圳': [ 114.5435, 22.5439],
'清远': [ 112.9175, 24.3292],
'温州': [ 120.498, 27.8119],
'渭南': [ 109.7864, 35.0299],
'湖州': [ 119.8608, 30.7782],
'湘潭': [ 112.5439, 27.7075],
'滨州': [ 117.8174, 37.4963],
'潍坊': [ 119.0918, 36.524],
'烟台': [ 120.7397, 37.5128],
'玉溪': [ 101.9312, 23.8898],
'珠海': [ 113.7305, 22.1155],
'盐城': [ 120.2234, 33.5577],
'盘锦': [ 121.9482, 41.0449],
'石家庄': [ 114.4995, 38.1006],
'福州': [ 119.4543, 25.9222],
'秦皇岛': [ 119.2126, 40.0232],
'绍兴': [ 120.564, 29.7565],
'聊城': [ 115.9167, 36.4032],
'肇庆': [ 112.1265, 23.5822],
'舟山': [ 122.2559, 30.2234],
'苏州': [ 120.6519, 31.3989],
'莱芜': [ 117.6526, 36.2714],
'菏泽': [ 115.6201, 35.2057],
'营口': [ 122.4316, 40.4297],
'葫芦岛': [ 120.1575, 40.578],
'衡水': [ 115.8838, 37.7161],
'衢州': [ 118.6853, 28.8666],
'西宁': [ 101.4038, 36.8207],
'西安': [ 109.1162, 34.2004],
'贵阳': [ 106.6992, 26.7682],
'连云港': [ 119.1248, 34.552],
'邢台': [ 114.8071, 37.2821],
'邯郸': [ 114.4775, 36.535],
'郑州': [ 113.4668, 34.6234],
'鄂尔多斯': [ 108.9734, 39.2487],
'重庆': [ 107.7539, 30.1904],
'金华': [ 120.0037, 29.1028],
'铜川': [ 109.0393, 35.1947],
'银川': [ 106.3586, 38.1775],
'镇江': [ 119.4763, 31.9702],
'长春': [ 125.8154, 44.2584],
'长沙': [ 113.0823, 28.2568],
'长治': [ 112.8625, 36.4746],
'阳泉': [ 113.4778, 38.0951],
'青岛': [ 120.4651, 36.3373],
'韶关': [ 113.7964, 24.7028]
};

var BJData = [
[{name: '北京'}, {name: '上海', value: 95}],
[{name: '北京'}, {name: '广州', value: 90}],
[{name: '北京'}, {name: '大连', value: 80}],
[{name: '北京'}, {name: '南宁', value: 70}],
[{name: '北京'}, {name: '南昌', value: 60}],
[{name: '北京'}, {name: '拉萨', value: 50}],
[{name: '北京'}, {name: '长春', value: 40}],
[{name: '北京'}, {name: '包头', value: 30}],
[{name: '北京'}, {name: '重庆', value: 20}],
[{name: '北京'}, {name: '常州', value: 10}]
];

var SHData = [
[{name: '上海'}, {name: '包头', value: 95}],
[{name: '上海'}, {name: '昆明', value: 90}],
[{name: '上海'}, {name: '广州', value: 80}],
[{name: '上海'}, {name: '郑州', value: 70}],
[{name: '上海'}, {name: '长春', value: 60}],
[{name: '上海'}, {name: '重庆', value: 50}],
[{name: '上海'}, {name: '长沙', value: 40}],
[{name: '上海'}, {name: '北京', value: 30}],
[{name: '上海'}, {name: '丹东', value: 20}],
[{name: '上海'}, {name: '大连', value: 10}]
];

var GZData = [
[{name: '广州'}, {name: '福州', value: 95}],
[{name: '广州'}, {name: '太原', value: 90}],
[{name: '广州'}, {name: '长春', value: 80}],
[{name: '广州'}, {name: '重庆', value: 70}],
[{name: '广州'}, {name: '西安', value: 60}],
[{name: '广州'}, {name: '成都', value: 50}],
[{name: '广州'}, {name: '常州', value: 40}],
[{name: '广州'}, {name: '北京', value: 30}],
[{name: '广州'}, {name: '北海', value: 20}],
[{name: '广州'}, {name: '海口', value: 10}]
];

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[ 0].name];
var toCoord = geoCoordMap[dataItem[ 1].name];
if (fromCoord && toCoord) {
res.push([{
coord: fromCoord
}, {
coord: toCoord
}]);
}
}
return res;
};


7.设置渲染参数和配置项

渲染参数是指线条和点的样式,动画的样式等。配置项(option)是决定数据的展示方式及展示内容。

var color = [ '#a6c84c', '#ffa022', '#46bee9'];
var series = [];
[[ '北京', BJData], [ '上海', SHData], [ '广州', GZData]].forEach( function (item, i) {
series.push({
name: item[ 0] + ' Top10',
type: 'lines',
zlevel: 1,
effect: {
show: true,
period: 6,
trailLength: 0.7,
color: '#fff',
symbolSize: 3
},
lineStyle: {
normal: {
color: color[i],
width: 0,
curveness: 0.2
}
},
data: convertData(item[ 1])
},
{
name: item[ 0] + ' Top10',
type: 'lines',
zlevel: 2,
effect: {
show: true,
period: 6,
trailLength: 0,
symbol: planePath,
symbolSize: 15
},
lineStyle: {
normal: {
color: color[i],
width: 1,
opacity: 0.4,
curveness: 0.2
}
},
data: convertData(item[ 1])
},
{
name: item[ 0] + ' Top10',
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: 2,
rippleEffect: {
brushType: 'stroke'
},
label: {
normal: {
show: true,
position: 'right',
formatter: '{b}'
}
},
symbolSize: function (val) {
return val[ 2] / 8;
},
itemStyle: {
normal: {
color: color[i]
}
},
data: item[ 1].map( function (dataItem) {
return {
name: dataItem[ 1].name,
value: geoCoordMap[dataItem[ 1].name].concat([dataItem[ 1].value])
};
})
});
});

option = {
// backgroundColor: '#404a59',
title: {
text: 'ArcGIS JS API扩展Echarts3之模拟迁徙',
subtext: 'Develop By WanderGIS',
left: 'center',
textStyle: {
color: '#fff'
}
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
top: 'bottom',
left: 'right',
data: [ '北京 Top10', '上海 Top10', '广州 Top10'],
textStyle: {
color: '#fff'
},
selectedMode: 'single'
},
geo: {
map: '',
label: {
emphasis: {
show: false
}
},
roam: true,
itemStyle: {
normal: {
areaColor: '#323c48',
borderColor: '#404a59'
},
emphasis: {
areaColor: '#2a333d'
}
}
},
series: series
};


全部代码:

<!DOCTYPE html >
< html lang= "en" >
< head >
< meta charset= "UTF-8" >
< title >测试程序 </ title >
< link rel= "stylesheet" type= "text/css" href= "http://localhost:8080/arcgis_js_api/library/3.23/3.23/esri/css/esri.css" />
< script src= "../dist/main.js" > < / script >
< script src= "http://localhost:8080/arcgis_js_api/library/3.23/3.23/init.js" > < / script >
</ head >
< body >
< div id= "mapDiv" ></ div >
< script >
var map; //把map从require中拿出来,全局
require([ "esri/map", "src/Echarts3Layer", "dojo/domReady!"], function (Map,Echarts3Layer) {
map= new Map( "mapDiv",{
logo: false,
basemap: "osm",
center: [ 122.45, 37.75], // longitude, latitude
zoom: 5
})
map.on( 'load', function () {
//eCharts添加到图层
var overlay= new Echarts3Layer(map,echarts);
var chartsContainer=overlay.getEchartsContainer();
var myChart=overlay.initECharts(chartsContainer);

// 定义各地区经纬度坐标
var geoCoordMap = {
'上海': [ 121.4648, 31.2891],
'东莞': [ 113.8953, 22.901],
'东营': [ 118.7073, 37.5513],
'中山': [ 113.4229, 22.478],
'临汾': [ 111.4783, 36.1615],
'临沂': [ 118.3118, 35.2936],
'丹东': [ 124.541, 40.4242],
'丽水': [ 119.5642, 28.1854],
'乌鲁木齐': [ 87.9236, 43.5883],
'佛山': [ 112.8955, 23.1097],
'保定': [ 115.0488, 39.0948],
'兰州': [ 103.5901, 36.3043],
'包头': [ 110.3467, 41.4899],
'北京': [ 116.4551, 40.2539],
'北海': [ 109.314, 21.6211],
'南京': [ 118.8062, 31.9208],
'南宁': [ 108.479, 23.1152],
'南昌': [ 116.0046, 28.6633],
'南通': [ 121.1023, 32.1625],
'厦门': [ 118.1689, 24.6478],
'台州': [ 121.1353, 28.6688],
'合肥': [ 117.29, 32.0581],
'呼和浩特': [ 111.4124, 40.4901],
'咸阳': [ 108.4131, 34.8706],
'哈尔滨': [ 127.9688, 45.368],
'唐山': [ 118.4766, 39.6826],
'嘉兴': [ 120.9155, 30.6354],
'大同': [ 113.7854, 39.8035],
'大连': [ 122.2229, 39.4409],
'天津': [ 117.4219, 39.4189],
'太原': [ 112.3352, 37.9413],
'威海': [ 121.9482, 37.1393],
'宁波': [ 121.5967, 29.6466],
'宝鸡': [ 107.1826, 34.3433],
'宿迁': [ 118.5535, 33.7775],
'常州': [ 119.4543, 31.5582],
'广州': [ 113.5107, 23.2196],
'廊坊': [ 116.521, 39.0509],
'延安': [ 109.1052, 36.4252],
'张家口': [ 115.1477, 40.8527],
'徐州': [ 117.5208, 34.3268],
'德州': [ 116.6858, 37.2107],
'惠州': [ 114.6204, 23.1647],
'成都': [ 103.9526, 30.7617],
'扬州': [ 119.4653, 32.8162],
'承德': [ 117.5757, 41.4075],
'拉萨': [ 91.1865, 30.1465],
'无锡': [ 120.3442, 31.5527],
'日照': [ 119.2786, 35.5023],
'昆明': [ 102.9199, 25.4663],
'杭州': [ 119.5313, 29.8773],
'枣庄': [ 117.323, 34.8926],
'柳州': [ 109.3799, 24.9774],
'株洲': [ 113.5327, 27.0319],
'武汉': [ 114.3896, 30.6628],
'汕头': [ 117.1692, 23.3405],
'江门': [ 112.6318, 22.1484],
'沈阳': [ 123.1238, 42.1216],
'沧州': [ 116.8286, 38.2104],
'河源': [ 114.917, 23.9722],
'泉州': [ 118.3228, 25.1147],
'泰安': [ 117.0264, 36.0516],
'泰州': [ 120.0586, 32.5525],
'济南': [ 117.1582, 36.8701],
'济宁': [ 116.8286, 35.3375],
'海口': [ 110.3893, 19.8516],
'淄博': [ 118.0371, 36.6064],
'淮安': [ 118.927, 33.4039],
'深圳': [ 114.5435, 22.5439],
'清远': [ 112.9175, 24.3292],
'温州': [ 120.498, 27.8119],
'渭南': [ 109.7864, 35.0299],
'湖州': [ 119.8608, 30.7782],
'湘潭': [ 112.5439, 27.7075],
'滨州': [ 117.8174, 37.4963],
'潍坊': [ 119.0918, 36.524],
'烟台': [ 120.7397, 37.5128],
'玉溪': [ 101.9312, 23.8898],
'珠海': [ 113.7305, 22.1155],
'盐城': [ 120.2234, 33.5577],
'盘锦': [ 121.9482, 41.0449],
'石家庄': [ 114.4995, 38.1006],
'福州': [ 119.4543, 25.9222],
'秦皇岛': [ 119.2126, 40.0232],
'绍兴': [ 120.564, 29.7565],
'聊城': [ 115.9167, 36.4032],
'肇庆': [ 112.1265, 23.5822],
'舟山': [ 122.2559, 30.2234],
'苏州': [ 120.6519, 31.3989],
'莱芜': [ 117.6526, 36.2714],
'菏泽': [ 115.6201, 35.2057],
'营口': [ 122.4316, 40.4297],
'葫芦岛': [ 120.1575, 40.578],
'衡水': [ 115.8838, 37.7161],
'衢州': [ 118.6853, 28.8666],
'西宁': [ 101.4038, 36.8207],
'西安': [ 109.1162, 34.2004],
'贵阳': [ 106.6992, 26.7682],
'连云港': [ 119.1248, 34.552],
'邢台': [ 114.8071, 37.2821],
'邯郸': [ 114.4775, 36.535],
'郑州': [ 113.4668, 34.6234],
'鄂尔多斯': [ 108.9734, 39.2487],
'重庆': [ 107.7539, 30.1904],
'金华': [ 120.0037, 29.1028],
'铜川': [ 109.0393, 35.1947],
'银川': [ 106.3586, 38.1775],
'镇江': [ 119.4763, 31.9702],
'长春': [ 125.8154, 44.2584],
'长沙': [ 113.0823, 28.2568],
'长治': [ 112.8625, 36.4746],
'阳泉': [ 113.4778, 38.0951],
'青岛': [ 120.4651, 36.3373],
'韶关': [ 113.7964, 24.7028]
};

//定义各条路线
var BJData = [
[{name: '北京'}, {name: '上海', value: 95}],
[{name: '北京'}, {name: '广州', value: 90}],
[{name: '北京'}, {name: '大连', value: 80}],
[{name: '北京'}, {name: '南宁', value: 70}],
[{name: '北京'}, {name: '南昌', value: 60}],
[{name: '北京'}, {name: '拉萨', value: 50}],
[{name: '北京'}, {name: '长春', value: 40}],
[{name: '北京'}, {name: '包头', value: 30}],
[{name: '北京'}, {name: '重庆', value: 20}],
[{name: '北京'}, {name: '常州', value: 10}]
];

var SHData = [
[{name: '上海'}, {name: '包头', value: 95}],
[{name: '上海'}, {name: '昆明', value: 90}],
[{name: '上海'}, {name: '广州', value: 80}],
[{name: '上海'}, {name: '郑州', value: 70}],
[{name: '上海'}, {name: '长春', value: 60}],
[{name: '上海'}, {name: '重庆', value: 50}],
[{name: '上海'}, {name: '长沙', value: 40}],
[{name: '上海'}, {name: '北京', value: 30}],
[{name: '上海'}, {name: '丹东', value: 20}],
[{name: '上海'}, {name: '大连', value: 10}]
];

var GZData = [
[{name: '广州'}, {name: '福州', value: 95}],
[{name: '广州'}, {name: '太原', value: 90}],
[{name: '广州'}, {name: '长春', value: 80}],
[{name: '广州'}, {name: '重庆', value: 70}],
[{name: '广州'}, {name: '西安', value: 60}],
[{name: '广州'}, {name: '成都', value: 50}],
[{name: '广州'}, {name: '常州', value: 40}],
[{name: '广州'}, {name: '北京', value: 30}],
[{name: '广州'}, {name: '北海', value: 20}],
[{name: '广州'}, {name: '海口', value: 10}]
];

//定义传值函数
var convertData = function (data) {
var res = [];
for ( var i = 0; i < data.length; i++) {
var dataItem = data[i];
var fromCoord = geoCoordMap[dataItem[ 0].name];
var toCoord = geoCoordMap[dataItem[ 1].name];
if (fromCoord && toCoord) {
res.push([{
coord: fromCoord
}, {
coord: toCoord
}]);
}
}
return res;
};

var color = [ '#a6c84c', '#ffa022', '#46bee9'];
var series = [];
[[ '北京', BJData], [ '上海', SHData], [ '广州', GZData]].forEach( function (item, i) {
series.push({
name: item[ 0] + ' Top10',
type: 'lines',
zlevel: 1,
effect: {
show: true,
period: 6,
trailLength: 0.7,
//定以尾部特效
color: '#fff',
symbolSize: 4
},
//显示转换框中的颜色变化
lineStyle: {
normal: {
color: color[i],
width: 0,
curveness: 0.2
}
},
data: convertData(item[ 1])
},
{
name: item[ 0] + ' Top10',
type: 'lines',
zlevel: 2,
effect: {
show: true,
period: 6,
trailLength: 0,
symbol: 'circle',
symbolSize: 6,
color: '#fff',
shadowBlur: 10
},
lineStyle: {
normal: {
color: '#00ffff',
width: 2,
opacity: 0.7,
curveness: 0.2 //弯曲程度设置0-1逐渐增大
}
},
data: convertData(item[ 1])
},
{
name: item[ 0] + ' Top10',
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: 2,
rippleEffect: {
brushType: 'stroke'
},
label: {
normal: {
show: true,
position: 'right',
formatter: '{b}'
}
},
//设置点显示样式
// symbolSize: function (val) {
// return val[2] / 8;
// },
symbolSize : function (v){
return 12
},
itemStyle: {
normal: {
color: color[i]
}
},
data: item[ 1].map( function (dataItem) {
return {
name: dataItem[ 1].name,
value: geoCoordMap[dataItem[ 1].name].concat([dataItem[ 1].value])
};
})
});
});

option = {
// backgroundColor: '#404a59',
title: {
text: 'ArcGIS JS API扩展Echarts3之模拟迁徙',
/* subtext: '',*/
left: 'center',
textStyle: {
color: '#fff'
}
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
top: 'bottom',
left: 'right',
data: [ '北京 Top10', '上海 Top10', '广州 Top10'],
textStyle: {
color: '#fff'
},
selectedMode: 'single'
},
//设置不同级别数据以不同的显示方式
dataRange: {
show: false, //是否显示调节条
min: 0,
max: 100,
// x: '760',
// y: '5', //这里的x\y代表了啥?
orient: 'horizontal',
calculable: true,
color: [ '#ff3333', 'orange', 'yellow', 'lime', 'aqua'],
textStyle: {
color: '#fff'
}
},
geo: {
map: '',
label: {
emphasis: {
show: false
}
},
roam: true,

itemStyle: {
normal: {
areaColor: '#323c48',
borderColor: '#404a59'
},
emphasis: {
areaColor: '#2a333d'
}
}
},
series: series
};
// 使用刚指定的配置项和数据显示图表。
overlay.setOption(option);
})
})
< / script >
</ body >
</ html >

猜你喜欢

转载自blog.csdn.net/scaped/article/details/79763846