漏刻有时数据可视化Echarts组件开发(26):全国地图三级热力图下钻和对接api自动调用数据开发实录

简介: 漏刻有时数据可视化Echarts组件开发(26):全国地图三级热力图下钻和对接api自动调用数据开发实录

项目需求

  1. 1.基于全国地图进行省市区(县)三级下钻开发;
  2. 2.不同区域进行视觉映射,体现区域热力图;
  3. 3.自动调用后台API,对应区域显示数据库数据;
  4. 4.动态筛选条件,依据筛选条件加载数据;


项目分析

1.全国完整地图china,json,二级省级34个json地理数据,三级地市344个json地理数据。地理数据获取存在难度,获取最新的地市和区县地理数据难上加难;

2.动态加载数据,意味着需要将地图下钻整体封装成函数,同时容器对应的变量设置为全局变量,才能实现图表和菜单的双向互动;

3.对接API数据时,只传过来有数据的地区名称,而无数据的地区空置,需要进行技术处理。如下所示:

{
    "err": "",
    "res": "",
    "data": [
        {
            "name": "山东省",
            "value": "921"
        }
    ],
    "code": 0,
    "msg": 0
}

只有山东省数据时,其他省的鼠标高亮效果会出现undefined异常。

4. 北京、天津、上海、重庆四个直辖市只有二级下钻;

5. 海南省下钻市,海域面积过大,需要进行特殊处理;

6. 省市json地理数据与对应区域的映射编码;


项目开发

外部文件

    <script type="text/javascript" src="static/js/jquery.2.14.js"></script>
    <script type="text/javascript" src="static/js/functions.js"></script>
    <script type="text/javascript" src="static/js/echarts5.min.js"></script>
    <!-- 全国344个市、区、州对应的数字编号 -->
    <script type="text/javascript" src="static/js/citymap.js"></script>
    <script type="text/javascript" src="static/js/lockmaps.js"></script>
    <link rel="stylesheet" type="text/css" href="static/rooted/css/lockmap.css">
    <!--layui核心框架-->
    <script src="static/layui/layui.js"></script>
    <link rel="stylesheet" href="static/layui/css/layui.css" media="all">
  • 搜索表单使用layui;
  • 基于Echarts5开发,动态效果更炫,同时会自动弥补区域无数据时补0;


图表容器及返回按钮

<!--地图-->
<div class="box">
    <span id="back">全国</span>
    <span id="cityBtn" class="hidden"></span>
    <span id="countyBtn" class="hidden"></span>
    <div id="main"></div>
</div>

对应省市区,分别做隐藏式的面包屑按钮,跟随鼠标互动显示或隐藏区域名称。


互动菜单

    //地图容器
    var oBack = document.getElementById("back");
    // 点击返回按钮
    oBack.onclick = function () {
        $('#cityBtn').addClass('hidden');
        $('#countyBtn').addClass('hidden');
        //加载地图;
        getChina(project_id, course_id);
    };
    //加载地图;
    getChina('', '');


常量配置

//34个省、市、自治区的名字拼音映射数组
var provinces = {
    //23个省
    "台湾省": "taiwan",
    "河北省": "hebei",
    "山西省": "shanxi",
    "辽宁省": "liaoning",
    "吉林省": "jilin",
    "黑龙江省": "heilongjiang",
    "江苏省": "jiangsu",
    "浙江省": "zhejiang",
    "安徽省": "anhui",
    "福建省": "fujian",
    "江西省": "jiangxi",
    "山东省": "shandong",
    "河南省": "henan",
    "湖北省": "hubei",
    "湖南省": "hunan",
    "广东省": "guangdong",
    "海南省": "hainan",
    "四川省": "sichuan",
    "贵州省": "guizhou",
    "云南省": "yunnan",
    "陕西省": "shanxi1",
    "甘肃省": "gansu",
    "青海省": "qinghai",
    //5个自治区
    "新疆维吾尔自治区": "xinjiang",
    "广西壮族自治区": "guangxi",
    "内蒙古自治区": "neimenggu",
    "宁夏回族自治区": "ningxia",
    "西藏自治区": "xizang",
    //4个直辖市
    "北京市": "beijing",
    "天津市": "tianjin",
    "上海市": "shanghai",
    "重庆市": "chongqing",
    //2个特别行政区
    "香港特别行政区": "xianggang",
    "澳门特别行政区": "aomen"
};
//直辖市和特别行政区-只有二级地图,没有三级地图
var special = ["北京市", "天津市", "上海市", "重庆市", "香港特别行政区", "澳门特别行政区"];


对接API封装函数

//省级下钻;
function getProvince(name, pid, cid) {
    $.getJSON('static/js/map/province/' + provinces[name] + '.json', function (data) {
        echarts.registerMap(name, data);
        //获取数据;
        $.getJSON('./api/api.php?act=getMap&token=3cab7ce4142608c0f40c785b5ab5ca24', {
            fromType: 'province',
            regionName: name,
            project_id: pid,
            course_id: cid
        }, function (res) {
            //console.log(res.data)
            lockDrillMap('main', name, res.data, pid, cid);
        })
    });
};
//地级市下钻;
function getCity(name, pid, cid) {
    $.getJSON('static/js/map/city/' + cityMap[name] + '.json', function (data) {
        echarts.registerMap(name, data);
        $.getJSON('./api/api.php?act=getMap&token=3cab7ce4142608c0f40c785b5ab5ca24', {
            fromType: 'city',
            regionName: name,
            project_id: pid,
            course_id: cid
        }, function (res) {
            lockDrillMap('main', name, res.data, pid, cid);
        })
    });
}


