从零开始:React+ECharts动态地理数据可视化

ECharts是由百度开源的一款基于JavaScript的数据可视化库,专为Web开发者设计,用于构建交互式图表和大屏数据展示,作为开发者,我们只需要修改配置属性就可以实现图标的高效展示。

引入

js 复制代码
npm install --save echarts-for-react

npm install --save echarts
// 3d地图会用到的插件
npm install --save echarts-gl

获取地理数据GEO

从以下网站可以获取geo数据,用于我们在echarts中展示。 DataV.GeoAtlas地理小工具系列

获取下载下来的geojson,存储在项目目录中。 例如:

上代码

js 复制代码
import React from "react";
import ReactECharts from "echarts-for-react";
import chinaGeoJSON from "../../public/map_data/map.json";
import * as echarts from "echarts";
import "echarts-gl";

export default function ScreenPage() {
  echarts.registerMap("chinatmp", chinaGeoJSON);

  return (
    <div>
      <section
        className="relative p-4 bg-gray-900"
        style={{
          width: "100%",
          height: "100vh",
          position: "fixed",
          top: 0,
          left: 0,
        }}
      >
        {/* 3D 地图容器 */}
        <div className="absolute inset-0" id="map-container">
          <ReactECharts
            option={{
              series: [
                {
                  type: "map3D",
                  map: "chinatmp",
                  viewControl: {
                    projection: "perspective",
                    distance: 70,
                    zoomSensitivity: 0.8,
                    minDistance: 30,
                    maxDistance: 150,
                    alpha: 30,
                    beta: 15,
                    center: [0, 0, 0],
                    animationDurationUpdate: 300, // 减少动画时间
                    damping: 0.2,
                  },
                  performance: {
                    // 添加性能监控
                    showFPS: true, // 显示帧率
                    showRenderTime: true, // 显示渲染时间
                  },
                  progressiveThreshold: 5000, // 大数据量分块加载
                  postEffect: {
                    bloom: {
                      intensity: 0.6, // 降低辉光强度
                    },
                    SSAO: {
                      radius: 1.5, // 缩小环境光遮蔽范围
                      intensity: 1.2,
                    },
                  },
                  itemStyle: {
                    // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                    //   { offset: 0, color: '#00ffff' },
                    //   { offset: 1, color: '#0000ff' }
                    // ]),
                    color: "#286ECA", // 地图板块的颜色
                    opacity: 1, // 图形的不透明度 [ default: 1 ]
                    borderWidth: 0.5, // (地图板块间的分隔线)图形描边的宽度。加上描边后可以更清晰的区分每个区域
                    borderColor: "#333", // 图形描边的颜色。[ default: #333 ]
                  },
                  label: {
                    show: true, // (地图上的城市名称)是否显示标签
                    distance: 10,
                    formatter: function (params) {
                      return params.name ? params.name : " ";
                    },
                    textStyle: {
                      // 标签的字体样式
                      color: "#fff", // 地图初始化区域字体颜色
                      fontSize: 15, // 字体大小
                    },
                  },
                  emphasis: {
                    label: {
                      // label 高亮时的配置
                      show: true,
                      textStyle: {
                        color: "#fff", // 高亮时标签颜色变为 白色
                        fontSize: 15, // 高亮时标签字体 变大
                      },
                    },
                    itemStyle: {
                      // itemStyle 高亮时的配置
                      color: "#66ffff", // 高亮时地图板块颜色改变
                    },
                  },
                  environment: new echarts.graphic.LinearGradient(
                    0,
                    0,
                    0,
                    1,
                    [
                      {
                        // 配置为垂直渐变的背景
                        offset: 0,
                        color: "#183890", // 天空颜色
                      },
                      {
                        offset: 0.7,
                        color: "#040829", // 地面颜色
                      },
                      {
                        offset: 1,
                        color: "#040829", // 地面颜色
                      },
                    ],
                    false
                  ),
                  light: {
                    main: {
                      color: "#3D94CE", // 改为冷色调主光源
                      intensity: 2.5, // 增强光照强度
                      shadow: true, // 启用阴影
                      shadowQuality: "ultra",
                      alpha: 65, // 调整光源角度
                      beta: -25,
                    },
                    ambient: {
                      color: "#4b0082", // 紫色环境光增强神秘感
                      intensity: 1.2,
                    },
                  },
                },
              ],
              tooltip: {
                trigger: "item",
                position: "inside",
                formatter: "{b}",
                backgroundColor: "rgba(50, 50, 50, 0.7)",
                textStyle: {
                  color: "#FFFFFF",
                  textalign: "center",
                  fontSize: "12px",
                },
              },
            }}
            style={{ height: "100%", width: "100%" }}
          />
        </div>
      </section>
    </div>
  );
}

就是一堆配置,来实现美化效果,大家可以参考调整。

怎么拼接多个省份到同一张地图

多个省份怎么展现在一张地图中呢,就需要将不同geo数据拼接到一起。 geojson.io | powered by Mapbox 打开很慢。 使用这个工具,Open多个json就可以将不同的geojson拼接到一起,然后粘贴出去即可。

相关推荐
好好好明天会更好8 分钟前
vue中的this.$nextTick如何使用
前端·vue.js
我的div丢了肿么办10 分钟前
使用URLSearchParams 优雅的获取URL携带的参数
前端·javascript
XXXFIRE10 分钟前
微信小程序开发实战笔记:全流程梳理
前端·微信小程序
答案answer13 分钟前
回顾一下我的开源项目之路和Three.js 学习历程
前端·开源·three.js
ZoeLandia13 分钟前
nginx实战分析
运维·前端·nginx
张迅之啊13 分钟前
【React】MQTT + useEventBus 实现MQTT长连接以及消息分发
前端
入秋16 分钟前
【视觉震撼】我用Three.js让极光在网页里跳舞!
前端·three.js
盛夏绽放17 分钟前
Vue项目生产环境性能优化实战指南
前端·vue.js·性能优化
专注API从业者25 分钟前
Python/Node.js 调用taobao API:构建实时商品详情数据采集服务
大数据·前端·数据库·node.js
狂炫一碗大米饭44 分钟前
Vue 3 的最佳开源分页库
前端·程序员·设计