用 echarts 开发地图、点击展示自定义信息框

1、下载所需地市的json 链接:DataV.GeoAtlas地理小工具系列

在右侧输入需要的名称,然后下载json文件到本地

2、在html 中准备容器,并设置宽高

<div id="mapContent">

<div ref="mapChart" style="width:100%;height:100%;margin-bottom: 0" />

</div>
#mapContent {

width: 100%;

height: 100%;

}

3、导入echarts 和 json 文件

import * as echarts from 'echarts'

import json_150000 from '@/static/neimenggu/county/150000.json'

4、处理数据

//data 数据

data() {

return {

charts: null,

mapjson: json_150000,

codeToJson: {

'150000': json_150000

},

mapOptions:{},

cityName: {

呼和浩特市: {

value: '',

jcz: '',

kc: '',

fwz: ''

},

...................

},

cityCodeAndName:{

'150100000000' :'呼和浩特市',

'150700000000' :'呼伦贝尔市',

'150200000000' :'包头市',

...................................

}

}

5、初始化方法

initEcharts(areaCode) {

const name = 'json_' + areaCode

const cityName = this.cityName

const mapjson = this.codeToJson[areaCode]

if (this.charts) {

this.charts.clear()

} else {

this.charts = echarts.init(this.$refs.mapChart)

}

const top = 28

const zoom = 1.2 //地图缩放层级(控制地图大小)

const option = {

backgroundColor: 'rgba(0,0,0,0)',

tooltip: {

show: false

},

legend: {

show: false

},

grid: {

height: '100%'

},

geo: {

map: name,

roam: false,

selectedMode: false, // 是否允许选中多个区域

zoom: zoom,

top: top,

show: false

},

series: [

{

name: 'MAP',

type: 'map',

map: name,

label: {

show: false,

color: '#fff'

},

showLegendSymbol: false,

data: [],

selectedMode: 'single', // 是否允许选中多个区域

zoom: zoom,

geoIndex: 1,

top: top,

tooltip: {

show: true,

formatter: function(params) {

return params.name + '(' + cityName[params.name].value + ')'

}, //内容

backgroundColor: 'rgba(0,0,0,.6)', //提示框样式

borderColor: 'rgba(147, 235, 248, .8)',

textStyle: {

color: '#FFF'

},

triggerOn: 'click'

},

emphasis: {

//划过区域时,样式设置

label: {

show: false //是否显示区域名称(在面积中)

},

itemStyle: {

areaColor: '#389BB7', //区域的面积颜色

borderWidth: 1 //区域边框

}

},

select: {

disabled: true

},

//区域样式设置

itemStyle: {

borderColor: '#2084bc',

borderWidth: 2,

areaColor: {

type: 'radial',

x: 0.5,

y: 0.5,

r: 0.8,

colorStops: [

{

offset: 0,

color: 'rgba(147, 235, 248, 0)' // 0% 处的颜色

},

{

offset: 1,

color: 'rgba(147, 235, 248, .2)' // 100% 处的颜色

}

],

globalCoord: false // 缺为 false

},

shadowOffsetX: -2,

shadowOffsetY: 2,

shadowBlur: 10

}

}

]

}

this.mapOptions = option

echarts.registerMap(name, mapjson)

//处理数据

const jsonData = this.getGeoCoordMap(mapjson)

this.mapOptions.series[0].data = jsonData

const that = this

//给区域添加点击事件

this.charts.on('click', function(params) {

//先移除上个标签

const popDiv = document.getElementById('popup')

if (popDiv) {

document.getElementById('mapContent').removeChild(popDiv)

}

// 自定义弹框

var popup = document.createElement('div')

popup.id = 'popup'

popup.style.position = 'absolute'

popup.style.left = params.event.event.clientX - 90 + 'px'

popup.style.top = params.event.offsetY - 120 + 'px'

popup.style.backgroundColor = '#22312f'

popup.style.zIndex = 999

popup.style.padding = '0 20px'

popup.style.borderRadius = '10px'

popup.innerHTML =

'<div id="nmgInfoWindow">' +

'<div class="title">' +

params.data.name +

'详情<i class="el-icon-close closebt" id = "closeBtn"></i></div>' +

'<div class="items"> <span style="color:#62b2bc;">项目一</span><span>' +

'<span style="color:#62b2bc;">' +

cityName[params.data.name].jcz +

'</span>' +

'<i class="el-icon-arrow-right toDetail" style="color:#62b2bc;"></i></span>' +

'</div>' +

'<div class="items"> <span style="color:#62b2bc;">项目二</span><span>' +

'<span style="color:#62b2bc;">' +

cityName[params.data.name].kc +

'</span>' +

'<i class="el-icon-arrow-right toDetail" style="color:#62b2bc;"></i></span>' +

'</div>' +

'<div class="items"> <span style="color:#62b2bc;">项目三</span><span>' +

'<span style="color:#62b2bc;">' +

cityName[params.data.name].fwz +

'</span>' +

'<i class="el-icon-arrow-right toDetail " style="color:#62b2bc;"></i></span>' +

'</div>' +

'</div>'

//添加到页面上

document.getElementById('mapContent').appendChild(popup)

//给自定义弹框中添加关闭事件

const closeButton = document.querySelector('#closeBtn')

closeButton.addEventListener('click', function() {

const popDiv = document.getElementById('popup')

if (popDiv) {

document.getElementById('mapContent').removeChild(popDiv)

}

})

//给自定义弹框中的按钮跳转事件

const detailButton = document.querySelectorAll('.toDetail')

detailButton.forEach((item, index) => {

item.addEventListener('click', function() {

console.log('点击事件',that)

})

})

})

this.charts.setOption(option)

},

getGeoCoordMap(mapjson) {

const mapFeatures = mapjson.features

const cityCenter = {}

mapFeatures.map((item) => {

cityCenter[item.properties.name] = item.properties.centroid || item.properties.center || []

})

const newData = []

mapFeatures.map((item) => {

if (cityCenter[item.properties.name]) {

newData.push({

name: item.properties.name,

value: cityCenter[item.properties.name],

adcode: item.properties.adcode

})

}

})

return newData

}

6、结果

相关推荐
她似晚风般温柔78914 分钟前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
Jiaberrr1 小时前
前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)
前端·javascript·vue.js·微信小程序·uni-app
everyStudy2 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
城南云小白2 小时前
web基础+http协议+httpd详细配置
前端·网络协议·http
前端小趴菜、2 小时前
Web Worker 简单使用
前端
web_learning_3212 小时前
信息收集常用指令
前端·搜索引擎
Ylucius2 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
tabzzz2 小时前
Webpack 概念速通:从入门到掌握构建工具的精髓
前端·webpack
200不是二百2 小时前
Vuex详解
前端·javascript·vue.js
滔滔不绝tao2 小时前
自动化测试常用函数
前端·css·html5