• Echarts绘制地图,且可以下钻到省区


     点击前

    点击后(山东省为例)

    1. 安装echarts,echarts按需引入      
      npm install echarts --save

    1. //引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口
    2. import * as echarts from 'echarts/core';

    2.引入echarts后,基于准备好的dom,初始化echarts实例。 

    1. const ChartMap = (props) =>{
    2. const {id} = props;
    3. const [name, setName] = useState('china');
    4. const renderMap = (code, name) => {
    5. const chartId = document.getElementById(id);
    6. const myChart = echarts.getInstanceByDom(chartId as HTMLElement);
    7. if (myChart) {
    8. mapInstance = myChart;
    9. } else {
    10. mapInstance = echarts.init(chartId as HTMLElement);
    11. }
    12. };
    13. const chinaMapConfig = (name, data) => {
    14. // 地图配置
    15. const option = {...}
    16. mapInstance.clear();
    17. mapInstance.setOption(option);
    18. }
    19. useEffect(() =>{
    20. renderMap(name);
    21. },[name])
    22. return (
    23. <div style={{ width: "100%", height: "70vh" }} id={id}>div>
    24. );
    25. };
    26. export default ChartMap;

      3.  使用echarts.registerMap 注册可用地图

    1. import { MapChart } from 'echarts/charts';
    2. //使用visiualMap来配置图表根据值的范围显示特定的颜色
    3. import { VisualMapComponent } from 'echarts/components';
    4. // 必须在使用 use 方法注册了 MapChart 后才能使用 registerMap 注册地图
    5. echarts.registerMap(name, data); // name: 地图当前名称和地图的地理数据

    4. 地图数据下载,推荐阿里云 DataV
       我已经提前下载到本地,可以统一放在后端或者cdn上

    1. import { mapJson } from './map';
    2. import { ahuiJson } from './ahui';
    3. // 上海, cp地理位置
    4. export const mapJson = {
    5. type: 'FeatureCollection',
    6. features: [{
    7. type: 'Feature',
    8. id: 'shang_hai',
    9. properties: {
    10. name: '上海',
    11. cp: [121.4648, 31.2891],
    12. childNum: 19,
    13. adcode: '310000',
    14. },
    15. geometry: {
    16. type: 'Polygon',
    17. coordinates: [
    18. [
    19. [120.9375, 31.0254],
    20. [121.2012, 31.4648],
    21. [121.377, 31.5088],
    22. [121.1133, 31.7285],
    23. [121.2012, 31.8604],
    24. [121.9922, 31.5967],
    25. [121.9043, 31.1572],
    26. [121.9922, 30.8057],
    27. [121.2891, 30.6738],
    28. [120.9375, 31.0254],
    29. ],
    30. ],
    31. },
    32. }],
    33. }

    5. visualMap 视觉映射组件 
     visualMap 是视觉映射组件。可以定义为 分段型(visualMapPiecewise) 或 连续型(visualMapContinuous),通过 type 来区分。

    1. visualMap: {
    2. left: "left", // visualMap 组件离容器左侧的距离,值为`'left'`, `'center'`, `'right'`,组件会根据相应的位置自动对齐。
    3. bottom: 0,
    4. itemSymbol:"circle",
    5. right: 10,
    6. seriesIndex: [0],
    7. itemWidth: 10, // 每个图元的宽度
    8. itemGap: 4, // 每两个图元之间的间隔距离,单位为px
    9. pieces: [
    10. {gte: 8, lte: 9, label: '连续下降', color: '#FF4D4D', symbol: 'circle'},
    11. {gte: 5, lte: 8, label: '本期下降', color: '#FF6F00', symbol: 'circle'},
    12. {gte: 1, lte: 5, label: '本期上升', color: '#FFC666', symbol: 'circle'},
    13. {gte: 0, lte: 1, label: '连续上升', color: '#13BF30', symbol: 'circle'},
    14. {gte: -1, lte: 0, label: '价格预警', color:'', symbol: 'image://http://xxx.png'}
    15. ],
    16. },

    6. 利用echartsInstance.resize改变图表尺寸 

    1. useEffect(() => {
    2. window.addEventListener("resize", function () {
    3. mapInstance.resize();
    4. });
    5. return () => {
    6. mapInstance && mapInstance.dispose();
    7. };
    8. }, []);

    7. 地图的后端数据
       alwaysDown:true是显示炸弹图标
       value: 是根据数据大小显示色值不同

    1. const mapInfos1 = [
    2. {
    3. alwaysDown: false,
    4. marketShareTrend: "8",
    5. name: "上海",
    6. provCode: "310000",
    7. provName: "上海",
    8. value: 1,
    9. },
    10. {
    11. alwaysDown: true,
    12. marketShareTrend: "8",
    13. name: "安徽",
    14. provCode: "340000",
    15. provName: "安徽省",
    16. value: 8,
    17. }
    18. ]
    19. const mapInfos2 = [
    20. {
    21. alwaysDown: false,
    22. marketShareTrend: "2",
    23. provCode: "340200",
    24. provName: "芜湖市",
    25. name: "芜湖市",
    26. value: 3
    27. },
    28. {
    29. alwaysDown: false,
    30. marketShareTrend: "2",
    31. name: "马鞍山市",
    32. provCode: "340500",
    33. provName: "马鞍山市",
    34. value: 3
    35. }
    36. ]

    8.  图例禁止点击

    1. const toEntriesObject = (data) => {
    2. return data?.features?.map((v) => ({
    3. name: v.properties.name,
    4. adcode: v.properties.adcode,
    5. }));
    6. };
    7. const handleClickMap = () => {
    8. mapInstance?.on('click', (params) => {
    9. clearTimeout(timeFn);
    10. timeFn = setTimeout(function() {
    11. const name = params.name; //地区name
    12. const code = toEntriesObject(mapJson).find((el:any) => el.name === name)?.adcode;
    13. if(!code) return
    14. setName(name);
    15. }, 250);
    16. });
    17. // 炸弹不点击
    18. mapInstance?.on('datarangeselected',(e) => {
    19. const selected = { 0: true, 1: true, 2: true, 3: true, 4: true };
    20. if (JSON.stringify(selected) !== JSON.stringify(e.selected) && !Object.values(e.selected)[4]) { //* 判断是否为全部选中,全部选中则不用设置。如果不判断则会死循环
    21. e.selected[4] = true
    22. mapInstance.dispatchAction({ //* 调用action方法将图例重新设置为全部选中
    23. type: 'selectDataRange',
    24. selected: e.selected
    25. })
    26. }
    27. })
    28. }

    9. 炸弹图标添加

    1. geo: {
    2. map: name,
    3. zoom: 1.25,
    4. roam: false,
    5. },
    6. series: [{
    7. map: name,
    8. type: "scatter",
    9. coordinateSystem: "geo",
    10. symbol: icon,
    11. symbolSize: 16,
    12. symbolOffset: [2, 8],
    13. data:convertData(mapInfos, mapData),
    14. tooltip:{
    15. show: false
    16. }
    17. }]

    10.  地图的完整配置

    1. const option = {
    2. backgroundColor: '#E1E6EB',
    3. tooltip: {
    4. trigger: "item",
    5. showDelay: 0,
    6. transitionDuration: 0.2,
    7. },
    8. visualMap: {
    9. left: "left", // visualMap 组件离容器左侧的距离,值为`'left'`, `'center'`, `'right'`,组件会根据相应的位置自动对齐。
    10. bottom: 0,
    11. itemSymbol:"circle",
    12. right: 10,
    13. seriesIndex: [0],
    14. itemWidth: 10, // 每个图元的宽度
    15. itemGap: 4, // 每两个图元之间的间隔距离,单位为px
    16. pieces: [
    17. {gte: 8, lte: 9, label: '连续下降', color: '#FF4D4D', symbol: 'circle'},
    18. {gte: 5, lte: 8, label: '本期下降', color: '#FF6F00', symbol: 'circle'},
    19. {gte: 1, lte: 5, label: '本期上升', color: '#FFC666', symbol: 'circle'},
    20. {gte: 0, lte: 1, label: '连续上升', color: '#13BF30', symbol: 'circle'},
    21. {gte: -1, lte: 0, label: '价格预警', color:'', symbol: 'image://http://xxx.png'}
    22. ],
    23. },
    24. geo: {
    25. map: name,
    26. zoom: 1.25,
    27. roam: false,
    28. },
    29. series: [{
    30. name: 'MAP',
    31. type: 'map',
    32. zoom: 1.25,
    33. mapType: name,
    34. selectedMode: false,//是否允许选中多个区域
    35. label: {
    36. normal: {
    37. show: true,
    38. },
    39. emphasis: {
    40. show: true
    41. }
    42. },
    43. itemStyle: {
    44. normal: {
    45. borderColor: "rgba(254, 254, 254, 1)",
    46. borderWidth: 1,
    47. label:{
    48. color: '#48535A'
    49. }
    50. },
    51. emphasis: {
    52. areaColor: "#eee",
    53. borderColor: "rgba(255,111,0,1)",
    54. borderWidth: 1,
    55. label:{
    56. color: '#FF6F00'
    57. }
    58. },
    59. },
    60. data: mapInfos
    61. },{
    62. map: name,
    63. type: "scatter",
    64. coordinateSystem: "geo",
    65. symbol: icon,
    66. symbolSize: 16,
    67. symbolOffset: [2, 8],
    68. data:convertData(mapInfos, mapData),
    69. tooltip:{
    70. show: false
    71. }
    72. }]
    73. };

     注意:

    •  mapInfos1,mapInfos2中的name的值要和mapJson的name保持一致,这样数据才会展示出来
    •  mapJson的cp字段是为了调整文字展示的位置,防止重叠在一起
    • serise内scatter的配置与option.geo共存,即在地理坐标系内添加组件,且option.geo.roam为false,否则出现如下情况​​​​​​​

     

  • 相关阅读:
    使用Java的方式配置Spring
    nvm下node安装;node环境变量配置
    不是吧,还有人连Java最强大的技术之一:反射还没搞懂?赶紧码住
    LRR1000 智能程控电阻箱
    DevOps|破除壁垒,重塑协作-业务闭环释放产研运协作巨大效能
    阿里EMO模型:AI生成表情丰富的视频
    自动驾驶中常见的位姿表示和坐标系问题
    基于Python+tkinter实现一个简易计算器桌面软件
    【无标题】
    openGauss内核分析:查询重写
  • 原文地址:https://blog.csdn.net/Little_Pig_Bug/article/details/126143441