使用echarts绘制中国地图根据不同的省份划分到指定区域里面中

需求:我们在开发过程中会遇到使用中国地图来划分不同区域省份下面的数量统计情况,但是有时候使用Echarts里面地图功能和我们实际业务需求不匹配的,这个时候就需要我们手动自定义进行划分不同区域下面的省份数据。例如大区1下面有哪些省份,大区2对应哪些的省份进行划分显示的。

1,实现效果图如下:

在这里插入图片描述
2,关键代码如下:

【1】后端返回数据格式如下:
在这里插入图片描述

在这里插入图片描述

【2】把需要合并的省份的经纬度数据合并起来。

function mergeProvinces(chinaJson, regionMap) {
    //合并大区里省份的coordinates
    var oldFeatures = chinaJson.features

    var featuress = regionMap.map((item) => {
      var polygonsCoordinates: any[] = []
      for (var z = 0; z < item.provinces.length; z++) {
        for (var j = 0; j < oldFeatures.length; j++) {
          if (oldFeatures[j].properties.name.includes(item.provinces[z].slice(0, 2))) {
            const coordinates = oldFeatures[j].geometry.coordinates
            if (coordinates[0].length !== 1) {
              polygonsCoordinates = polygonsCoordinates.concat(coordinates)
            } else {
              polygonsCoordinates = polygonsCoordinates.concat(
                coordinates.reduce((r, e) => {
                  return r.concat(e)
                }, []),
              )
            }

            oldFeatures[j].ok = 1
            break
          }
        }
      }
      return {
        id: 'xx',
        type: 'MultiPolygon',
        geometry: {
          type: 'Polygon',
          coordinates: polygonsCoordinates,
        },
        properties: {
          name: item.regionName || '',
          childNum: polygonsCoordinates.length,
        },
      }
    })
    const others = oldFeatures.filter((item: any) => !item.ok)
    featuress = featuress.concat(others)
    chinaJson.features = featuress
    return chinaJson
  }

3- 具体代码组件如下所示:

<template>
  <div class="chinamapContentbox">
    <div id="chinaMap" ref="chinaMap"></div>
  </div>
</template>

<script lang="ts" setup>
  import { onMounted, onBeforeUnmount, ref, watch } from 'vue'
  import china from './china.json'
  import { cloneDeep, debounce } from 'lodash-es'
  import { nextTick } from 'vue'
  import * as echarts from 'echarts/core'
  import {
    TooltipComponent,
    TooltipComponentOption,
    VisualMapComponent,
    VisualMapComponentOption,
    GeoComponent,
    GeoComponentOption,
  } from 'echarts/components'
  import { MapChart, MapSeriesOption } from 'echarts/charts'
  import { CanvasRenderer } from 'echarts/renderers'

  echarts.use([TooltipComponent, VisualMapComponent, GeoComponent, MapChart, CanvasRenderer])

  type EChartsOption = echarts.ComposeOption<
    TooltipComponentOption | VisualMapComponentOption | GeoComponentOption | MapSeriesOption
  >

  function mergeProvinces(chinaJson, regionMap) {
    //合并大区里省份的coordinates
    var oldFeatures = chinaJson.features

    var featuress = regionMap.map((item) => {
      var polygonsCoordinates: any[] = []
      for (var z = 0; z < item.provinces.length; z++) {
        for (var j = 0; j < oldFeatures.length; j++) {
          if (oldFeatures[j].properties.name.includes(item.provinces[z].slice(0, 2))) {
            const coordinates = oldFeatures[j].geometry.coordinates
            if (coordinates[0].length !== 1) {
              polygonsCoordinates = polygonsCoordinates.concat(coordinates)
            } else {
              polygonsCoordinates = polygonsCoordinates.concat(
                coordinates.reduce((r, e) => {
                  return r.concat(e)
                }, []),
              )
            }

            oldFeatures[j].ok = 1
            break
          }
        }
      }
      return {
        id: 'xx',
        type: 'MultiPolygon',
        geometry: {
          type: 'Polygon',
          coordinates: polygonsCoordinates,
        },
        properties: {
          name: item.regionName || '',
          childNum: polygonsCoordinates.length,
        },
      }
    })
    const others = oldFeatures.filter((item: any) => !item.ok)
    featuress = featuress.concat(others)
    chinaJson.features = featuress
    return chinaJson
  }

  const chinaMap = ref()
  let myChart: echarts.ECharts
  const resize = debounce(() => myChart && myChart.resize(), 200)
  const props = defineProps({
    type: {
      type: String,
      default: '1',
    },
    areaDataInfo: {
      type: Array,
      default: () => [],
    },
    regionMap: {
      type: Array,
      default: () => [],
    },
  })

  watch(
    () => ({
      areaDataInfo: props.areaDataInfo,
      chinaMap: chinaMap.value,
      regionMap: props.regionMap,
    }),
    ({ areaDataInfo, chinaMap, regionMap }) => {
      if (chinaMap && areaDataInfo) {
        const getvlaueList = areaDataInfo.map((item: any) => {
          return item.value
        })
        let maxNum = 100
        if (getvlaueList && getvlaueList.length > 0) {
          maxNum = Math.max(...getvlaueList)
        }
        echarts.registerMap('china', mergeProvinces(cloneDeep(china), regionMap))
        if (!myChart) {
          myChart = echarts.init(chinaMap)
        }
        nextTick(() => {
          setOptions(maxNum, areaDataInfo)
        })
      }
    },
    { immediate: true, deep: true },
  )

  onMounted(() => {
    window.addEventListener('resize', resize)
  })

  onBeforeUnmount(() => {
    window.removeEventListener('resize', resize)
  })

  function setOptions(maxNum, areaDataInfo) {
    const options: EChartsOption = {
      tooltip: {
        formatter(params) {
          if (!areaDataInfo.some((e) => e.name === params.name)) {
            return ''
          }
          const htmlStr1 = `<div style='font-size:14px; margin-bottom:10px;'> ${params.name} </div>
              <p style='text-align:left;margin-top:-4px;'>联斯达覆盖省份:${
                params.data?.liansidaCoverProvinceCount || 0
              }
                <br/>联斯达覆盖城市:${params.data?.liansidaCoverCityCount || 0}
                <br/>斯联达覆盖中心:${params.data?.liansidaCoverCenterCount || 0}
                <br/>联斯达未覆盖中心:${params.data?.liansidaUnCoverCenterCount || 0}
                <br/>联斯达中心覆盖率:${params.data?.liansidaCoverCenterRate || 0}
              </p>`
          const htmlStr2 = `<div style='font-size:14px; margin-bottom:10px;'> ${params.name} </div>
              <p style='text-align:left;margin-top:-4px;'>项目数:${params.data?.projectCount || 0}
                <br/>提前启动项目:${params.data?.preProjectCount || 0}
                <br/>入组数:${params.data?.enrollmentCount || 0}
              </p>`
          return props.type === '1' ? htmlStr1 : htmlStr2
        },
        backgroundColor: 'rgba(0,0,0,.6)', //提示标签背景颜色
        textStyle: { color: '#fff' }, //提示标签字体颜色
      },
      visualMap: {
        show: false,
        max: maxNum,
        color: ['#356191', '#1890ff', '#EBEBEB'],
      },
      geo: {
        map: 'china',
        roam: false,
        zoom: 1.2,
        label: {
          show: false,
          color: '#fff',
          textShadowColor: '#000',
          textShadowBlur: 10,
          textShadowOffsetX: 3,
        },
        itemStyle: {
          areaColor: '#d5e8f3',
          borderColor: '#fcfdfe',
          borderWidth: 1,
        },
        center: [104.114129, 37.550339],
        emphasis: {
          label: {
            color: '#fff',
            textShadowColor: '#000',
            textShadowBlur: 10,
            textShadowOffsetX: 0,
          },
          itemStyle: {
            areaColor: '#55D187',
          },
        },
      },
      series: [
        {
          name: '地图', // 浮动框的标题(上面的formatter自定义了提示框数据,所以这里可不写)
          type: 'map',
          map: 'china',
          geoIndex: 0,
          label: {
            show: true,
          },
          data: areaDataInfo,
        },
      ],
    }
    myChart.clear()
    myChart.setOption(options)
  }
