基于Vue3 + ts + echarts(版本5.X)实现中国地图下钻、地图打点、地图热力图功能

这篇具有很好参考价值的文章主要介绍了基于Vue3 + ts + echarts(版本5.X)实现中国地图下钻、地图打点、地图热力图功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面:

实现效果图

基于Vue3 + ts + echarts(版本5.X)实现中国地图下钻、地图打点、地图热力图功能

 基于Vue3 + ts + echarts(版本5.X)实现中国地图下钻、地图打点、地图热力图功能

1.比较重要的部分用红字标出

 2.安装echats:       

npm install echarts --save

 3.由于echarts5版本的已经没有自带地图数据了,所以地图数据需要到专门的GEO数据网站中下载。这里提供一个阿里的下载地址:DataV.GeoAtlas地理小工具系列 对于这个工具网站,有一个重点需要说一下

用阿里的JSON API测试没有问题,但是上正式环境,调用他们的JSON API是要花钱的。

解决办法就是,将地图数据json文件全部下载下来。然后按照100000_full.json这种格式,放到你们自己的服务器就可以了

4.功能说明,本次教程内容基于vue3+ts+echarts 5版本,实现的内容包括,中国地图的下钻到省市区县级、在指定经纬度进行打点标记。并在鼠标浮动时展示该点的信息、通过区域点数量,呈现地图热力图。

接下来,正式开始实现。

第一步:建立地图容器,给上宽高,导入echarts。

<div ref="echartsMap1" style="width: 100%; height: 79%"></div>
import * as echarts from "echarts";

第二步:实现过程中需要的类型文件:


export interface Geodatav {
    type:     string;
    features: Feature[];
}

export interface Feature {
    type:       FeatureType;
    properties: Properties;
    geometry:   Geometry;
}

export interface Geometry {
    type:        GeometryType;
    coordinates: Array<Array<Array<number[] | number>>>;
}

export enum GeometryType {
    MultiPolygon = "MultiPolygon",
    Polygon = "Polygon",
}

export interface Properties {
    adcode:           number | string;
    name:             string;
    center?:          number[];
    centroid?:        number[];
    childrenNum?:     number;
    level?:           Level;
    parent?:          Parent;
    subFeatureIndex?: number;
    acroutes?:        number[];
    adchar?:          string;
}

export enum Level {
    Province = "province",
}

export interface Parent {
    adcode: number;
}

export enum FeatureType {
    Feature = "Feature",
}

// 城市属性
export interface citymodel {
    name: string,
    adcode: number | string,
    url: string,
    childrenNum: number | undefined,
    center?: number[],
    parentadcode?: number | string,  // 父地图
    hasRegister: boolean  // 是否已经注册在echarts
}

第三步:写一个简单的工具,实现将阿里中国地图城市数据集合JSON数据引入项目中并使用。

// 引入type
import { Feature, Geodatav, citymodel } from "./geodatav";


// 获取当前json下的省份城市区域adcode和json
// 根据城市adcode
function getCurrentadcode(mapdata: Geodatav) {
    let currentMap = new Map();

    mapdata.features.map((item:Feature)=>{
        if (item.properties.name != '') {
            let cityinfo: citymodel = {
                name: item.properties.name,
                adcode: item.properties.adcode,
                childrenNum: item.properties.childrenNum,
                url: `https://geo.datav.aliyun.com/areas_v3/bound/${item.properties.adcode}_full.json`,
               
                center: item.properties.center,
                parentadcode: item.properties.parent?.adcode,
                hasRegister: false
            }
            currentMap.set(cityinfo.adcode, cityinfo);
        }
    })
    return currentMap;
}

// 根据城市名称name
function getCurrentadcodebyname(mapdata: Geodatav) {
    let currentMap = new Map();

    mapdata.features.map((item:Feature)=>{
        if (item.properties.name != '') {
            let cityinfo: citymodel = {
                name: item.properties.name,
                adcode: item.properties.adcode,
                childrenNum: item.properties.childrenNum,
                url: `https://geo.datav.aliyun.com/areas_v3/bound/${item.properties.adcode}_full.json`,
                center: item.properties.center,
                parentadcode: item.properties.parent?.adcode,
                hasRegister: false
            }
            currentMap.set(cityinfo.name, cityinfo);
        }
    })
    return currentMap;
}



export { getCurrentadcode, getCurrentadcodebyname }

注意,在这里,如果你采用将地图数据放在自己的服务器,讲JSON数据下载下来,替换地址即可

第四步:开始渲染地图

首先引入2个工具文件

import * as echarts from "echarts";
import { getCurrentadcode } from "./utils/getAllChineseCity";
import { citymodel } from "./utils/geodatav";

定义地图

const echartsMap1: any = ref(null);
// 定义当前所有的地图
let allMap: Map<string | number, citymodel> = new Map();

// 当前地图
let currentMap: Ref<null | citymodel> = ref(null);
// echarts实例
let myChart: any,
  currentadcode: Ref<number | string> = ref(100000);

在onMounted中初始化中国地图 

onMounted(async () => {
  allMap.set(100000, {
    name: "中国",
    adcode: 100000,
    url: "https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json",
    childrenNum: 34,
    center: [0, 0],
    hasRegister: false, // 是否已经注册在echarts
  });
  currentMap.value = allMap.get(currentadcode.value) as citymodel;
  myChart = echarts.init(echartsMap1.value);
  renderChart(currentMap.value, data, dataMap);
  // 图表跟随屏幕自适应
  window.addEventListener("resize", () => {
    myChart.resize();
  });
  // 地图点击事件
  myChart.on("click", (params: any) => {
    let n = getMapKey(params.name, allMap);
    if (allMap.get(n)?.childrenNum == 0) return;
    (currentadcode.value as number | string) = n;
  });
});
// 根据map中数值,获取key
const getMapKey = (
  value: string,
  map: Map<string | number, citymodel>
): number | string => {
  let arriterator = map.values(),
    res: number | string = 0;
  for (const iterator of arriterator) {
    if (iterator.name == value) {
      res = iterator.adcode;
      break;
    }
  }
  console.log(res);
  return res;
};

其中data,dataMap为我传入地图中需要渲染的数据。你们可以自信传入你们需要展示的数据。

第五步:监听currentadcode的变化,更新地图

// 监听currentadcode地图值
watch(currentadcode, async (newval, oldval) => {
  let nextMap = allMap.get(newval) as citymodel;
  // 如果存在子节点
  if (nextMap?.childrenNum && nextMap.childrenNum > 0) {
    currentMap.value = nextMap;
    // 如果出现意外,没呀父节点
    if (currentMap.value.parentadcode == undefined) {
      currentMap.value.parentadcode = oldval;
    }
    console.log("nextMap: ", nextMap);
    if (nextMap.adcode != 100000) {
      query.code = nextMap.adcode;
      queryData.code = nextMap.adcode;
    } else {
      delete query.code;
      queryData.code = "";
    }
    const data = await getDeptList();
    const dataMap = await getDeptHotMap();
    renderChart(nextMap, data, dataMap);
  }
});

绘制地图函数:

// 获取地图json, 绘制地图
const renderChart = async (cMap: citymodel | null, dataArr, dataMap) => {
  // myChart.showLoading(); // 加载动画
  // 访问当前的地图数据
  let { data: mapdata } = await axios.get(cMap?.url as any);
  let currentName = cMap?.name;

  // 判断是否注册过
  if (!cMap?.hasRegister) {
    echarts.registerMap(currentName as any, mapdata);
    // 当前地图下的地区信息
    let currentCityMap: Map<string | number, citymodel> =
      getCurrentadcode(mapdata);

    allMap = new Map([...allMap, ...currentCityMap]);
    (allMap.get(cMap?.adcode as string | number) as citymodel).hasRegister =
      true;
  }

  let option = {
    tooltip: {
      position: "right",
      color: "#F7C034",
      formatter(d: any) {
        console.log(d);
        return `<div style="padding: 5px 10px;">${d.name}</div>`;
      },
    },
    title: {
      text: `${currentName}地图`,
      left: "center",
      top: "2%",
      textStyle: {
        color: "#fff",
      },
    },
//热力图配置
    visualMap: {
      left: "left",
      orient: "vertical",
      itemWidth: 10,
      min: 0,
      max: 1000,
      align: "center",
      bottom: "10%",
      inRange: {
        color: [
          "#313695",
          "#4575b4",
          "#74add1",
          "#abd9e9",
          "#e0f3f8",
          "#ffffbf",
          "#fee090",
          "#fdae61",
          "#f46d43",
          "#d73027",
          "#a50026",
        ],
      },
      calculable: true,
    },
    //层级地图配置
    series: [
      {
        name: `${currentName}地图`,
        map: currentName,
        type: "map",
        roam: true,
        label: {
          normal: {
            formatter(d: any) {
              return `${d.name}`;
            },
            show: true,
            textStyle: {
              color: "#fff",
            },
          },
          emphasis: {
            show: true,
            textStyle: {
              color: "#05C3F9",
            },
          },
        },
        itemStyle: {
          normal: {
            areaColor: "#3D8CFD",
            borderColor: "#5EC9F9",
            borderWidth: 1,
          },
          emphasis: {
            areaColor: "#0C356C",
            shadowColor: "#1773c3",
            shadowBlur: 20,
          },
        },
        markPoint: {
          symbol: "circle",
          itemStyle: {
            color: "#F7C034",
            // borderColor:'#000'
          },
          label: {
            normal: {
              show: true,
            },
            emphasis: {
              show: true,
            },
          },
          data: dataArr,
          blur: {},
        },
        data: dataMap,
      },
    ],
  };
  myChart.clear();
  myChart.setOption(option, true);
};

