两类地图预览效果如下:
为了保证读者们都能理解透彻
我们先做中国地图省市县三级联动,再根据代码改成某个省的市县联动!
可用于大屏展示地图
地图可以是平面的也可以是3d的,
3d地图请参考我的另一篇文章:实用且牛逼的3D旋转地图上显示柱图,可以更换成任意省市
1. 需要素材
asset存放地图各省市县的json
css是简单的布局排版
js:index3是湖南省的代码;index-china为全国代码;其余js为插件不用管
我们需要关注的就是这两个js页面;
2.HTML代码与css代码(复制可用)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Echarts 地图钻取</title>
<link rel="stylesheet" href="./css/index.css" type="text/css">
<script type="text/javascript" src="./js/echarts.min.js"></script>
<script src="./js/jquery-3.0.0.min.js"></script>
<script type="text/javascript" src="./js/index3.js"></script>
<script type="text/javascript" src="./js/china-main-city-map.js"></script>
<script type="text/javascript" src="./js/rem.js"></script>
</head>
<body>
<div class='title' >湖南</div>
<div class="box">
<button class= "backBtn" onclick="backSuperior()">返回上级</button>
<div id="mapChart" class="chart"></div>
</div>
</body>
</html>
中国的js代码(复制可用)
/* jshint esversion: 6 */
$(function() {//dom加载后执行
mapChart('mapChart')
})
/**
* 根据Json里的数据构造Echarts地图所需要的数据
* @param {} mapJson
*/
function initMapData(mapJson) {
var mapData = [];
for (var i = 0; i < mapJson.features.length; i++) {
mapData.push({
name: mapJson.features[i].properties.name,
value:Math.floor(Math.random()*2800)+200//这里是模拟的数据
//id:mapJson.features[i].id
})
}
return mapData;
}
/**
* 返回上一级地图
*/
function back(){
if(mapStack.length!=0){//如果有上级目录则执行
var map = mapStack.pop();
$.get('./asset/json/map/'+map.mapId+'.json', function (mapJson,status) {
registerAndsetOption(myChart,map.mapId,map.mapName,mapJson,false)
//返回上一级后,父级的ID、Name随之改变
parentId = map.mapId;
parentName = map.mapName;
})
}
}
/**
* Echarts地图
*/
//中国地图(第一级地图)的ID、Name、Json数据
var chinaId = 100000;
var chinaName = 'china'
var chinaJson = null;
//记录父级ID、Name
var mapStack = [];
var parentId = null;
var parentName = null;
//Echarts地图全局变量,主要是在返回上级地图的方法中会用到
var myChart = null;
function mapChart(divid){
$.get('./asset/json/map/'+chinaId+'.json', function (mapJson) {
chinaJson = mapJson;
myChart = echarts.init(document.getElementById(divid));
registerAndsetOption(myChart,chinaId,chinaName,mapJson,false)
parentId = chinaId;
parentName = 'china'
myChart.on('click', function(param,t) {
var cityId = cityMap[param.name]
if(cityId){//代表有下级地图
$.get('./asset/json/map/'+cityId+'.json', function (mapJson,status) {
registerAndsetOption(myChart,cityId,param.name,mapJson,true)
})
}else{
//没有下级地图,回到一级中国地图,并将mapStack清空
registerAndsetOption(myChart,chinaId,chinaName,chinaJson,false)
mapStack=[]
parentId = chinaId;
parentName = chinaName;
}
// $.get('./asset/json/map/'+param.data.id+'.json', function (mapJson,status) {
// registerAndsetOption(myChart,param.data.id,param.name,mapJson,true)
// }).fail(function () {
// registerAndsetOption(myChart,chinaId,'china',chinaJson,false)
// });
});
})
}
/**
*
* @param {*} myChart
* @param {*} id 省市县Id
* @param {*} name 省市县名称
* @param {*} mapJson 地图Json数据
* @param {*} flag 是否往mapStack里添加parentId,parentName
*/
function registerAndsetOption(myChart,id,name,mapJson,flag)
{
echarts.registerMap(name, mapJson);
// myChart.setOption({
// series: [{
// type: 'map',
// map: name,
// itemStyle: {
// normal: {
// areaColor: 'rgba(23, 27, 57,0)',
// borderColor: '#1dc199',
// borderWidth: 1,
// },
// },
// data:initMapData(mapJson)
// }]
// });
//上一段是地图的颜色,因为想做出根据数据大小展示颜色不同所以用了以下一段代码
myChart.setOption({
//左下角lengend
tooltip : {
// show: true,
trigger: 'item',
formatter: function(params) {//鼠标移动时展示当前省市县的数据
if (params.data) return params.name + ':' + params.data['value']
},
},
// dataRange: {
// show:false,
// x: 'left',
// y: 'bottom',
// splitList: [
// {start: 5, end: 5, color: 'orange'},//当值为5时,区域背景
// {start: 10, end: 10, color: '#F2D010'},//当值为10时,区域背景
// {start: 15, end: 15, color: '#ccc'},//当值为15时,区域背景
// ]
// },
visualMap: {//颜色的展示,这里是不显示,可以打开看看
show:false,
min: 200,//阈值
max: 3000,
left:'1%',
bottom:'1%',
itemWidth: 25,
itemHeight: 100,
text:['高','低'],
realtime: false,
calculable: true,
textStyle: {
color:'#fff',
fontSize:'20'
},
inRange: {
color: ['#18b0ff','#ffde00', '#ff6f18']
}
},
series: [{//地图的一些属性设置
hoverable: true, //鼠标经过时,是否高亮显示
type: 'map',
map: name,
label: {
normal: {
show: true,
color:"#fff",//城市名称颜色
fontSize:10//城市名称字体大小
},
emphasis: {
show: true,
color:"#fff",
fontSize:10
}
},
itemStyle: {
normal: {
areaColor: 'rgba(7,157,233,0.4)',//背景颜色值
borderColor: '#ddd',
},
emphasis: {
areaColor: '#3093d8'//指向颜色值
}
},
//
data: initMapData(mapJson)
}]
});
if(flag){//往mapStack里添加parentId,parentName,返回上一级使用
mapStack.push({
mapId: parentId,
mapName: parentName
});
parentId = id;
parentName = name;
}
}
湖南的js代码(复制可用)
注释的是我自己写的公司需要业务代码 ,根据实际情况改,我这里做的是1.每次下钻就请求数据填充下级地图 2.大屏页面其他模块图表数据联动;可以不用理会
/* jshint esversion: 6 */
/**
* Echarts地图
*/
//中国地图(第一级地图)的ID、Name、Json数据
var chinaId = 430000;
var chinaName = '湖南'
var chinaJson = null;
var CITYID;
//记录父级ID、Name
var mapStack = [];
var parentId = 430000;
var parentName = '湖南';
var initState=true;
//Echarts地图全局变量,主要是在返回上级地图的方法中会用到
var myChart = null;
$(function () {//dom加载后执行
mapChart('mapChart');//
})
/**
* 根据Json里的数据构造Echarts地图所需要的数据
* @param {} mapJson
*/
function initMapData(mapJson) {
var mapData = [];
for (var i = 0; i < mapJson.features.length; i++) {
mapData.push({
name: mapJson.features[i].properties.name,
value:Math.floor(Math.random()*5000)+200
//id:mapJson.features[i].id
})
}
return mapData;
}
/**
* 返回上一级地图
*/
function backSuperior() {
if (mapStack.length != 0) {//如果有上级目录则执行
$('.title').html('湖南');
var map = mapStack.pop();
$.get('./asset/json/map/' + map.mapId + '.json', function (mapJson) {
initState=true;
registerAndsetOption(myChart, map.mapId, map.mapName, mapJson, false)
//返回上一级后,父级的ID、Name随之改变
parentId = map.mapId;
parentName = map.mapName;
})
}
}
function mapChart(divid) {
$.get('./asset/json/map/' + chinaId + '.json', function (mapJson) {
chinaJson = mapJson;
myChart = echarts.init(document.getElementById(divid));
registerAndsetOption(myChart, chinaId, chinaName, mapJson, false)
parentId = chinaId;
parentName = '湖南';
//钻取事件
myChart.on('click', function (param) {
$('.title').html(param.name);
var cityId = cityMap[param.name];
if (cityId) {//代表有下级地图
CITYID=cityId;
$.get('./asset/json/map/' + cityId + '.json', function (mapJson) {
//location.href="indexbf.html?cs="+param.name+"&cityid="+cityId;
registerAndsetOption(myChart, cityId, param.name, mapJson, true)
})
} else {
// window.fn_get_event_post(cityId,param.name);//调用方法 获取数据 进行渲染
// console.log("111");
// $.get('./asset/json/map/' + CITYID + '.json', function (mapJson) {
// location.href="indexbf.html?cs="+param.name+"&cityid="+CITYID;
// //registerAndsetOption(myChart, cityId, param.name, mapJson, false)
// })
// console.log(cityId,param.name)
// //没有下级地图,回到一级中国地图,并将mapStack清空
// registerAndsetOption(myChart, chinaId, chinaName, chinaJson, false)
// mapStack = []
// parentId = cityId;
// parentName = param.name;
// param.name="湖南"
// alert(param.name);
return false;
}
//刷新页面渲染数据
// $.get("test.html", {Action:"get",Name:"lulu"}, function (data, textStatus){
//
// })
// param.event.event.stopPropagation();
// return false
});
//移动上去 触发事件
myChart.on("mouseover",function(param){
})
})
}
/**
*
* @param {*} myChart
* @param {*} id 省市县Id
* @param {*} name 省市县名称
* @param {*} mapJson 地图Json数据
* @param {*} flag 是否往mapStack里添加parentId,parentName
*/
function registerAndsetOption(myChart, id, name, mapJson, flag) {
if(initState==false && name=="湖南"){
return;
}else{
initState=false;
}
// window.fn_get_event_post(id,name);
echarts.registerMap(name, mapJson);
myChart.setOption({
//左下角lengend
tooltip : {
// show: true,
trigger: 'item',
formatter: function(params) {
if (params.data) return params.name + ':' + params.data['value']
},
},
// dataRange: {
// show:false,
// x: 'left',
// y: 'bottom',
// splitList: [
// {start: 5, end: 5, color: 'orange'},//当值为5时,区域背景
// {start: 10, end: 10, color: '#F2D010'},//当值为10时,区域背景
// {start: 15, end: 15, color: '#ccc'},//当值为15时,区域背景
// ]
// },
toolbox: {
feature: {
saveAsImage: {}
}
},
visualMap: {
show:false,
min: 200,
max: 3000,
left:'1%',
bottom:'1%',
itemWidth: 25,
itemHeight: 100,
text:['高','低'],
realtime: false,
calculable: true,
textStyle: {
color:'#fff',
fontSize:'20'
},
inRange: {
color: ['#18b0ff','#ffde00', '#ff6f18']
}
},
series: [{
hoverable: true, //鼠标经过时,是否高亮显示
type: 'map',
map: name,
label: {
normal: {
show: true,
color:"#000",//城市名称颜色
fontSize:12//城市名称字体大小
},
emphasis: {
show: true,
color:"#fff",
fontSize:14
}
},
itemStyle: {
normal: {
areaColor: 'rgba(7,157,233,0.4)',//背景颜色值
borderColor: '#ddd',
},
emphasis: {
areaColor: '#3093d8'//指向颜色值
}
},
//
data: initMapData(mapJson)
}]
});
if (flag) {//往mapStack里添加parentId,parentName,返回上一级使用
mapStack.push({
mapId: parentId,
mapName: parentName
});
parentId = id;
parentName = name;
}
console.log(mapStack);
}
至此,页面成功运行。欢迎大佬们指点
资源直通车链接:https://download.csdn.net/download/qq_42197013/21761477
另:3d地图请参考我的另一篇文章::实用且牛逼的3D旋转地图上显示柱图,可以更换成任意省市