地图下钻,双击返回上一级

news2024/11/15 14:08:38

介绍:
看了好多地图下钻的案例,要么json文件不全胡,要么返回功能不全胡,有的返回是直接写死,返回到首页,我这个小案例是使用地理小工具的数据,本案例可以逐步一级一级的返回,地图的其他样式可以根据项目需求在option中配置。

lodash4.17.21版本:

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
    #chart-panel {
      position: absolute;
      left: 0;
      right: 0;
      top: 0;
      bottom: 0;
    }
  </style>

  <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.2.1/echarts.min.js"></script>
  <!-- <script src="https://lib.baomitu.com/echarts/4.1.0/echarts.min.js"></script> -->
  <script src=""></script>
  <script src="./静态资源/Lodash4.17.21.min.js"></script>
  <script src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
  <!-- <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.1/echarts.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.2.1/echarts.min.js"></script> -->
</head>

<body>
  <div id="chart-panel" style="margin-top:30px"></div>
  <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
  <script type="text/javascript">
    //各省份的数据
    var allData = [
      {
        name: '北京'
      }, {
        name: '天津'
      }, {
        name: '上海'
      }, {
        name: '重庆'
      }, {
        name: '河北'
      }, {
        name: '河南'
      }, {
        name: '云南'
      }, {
        name: '辽宁'
      }, {
        name: '黑龙江'
      }, {
        name: '湖南'
      }, {
        name: '安徽'
      }, {
        name: '山东'
      }, {
        name: '新疆'
      }, {
        name: '江苏'
      }, {
        name: '浙江'
      }, {
        name: '江西'
      }, {
        name: '湖北'
      }, {
        name: '广西'
      }, {
        name: '甘肃'
      }, {
        name: '山西'
      }, {
        name: '内蒙古'
      }, {
        name: '陕西'
      }, {
        name: '吉林'
      }, {
        name: '福建'
      }, {
        name: '贵州'
      }, {
        name: '广东'
      }, {
        name: '青海'
      }, {
        name: '西藏'
      }, {
        name: '四川'
      }, {
        name: '宁夏'
      }, {
        name: '海南'
      }, {
        name: '台湾'
      }, {
        name: '香港'
      }, {
        name: '澳门'
      }];

    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(document.getElementById('chart-panel'));
    for (var i = 0; i < allData.length; i++) {
      allData[i].value = Math.round(Math.random() * 100);
    }

    var allmapdata = [];//每点击一次,都将获取的地图level、name和mapcode储存在数组中
    var bigArray = [];//保存所有点击过的区域显示的地图,不重复的数组
    var timeFn = null;
    var click_history_path_Arry = [];//点击的历史记录

    click_history_path_Arry.push({//初始历史记录
      type: 'FeatureCollection',
      level: 'country',
      name: '中国',
      adcode: 'https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=100000_full'
    })
    localStorage.setItem('click_history_path_Arry', JSON.stringify(click_history_path_Arry))
    console.log('初始历史记录:', click_history_path_Arry);
    loadMap('https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=100000_full', '中国');  //初始化地图


    /**
     获取对应的json地图数据,然后向echarts注册该区域的地图,最后加载地图信息
     @params {String} mapCode:json数据的地址
     @params {String} name: 地图名称
     */
    function loadMap(mapCode, name) {
      $.get(mapCode, function (data) {
        console.log('传入省份json网址的数据:', data.features);

        var detail_data = []
        // 从中国地图数据中获取每个省份的名字
        // console.log("获取点击后的下一级数据:");
        // console.log("子节点数量:", data.features.length);
        data.features.forEach(item => {
          // console.log( item.type, item.properties.level, item.properties.name, item.properties.adcode);
          if (item.properties.level == 'province') {
            detail_data.push({
              type: item.type,
              level: item.properties.level,
              name: item.properties.name,
              adcode: 'https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=' + item.properties.adcode + '_full'
            })

          }
          else if (item.properties.level == 'city') {
            detail_data.push({
              type: item.type,
              level: item.properties.level,
              name: item.properties.name,
              adcode: 'https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=' + item.properties.adcode + '_full'
            })

          }
          else if (item.properties.level == 'district') {
            detail_data.push({
              type: item.type,
              level: item.properties.level,
              name: item.properties.name,
              adcode: 'https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=' + item.properties.adcode
            })

          }
        });
        allmapdata.push(...detail_data)//将点击后显示的区域都追加到allmapdata数组
        bigArray = _.uniqWith(allmapdata, _.isEqual);//利用loadsh进行数组去重

        // 将 bigArray 转换为字符串,并保存到 localStorage  
        localStorage.setItem('bigArray', JSON.stringify(bigArray));
        //console.log('全量不重复数据:', bigArray);//这个数组数据很有用

        if (data) {
          echarts.registerMap(name, data);

          var option = {
            tooltip: {
              show: true,
              textStyle: {
                color: '#681752',//文字的颜色。
                fontStyle: 'normal',//文字字体的风格。
                fontWeight: 'bolder',
                fontSize: 20,
                textBorderWidth: 4,
                textBorderType: 'solid',
              },
              formatter: function (params) {
                if (params.data) return params.name + ':' + params.data['value']
              },
            },
            // 视觉映射组件,用于视觉编码,如颜色、大小等  
            visualMap: {
              type: 'continuous',//连续型数据 
              text: ['', ''],// 文本,默认为数值文本,为空时则不显示  
              showLabel: false,//false    true// 是否显示文字标签 
              left: '50',// 组件离容器左侧的距离 
              min: 0,// 映射的最小值 
              max: 100,// 映射的最大值  
              inRange: {// 在视觉映射范围内的视觉元素  
                color: ['#edfbfb', '#b7d6f3', '#40a9ed', '#3598c1', '#215096',]
              },
              splitNumber: 0,// 这里设置为0可能会按照数据自动计算分割段数 
            },
            //roam: true, // 是否开启鼠标缩放和平移漫游 
            series: [{
              name: 'MAP',
              type: 'map',
              mapType: name, // 使用的地图类型,这里使用了变量 name 来动态指定
              selectedMode: 'false',//是否允许选中多个区域
              layoutCenter: ["50%", "50%"], //地图位置
              layoutSize: "100%",
              zoom: 1, //当前视角的缩放比例
              label: {
                normal: {
                  show: true,// 正常状态下是否显示标签 
                },
                emphasis: {
                  show: true,// 高亮状态下是否显示标签
                }
              },
              data: allData,// 数据内容,这里使用了变量 allData 来动态指定 
            }]
          };

          myChart.setOption(option);
        }
        else {
          alert('json数据不存在,无法加载该地图');
        }
      });
    }

    // 查询函数,通过name属性,查找adcode
    function findAdcodeByName(name, data) {
      for (let i = 0; i < data.length; i++) {
        if (data[i].name === name) {
          return data[i].adcode;
        }
      }
      return null; // 如果没有找到,返回null或你想要的任何默认值  
    }

    //单击切换到省级地图,当mapCode有值,说明可以切换到下级地图
    myChart.on('click', function (params) {
      clearTimeout(timeFn);
      //由于单击事件和双击事件冲突,故单击的响应事件延迟250毫秒执行
      // console.log(params);
      timeFn = setTimeout(function () {
        var name = params.name; //获取单击时区域的名字
        const mapCode = findAdcodeByName(name, JSON.parse(localStorage.getItem('bigArray')));//通过name在全量数据中查找mapcode路径

        localStorage.setItem('danji_name', name)//将单击时的区域名字存储本地
        localStorage.setItem('danji_mapcode', mapCode)//将单击时的区域json数据存储本地
        var get_name = localStorage.getItem('danji_name')
        var get_mapcode = localStorage.getItem('danji_mapcode')
        console.log("单击区域名字:", get_name, "单击区域mapcode:", get_mapcode);

        // 当点击的时候将点击区域的名字和mapcode推进历史记录数组
        setTimeout(function () {
          click_history_path_Arry = JSON.parse(localStorage.getItem('click_history_path_Arry'));
          console.log('获取第一次路径:', click_history_path_Arry);

          click_history_path_Arry.push({
            name: get_name,
            adcode: get_mapcode
          })
          click_history_path_Arry = _.uniqWith(click_history_path_Arry, _.isEqual);//利用loadsh进行数组去
          localStorage.setItem('click_history_path_Arry', JSON.stringify(click_history_path_Arry));
          console.log('历史路径:', click_history_path_Arry);//这个有路径
        }, 200)
        if (!mapCode) {
          alert('无此区域地图显示!!!');
          return;
        }
        loadMap(mapCode, name);
      }, 250);
    });
    // 绑定双击事件,返回全国地图
    myChart.on('dblclick', function (params) {
      //当双击事件发生时,清除单击事件,仅响应双击事件
      clearTimeout(timeFn);
      // 对历史路径中的元素进行去重
      var get_click_history_path_Arry = _.uniqWith(JSON.parse(localStorage.getItem('click_history_path_Arry')), _.isEqual)
      console.log('从本地获取的历史路径:', get_click_history_path_Arry);
      // 检查数组是否非空  
      if (get_click_history_path_Arry.length > 1) {
        // 获取倒数第二个元素的索引(因为JavaScript的索引是从0开始的)  
        const lastIndex = get_click_history_path_Arry.length - 2;
        // 访问该索引的name和adcode  
        const his_name = get_click_history_path_Arry[lastIndex].name;
        const his_adcode = get_click_history_path_Arry[lastIndex].adcode;
        // 打印结果  
        console.log('上传名字:', his_name);
        console.log('上传Adcode:', his_adcode);
        loadMap(his_adcode, his_name);
        const newAreas = get_click_history_path_Arry.slice(0, get_click_history_path_Arry.length - 1);
        localStorage.setItem('click_history_path_Arry', JSON.stringify(newAreas))//将删除后的数组覆盖掉本地原有的数组
      }
      else {
        alert('暂无历史记录.');
      }
    });
  </script>
