当前位置: 首页>后端>正文

echarts 地图下钻+散点图

"echarts": "^5.2.2",

<!--实现全国地图下钻,由于涉及JSON文件较多,所以就直接引用在线JSON https://geo.datav.aliyun.com/areas_v3/bound/-->

<template>

? <div>

? ? <div

? ? ? class="areaRankingAll"

? ? ? ref="areaRankingAll"

? ? ? :style="{ width: '1000px', height: '1000px' }"

? ? ></div>

? ? <div>

? ? ? <button type="button" @click="cancel">返回上一级</button>

? ? </div>

? </div>

</template>

<script>

import axios from "axios"; //采用axios动态请求数据

var echarts = require("echarts");

export default {

? name: "areaRankingAll",

? mounted() {

? ? this.initChart(); //初始化地图

? },

? data() {

? ? return {

? ? ? myChart: null,

? ? ? //线上请求JSON文件数据地址

? ? ? publicUrl: "https://geo.datav.aliyun.com/areas_v3/bound/",

? ? ? //allCode 区域行政编码信息

? ? ? allCode: [

? ? ? ? // {name:"廉江市",adcode:"440881"}

? ? ? ],

? ? ? regionsArray: [],

? ? ? spotArray: [],

? ? ? spotArray2: [],

? ? };

? },

? methods: {

? ? cancel() {

? ? ? this.initChart();

? ? },

? ? getGeoJson(jsonName) {

? ? ? return axios.get(this.publicUrl + jsonName);

? ? },

? ? initEcharts(geoJson, name, chart) {

? ? ? let self = this;

? ? ? this.myChart = echarts.init(this.$refs.areaRankingAll);

? ? ? echarts.registerMap(name, geoJson);

? ? ? let option = {

? ? ? ? title: {

? ? ? ? ? text: name,

? ? ? ? },

? ? ? ? tooltip: {

? ? ? ? ? trigger: "item",

? ? ? ? ? // formatter: "{b}<br/>{c} (数量)",

? ? ? ? ? formatter(params) {

? ? ? ? ? ? console.log(params, "params");

? ? ? ? ? ? return 'params'

? ? ? ? ? },

? ? ? ? },

? ? ? ? visualMap: {

? ? ? ? ? min: 100,

? ? ? ? ? max: 5000,

? ? ? ? ? text: ["High", "Low"],

? ? ? ? ? realtime: false,

? ? ? ? ? calculable: true,

? ? ? ? ? inRange: {

? ? ? ? ? ? color: ["lightskyblue", "yellow", "orangered"],

? ? ? ? ? },

? ? ? ? },

? ? ? ? geo: {

? ? ? ? ? map: name,

? ? ? ? ? zlevel: 1,

? ? ? ? ? regions: this.regionsArray,

? ? ? ? ? label: {

? ? ? ? ? ? show: true, //是否显示省份名称

? ? ? ? ? },

? ? ? ? ? tooltip: {

? ? ? ? ? ? trigger: "item",

? ? ? ? ? ? formatter(params) {

? ? ? ? ? ? ? if (params.value && params.value.length > 0) {

? ? ? ? ? ? ? ? return `名称:${params.name}<br>数量:${params.value[2]}`;

? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? return`${params.name}`

? ? ? ? ? ? ? }

? ? ? ? ? ? },

? ? ? ? ? },

? ? ? ? },

? ? ? ? series: [

? ? ? ? ? //样式一展示

? ? ? ? ? {

? ? ? ? ? ? showLegendSymbol: true,

? ? ? ? ? ? type: "scatter",

? ? ? ? ? ? coordinateSystem: "geo",

? ? ? ? ? ? symbol: "pin",

? ? ? ? ? ? legendHoverLink: true,

? ? ? ? ? ? symbolSize: [60, 60],

? ? ? ? ? ? // 这里渲染标志里的内容以及样式

? ? ? ? ? ? label: {

? ? ? ? ? ? ? show: true,

? ? ? ? ? ? ? formatter(value) {

? ? ? ? ? ? ? ? return value.data.value[2];

? ? ? ? ? ? ? },

? ? ? ? ? ? ? color: "#fff",

? ? ? ? ? ? },

? ? ? ? ? ? // 标志的样式

? ? ? ? ? ? itemStyle: {

? ? ? ? ? ? ? normal: {

? ? ? ? ? ? ? ? color: "rgba(255,0,0,.7)",

? ? ? ? ? ? ? ? shadowBlur: 2,

? ? ? ? ? ? ? ? shadowColor: "D8BC37",

? ? ? ? ? ? ? },

? ? ? ? ? ? },

? ? ? ? ? ? // 数据格式,其中name,value是必要的,value的前两个值是数据点的经纬度,其他的数据格式可以自定义

? ? ? ? ? ? // 至于如何展示,完全是靠上面的formatter来自己定义的

? ? ? ? ? ? data: this.spotArray,

? ? ? ? ? ? showEffectOn: "render",

? ? ? ? ? ? rippleEffect: {

? ? ? ? ? ? ? brushType: "stroke",

? ? ? ? ? ? },

? ? ? ? ? ? hoverAnimation: true,

? ? ? ? ? ? zlevel: 1,

? ? ? ? ? },

? ? ? ? ? //样式二展示

? ? ? ? ? {

? ? ? ? ? ? type: "effectScatter",

? ? ? ? ? ? coordinateSystem: "geo",

? ? ? ? ? ? effectType: "ripple",

? ? ? ? ? ? showEffectOn: "render",

? ? ? ? ? ? rippleEffect: {

? ? ? ? ? ? ? period: 10,

? ? ? ? ? ? ? scale: 10,

? ? ? ? ? ? ? brushType: "fill",

? ? ? ? ? ? },

? ? ? ? ? ? hoverAnimation: true,

? ? ? ? ? ? itemStyle: {

? ? ? ? ? ? ? normal: {

? ? ? ? ? ? ? ? color: "rgba(255, 235, 59, .7)",

? ? ? ? ? ? ? ? shadowBlur: 10,

? ? ? ? ? ? ? ? shadowColor: "#333",

? ? ? ? ? ? ? },

? ? ? ? ? ? },

? ? ? ? ? ? zlevel: 1,

? ? ? ? ? ? data: this.spotArray2,

? ? ? ? ? },

? ? ? ? ? {

? ? ? ? ? ? type: "map",

? ? ? ? ? ? map: name,

? ? ? ? ? ? data: [],

? ? ? ? ? },

? ? ? ? ],

? ? ? };

? ? ? chart.setOption(option);

? ? ? chart.off("click");

? ? ? chart.on("click", (params) => {

? ? ? ? //点击区域时的行政编码,然后再进行匹配

? ? ? ? let clickCode = self.allCode.filter(

? ? ? ? ? (areaJson) => areaJson.name === params.name

? ? ? ? )[0].adcode;

? ? ? ? //1、如果要实现多级下钻并且展示子区域的话,下钻点击事件请求的JSON必须是该点击区域的全面父级JSON(即没有自己只有孩子们组成)

? ? ? ? //2、如果要实现地图只下钻一次,并且不展示目标下钻区域的子区域。如第一层地图是中国,实现点击某个省下钻到该省,但是不展示该省的子区域,那么下钻点击事件请求的JSON必须是该点击区域的确切json(即只有自己没有孩子们)

? ? ? ? //声明:比如这里线上引用的父级JSON带有:地域行政编码_full.json(如中国 100000_full.json),子级JSON是行政编码.json(如廉江市 440881.json)

? ? ? ? self

? ? ? ? ? .getGeoJson(clickCode + "_full.json")

? ? ? ? ? .then((res) => {

? ? ? ? ? ? this.spotArray = [];

? ? ? ? ? ? this.spotArray2 = [];

? ? ? ? ? ? if (params.name == "山东省") {

? ? ? ? ? ? ? this.regionsArray.push({

? ? ? ? ? ? ? ? name: "青岛市",

? ? ? ? ? ? ? ? itemStyle: {

? ? ? ? ? ? ? ? ? normal: {

? ? ? ? ? ? ? ? ? ? opacity: 1, // 透明度

? ? ? ? ? ? ? ? ? ? borderColor: "#fff", // 省份界线颜色

? ? ? ? ? ? ? ? ? ? borderWidth: 3, // 省份界线的宽度

? ? ? ? ? ? ? ? ? ? areaColor: "red", // 整个省份的颜色

? ? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? });

? ? ? ? ? ? ? let features = res.data.features;

? ? ? ? ? ? ? features.forEach((item) => {

? ? ? ? ? ? ? ? if (item.properties.name == "济南市") {

? ? ? ? ? ? ? ? ? this.spotArray.push({

? ? ? ? ? ? ? ? ? ? name: item.properties.name,

? ? ? ? ? ? ? ? ? ? value: [

? ? ? ? ? ? ? ? ? ? ? item.properties.centroid[0],

? ? ? ? ? ? ? ? ? ? ? item.properties.centroid[1],

? ? ? ? ? ? ? ? ? ? ? 1000,

? ? ? ? ? ? ? ? ? ? ],

? ? ? ? ? ? ? ? ? });

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if (item.properties.name == "济宁市") {

? ? ? ? ? ? ? ? ? this.spotArray2.push({

? ? ? ? ? ? ? ? ? ? name: item.properties.name,

? ? ? ? ? ? ? ? ? ? value: [

? ? ? ? ? ? ? ? ? ? ? item.properties.centroid[0],

? ? ? ? ? ? ? ? ? ? ? item.properties.centroid[1],

? ? ? ? ? ? ? ? ? ? ? 1000,

? ? ? ? ? ? ? ? ? ? ],

? ? ? ? ? ? ? ? ? });

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? });

? ? ? ? ? ? }

? ? ? ? ? ? if (params.name == "青岛市") {

? ? ? ? ? ? ? this.regionsArray.push({

? ? ? ? ? ? ? ? name: "崂山区",

? ? ? ? ? ? ? ? itemStyle: {

? ? ? ? ? ? ? ? ? normal: {

? ? ? ? ? ? ? ? ? ? opacity: 1, // 透明度

? ? ? ? ? ? ? ? ? ? borderColor: "#fff", // 省份界线颜色

? ? ? ? ? ? ? ? ? ? borderWidth: 3, // 省份界线的宽度

? ? ? ? ? ? ? ? ? ? areaColor: "red", // 整个省份的颜色

? ? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? });

? ? ? ? ? ? }

? ? ? ? ? ? self.initEcharts(res.data, params.name, chart);

? ? ? ? ? })

? ? ? ? ? .catch((err) => {

? ? ? ? ? ? console.log(err, "err");

? ? ? ? ? ? self.getGeoJson("100000_full.json").then((China) => {

? ? ? ? ? ? ? self.initEcharts(China.data, "中华人民共和国", chart);

? ? ? ? ? ? });

? ? ? ? ? });

? ? ? });

? ? },

? ? //带头函数-初始化

? ? initChart() {

? ? ? let chart = echarts.init(this.$refs.areaRankingAll);

? ? ? //this.allCode获取所有的区域编码信息

? ? ? this.getGeoJson("all.json").then((all) => {

? ? ? ? this.allCode = all.data;

? ? ? });

? ? ? //初始化地图展示

? ? ? this.getGeoJson("100000_full.json").then((China) => {

? ? ? ? this.spotArray = [];

? ? ? ? this.spotArray2 = [];

? ? ? ? this.regionsArray.push({

? ? ? ? ? name: "山东省",

? ? ? ? ? itemStyle: {

? ? ? ? ? ? normal: {

? ? ? ? ? ? ? opacity: 1, // 透明度

? ? ? ? ? ? ? borderColor: "#fff", // 省份界线颜色

? ? ? ? ? ? ? borderWidth: 3, // 省份界线的宽度

? ? ? ? ? ? ? areaColor: "red", // 整个省份的颜色

? ? ? ? ? ? },

? ? ? ? ? },

? ? ? ? });

? ? ? ? let features = China.data.features;

? ? ? ? features.forEach((item) => {

? ? ? ? ? if (item.properties.name == "西藏自治区") {

? ? ? ? ? ? this.spotArray.push({

? ? ? ? ? ? ? name: item.properties.name,

? ? ? ? ? ? ? value: [

? ? ? ? ? ? ? ? item.properties.centroid[0],

? ? ? ? ? ? ? ? item.properties.centroid[1],

? ? ? ? ? ? ? ? 1000,

? ? ? ? ? ? ? ],

? ? ? ? ? ? });

? ? ? ? ? }

? ? ? ? ? if (item.properties.name == "湖北省") {

? ? ? ? ? ? this.spotArray2.push({

? ? ? ? ? ? ? name: item.properties.name,

? ? ? ? ? ? ? value: [

? ? ? ? ? ? ? ? item.properties.centroid[0],

? ? ? ? ? ? ? ? item.properties.centroid[1],

? ? ? ? ? ? ? ? 1000,

? ? ? ? ? ? ? ],

? ? ? ? ? ? });

? ? ? ? ? }

? ? ? ? });

? ? ? ? this.initEcharts(China.data, "中华人民共和国", chart);

? ? ? });

? ? },

? },

};

</script>

<style scoped>

</style>


https://www.xamrdz.com/backend/3p51944845.html

相关文章: