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

news2025/4/22 2:50:17

需求:我们在开发过程中会遇到使用中国地图来划分不同区域省份下面的数量统计情况,但是有时候使用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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis---10---SpringBoot集成Redis

SpringBoot集成Redis 总体概述jedis-lettuce-RedisTemplate三者的联系 本地Java连接Redis常见问题&#xff0c;注意 bind配置请注释掉​ 保护模式设置为no​ Linux系统的防火墙设置​ redis服务器的IP地址和密码是否正确​ 忘记写访问redis的服务端口号和auth密码集成Jedis …

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

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

【C++干货基地】C++模板深度解析:进阶技巧与高级特性掌握(按需实例化、全特化与偏特化)文末送书

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

运维锅总详解CPU

本文从CPU简介、衡量CPU性能指标、单核及多核CPU工作流程、如何平衡 CPU 性能和防止CPU过载、为什么计算密集型任务要选择高频率CPU、超线程技术、CPU历史演进及摩尔定律等方面对CPU进行详细分析。希望对您有所帮助&#xff01; 一、CPU简介 CPU&#xff08;中央处理器&#…

亚马逊自养号实操:搭建高效防砍单IP环境的步骤与技巧

在亚马逊自养号下单的实践中&#xff0c;面对砍单与封号的风险&#xff0c;构建一个稳固且安全的IP网络环境成为了至关重要的一环。以下是一系列精心设计的步骤与策略&#xff0c;主要帮助卖家减少这些风险&#xff0c;确保账号的稳定运行&#xff1a; 一、构建稳固的IP网络环境…

实例演示kafka stream消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

jmeter-beanshell学习3-beanshell获取请求报文和响应报文

前后两个报文&#xff0c;后面报文要用前面报文的响应结果&#xff0c;这个简单&#xff0c;正则表达式或者json提取器&#xff0c;都能实现。但是如果后面报文要用前面请求报文的内容&#xff0c;感觉有点难。最早时候把随机数写在自定义变量&#xff0c;前后两个接口都用这个…

如何处理 PostgreSQL 中由于表连接顺序不当导致的性能问题?

文章目录 一、理解表连接和连接顺序二、识别由于表连接顺序不当导致的性能问题三、影响表连接顺序的因素四、解决方案手动调整连接顺序创建合适的索引分析数据分布和优化查询逻辑 五、示例分析手动调整连接顺序创建索引优化查询逻辑 六、总结 在 PostgreSQL 中&#xff0c;表连…

浪潮信息携手算力企业为华东产业集群布局提供高质量算力支撑

随着信息技术的飞速发展&#xff0c;算力已成为推动数字经济发展的核心力量。近日&#xff0c;浪潮信息与五家领先的算力运营公司在南京正式签署战略合作协议&#xff0c;共同加速华东地区智算基础设施布局&#xff0c;为区域经济发展注入新动力。 进击的算力 江苏持续加码智算…

使用LoFTR模型进行图像配准、重叠区提取

LoFTR模型源自2021年CVPR提出的一篇论文LoFTR: Detector-Free Local Feature Matching with Transformers&#xff0c;其基于pytorch实现图像配准&#xff0c;与基于superpointsuperglue的方法不同&#xff0c; 是一个端到端的图像配准方法。与LoFTR官方库相关的有loftr2onnx库…

推荐好玩的工具之OhMyPosh使用

解除禁止脚本 Set-ExecutionPolicy RemoteSigned 下载Oh My Posh winget install oh-my-posh 或者 Install-Module oh-my-posh -Scope AllUsers 下载Git提示 Install-Module posh-git -Scope CurrentUser 或者 Install-Module posh-git -Scope AllUser 下载命令提示 Install-Mo…

搜索旋转数组

题目链接 搜索旋转数组 题目描述 注意点 数组已被旋转过很多次数组元素原先是按升序排列的若有多个相同元素&#xff0c;返回索引值最小的一个 解答思路 首先需要知道的是&#xff0c;本题数组中的旋转多次只是将头部的某些元素移动到尾部&#xff0c;所以不论怎么旋转&am…

欢迎加入国家智能网联汽车创新中心OS开发训练营大家庭

欢迎加入国家智能网联汽车创新中心OS开发训练营大家庭。&#x1f680; 导学阶段启动 在正式开营之前&#xff0c;我们特别设置了导学阶段&#xff0c;旨在帮助大家更好地迎接颇具挑战性的项目实战。导学阶段包括一系列精心准备的视频课程和配套习题。github链接&#xff1a;htt…

20K Stars!一个轻量级的 JS 库

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 Driver.js 是一个轻量级的 JavaScript 库,旨在帮助开发人员创建网站或应用程序的引导和教程。通过 Driver.js,您可以引导用户了解网站的各个功能和使用方式。 Driver.js 提供了高度可定制的功能,使其能够适应各种需求和…

Unity编辑器扩展之Inspector面板扩展

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity编辑器扩展之Inspector面板扩展 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff…

开关阀(4):对于客户技术要求信息的识别

1.阀门部分 2.执行器 行程时间的一般标准 The stroking times are applicable to throttling control valves and should not exceed 2 seconds/inch of valve diameter 3.附件 4.定位器

ubuntu设置开启自动挂载sftp

1. 前言 与其说 ubuntu 开启自动挂载 sftp, 更确切的说应该是 nautilus (ubuntu上默认的文件管理器) 开机自动挂载 sftp。 因为 这里即使选择永远记住&#xff0c;开机也不会自动挂载 sftp 2.设置方法 gnome-session-properties #开机只启动设置命令设置 gio mount sftp…

科普文:构建可扩展的微服务架构设计方案

前言 微服务架构是一种新兴的软件架构风格&#xff0c;它将单个应用程序拆分成多个小的服务&#xff0c;每个服务都运行在自己的进程中&#xff0c;这些服务通过网络进行通信。这种架构的优势在于它可以提高应用程序的可扩展性、可维护性和可靠性。 在传统的应用程序架构中&…

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

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

Linux SSH服务介绍

1. 引言 在现代IT基础设施中&#xff0c;远程访问和管理服务器已成为日常运维工作的重要组成部分。Secure Shell (SSH) 是一种广泛使用的加密网络协议&#xff0c;允许在不安全的网络上安全地进行远程登录和其他网络服务。本文将详细介绍SSH服务的各个方面&#xff0c;包括其定…