"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>