视觉映射配置

   //判断视觉映射最大值;
    //console.log(data);
    var dataMax;
    if (data.length == 0) {
        dataMax = 1;
    } else {
        dataMax = data[0].value;
    }
    /* if (data.length == 0) {
         dataMax = 1;
     } else {
         dataMax = data[0].value;
         for (var i = 0; i < data.length - 1; i++) {
             dataMax = dataMax < data[i + 1].value ? data[i + 1].value : dataMax
         }
     }*/
  visualMap: {
            show: true,
            left: '5%',
            bottom: '5%',
            calculable: true,
            min: 0,
            max: dataMax,
            textStyle: {
                color: "#FFF"
            },
            inRange: {
                symbolSize: 30,
                symbol: 'circle',
                color: ['#A3E00B', '#E0022B']
            }
        },


海南省放大

    // 针对海南放大
    if (map == '海南省') {
        option.series[0].center = [109.844902, 19.0392];
        option.series[0].layoutCenter = ['50%', '50%'];
        option.series[0].layoutSize = "120%";
    } else { //非显示海南时,将设置的参数恢复默认值
        option.series[0].center = undefined;
        option.series[0].layoutCenter = undefined;
        option.series[0].layoutSize = undefined;
    }


   //防止重复触发点击事件
    lockChart.off('click');
    //地图点击事件
    lockChart.on('click', function (params) {
        //console.log(params.name);
        if (params.name in provinces) {
            //如果点击的是34个省、市、自治区,绘制选中地区的二级地图
            $('#cityBtn').html(params.name);
            $('#cityBtn').removeClass('hidden');
            getProvince(params.name, pid, cid);
        } else if (params.seriesName in provinces) {
            //如果是【直辖市/特别行政区】只有二级下钻
            if (special.indexOf(params.seriesName) >= 0) {
                console.log("未找到对应的下钻级别.");
            } else {
                //显示县级地图
                $('#countyBtn').html(params.name);
                $('#countyBtn').removeClass('hidden');
                /*二级返回按钮*/
                $('#cityBtn').click(function () {
                    $('#countyBtn').addClass('hidden');
                    var val = $('#cityBtn').html();
                    getProvince(val, pid, cid);
                })
                getCity(params.name, pid, cid);
            }
        } else {
            console.log("未找到对应的下钻级别.");
        }
    });


@lockdata.cn


相关文章
|
9月前
|
JSON API 数据格式
小红书API接口文档:笔记详情数据开发手册
小红书笔记详情API可获取指定笔记的标题、正文、互动数据及多媒体资源,支持字段筛选与评论加载。通过note_id和access_token发起GET/POST请求,配合签名验证,广泛用于内容分析与营销优化。
1868 3
|
9月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
10月前
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。
|
10月前
|
人工智能 自然语言处理 机器人
使用 API 编程开发扣子应用
扣子(Coze)应用支持通过 API 编程,将 AI 聊天、内容生成、工作流自动化等功能集成至自有系统。主要 API 包括 Bot API(用于消息交互与会话管理)及插件与知识库 API(扩展功能与数据管理)。开发流程包括创建应用、获取密钥、调用 API 并处理响应,支持 Python 等语言。建议加强错误处理、密钥安全与会话管理,提升集成灵活性与应用扩展性。
3150 0
|
11月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
743 0
|
11月前
|
存储 监控 算法
淘宝买家秀 API开发实录Python(2025)
本文讲述了作者在电商开发领域,尤其是对接淘宝买家秀 API 接口过程中所经历的挑战与收获。从申请接入、签名验证、频率限制到数据处理和实时监控,作者分享了多个实战经验与代码示例,帮助开发者更高效地获取和处理买家秀数据,提升开发效率。
|
12月前
|
数据采集 缓存 监控
唯品会 API 开发痛点解析:从权限申请到数据清洗的实战经验
本文深入解析唯品会开放平台(VOP)API开发全流程,涵盖权限申请、签名机制、数据清洗、性能优化等核心挑战与实战解决方案,助力开发者高效构建稳定可靠的电商数据整合系统。
|
9月前
|
API 开发者 数据采集
高效获取淘宝商品详情:API 开发实现链接解析的完整技术方案
2025反向海淘新机遇:依托代购系统,聚焦小众垂直品类,结合Pandabay数据选品,降本增效。系统实现智能翻译、支付风控、物流优化,助力中式养生茶等品类利润翻倍,新手也能快速入局全球市场。
高效获取淘宝商品详情:API 开发实现链接解析的完整技术方案
|
10月前
|
数据采集 缓存 API
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
本文详解小红书笔记详情API的开发对接、实战场景与收益模式,涵盖注册避坑、签名生成、数据解析全流程,并分享品牌营销、内容创作、SAAS工具等落地应用,助力开发者高效掘金“种草经济”。
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
|
9月前
|
缓存 数据可视化 定位技术
快递鸟快递API技术指南:获取物流轨迹信息与轨迹地图的解决方案
在当今电商竞争激烈的环境中,物流体验已成为提升用户满意度的关键因素。研究表明,超过 75% 的消费者会因物流信息不透明而放弃下单。
1998 1