echarts地图功能(geojson获取数据、渐变色、地区名字标点、点击空白区域取消选中)

echarts地图功能

本文正在参加「金石计划」

介绍:本文实现echarts地图功能有:geojson获取数据、渐变色、地图描边、添加地区名字、地区名标点、点击空白区域取消选中地图状态。以下功能使用vue代码展示。以下代码每一个步骤都是关联的。

1.geojson获取数据渲染地图

index.vue

js 复制代码
<div id="map" class="map" ref="map"></div>

<script setup>  
import * as echarts from "echarts";  
import {onMounted, ref} from "vue";  
import { option } from "./data.js";  
  
let eCharts = ref();  
let map = ref(null);  
let current = ref()  
onMounted(() => {
// 这里通过fetch请求geojson文件
// 这里的foshan.geojson文件放到的public文件下面即可。
    fetch('/foshan.geojson').then(res => res.json())  
    .then(data => {  
    // 这几个步骤都是固定步骤,直接使用就行或者看看官方文档
        echarts.registerMap("佛山市", {geoJSON: data})  
        eCharts.value = echarts.init(map.value)  
        eCharts.value.setOption(option)  
    })  
})  
</script>  
  
<style scoped>  
/* 必须要给宽高,不然地图没有大小,显示不出来 */
#map {  
    width: 700px;  
    height: 500px;  
}  
</style>

data.js

js 复制代码
import {reactive} from "vue";
export const option = reactive({  
    geo: {  
        show: true,  
        // 这个名字要和echarts.registerMap("佛山市", {geoJSON: data}) 相对应
        map: '佛山市', 
        // 文字是否显示
        label: {  
            show: false  
        },  
        aspectScale: 1, //长宽比  
        zoom: 1.1,  
    },
})
  1. 这里使用了geo配置项:
  • 作用:地理坐标系组件用于地图的绘制,支持在地理坐标系上绘制散点图,线集。但是它的数据是基于地理坐标的。geo 组件可以绘制全球范围的地图,也可以绘制各种国家、地区的地图。在使用 geo 组件时,需要提供地理坐标系的相关配置,如投影方式、缩放、中心位置等。通过 geo 组件,可以在地图上展示各种数据的分布情况。

geojson文件 效果图

2.地图渐变色

data.js

js 复制代码
import {reactive} from "vue";
export const option = reactive({  
    geo: {  
        show: true,  
        // 这个名字要和echarts.registerMap("佛山市", {geoJSON: data}) 相对应
        map: '佛山市',  
        label: {  
            show: false  
        },  
        aspectScale: 1, //长宽比  
        zoom: 1.1,  
        // 渐变色  
        itemStyle: {  
            borderColor: '0BC265',  
            shadowColor: '#182f68',  
            shadowOffsetX: 0,  
            shadowOffsetY: 20, //这里可以设置一下Y轴的阴影,比较有层次感  
            borderWidth: 0,//设置外层边框  
        areaColor: {  
            type: 'radial',  
            x: 0.5,  
            y: 0.5,  
            r: 0.9,  
            // 关键代码 会从offset:0到offset:1去过渡。
            // 我们可以增加其中的过渡颜色,在0和1之间加就行。
            // 比如:{  
            //            offset: 0.5, color: 'green'  
            //        },  
        colorStops: [
                {  
                    offset: 0, color: '#0a3288'  
                },  
                {  
                    offset: 1, color: 'rgba(27,130,183,1)'  
                }  
            ],  
                global: false  
            },  
        },
    },
})

效果图

3.地图描边和添加地区名字

  • 在series中添加一个map图层,对该图层进行操作即可。

data.js

