数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)

简介: 数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)

文章目录

项目说明

一、项目说明

单位信息数据库字段:

资源数据库字段

项目需求

二、项目开发

1.项目分析

2.引入库

3.项目开发

(1)地图容器构建

(2)筛选和返回按钮事件

(3)企业筛选功能

(4)百度地图封装

(5)判断是加载标注还是路线规划

(5)核心企业标注

(6)周边资源标注和弹窗

(7)路线规划:时间和距离

总结


项目说明

基于定制拼接大屏开发,其中显示大屏是长度8m,高度是2.57m,大约可以分成3部分:中间部分是16:9的地图界面,两边部分为2个竖屏显示,分辨率为4472*1536。


997f588eb9bd44899847567638687fb0.jpg


一、项目说明

单位信息数据库字段:

企业名称 、企业类型 、 地址 、 安全负责人、 联系电话1 、联系电话2 、简单介绍 、主要安全隐患 、 状态(下拉可选,比如正常生产、在整改、待整改、整改完毕待验收等) 视频监控链接(1-4);


资源数据库字段

分医疗救治、应急仓库、消防救援队伍、水源地4个类别


医疗救治:医院名称、地址、负责人、紧急联系电话、医院分类、专业特长、床位数;

救援队伍:名称、地址、负责人、电话、救援类别

应急储备仓库:名称、地址、负责人、电话、储存类别、储存数量

水源地:名称、地址、负责人、电话、容量


项目需求

进入数据可视化大屏后,以该企业(首次随机,可搜索)为核心显示地图,周围5公里以内显示1个浅红色的圆圈,显示周围的资源(不同的图标)、资源等到此处可以计算路径(路径计算为线路规划距离)。


a592b533afd54883b237894e8cdee718.gif


二、项目开发

1.项目分析

以客户需求为准,设计师提供大屏设计稿,整个大屏分为5部分:企业介绍、响应预案、核心地图、附近资源和路线规划,其中响应预案是固定API接口,和地图没有直接关联关系,其余4部分都是地图自动加载企业后,将对应的信息通过jq展示到对应的位置。为此,必须先开发地图,具体流程如下:


加载百度地图;

默认随机读取单位企业信息,提供地图中心点和缩放级别map.centerAndZoom(new window.BMap.Point(poi_lng, poi_lat), 13);

通过xm-select下拉筛选组件,选择单位,并在地图上进行二次加载展示;

显示企业周边对应5千米范围的资源信息点,以分类标注的形式展示,同时支持弹窗;

单击对应的资源标注,显示对应的信息内容,同时自动填充资源点经纬度坐标信息;

二次单击查询,实现企业和资源点之间的路线规划查询;

支持路线规划后返回功能;

2.引入库

引入百度地图jsAPI接口,实现百度地图标注、弹窗、范围搜索以及路线规划等功能的开发;

引入layui封装组件xm-select,实现企业的下拉搜索;

引入数据可视化自行开发的层叠样式表common.css;

    <!--百度地图核心库-->
    <script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=3HGqGo1RHf8zsLZC**"></script>
    <!--layui封装库-->
    <script src="static/layui/layui.js" charset="utf-8"></script>
    <script src="static/layui/xm-select.js"></script>
    <link rel="stylesheet" href="static/layui/css/layui.css">
    <!--样式表-->
    <link type="text/css" rel="stylesheet" href="static/rooted/css/common.css"/>

3.项目开发

(1)地图容器构建

 <div class="map_box">
                    <div class="search_panel">
                        <div class="layui-form-item searchTop">
                            <div id="selected_box" class="layui-input-inline xm-select-demo" style="width:200px;"><input type="hidden" id="depart_name2"></div>
                            <div class="layui-input-inline"><input type="text" id="res_name" name="res_name" autocomplete="off" class="layui-input" placeholder="资源点"></div>
                            <div class="layui-inline"><a class="layui-btn layui-btn-danger" id="btn"><i class="layui-icon layui-icon-search" style="color: #fff;"></i> 查询</a></div>
                            <div class="layui-inline"><a class="layui-btn layui-btn-warm" id="reback"><i class="layui-icon layui-icon-return" style="color: #fff;"></i> 返回</a></div>
                        </div>
                    </div>
                    <div id="lock_map"></div>
                </div>

(2)筛选和返回按钮事件

        //筛选操作;
        $('#btn').click(function () {
            var depart_name = $('#depart_name2').val();
            var res_name = $('#res_name').val();
            //加载地图;
            getSingleDepart(depart_name, res_name, 2)
        })
        //返回操作;
        $('#reback').click(function () {
            var depart_name = $('#depart_name2').val();
             $('#res_name').val('');
            //加载地图;
            getSingleDepart(depart_name, '', 2)
        })