</script>

<style lang="less">
  .chinamapContentbox {
    width: 100%;

    #chinaMap {
      width: 100%;
      height: 430px;
    }
  }
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/778705.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes集群部署:环境准备及master节点部署(二)

主机名IPv4地址IPv6地址角色安装组件操作系统k8s130-node190192.168.XX.190240a:XX::190masterkubeadm、kubelet、containerdAnolis OS 8.94.19.91-28.1.an8.x86_64k8s130-node191192.168.XX.191240a:XX::191nodekubeadm、kubelet、cri-oAnolis OS 8.94.19.91-28.1.an8.x86_64k…

38条Web测试经验分享

1. 页面链接检查 每一个链接是否都有对应的页面&#xff0c;并且页面之间切换正确。可以使用一些工具&#xff0c;如LinkBotPro、File-AIDCS、HTML Link Validater、Xenu等工具。 LinkBotPro不支持中文&#xff0c;中文字符显示为乱码&#xff1b;HTML Link Validater只能测…

rust + mingw安装教程

0. 说明 windows上安装rust时&#xff0c;需要在电脑上安装C/C构建工具。推荐的的两种工具链可以选择&#xff1a; visual studio build toolsmingw 官方推荐使用visual studio&#xff0c;若你的电脑上已经安装了visual studio&#xff0c;则无需再安装&#xff0c;直接安装…

智慧景区解决方案PPT(89页)

智慧景区解决方案摘要 解决方案概述智慧景区解决方案旨在利用现代信息技术解决景区管理机构面临的保护与发展矛盾&#xff0c;推动服务职能转变&#xff0c;促进旅游产业跨越式发展&#xff0c;实现旅游经营增长和管理成本优化。 宏观政策背景国家旅游局发布的《“十三五”全国…

《昇思25天学习打卡营第13天|onereal》

今天学习的内容如下&#xff1a; DCGN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动漫头像数据集共有70,171张动漫头像图片&#xff0c;图片大小均为…

如何利用算法优化广告效果

效果广告以超过67%的占比&#xff0c;成为了中国互联网广告预算的大头。在BAT、字节等大的媒体平台上&#xff0c;效果广告以CPC实时竞价广告为主。在这种广告产品的投放中&#xff0c;广告主或其代理公司通过针对每个广告点击出价&#xff0c;系统自动把这些点击出价换算成eCP…

2.2.2.1 如何在vscode 中设置ROS2的 用户代码片段

1. vscode中设置C版本的ROS2用户代码片段 1) 找到vscode 下的设置选项&#xff0c;选择用户代码片段 2) 选择用户代码片段后&#xff0c;会弹出选择框&#xff0c;如下图&#xff0c;输入C,选择 cpp.json 配置好的文件 进入如下文件&#xff0c;下图为本人配置的代码片段模版文…

利用 Hexo 搭建个人博客

〇、前言 本文将会讨论&#xff0c;如何将 CSDN 上的博客&#xff0c;拉取到本地&#xff0c;然后PicGo、Hexo、Github 等工具建立个人博客&#xff0c;环境为 Ubuntu 20.04。 一、利用 Hexo 预备工作 首先安装 Node.js、npm、git工具。 > node -v v12.22.9 > npm -…

复现YOLO_ORB_SLAM3_with_pointcloud_map项目记录

文章目录 1.环境问题2.遇到的问题2.1编译问题1 monotonic_clock2.2 associate.py2.3 associate.py问题 3.运行问题 1.环境问题 首先环境大家就按照github上的指定环境安装即可 环境怎么安装网上大把的资源&#xff0c;自己去找。 2.遇到的问题 2.1编译问题1 monotonic_cloc…