</body>
</html>

效果图片:
在这里插入图片描述
单击进入下一级:
在这里插入图片描述
单击再次进入下一级:
在这里插入图片描述
双击返回上一级:
在这里插入图片描述
返回到首页:
在这里插入图片描述

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

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

相关文章

中学生学人工智能系列:如何用AI学英语

经常有读者朋友给公众号《人工智能怎么学》留言咨询如何使用人工智能学习语文、数学、英语等科目。这些都是中学教师、中学生朋友及其家长们普遍关注的问题。仅仅使用留言回复的方式&#xff0c;不可能对这些问题做出具体和透彻的解答&#xff0c;因此本公众号近期将推出中学生…

用户流失分析:如何使用Python训练一个用户流失预测模型?

引言 在当今商业环境中&#xff0c;客户流失分析是至关重要的一环。随着市场竞争的加剧&#xff0c;企业需要更加注重保持现有客户&#xff0c;并深入了解他们的离开原因。本文探讨了用户流失分析的核心概念以及如何构建客户流失预测模型的案例。通过分析用户行为数据和交易模式…

网络工程基础 不同网段下的设备实现通信

交换机可以实现同一个网段下的不同设备直接通信 路由器可以实现不同的网段下的设备进行通信 路由器查看路由表命令 display ip routing-table 华为路由器配置静态路由命令&#xff1a; ip route-static 目的网络地址 子网掩码 下一跳地址 电脑判断不同网段的ip会把请求转给网…