(3)企业筛选功能

   //获取分类;
        xmSelect.render({
            el: '#selected_box',
            radio: true,//单选
            theme: {
                color: 'red',
            },
            paging: true,
            pageSize: 30,
            tips: '选择企业',
            filterable: true,//搜索模式
            remoteSearch: true,//远程搜索
            remoteMethod: function (val, cb, show) {
                $.getJSON('./api/api.php?act=getSingleEnterprise&token=3cab7ce4142**', {
                    depart_name: val
                }, function (res) {
                    var newData = res.data;
                    var data = [];
                    for (var i = 0; i < newData.length; i++) {
                        data.push({
                            name: newData[i].depart_name + "|" + newData[i].poi_lng + "|" + newData[i].poi_lat,
                            value: newData[i].depart_id
                        })
                    }
                    cb(data);
                });
            },
            on: function (data) {
                var selectArr = data.arr;
                var seachArr = [];
                for (var j = 0; j < selectArr.length; j++) {
                    seachArr.push(selectArr[j].name);
                }
                $("#depart_name2").val(seachArr.toString());
            }
        })

(4)百度地图封装

将地图map定义为全局函数,便于在实际开发过程中,进行参数的传递。

    // 百度地图;
    var map;
    function intSingleMap(markerArr, res_name, fromType) {
        map = new BMap.Map("lock_map", {enableMapClick: false});
        map.centerAndZoom(new window.BMap.Point(markerArr[0].poi_lng, markerArr[0].poi_lat), 13);
        map.enableScrollWheelZoom();
        //添加缩放控件
        var ctrlNav = new window.BMap.NavigationControl({
            anchor: BMAP_ANCHOR_TOP_LEFT,
            type: BMAP_NAVIGATION_CONTROL_LARGE
        });
        map.addControl(ctrlNav);
        //移除全部覆盖物
        map.clearOverlays();

(5)判断是加载标注还是路线规划

由于在同一个地图容器中操作,项目采用资源点名称是否为空作为加载标注还是路线规划的判断依据,即:

      if (res_name == "") {
            //加载数据;
            getSingleMaker(markerArr);
        } else {
            //获取线路;
            var ename = res_name.split("|");
            getDis(markerArr[0].depart_name, markerArr[0].poi_lng, markerArr[0].poi_lat, ename[0], ename[1], ename[2]);
        }

在多次使用同一地图加载数据时,为了避免重复加载地图图层,必须使用map.clearOverlays();清楚上次的内容。

(5)核心企业标注

    //绘制标注;
        function getSingleMaker(markerArr) {
            var allponits = [];
            for (var i = 0; i < markerArr.length; i++) {
                var p0 = markerArr[i].poi_lng;
                var p1 = markerArr[i].poi_lat;
                var pos = new window.BMap.Point(p0, p1);
                var lnglat = p0 + "," + p1;
                //添加标注和圆形范围;
                addSingleMarker(pos);
                addCircle(pos);
                //调用周边资源;
                $.getJSON('./api/api.php?act=getDistance&token=3cab7ce414***', {
                    lnglat: lnglat
                }, function (res) {
                    //console.log(res.data);
                    //附近资源
                    var entHtml = "";
                    if (res.data) {
                        for (var i = 0; i < res.data.length; i++) {
                            entHtml += "<li><span>"
                                + (i + 1)
                                + "</span><span>"
                                + getResName(res.data[i].res_type)
                                + "</span><span>"
                                + limitWords(res.data[i].res_name, 12)
                                + "</span><span>"
                                + res.data[i].res_tel
                                + "</span></li>"
                        }
                        $('#resource').html(entHtml);
                        //资源点标注;
                        getResMarker(res.data);
                    }
                });
            }
            map.setViewport(allponits);
        }

(6)周边资源标注和弹窗

        //绘制资源标注;
        function getResMarker(markerArr) {
            var allponits = [];
            for (var i = 0; i < markerArr.length; i++) {
                var p0 = markerArr[i].res_lng;
                var p1 = markerArr[i].res_lat;
                var cat = markerArr[i].res_type;
                var name = markerArr[i].res_name;
                var pos = new window.BMap.Point(p0, p1)
                var maker = addResMarker(pos, cat, name, p0, p1);
                addResInfoWindow(maker, cat, markerArr[i]);
            }
            map.setViewport(allponits);
        }

(7)路线规划:时间和距离

        //获取距离和时间;
        function getDis(sname, lng1, lat1, ename, lng2, lat2) {
            map.clearOverlays();
            var output = "<p>起点:" + sname + "</p><p>终点:" + ename + "</p><p>时间:";
            var searchComplete = function (results) {
                if (transit.getStatus() != BMAP_STATUS_SUCCESS) {
                    return;
                }
                var plan = results.getPlan(0);
                output += plan.getDuration(true) + "</p>";
                output += "<p>总路程为:";
                output += plan.getDistance(true) + "</p>";
            }
            var transit = new BMap.DrivingRoute(map, {
                renderOptions: {map: map},
                onSearchComplete: searchComplete,
                onPolylinesSet: function () {
                    $("#lines").html(output);
                }
            });
            var start = new BMap.Point(lng1, lat1);
            var end = new BMap.Point(lng2, lat2);
            transit.search(start, end);
        }


总结

本次数据可视化大屏应急管理综合指挥调度系统的开发,需求虽然简单,但是实现的过程确是十分的繁琐。必须将产品加载流程图分析清晰,做好底层的逻辑,才能根据需求开发对应的API接口。

相关文章
|
2月前
|
供应链 API
案例分享:API如何助力小型电商实现月销售额翻倍
&quot;悦居生活&quot;通过接入支付、库存、营销及物流API,优化运营流程,解决库存滞后、营销低效、物流体验差等问题,实现库存周转率提升152%、会员复购率增长128%、月销售额突破32万元。
49 1
|
3月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
|
12月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
10月前
|
JSON BI API
商城上货API接口的实战案例
在商城上货过程中,API接口扮演着至关重要的角色。以下是对商城上货API接口的实战分析,涵盖其主要功能、类型、安全性以及实战案例等方面。
|
10月前
|
XML 数据可视化 API
商品详情数据实战案例,API接口系列
淘宝商品详情数据在电商领域具有广泛的应用价值,而淘宝商品详情API接口则为开发者提供了获取这些数据的重要途径。通过合理利用这些接口和数据,可以提升业务效率、优化用户体验,为电商行业的发展注入新的活力。
|
存储 Linux API
Linux源码阅读笔记08-进程调度API系统调用案例分析
Linux源码阅读笔记08-进程调度API系统调用案例分析
|
JSON 数据管理 关系型数据库
【Dataphin V3.9】颠覆你的数据管理体验!API数据源接入与集成优化,如何让企业轻松驾驭海量异构数据,实现数据价值最大化?全面解析、实战案例、专业指导,带你解锁数据整合新技能!
【8月更文挑战第15天】随着大数据技术的发展,企业对数据处理的需求不断增长。Dataphin V3.9 版本提供更灵活的数据源接入和高效 API 集成能力,支持 MySQL、Oracle、Hive 等多种数据源,增强 RESTful 和 SOAP API 支持,简化外部数据服务集成。例如,可轻松从 RESTful API 获取销售数据并存储分析。此外,Dataphin V3.9 还提供数据同步工具和丰富的数据治理功能,确保数据质量和一致性,助力企业最大化数据价值。
497 1
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`&lt;h:inputText&gt;`、`&lt;h:dataTable&gt;`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
122 0
|
UED 存储 自然语言处理
【语言无界·体验无疆】解锁Vaadin应用全球化秘籍:从代码到文化,让你的应用畅游世界每一个角落!
【8月更文挑战第31天】《国际化与本地化实战:构建多语言支持的Vaadin应用》详细介绍了如何使用Vaadin框架实现应用的国际化和本地化,提升用户体验和市场竞争力。文章涵盖资源文件的创建与管理、消息绑定与动态加载、日期和数字格式化及文化敏感性处理等方面,通过具体示例代码和最佳实践,帮助开发者构建适应不同语言和地区设置的Vaadin应用。通过这些步骤,您的应用将更加灵活,满足全球用户需求。
158 0
|
API 数据库 UED
全面解析构建高性能API的秘诀:运用Entity Framework Core与异步编程提升Web应用响应速度及并发处理能力的详细指南与实践案例
【8月更文挑战第31天】本文详细介绍了如何利用 Entity Framework Core (EF Core)的异步编程特性构建高性能 API。通过创建基于 EF Core 的 .NET Core Web API 项目,配置数据库上下文,并定义领域模型,文章展示了如何使用异步方法进行数据查询、加载相关实体及事务处理。具体代码示例涵盖了 GET、POST、PUT 和 DELETE 操作,全面展示了 EF Core 异步编程的优势,有助于提升 API 的响应速度和处理能力。
153 0