最后,返回上级地图方法:文章来源地址https://www.toymoban.com/news/detail-483698.html

// 返回上级地图
const returnLastMap = (adcode: any) => {
  currentadcode.value = adcode;
};

到了这里,关于基于Vue3 + ts + echarts(版本5.X)实现中国地图下钻、地图打点、地图热力图功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ECharts 图表简单示例,中国地图

    2024年01月25日
    浏览(54)
  • Echarts中国地图与世界地图实战

    Echarts中中国地图与世界地图实战,完整代码。 其中 china.js 与 world.js 两个文件已通过CDN的方法给出,而 echarts.js 大家可以自行去官网下载。 echarts.js是百度团队推出的一款用于图表可视化的插件,用于以图表的形式展现数据,功能强大,上手简单。 版本区别: 1.完全版:ec

    2024年02月03日
    浏览(91)
  • echarts 5.0——3d中国地图和飞线

    echarts 5.0的版本样式语法与4.0及以下的语法有个别差异,使用旧语法浏览器会警告提示。 3d地图常用的实现方法有两种。一种是使用GL来实现,一种是使用叠层和阴影来实现,本文将使用叠层和阴影来实现。先看效果图: 1. 一定要使用 echarts 5.0及以上的版本; 2. echarts 5.0没有

    2024年04月13日
    浏览(36)
  • vue3+ts+vite项目引入echarts,vue3项目echarts组件封装

    技术栈 :Vue3 + Ts + Vite + Echarts 简介 : 图文详解,教你如何在 Vue3 项目中 引入Echarts , 封装Echarts组件 ,并实现常用Echarts图例 1.1 静态效果 1.2 动态效果 2.1 安装 Echarts npm: pnpm: 2.2 main.ts 中引入 2.3 Echarts 组件封装 /src/components/ReEcharts/index.vue 文件中写入如下代码 3.1 柱状图 实现

    2024年02月09日
    浏览(63)
  • vue3+ts打开echarts的正确方式

    实例项目使用 vite5 + vue3 + ts,项目地址 vite-vue3-charts,预览地址 https://weizwz.com/vite-vue3-charts 第1步和第2步是为了在echarts里使用百度地图,如果你不想使用,或者使用高德地图,可忽略 官网地址,然后在 应用管理 - 我的应用 里, 创建应用 ,创建好后复制 AK 在 head 里引入,是

    2024年02月04日
    浏览(46)
  • 中国省市区地区选择组件(ElementPlus + Vue3 + TS )

    1.引用 2.用法 provinceAndCityData :省市数据(不带“全部”选项) regionData :省市区数据(不带“全部”选项) provinceAndCityDataPlus :省市区数据(带“全部”选项) regionDataPlus :省市区数据(带“全部”选项) CodeToText :例如:CodeToText[‘110000’]输出北京市 TextToCode :例如:

    2023年04月27日
    浏览(68)
  • html Antv L7 + mapbox 实现3D地图 3D中国地图 不限于中国地图

    echarts的3D地图实在太丑了,还一堆bug 使用阿里的Antv可视化库L7,实现3D地图,底图是mapbox 参考示例:https://l7.antv.antgroup.com/zh/examples/polygon/3d#floatMap 如果不需要底图样式,可把Scene的style设置为blank 直接上代码了,vue的就不说了,项目是html的 mapbox依赖 L7依赖 body元素 实现

    2024年02月14日
    浏览(52)
  • uniapp导入echarts类库 开发图表类小程序vue3+ts+vite

    微信小程序和抖音小程序等都支持: 使用步骤如下 第一步:下载插件包 下载echarts插件包,并导入到项目中,然后使用插件中的组件创建容器,并导入数据就可以了。 echarts插件包地址:echarts - DCloud 插件市场 如果你是使用hbuilder写的,可以直接导入,如果你是vscode写的,就

    2024年01月21日
    浏览(46)
  • SVG实现中国地图

    1.SVG是什么? svg 是Scalable Vector Graphics的缩写,指可伸缩矢量图形,可以用于绘制复杂不规则的控件。 svg绘制原理,就是利用了Path绘制图形。 1)svg利用xml定义图形。在xml中就包晗了绘制Path所需的数据。 2)加载xml中的PathData,转换成Path对象。 3)利用Canvas,把Path绘制在屏幕

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包