js 复制代码
import {reactive} from "vue";
export const option = reactive({  
    geo: {  
        show: true,  
        // 这个名字要和echarts.registerMap("佛山市", {geoJSON: data}) 相对应
        map: '佛山市',  
        label: {  
            show: false  
        },  
        aspectScale: 1, //长宽比  
        zoom: 1.1,  
            // 渐变色  
        itemStyle: {  
            borderColor: '0BC265',  
            shadowColor: '#182f68',  
            shadowOffsetX: 0,  
            shadowOffsetY: 20, //这里可以设置一下Y轴的阴影,比较有层次感  
            borderWidth: 0,//设置外层边框  
            areaColor: {  
                type: 'radial',  
                x: 0.5,  
                y: 0.5,  
                r: 0.9,  

            // 关键代码 会从offset:0到offset:1去过渡。
            // 我们可以增加其中的过渡颜色,在0和1之间加就行。
            // 比如:{  
            //            offset: 0.5, color: 'green'  
            //        },  
                colorStops: [
                        {  
                            offset: 0, color: '#0a3288'  
                        },  
                        {  
                            offset: 1, color: 'rgba(27,130,183,1)'  
                        }  
                    ],  
                    global: false  
            },  
        },
    },
    series: [  
        {  
            zoom: 1.1,  
            aspectScale: 1,  
            shading: 'realistic',  
            name: "地图",  
            map: "佛山市",  
            selectedMode: 'single',//选择类型,  
            hoverable: true,//鼠标经过高亮  

            type: "map",  
            
            // 鼠标移入的样式
            emphasis: {  
                label: {  
                    show: true,  
                    color: 'white',  
                    fontSize: 16,  
                },  
                itemStyle: {  
                    borderColor: '#0BC265',  
                    borderWidth: 4,  
                    areaColor: null,  
                },  
            },  
            // 选中的样式
            select: {  
                label: {  
                    color: 'white',  
                    fontSize: 16,  
                }  
            },  
            // 地图样式
            itemStyle: {  
                areaColor: 'rgba(0,0,0,0)',  
                borderWidth: 1,  
                borderColor: '#0BC265',  
            },  
            // 文字默认样式
            label: {  
                show: true,  
                color: '#fff',  
                fontSize: 16,  
                distance: 20,  
            },  
        },  
    ],
})

geojson文件

  • 要让地图上展示地区名字,这里必须在properties的对象里面,写入name这个key值才可以。

地图展示

4.地区标点

  • 地区旁边标点:在series数组中添加多一个对象即可。
  • 作用:相当于添加多一个图层,这个图层专门来标点。

data.js

js 复制代码
// 标点  
{  
    name: "地图",  
    map: "佛山市",  
    // 这个必须写上,否则无法对应地理坐标
    coordinateSystem: 'geo',  
    // 散点图
    type: "scatter",  
    // 标点的样式
    itemStyle: {color: 'red'},  
    
    // 标点的数据
    // 下面的value值是下面地区的中心经纬度,因为我想把点标在地区中心
    // 这些点的值如何来的?
    // 1.地区的中心点
    // 2.如果没有,从geojson文件中找到对应地区的点(随便一个),把点进行手动调试,把中心点调试出来
    data: [  
        {  
            name: '禅城区',  
            value: [113.055332, 22.999999]  
        },  
        {  
            name: '三水区',  
            value: [112.905332, 23.296666]  
        },  
        {  
            name: '高明区',  
            value: [112.655332, 22.796666]  
        },  
        {  
            name: '南海区',  
            value: [113.055332, 23.111999]  
        },  
        {  
            name: '顺德区',  
            value: [113.175332, 22.859999]  
        },  
    ],  
},

效果图

5.点击空白区域取消选中

index.vue

js 复制代码
<template>  
    <div id="map" class="map" ref="map" @click="clickMap"></div>  
</template>  
  
<script setup>  
import * as echarts from "echarts";  
import {onMounted, ref} from "vue";  
import { option } from "./data2.js";  
  
let eCharts = ref();  
let map = ref(null);  
  
onMounted(() => {  
fetch('/foshan.geojson').then(res => res.json())  
    .then(data => {  
        echarts.registerMap("佛山市", {geoJSON: data})  
        eCharts.value = echarts.init(map.value)  
        eCharts.value.setOption(option)  
        // 点击事件绑定
        eCharts.value.on('click', (e) => {  
        // 点击地图非空白区域,这里可以进行操作  
        console.log('e', e)  
        })  
    })  
})  
  
// 以下为关键代码  
// 让地图取消选中状态  
function resetMap() {  
    eCharts.value.dispatchAction({  
        type: 'unselect',  
        // 这里的name跟geoJSON的文件里面properties对象的name属性对应  
        name: ['南海区', '高明区', '三水区', '顺德区', '禅城区']  
    })  
}  
  