AI - 如何科学的使用提示词

一、目的&#xff1a; 在人工智能领域&#xff0c;尤其是在与AI交互的过程中&#xff0c;精确而高效的提示词至关重要。它们不仅能够引导AI更准确地理解我们的需求&#xff0c;还能提升整个交流过程的质量和效率。解决大模型很多时候不能给出我们想要的结果的问题&#xff0c;…

任务3.1:采用面向对象方式求三角形面积

面向对象编程&#xff08;OOP&#xff09;是一种将现实世界中的实体抽象为对象&#xff0c;并通过类和对象来模拟现实世界中的行为和属性的编程范式。在本实战任务中&#xff0c;我们通过创建一个Triangle类来模拟现实世界中的三角形&#xff0c;并使用面向对象的方法来求解三角…

OrangePi AIpro 快速上手初体验——接口、样例和目标检测

​ 一、 开发板简介 OrangePi AIpro开发板是香橙派联合华为精心打造的高性能 AI 开发板&#xff0c;其搭载了昇腾 AI 处理器&#xff0c;可提供 8TOPS INT8 的计算能力&#xff0c;内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算&#xff0c;可…

stm32学习-CubeIDE开发

参考正点原子CubeIDE视频 stm32开发常用开发环境&#xff08;代码编写软件&#xff09; MDK5&#xff1a;通用所有的ARM芯片&#xff0c;收费、界面功能原始 CubeMxMDK5&#xff1a;CubeMX图形化配置外设&#xff0c;生成Hal库代码 CubeIDE&#xff08;集成了CubeMX&#…

C++进阶篇章:set与map(pair , multiset , multimap)

目录 1.关联式容器与序列式容器 2.pair&#xff08;键值对&#xff09; 3.set 构造函数 find函数 count函数&#xff1a; insert函数 4.multiset 5.map insert函数 operator[] 1.关联式容器与序列式容器 C中关联式容器与序列式容器是两种不同的容器 1.关联式容器 关…

【Python Cookbook】S01E01 将长度为N的序列分解为N个单独的变量

