react d3使用循环显示多个地图

首先需要写一个组件:

import React, { useState, useEffect, useRef } from 'react';
import ChinaMap from 'moment';
import * as d3 from 'd3';
import chinaGeoJson from 'china-geojson/src/geojson/china.json';const MyMapToShowResult = ({ realData }) => {const [data, setData] = useState({});const [loading, setLoading] = useState(true);const svgRef = useRef(null);const [hoveredProvince, setHoveredProvince] = useState(null);useEffect(() => {const backgroundColor = 'blue';const svg = d3.select(svgRef.current);svg.style('background-color', backgroundColor);let isMounted = true;const width = 780;const height = 580;const projection = d3.geoMercator().center([105, 38]).scale(600).translate([width / 2, height / 2]);const path = d3.geoPath().projection(projection);const features = JSON.parse(JSON.stringify(chinaGeoJson.features));//const realData = [//  { province: '北京', emission: 500 },//  { province: '上海', emission: 200 },//  { province: '台湾', emission: 400 },//  { province: '青海', emission: 200 },//  { province: '辽宁', emission: 300 },//  { province: '黑龙江', emission: 100 },//];features.forEach((feature, i) => {// 在 realData 中查找对应省份的数据const provinceData = realData.find(data => data.province === feature.properties.name);// 如果找到对应省份的数据,则将真实的数量赋给 emission 属性if (provinceData) {feature.properties.emission = provinceData.emission;} else {feature.properties.emission = 0;}});console.log('== 省份数据:', features);svg.selectAll('*').remove();svg.append('g').attr('transform', `translate(${width / 2},${height / 2})`).call(projection);svg.selectAll('path').data(features).join('path').attr('d', path).transition().attr('fill-opacity', 0.8).style('stroke', 'black').style('stroke-width', '1px').attr('data-tip', (d, i) => { return d.properties.name + " : " + d.properties.emission; }).attr('fill', (d, i) => {const colorScale = d3.scaleSequential().interpolator(d3.interpolateRgb('#ffffff', '#008000')).domain([0, d3.max(features, d => d.properties.emission)]);return colorScale(d.properties.emission);});// 创建比色卡const legendWidth = 200;const legendHeight = 20;const legendPadding = 10;const legend = svg.append('g').attr('transform', `translate(${width - legendWidth - legendPadding},${height - legendHeight - legendPadding})`);const colorScale = d3.scaleSequential().interpolator(d3.interpolateRgb('#ffffff', '#008000')).domain([0, d3.max(features, d => d.properties.emission)]);console.log('== 比色卡前,省份数据:', features);const legendXScale = d3.scaleLinear().domain([0, d3.max(features, d => d.properties.emission)]).range([0, legendWidth]);// 根据需要设置刻度数量const legendXAxis = d3.axisBottom(legendXScale).ticks(5);legend.append('g').attr('class', 'legend-axis').attr('transform', `translate(0, ${legendHeight})`).call(legendXAxis);const legendGradient = legend.append('linearGradient').attr('id', 'legend-gradient').attr('gradientUnits', 'userSpaceOnUse').attr('x1', 0).attr('x2', legendWidth).selectAll('stop').data(colorScale.ticks().map((t, i, n) => ({offset: `${100 * i / n.length}%`,color: colorScale(t)}))).join('stop').attr('offset', d => d.offset).attr('stop-color', d => d.color);legend.append('rect').attr('x', 0).attr('y', -legendHeight / 2).attr('width', legendWidth).attr('height', legendHeight).style('fill', 'url(#legend-gradient)');}, [data]);return (<div><svg ref={svgRef} width="800" height="600"></svg><div id="tooltip" style={{ display: 'none', position: 'absolute', backgroundColor: 'white', padding: '5px', borderRadius: '5px', boxShadow: '0 2px 5px rgba(0, 0, 0, 0.3)', zIndex: '999' }}></div>{hoveredProvince && (<div id="tooltip" style={{ display: 'block', position: 'absolute', backgroundColor: 'white', padding: '5px', borderRadius: '5px', boxShadow: '0 2px 5px rgba(0, 0, 0, 0.3)', zIndex: '999', left: '10px', top: '10px' }}>{hoveredProvince}</div>)}</div>);
};export default MyMapToShowResult;

然后在页面进行引用,并且传递数据给组件:

引入:

import MyMapToShowResult from "@/compontens/MyMapToShowResult";

渲染:(注意需要把realData声明赋值)

<MyMapToShowResult realData={realData}/

在循环中使用:

{data.map((item, index) => (<div key={index}><p>map{index}</p><MyMapToShowResult realData={realData}/></div>
))}

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

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

相关文章

笔记 | 十六进制不进位加法

这里写自定义目录标题 题目极笨代码错误原因正确代码 题目 Time Limit: 1000 ms Memory Limit: 256 mb 16进制不进位的加法&#xff0c;即和正常加法类似&#xff0c;只是不用去计算进位的数&#xff0c;比正常的加法更简单。 如A 6 0&#xff08;正常加法是10&#xff0c;…

使用JAXB将xml转成Java对象

文章目录 使用JAXB将xml转成Java对象1. xml内容2. Java对象类3. 封装的工具类4. 测试 使用JAXB将xml转成Java对象 工作中遇到个问题&#xff0c;需要将xml转对象&#xff0c;之前复杂的xml都是自己用dom4j来解析组装成Java对象&#xff0c;但是对于简单的&#xff0c;看到了JAX…

SQL中的PowerDesigner逐步深入提问,你能掌握多少?

你提到了有PowerDesigner操作经验&#xff0c;请解释一下PowerDesigner是什么&#xff0c;以及它在数据库设计和开发中的作用是什么&#xff1f; 标准回答&#xff1a; PowerDesigner是一种数据库建模和设计工具&#xff0c;它用于创建数据库模型、设计表结构、定义关系和生成…

android.support.multidex.MultiDexApplication:DexPathList

修改项目的build.gradle文件&#xff0c;使用multidex并添加multidex库作为依赖&#xff0c;如下所示&#xff1a; android { defaultConfig { ... minSdkVersion 21 targetSdkVersion 28 multiDexEnabled true } ... } dependencies { compile com.android.support:multidex…

【漏洞复现】Smanga未授权远程代码执行漏洞(CVE-2023-36076) 附加SQL注入+任意文件读取

文章目录 前言声明一、产品简介一、漏洞描述二、漏洞等级三、影响范围四、漏洞复现五、修复建议六、附加漏洞漏洞一、SQL注入漏洞二、任意文件读取 前言 Smanga存在未授权远程代码执行漏洞,攻击者可在目标主机执行任意命令,获取服务器权限。 声明 请勿利用文章内的相关技术从…

windows彻底卸载unity

1.控制面板卸载 双击打开桌面的控制面板&#xff0c;选择卸载程序&#xff0c;选中Unity和UnityHub右击卸载。 2.清除unity的注册表 在运行中输入“regedit”双击打开注册表界面 删除 HKEY_CURRENT_USER\Software\Unity 下所有项 删除 HKEY_CURRENT_USER\Software\Unity Tec…

电脑怎么取消磁盘分区?

有时候&#xff0c;我们的电脑会出现一个磁盘爆满&#xff0c;但另一个却空着&#xff0c;这时我们可以通过取消磁盘分区来进行调整&#xff0c;那么&#xff0c;这该怎么操作呢&#xff1f;下面我们就来了解一下。 磁盘管理取消磁盘分区 磁盘管理是Windows自带的磁盘管理工具…

BMS电池管理系统的蓝牙芯片 国产高性能 低功耗蓝牙Soc芯片PHY6222

电池管理系统是对电池进行监控与控制的系统&#xff0c;将采集的电池信息实时反馈给用户&#xff0c;同时根据采集的信息调节参数&#xff0c;充分发挥电池的性能。但是&#xff0c;前技术中&#xff0c;在管理多个电池时&#xff0c;需要人员现场调试与设置&#xff0c;导致其…

leetcode Top100 (5) 盛最多水的容器

/*** 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。* <p>* 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。* <p>* 返回容器可以储存的最大水量。* <p>* …

uniapp h5网页打开白屏

修改了默认基本运行路径&#xff0c;然后直接打开index.html的情况下是会这样&#xff0c;放在nginx服务器上运行就ok了。 把默认的./ 路径修改了&#xff1a;/cloudh5 nginx html目录下放子网站 &#xff1a;/cloudh5&#xff1a;

6-2 pytorch中训练模型的3种方法

Pytorch通常需要用户编写自定义训练循环&#xff0c;训练循环的代码风格因人而异。&#xff08;养成自己的习惯&#xff09; 有3类典型的训练循环代码风格&#xff1a;脚本形式训练循环&#xff0c;函数形式训练循环&#xff0c;类形式训练循环。 下面以minist数据集的多分类模…

Spring Boot集成Redis实现数据缓存

&#x1f33f;欢迎来到衍生星球的CSDN博文&#x1f33f; &#x1f341;本文主要学习Spring Boot集成Redis实现数据缓存 &#x1f341; &#x1f331;我是衍生星球&#xff0c;一个从事集成开发的打工人&#x1f331; ⭐️喜欢的朋友可以关注一下&#x1faf0;&#x1faf0;&…

【最新面试问题记录持续更新,java,kotlin,android,flutter】

最近找工作&#xff0c;复习了下java相关的知识。发现已经对很多概念模糊了。记录一下。部分是往年面试题重新整理&#xff0c;部分是自己面试遇到的问题。持续更新中~ 目录 java相关1. 面向对象设计原则2. 面向对象的特征是什么3. 重载和重写4. 基本数据类型5. 装箱和拆箱6. …

华为aarch64架构的泰山服务器EulerOS 2.0 (SP8)系统离线安装saltstack3003.1实践

华为泰山服务器的CPU芯片架构为aarch64&#xff0c;所装系统为EulerOS 2.0 (SP8)aarch64系统&#xff0c;安装saltstack比较困难。本文讲解通过pip安装方式离线安装saltstack3003.1以进行集中化管理和维护。 一、系统环境 1、操作系统版本 [rootlocalhost ~]# cat /etc/os-r…

uniapp 可输入可选择的........框

安装 uniapp: uni-combox地址 vue页面 <uni-combox :border"false" input"selectname" focus"handleFocus" blur"handleBlur" :candidates"candidates" placeholder"请选择姓名" v-model"name"&g…

Flask实现Web服务调用Python程序

Flask实现Web服务调用Python程序_flask调用python程序_小白白程序员的博客-CSDN博客 【小沐学Python】Python实现Web服务器&#xff08;Flask入门&#xff09;_python flask web开发_爱看书的小沐的博客-CSDN博客

在微信公众号怎么实现投票活动

微信公众号实现投票活动的方法和步骤 一、投票活动的优势 通过投票活动&#xff0c;微信公众号可以实现用户参与、增加互动、了解用户需求等功能&#xff0c;同时也可以提升品牌知名度和用户粘性。以下是一些投票活动的优势&#xff1a; 增加用户参与度&#xff1a;通过投票活…

SpringCloudGateway网关实战(三)

SpringCloudGateway网关实战&#xff08;三&#xff09; 上一章节我们讲了gateway的内置过滤器Filter&#xff0c;本章节我们来讲讲全局过滤器。 自带全局过滤器 在实现自定义全局过滤器前&#xff0c; spring-cloud-starter-gateway依赖本身就自带一些全局过滤器&#xff0…

嵌入式-C语言中的常量

目录 一.简介 二.常量类型 一.简介 在C语言中&#xff0c;常量是指不可改变的值&#xff0c;即固定不变的数据。常量可以是数值、字符或字符串等类型的值。常量可以直接在代码中使用&#xff0c;而无需在程序运行时进行修改。 二.常量类型 C语言中的常量有以下几种类型&…

Unity中Shader的模板测试

文章目录 前言什么是模板测试1、模板缓冲区2、模板缓冲区中存储的值3、模板测试是什么&#xff08;看完以下流程就能知道模板测试是什么&#xff09;模板测试就是在渲染&#xff0c;后渲染的物体前&#xff0c;与渲染前的模板缓冲区的值进行比较&#xff0c;选出符合条件的部分…