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. 有什么问题可以下方留言或者私信哦。
相关推荐
不是吧这都有重名6 分钟前
利用systemd启动部署在服务器上的web应用
运维·服务器·前端
霸王蟹6 分钟前
React中巧妙使用异步组件Suspense优化页面性能。
前端·笔记·学习·react.js·前端框架
Maỿbe15 分钟前
利用html制作简历网页和求职信息网页
前端·html
森叶35 分钟前
Electron 主进程中使用Worker来创建不同间隔的定时器实现过程
前端·javascript·electron
霸王蟹44 分钟前
React 19 中的useRef得到了进一步加强。
前端·javascript·笔记·学习·react.js·ts
霸王蟹44 分钟前
React 19版本refs也支持清理函数了。
前端·javascript·笔记·react.js·前端框架·ts
繁依Fanyi1 小时前
ColorAid —— 一个面向设计师的色盲模拟工具开发记
开发语言·前端·vue.js·编辑器·codebuddy首席试玩官
明似水2 小时前
Flutter 开发入门:从一个简单的计数器应用开始
前端·javascript·flutter
沐土Arvin2 小时前
前端图片上传组件实战:从动态销毁Input到全屏预览的全功能实现
开发语言·前端·javascript
爱编程的鱼3 小时前
C#接口(Interface)全方位讲解:定义、特性、应用与实践
java·前端·c#