目标效果
实现效果
没有实现城市散点的效果,但是这样也可以了。
第一次尝试
看了echarts官网实例,发现一个还可以,摸索半天最后效果达不到自己想要的
第二次尝试
问同学才知道不能用百度地图,要引入中国地图得json。
网上搜看了教程用到了dataV地图,dataV地理小工具。
1 下载
下载到项目目录里,我下载到assets里
2 引入
echarts初始化要放在onMounted里,要不然就会报错不显示等。
3 效果
最后想加散点图,怎么也实现不了
第三次尝试
1 下载引入
2 官方示例
一直在看怎么实现,仿照csdn上别人代码,最后还是看官网。echarts官网示例
官网的代码其实很清楚,跟我不同的地方就是他用的是百度地图的,我用的是dataV下载的json数据
看关键代码
这个地方我看了好久,不知道这个函数convertData的作用是什么,最后发现,上边两个数据
data是有关散点图的数据值
geoCoord 是地图点的坐标
函数的作用是把他们拼接到一起,好在散点图上使用,拼接之后的数据是这样的。
3 实现
我从dataV下载的只有全国地图的json,包含省和直辖市,自治区,但是没有包含下边的市。
先改配置,在option里添加geo
geo: {
map: 'china',//上边注册的地图名
nameProperty: 'name', // 数据点中的 name:Alabama 会关联到 GeoJSON 中 NAME 属性值为 Alabama 的地理要素{"type":"Feature","id":"01","properties":{"NAME":"Alabama"}, "geometry": { ... }}
label: {
show: false
},
roam: 'move', //只可平移,不能缩放
zoom: 1.8,//缩放
center: [108.54, 34.26],//中心位置
itemStyle: {
// 地图样式
areaColor: '#0a4699', //地图区域颜色
borderColor: '#12d9e2', //边框颜色
borderWidth: 1,
emphasis: {
areaColor: '#0a4699' //区域颜色,
}
}
},
这时候地图上就会有一张地图了,
更改series
以前我是加了type:'map’的系列,这样没办法跟散点图一起加,所以删掉,添加
series: [
{
type: 'effectScatter',
coordinateSystem: 'geo',//
data: convertData(data),
symbolSize: 15,
geoIndex: 0,
encode: {
value: 2
},
tooltip: {
trigger: 'item'
},
itemStyle: {
color: '#66FF00' //散点颜色
},
label: {
formatter: '{b}',
position: 'right',
show: true,
color: '#66FF00'
}}
]
几个关键的配置项
-
coordinateSystem
-
geoIndex
因为我就一个地图,默认是0
-
data
数据很关键啊。上边我已经知道了官网converData的作用,所以要想办法把我的数据格式也变成这样的
-
encode
散点图用到的数据是data数组里,value第三个值,index是2,所以
encode: {
value: 2
},
获取数据
我的data:
地理坐标这里我没有现成的,就用了函数生成了结果
我的json文件:
我只需要这两个数据
把他变成这样的集合
代码实现
const logCity: Function = () => {
const arr = china.features //china就是引入的json文件,
let res: Record<string, number[] | undefined> = {}// 结果是k:value的形式
for (let i = 0; i < arr.length; i++) {
let keyss = arr[i].properties.name
res[keyss] = arr[i].properties.center
}
console.log(res, 'res')
return res
}
输出的结果是
{
北京市: [116.405285, 39.904989],
天津市: [117.190182, 39.125596],
河北省: [114.502461, 38.045474],
山西省: [112.549248, 37.857014],
内蒙古自治区: [111.670801, 40.818311],
辽宁省: [123.429096, 41.796767],
吉林省: [125.3245, 43.886841],
黑龙江省: [126.642464, 45.756967],
上海市: [121.472644, 31.231706],
江苏省: [118.767413, 32.041544],
浙江省: [120.153576, 30.287459],
安徽省: [117.283042, 31.86119],
福建省: [119.306239, 26.075302],
江西省: [115.892151, 28.676493],
山东省: [117.000923, 36.675807],
河南省: [113.665412, 34.757975],
湖北省: [114.298572, 30.584355],
湖南省: [112.982279, 28.19409],
广东省: [113.280637, 23.125178],
广西壮族自治区: [108.320004, 22.82402],
海南省: [110.33119, 20.031971],
重庆市: [106.504962, 29.533155],
四川省: [104.065735, 30.659462],
贵州省: [106.713478, 26.578343],
云南省: [102.712251, 25.040609],
西藏自治区: [91.132212, 29.660361],
陕西省: [108.948024, 34.263161],
甘肃省: [103.823557, 36.058039],
青海省: [101.778916, 36.623178],
宁夏回族自治区: [106.278179, 38.46637],
新疆维吾尔自治区: [87.617733, 43.792818],
台湾省: [121.509062, 25.044332],
香港特别行政区: [114.173355, 22.320048],
澳门特别行政区: [113.54909, 22.198951]
}
我就直接复制到代码里用了
这样就可以合并数组了
const convertData = function (data: DataItem[]) {
var res = []
for (var i = 0; i < data.length; i++) {
var geoCoord = logCity[data[i].name]
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value)
})
}
}
console.log(res, 'convertData')
return res
}
完整代码
<template>
<div class="content">
<div class="title"><dv-decoration-7>骑行数据分布图示</dv-decoration-7></div>
<div id="map" style="width: 800px; height: 500px"></div>
</div>
</template>
<script setup lang="ts">
import * as echarts from 'echarts'
import china from '@/assets/中华人民共和国.json'
import { onMounted } from 'vue'
onMounted(() => {
var myChart = echarts.init(document.getElementById('map'))
echarts.registerMap('china', china)
myChart.setOption(option)
})
/* const logCity: Function = () => {
const arr = china.features
let res = {}
for (let i = 0; i < arr.length; i++) {
let keyss = arr[i].properties.name
res[keyss] = arr[i].properties.center
}
console.log(res, 'res')
return res
}*/
const logCity: Record<string, number[]> = {
北京市: [116.405285, 39.904989],
天津市: [117.190182, 39.125596],
河北省: [114.502461, 38.045474],
山西省: [112.549248, 37.857014],
内蒙古自治区: [111.670801, 40.818311],
辽宁省: [123.429096, 41.796767],
吉林省: [125.3245, 43.886841],
黑龙江省: [126.642464, 45.756967],
上海市: [121.472644, 31.231706],
江苏省: [118.767413, 32.041544],
浙江省: [120.153576, 30.287459],
安徽省: [117.283042, 31.86119],
福建省: [119.306239, 26.075302],
江西省: [115.892151, 28.676493],
山东省: [117.000923, 36.675807],
河南省: [113.665412, 34.757975],
湖北省: [114.298572, 30.584355],
湖南省: [112.982279, 28.19409],
广东省: [113.280637, 23.125178],
广西壮族自治区: [108.320004, 22.82402],
海南省: [110.33119, 20.031971],
重庆市: [106.504962, 29.533155],
四川省: [104.065735, 30.659462],
贵州省: [106.713478, 26.578343],
云南省: [102.712251, 25.040609],
西藏自治区: [91.132212, 29.660361],
陕西省: [108.948024, 34.263161],
甘肃省: [103.823557, 36.058039],
青海省: [101.778916, 36.623178],
宁夏回族自治区: [106.278179, 38.46637],
新疆维吾尔自治区: [87.617733, 43.792818],
台湾省: [121.509062, 25.044332],
香港特别行政区: [114.173355, 22.320048],
澳门特别行政区: [113.54909, 22.198951]
}
interface DataItem {
name: String
value: Number
}
const data: DataItem[] = [
{ name: '北京市', value: 279 },
{ name: '上海市', value: 41 },
{ name: '天津省', value: 11 },
{ name: '重庆市', value: 7 },
{ name: '河南省', value: 2 },
{ name: '云南省', value: 2 },
{ name: '辽宁省', value: 12 },
{ name: '黑龙江省', value: 17 },
{ name: '湖南省', value: 21 },
{ name: '安徽省', value: 31 },
{ name: '山东省', value: 50 },
{ name: '江苏省', value: 45 },
{ name: '浙江省', value: 58 },
{ name: '江西省', value: 4 },
{ name: '湖北省', value: 48 },
{ name: '甘肃省', value: 1 },
{ name: '山西省', value: 3 },
{ name: '陕西省', value: 46 },
{ name: '吉林省', value: 4 },
{ name: '福建省', value: 9 },
{ name: '广东省', value: 82 },
{ name: '四川省', value: 38 },
{ name: '台湾省', value: 2 },
{ name: '香港特别行政区', value: 188 },
{ name: '澳门特别行政区', value: 10 },
{ name: '河北省', value: 34 }
]
const convertData = function (data: DataItem[]) {
var res = []
for (var i = 0; i < data.length; i++) {
var geoCoord = logCity[data[i].name]
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value)
})
}
}
console.log(res, 'convertData')
return res
}
var option = {
color: ['#1256b0', '#2b61a8', '#0250b6', '#73aaf1', '#2972d1'],
tooltip: {
trigger: 'item'
},
legend: {
selectNode: true,
textStyle: {
color: '#fff'
}
},
geo: {
map: 'china',
nameProperty: 'name', // 数据点中的 name:Alabama 会关联到 GeoJSON 中 NAME 属性值为 Alabama 的地理要素{"type":"Feature","id":"01","properties":{"NAME":"Alabama"}, "geometry": { ... }}
label: {
show: false
},
roam: 'move', //只可平移,不能缩放
zoom: 1.8,
center: [108.54, 34.26],
itemStyle: {
// 地图样式
areaColor: '#0a4699', //地图区域颜色
borderColor: '#12d9e2', //边框颜色
borderWidth: 1,
emphasis: {
areaColor: '#0a4699' //区域颜色,
}
}
},
series: [
{
type: 'effectScatter',
coordinateSystem: 'geo',
data: convertData(data),
symbolSize: 15,
geoIndex: 0,
encode: {
value: 2
},
tooltip: {
trigger: 'item'
},
itemStyle: {
color: '#66FF00' //散点颜色
},
label: {
formatter: '{b}',
position: 'right',
show: true,
color: '#66FF00'
}
}
]
}
</script>
<style lang="scss" scoped>
.content {
width: 100%;
height: 100%;
padding: 2%;
display: flex;
flex-direction: column;
.title {
font-size: 20px;
font-weight: 600;
text-align: center;
}
}
</style>