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

news/2024/10/5 7:59:22/

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

1,实现效果图如下:

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

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

在这里插入图片描述

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

javascript">function mergeProvinces(chinaJson, regionMap) {//合并大区里省份的coordinatesvar oldFeatures = chinaJson.featuresvar 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.coordinatesif (coordinates[0].length !== 1) {polygonsCoordinates = polygonsCoordinates.concat(coordinates)} else {polygonsCoordinates = polygonsCoordinates.concat(coordinates.reduce((r, e) => {return r.concat(e)}, []),)}oldFeatures[j].ok = 1break}}}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 = featuressreturn chinaJson}

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

javascript"><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) {//合并大区里省份的coordinatesvar oldFeatures = chinaJson.featuresvar 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.coordinatesif (coordinates[0].length !== 1) {polygonsCoordinates = polygonsCoordinates.concat(coordinates)} else {polygonsCoordinates = polygonsCoordinates.concat(coordinates.reduce((r, e) => {return r.concat(e)}, []),)}oldFeatures[j].ok = 1break}}}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 = featuressreturn chinaJson}const chinaMap = ref()let myChart: echarts.EChartsconst 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 = 100if (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.ppmy.cn/news/1473471.html

相关文章

生产力工具|viso常用常见科学素材包

一、科学插图素材网站 一图胜千言&#xff0c;想要使自己的论文或重要汇报更加引人入胜&#xff1f;不妨考虑利用各类示意图和科学插图来辅助研究工作。特别是对于新手或者繁忙的科研人员而言&#xff0c;利用免费的在线科学插图素材库&#xff0c;能够极大地节省时间和精力。 …

SpringBoot中整合ONLYOFFICE在线编辑

SpringBoot整合OnlyOffice SpringBoot整合OnlyOffice实现在线编辑1. 搭建私有的OnlyOffice的服务2. SpringBoot进行交互2.1 环境2.2 我们的流程2.3 接口规划2.3.1 获取编辑器配置的接口2.3.2 文件下载地址2.3.3 文件下载地址 3. 总结4. 注意4.1 你的项目的地址一定一定要和only…

【国产开源可视化引擎Meta2d.js】钢笔

钢笔 钢笔是和其他众多绘图工具&#xff08;Photoshop、Sketch、Illustrator&#xff09;中一致的钢笔工具&#xff0c;能够很方便的在线绘制各种小图标 在线体验&#xff1a; 乐吾乐2D可视化 示例&#xff1a; // 开始绘画&#xff1a;curve。除了curve&#xff0c;还有poly…

CASS如何输入距离和坐标绘制图形

1、软件版本 这里使用CASS7.0软件进行操作。如下&#xff1a; 2、 操作 输入&#xff1a;500,45【表示距离500米&#xff0c;方向45度】。 点击回车&#xff0c;完成绘制。

万界星空科技MES系统中的排版排产功能

在当今高度竞争的市场环境中&#xff0c;企业对于生产管理的效率和质量要求日益提高。作为智能制造的重要组成部分&#xff0c;制造执行系统&#xff08;MES&#xff09;以其强大的功能&#xff0c;在提升企业生产能力方面发挥着不可替代的作用。万界星空科技作为行业领先的智能…

PCA和PCoA分析的python代码

主成分分析&#xff08;PCA&#xff09;和主坐标分析&#xff08;PCoA&#xff09;都是数据降维和可视化的常用方法&#xff0c;但它们在适用场景和计算方法上有一些重要区别。 主成分分析&#xff08;PCA&#xff09; 定义: PCA是一种线性降维方法&#xff0c;通过正交变换将…

electron通信与持久化存储

electron通信 主进程与渲染进程的通信方式 IPC (Inter-Process Communication) 通信&#xff1a; 使用 ipcMain 和 ipcRenderer 模块进行通信。 ipcMain 用于在主进程中接收和处理消息。 ipcRenderer 用于在渲染进程中发送消息。 使用 contextBridge 和 preload 脚本&#…

每日一练:攻防世界:Hidden-Message

追踪UDP数据流&#xff0c;没有任何隐藏信息&#xff1a; WP&#xff1a; 观察流量包 每个流的唯一的区别就是UDP的源地址srcport的最后一位在变化 都提取出来就是二进制序列 用tshark提取一下 //使用tshark过滤出源端口&#xff0c;使用cut裁取端口的最后一位 tshark -r 8…