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

news2024/11/26 2:41:00

文章目录

  • 项目说明
  • 一、项目说明
    • 单位信息数据库字段:
    • 资源数据库字段
    • 项目需求
  • 二、项目开发
    • 1.项目分析
    • 2.引入库
    • 3.项目开发
      • (1)地图容器构建
      • (2)筛选和返回按钮事件
      • (3)企业筛选功能
      • (4)百度地图封装
      • (5)判断是加载标注还是路线规划
      • (5)核心企业标注
      • (6)周边资源标注和弹窗
      • (7)路线规划:时间和距离
  • 总结


项目说明

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


在这里插入图片描述

一、项目说明

单位信息数据库字段:

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

资源数据库字段

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

  • 医疗救治:医院名称、地址、负责人、紧急联系电话、医院分类、专业特长、床位数;
  • 救援队伍:名称、地址、负责人、电话、救援类别
  • 应急储备仓库:名称、地址、负责人、电话、储存类别、储存数量
  • 水源地:名称、地址、负责人、电话、容量

项目需求

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

二、项目开发

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接口。

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

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

相关文章

【java】stream流

文章目录体验stream流stream流的生成方式Stream流的常见中间操作方法Stream流的常见中间操作方法Stream流的常见终结操作方法Stream流的练习Stream流的收集操作体验stream流 package heima.stream流;import java.util.ArrayList;public class P1 {public static void main(Stri…

node.js+uni计算机毕设项目基于微信小程序的肉鸡养殖管理平台LW(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

第二十四章 数论——质数(2)(详细讲解质数的筛选原理和证明!!)

第二十四章 数论——质数的筛选一、朴素筛法——埃氏筛法1、问题描述2、算法思路3、代码实现二、线性筛法——欧拉筛1、朴素筛法的弊端2、欧拉筛&#xff08;1&#xff09;算法思路&#xff08;2&#xff09;代码实现一、朴素筛法——埃氏筛法 1、问题描述 2、算法思路 我们从…

【折腾服务器 2】妖板 Intel N5105 + i226 主板安装 群晖、直通 SATA 控制器 教程

Catch UP 前期回顾&#xff0c;我在这台使用 N5105 和 Intel 226V 2.5G 网卡的电脑上安装了 ESXi 7.0 系统。文章在博客里有&#xff0c;可以去翻翻。 Chapter 1 网络环境准备 登录 VMWare ESXi&#xff0c;点击左侧的网络。 点击 虚拟交换机 有一个 vSwitch 0 这个是默认的&a…

抽象类与接口(Java系列6)

目录 前言&#xff1a; 1.抽象类 1.1抽象类的概念及语法 1.2 抽象类的特征 1.3抽象类的特性 2.接口 2.1接口的概念及语法 2.2接口的使用及特性 2.2.1接口的使用 2.2.2接口的特性 2.3实现多个接口 2.4接口的继承 3.抽象类与接口的区别 结束语&#xff1a; 前言&…

分布式理论之分布式选举

写在前面 一个国家需要领导人制定各种国家决策&#xff0c;一个军队也需要最高统领来制定各种军事决策&#xff0c;同理&#xff0c;一个分布式集群也需要一个领导&#xff0c;来协调整个集群的事务&#xff0c;比如保证数据一致性(这也是最重要的&#xff01;)&#xff0c;分…

uni-app学习总结

本文以B站黑马教程的uni-app项目实战视频为载体&#xff0c;总结uni-app相关用法&#xff0c;如有误&#xff0c;请指出~ 一、创建项目&#xff1a; HbuilderX工具-->文件-->新建-->项目---》选择uni--app项目&#xff0c;创建。 二、项目初始化&#xff1a; 去掉一…

设计模式之结构型模式:适配器模式

前言 前面讲解完了设计模式中的创建性模式&#xff0c;本文开始讲解设计模式中的结构性模式之一&#xff1a;适配器模式。 一、适配器模式的是干什么的&#xff1f; A类想要使用B类中的某些方法&#xff0c;但是不能直接使用&#xff0c;需要一个中间类对B类进行处理后&…

C++的类型转换

目录C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_castC语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不…

【Linux】第七部分 Linux中系统管理

【Linux】第七部分 Linux中系统管理 文章目录【Linux】第七部分 Linux中系统管理7. Linux中系统管理7.1 进程和服务7.2 service 服务管理systemctl 基本语法systemctl设置后台服务的自启动配置关机重启命令总结7. Linux中系统管理 7.1 进程和服务 一个正在执行的程序或命令&a…

2023年快到了,就简单用python写个对联吧

人生苦短 我用python 我知道现在离过年还早~ 但是早点准备早点轻松~ Python写对联挺火的&#xff0c;但是代码又不是人人都用&#xff0c;那就直接写个界面打包一下呗~ 主要实现只要运行后输入上联下联、横批&#xff0c;然后自动生成春联保存在代码文件夹&#xff0c;如果…

梦想SkyPython IDLE入门

IDLE是Python软件包自带的一个集成开发环境&#xff0c;初学者可以利用它方便地创建、运行、测试和调试Python程序。 一、IDLE的安装 实际上&#xff0c;IDLE是跟Python一起安装的&#xff0c;不过要确保安装时选中了“Tcl/Tk”组件&#xff0c;准确地说&#xff0c;应该是不要…

六、应用层(一)网络应用模型

目录 1.1 客户/服务器模型 1.2 P2P模型 应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。 早期基于文本的应用&#xff08;电子邮件、远程登陆、文件传输、新闻组&#xff09;20世纪90年代将…

node.js+uni计算机毕设项目基于微信小程序的培训机构管理系统小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

六、应用层(二)域名系统(DNS)

目录 2.1层次域名空间 2.2域名服务器 2.3域名解析过程 域名系统&#xff08;Domain Name System,DNS&#xff09;是因特网使用的命名系统&#xff0c;用来把便于人们记忆的具有特定含义的主机名转换为便于机器处理的IP地址。 多台主机可以映射到同一个域名上&#xff08;如负…

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 yolo

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 通过Python基于YOLOv7深度学习网络对现场画面实时监测分析。当识别到现场车辆冲洗不干净或者没有冲洗&#xff0c;系统就立即抓拍。与C / C等语言相比&#xff0c;Python速度较慢。也就是说&#xff0c;Python可以使用C / C轻松…

SpringCloud图文详解 | 两种注册中心远程调用负载均衡服务网关... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘SpringCloud&#xff0c;顺便上传笔记。 下图是我总结的 SpringCloud 知识的初级思维导图&#xff0c;后续会不断补充 文章目录微服务技术演变单体架构分布式架构微服务 - 特点微服务实现 - 技术对比微服务技术 - 实际应用SpringCloud知识点总结服务拆分和…

SSM框架学习记录-SpringMVC_day02

1.SSM整合 代码参考Springmvc_08_ssm 流程分析 添加依赖&#xff1a;pom.xml编写配置类&#xff1a; Spring的配置类SpringConfig.javaSpringMVC的配置类SpringMvcConfig.javaWeb项目的入口配置类ServletConfig.javaMyBatis的配置类MyBatisConfig.java第三方数据源的配置类Jdbc…

uniapp动态切换显示不同内容组件

需求描述 通过点击注册或是登录按钮切换不同的组件.默认显示登陆界面,登录字样加粗显示,登录页面显示手机号密码登录.点击注册切换到注册页面,注册字样加粗显示,页面显示手机号和验证码以及注册按钮.对应页面显示如下: 实现代码: <template><view class"conte…

pytorch实战(五)——时间序列多步预测的五种方法介绍

当需要根据已有的时间序列数据&#xff0c;预测未来多个时刻的状态时&#xff0c;被称之为时间序列多步预测。 时间序列多步预测有五种策略&#xff0c;分别为&#xff1a; 1、直接多步预测&#xff08;Direct Multi-step Forecast&#xff09; 2、递归多步预测&#xff08;Rec…