// index作用:只绑定一次这个click事件,不然的话一直点击地图,一直就会绑定事件,就会导致触发多次了。  
let index = 0  
function clickMap() {  
    // 为了只绑定一次事件  
    if(index !== 0) return;  
    // 以下这个可以获取整个地图的点击区域,包括空白部分,所以我们才需要分辨出是否点击了空白区域。
    eCharts.value.getZr().on('click', function (event) {  
    // 点击了空白处才触发下面的清理函数,如果不是空白处这个event.target不会是空。
    // 那么就不会触发resetMap函数  
    if(!event.target) {  
        resetMap()  
        }  
    })  
    index++  
}  
</script>  
  
<style scoped>  
#map {  
    width: 700px;  
    height: 500px;  
    border: 1px solid red;  
}  
</style>

效果图

6.所有代码

index.vue

js 复制代码
<template>  
    <div id="map" class="map" ref="map" @click="clickMap"></div>  
</template>  
  
<script setup>  
import * as echarts from "echarts";  
import {onMounted, ref} from "vue";  
import { option } from "./data.js";  
  
let eCharts = ref();  
let map = ref(null);  
  
onMounted(() => {  
fetch('/foshan.geojson').then(res => res.json())  
    .then(data => {  
        echarts.registerMap("佛山市", {geoJSON: data})  
        eCharts.value = echarts.init(map.value)  
        eCharts.value.setOption(option)  
        // 点击事件绑定
        eCharts.value.on('click', (e) => {  
        // 点击地图非空白区域,这里可以进行操作  
        console.log('e', e)  
        })  
    })  
})  
  
// 以下为关键代码  
// 让地图取消选中状态  
function resetMap() {  
    eCharts.value.dispatchAction({  
        type: 'unselect',  
        // 这里的name跟geoJSON的文件里面properties对象的name属性对应  
        name: ['南海区', '高明区', '三水区', '顺德区', '禅城区']  
    })  
}  
  
// index作用:只绑定一次这个click事件,不然的话一直点击地图,一直就会绑定事件,就会导致触发多次了。  
let index = 0  
function clickMap() {  
    // 为了只绑定一次事件  
    if(index !== 0) return;  
    // 以下这个可以获取整个地图的点击区域,包括空白部分,所以我们才需要分辨出是否点击了空白区域。
    eCharts.value.getZr().on('click', function (event) {  
    // 点击了空白处才触发下面的清理函数,如果不是空白处这个event.target不会是空。
    // 那么就不会触发resetMap函数  
    if(!event.target) {  
        resetMap()  
        }  
    })  
    index++  
}  
</script>  
  
<style scoped>  
#map {  
    width: 700px;  
    height: 500px;  
    border: 1px solid red;  
}  
</style>

data.js