DDR3(三)

目录 1 预取1.1 什么是预取1.2 预取有哪些好处1.3 结构框图1.4 总结 2 突发2.1 什么是突发2.2 突发与预取 本文讲解DDR中常见的两个术语&#xff1a;预取和突发&#xff0c;对这两个概念理解的关键在于地址线的低位是否参与译码&#xff0c;具体内容请继续往下看。 1 预取 1.1…

印尼网络安全治理能力观察

在全国国际机场的移民服务完全瘫痪 100 多个小时后&#xff0c;印尼政府承认其新成立的国家数据中心 (PDN) 遭受了网络攻击。 恶意 Lockbit 3.0 勒索软件加密了存储在中心的重要数据&#xff0c;其背后的黑客组织要求支付 800 万美元的赎金。 不幸的是&#xff0c;大多数数据…

使用Source Insight 4.0

一、使用书签 二、添加文件 三、Search 3.1 替换所有变量 四、右键查询 4.1 查看被调用的地方

【算法笔记自学】第 6 章 C++标准模板库(STL)介绍

6.1vector常见用法详解 #include <cstdio> #include <vector> using namespace std;int main() {int n, x;scanf("%d", &n);vector<int> v;for (int i 0; i < n; i) {scanf("%d", &x);v.push_back(x);}for (int i 0; i <…

[数据结构] 基于插入的排序 插入排序希尔排序

标题&#xff1a;[数据结构] 排序#插入排序&希尔排序 水墨不写bug 目录 &#xff08;一&#xff09;插入排序 实现思路&#xff1a; 插入排序实现&#xff1a; &#xff08;二&#xff09;希尔排序 希尔排序的基本思想&#xff1a; 希尔排序的实现&#xff1a; 正…

Linux 进程间的信号

1.信号的初认识 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。通俗来说信号就是让用户或进程给其他用户和进程发生异步信息的一种方式。对于信号我们可以根据实际生活&#xff0c;对他有以下几点认识&#xff1a;1.在没有产生信号时我们就知道产生信号要怎么处…

Win11 Python3.10 安装pytorch3d

0&#xff0c;背景 Python3.10、cuda 11.7、pytorch 2.0.1 阅读【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程-CSDN博客 1&#xff0c;解决方法 本来想尝试&#xff0c;结果发现CUB安装配置对照表里没有cuda 11.7对应的版本&#xff0c;不敢轻举妄动&#x…

求 自然对数 ln(x)

np.log()函数是用来计算数组中每个元素的自然对数的。自然对数是以数学常数e&#xff08;约等于2.71828&#xff09;为底的对数。NumPy作为一个强大的数值计算库&#xff0c;提供了很多用于数组操作的函数&#xff0c;np.log()就是其中之一。 • 下面是一个简单的例子&#xff…

24西安电子科技大学经济与管理学院—考研录取情况

24西安电子科技大学—经理与管理学院—考研录取统计 01、经理与管理学院各个方向 02、24经济与管理近三年复试分数线对比 1、经管院24年院线相对于23年院线普遍下降2-15分&#xff0c;个别专业上涨4-10分。 2、经管院应用经济学2024年院线350分&#xff1b;管理科学与工程院线…

进程控制-exec函数

让父子进程来执行不相干的操作 能够替换进程地址空间的代码.text段 执行另外的程序&#xff0c;不需要创建额外的的地址空间 当前程序中调用另外一个应用程序 指定执行目录下的程序 int execl(const char *path, const char *arg&#xff0c;/* (char *) NULL */); /* pat…

如何配置 PostgreSQL 以实现高可用性和故障转移?

文章目录 一、高可用性和故障转移的概念&#xff08;一&#xff09;数据复制&#xff08;二&#xff09;监控和检测&#xff08;三&#xff09;快速切换 二、实现高可用性和故障转移的技术方案&#xff08;一&#xff09;流复制&#xff08;Streaming Replication&#xff09;&…