目录 问题解决方案讨论 问题 将一个包含 N N N 个元素的元组或者序列&#xff0c;现在想将其分解为 N N N 个单独的变量。 解决方案 任何序列都可以通过简单的赋值操作分解为单独的变量&#xff1a; p (4, 5) x, y p print("x", x) print("y", y)唯…

合约之间调用-如何实现函数静态调用?

合约之间的函数调用 EOA&#xff0c;external owned account&#xff0c;外部账号&#xff0c;例如metamask调用最终总是由EOA发起的合约之间的调用使得一次完整的调用成为一个调用链条 合约间调用过程 调用者须持有被调用合约的地址得到被调用合约的信息将地址重载为被调用合…

ChatGPT的工作原理,这篇文章说清楚了!

作者&#xff1a;史蒂芬沃尔弗拉姆&#xff08;Stephen Wolfram&#xff09;英、美籍 计算机科学家&#xff0c; 物理学家。他是 Mathematica 的首席设计师&#xff0c;《一种新科学》一书的作者。 ChatGPT 能够自动生成一些读起来表面上甚至像人写的文字的东西&#xff0c;这…

c#点击listview控件获取内容

构造函数添加&#xff1a; 点击事件&#xff1a; &#xff08;listview控件确保有内容&#xff0c;比如已查询到数据添加到了listview&#xff09; if (listView_data_base.Items.Count > 0){listView_data_base.FullRowSelect true;listView_data_base.Items[listView_da…

Django 解决 CSRF 问题

在 Django 出现 CSRF 问题 要解决这个问题&#xff0c;就得在 html 里这么修改 <!DOCTYPE html> <html><head></head><body><form action"/login/" method"post">{% csrf_token %}</form></body> </…

Vue3项目练习详细步骤(第三部分:文章分类页面模块)

文章分类列表 主体结构 接口文档 文章分类列表查询接口数据绑定 Pinia状态管理库 axios请求拦截器 Pinia持久化插件-persist 未登录统一处理 添加文章分类 主体结构 接口文档 绑定请求数据 编辑文章分类 弹框结构 数据回显 接口文档 绑定请求数据 删除分类 …

CPU占用率很高,相应很慢排查思路

获取线程状态 通过top -c命令可以动态显示进程及其占用资源的排行榜 可以看到&#xff0c;CPU占用率100%的PID是80972&#xff0c;定位到该进程之后&#xff0c;我们再从线程的dump日志中去定位. 使用top -H -p 80972命令查找到该进程中消耗CPU最多的线程&#xff0c;从下面的…

海外社媒账号如何运营安全稳定?

由于设备与网络原因&#xff0c;通常一个海外社媒账号尤其是多账号的稳定性都有一定限制&#xff0c;错误的操作或者网络都可能使得账号被封&#xff0c;前功尽弃。本文将为大家讲解如何通过IP代理来维持账号稳定与安全&#xff0c;助力海外社媒矩阵的搭建。 一、社媒账号关联…

金蝶云星空数据库迁移后,显示 error: 40 - 无法打开到 SQL Server 的连接的解决方法

原因&#xff1a;数据库迁移/或者更新IP后&#xff0c;与之前添加的数据库地址不一致导致无法连接数据库&#xff1b; 解决方法&#xff1a;修改IP为目前数据库的IP&#xff1b; 文件路径&#xff1a;在ManageSite\APP_Data\Common.config中&#xff0c;修改DbServerInstance…

数据源不同?奥威BI软件是这么做的

面对数据源不同的情况&#xff0c;BI&#xff08;商业智能&#xff09;软件如奥威BI软件通常通过一系列技术和方法来实现数据的整理。以下以奥威BI软件为例&#xff0c;详细解释其如何整理不同数据源的数据&#xff1a; 数据收集&#xff1a; 爬虫技术&#xff1a;奥威BI软件…

【车载开发系列】Autosar DEM中重要配置项说明

【车载开发系列】Autosar DEM中重要配置项目 【车载开发系列】Autosar DEM中重要配置项目说明 【车载开发系列】Autosar DEM中重要配置项目1&#xff09;DemDtcStatusAvailabilityMask2&#xff09;DemTypeOfDTCSupported3&#xff09;DemFreezeFrameCapture4&#xff09;DemIm…

3D模型三角面转四角面操作指南---模大狮模型网

在3D建模的过程中&#xff0c;三角面(Triangles)和四角面(Quads)是两种常见的多边形类型。虽然三角面在渲染速度和计算效率上有其优势&#xff0c;但四角面在模型编辑和纹理映射上通常更为方便。因此&#xff0c;将三角面转换为四角面是建模过程中常见的需求。 一、选择合适的建…