js 复制代码
import {reactive} from "vue";
export const option = reactive({  
    geo: {  
        show: true,  
        // 这个名字要和echarts.registerMap("佛山市", {geoJSON: data}) 相对应
        map: '佛山市',  
        label: {  
            show: false  
        },  
        aspectScale: 1, //长宽比  
        zoom: 1.1,  
            // 渐变色  
        itemStyle: {  
            borderColor: '0BC265',  
            shadowColor: '#182f68',  
            shadowOffsetX: 0,  
            shadowOffsetY: 20, //这里可以设置一下Y轴的阴影,比较有层次感  
            borderWidth: 0,//设置外层边框  
            areaColor: {  
                type: 'radial',  
                x: 0.5,  
                y: 0.5,  
                r: 0.9,  

            // 关键代码 会从offset:0到offset:1去过渡。
            // 我们可以增加其中的过渡颜色,在0和1之间加就行。
            // 比如:{  
            //            offset: 0.5, color: 'green'  
            //        },  
                colorStops: [
                        {  
                            offset: 0, color: '#0a3288'  
                        },  
                        {  
                            offset: 1, color: 'rgba(27,130,183,1)'  
                        }  
                    ],  
                    global: false  
            },  
        },
    },
    series: [  
        {  
            zoom: 1.1,  
            aspectScale: 1,  
            shading: 'realistic',  
            name: "地图",  
            map: "佛山市",  
            // aspectScale: 1.0,  
            selectedMode: 'single',//选择类型,  
            hoverable: true,//鼠标经过高亮  

            type: "map",  
            
            // 鼠标移入的样式
            emphasis: {  
                label: {  
                    show: true,  
                    color: 'white',  
                    fontSize: 16,  
                },  
                itemStyle: {  
                    borderColor: '#0BC265',  
                    borderWidth: 4,  
                    areaColor: null,  
                },  
            },  
            // 选中的样式
            select: {  
                label: {  
                    color: 'white',  
                    fontSize: 16,  
                }  
            },  
            // 地图样式
            itemStyle: {  
                areaColor: 'rgba(0,0,0,0)',  
                borderWidth: 1,  
                borderColor: '#0BC265',  
            },  
            // 文字默认样式
            label: {  
                show: true,  
                color: '#fff',  
                fontSize: 16,  
                distance: 20,  
            },  
        },  
        // 标点  
        {  
            name: "地图",  
            map: "佛山市",  
            // 这个必须写上,否贼无法对应地理坐标
            coordinateSystem: 'geo',  
            // 散点图
            type: "scatter",  
            // 标点的样式
            itemStyle: {color: 'red'},  

            // 标点的数据
            // 下面的value值是下面地区的中心经纬度,因为我想把点标在地区中心
            // 这些点的值如何来的?
            // 1.地区的中心点
            // 2.如果没有,从geojson文件中找到对应地区的点(随便一个),
            // 把点进行手动调试,把中心点调试出来
            data: [  
                {  
                    name: '禅城区',  
                    value: [113.055332, 22.999999]  
                },  
                {  
                    name: '三水区',  
                    value: [112.905332, 23.296666]  
                },  
                {  
                    name: '高明区',  
                    value: [112.655332, 22.796666]  
                },  
                {  
                    name: '南海区',  
                    value: [113.055332, 23.111999]  
                },  
                {  
                    name: '顺德区',  
                    value: [113.175332, 22.859999]  
                },  
            ],  
        },
    ],
    
})

7. geo和series中map的区别:

  1. geo 组件:geo 组件用于绘制地理坐标系上的图表。它可以绘制各种类型的图表,如散点图、线图和柱状图等,但是它的数据是基于地理坐标的。geo 组件可以绘制全球范围的地图,也可以绘制各种国家、地区的地图。在使用 geo 组件时,需要提供地理坐标系的相关配置,如投影方式、缩放、中心位置等。通过 geo 组件,可以在地图上展示各种数据的分布情况。
  2. map 组件:map 组件用于绘制预定义的地图,它内置了一些常见的地图数据,如中国地图、世界地图等。与 geo 不同,map 组件的数据是基于地图的区域进行的,而不是地理坐标。map 组件提供了一些预定义的地图数据,可以直接使用,无需手动配置地理坐标系。通过 map 组件,可以在地图上展示各个区域的数据情况。
  3. 总结来说,geo 组件适用于自定义的地理数据可视化,可以根据需要配置地理坐标系,绘制各种类型的图表;而 map 组件适用于预定义的地图数据可视化,提供了一些常见地图的数据,方便快速展示各个区域的数据情况。

全文总结

  1. 本文介绍:geojson获取数据、渐变色、地图描边、添加地区名字、地区名标点、点击空白区域取消选中地图状态功能实现。
  2. 代码解释都通过注释的方式说明,每一行关键代码上方都添加了注释,请仔细观看注释。
  3. 有什么问题可以下方留言或者私信哦。
相关推荐
Jiaberrr2 小时前
前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)
前端·javascript·vue.js·微信小程序·uni-app
everyStudy3 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
城南云小白3 小时前
web基础+http协议+httpd详细配置
前端·网络协议·http
前端小趴菜、3 小时前
Web Worker 简单使用
前端
web_learning_3213 小时前
信息收集常用指令
前端·搜索引擎
tabzzz3 小时前
Webpack 概念速通:从入门到掌握构建工具的精髓
前端·webpack
200不是二百3 小时前
Vuex详解
前端·javascript·vue.js
滔滔不绝tao3 小时前
自动化测试常用函数
前端·css·html5
码爸4 小时前
flink doris批量sink
java·前端·flink
深情废杨杨4 小时前
前端vue-父传子
前端·javascript·vue.js