| <%@ page contentType="text/html;charset=UTF-8" language="java" %> | 
| <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | 
| <%@page isELIgnored="false" %> | 
|   | 
| <!DOCTYPE html> | 
| <html> | 
| <head> | 
|     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | 
|     <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> | 
|     <style type="text/css"> | 
|         body, html, #allmap { | 
|             width: 100%; | 
|             height: 100%; | 
|             overflow: hidden; | 
|             margin: 0; | 
|             font-family: "微软雅黑"; | 
|         } | 
|   | 
|         #box { | 
|             width: 300px; | 
|             height: 400px; | 
|             top: 30px; | 
|             right: 30px; | 
|             position: absolute; | 
|             z-index: 1; | 
|             border: 2px solid red; | 
|             background-color: gainsboro; | 
|             opacity: 0.8; | 
|         } | 
|   | 
|         #cpm, #cpm1 { | 
|             width: 300px; | 
|             height: 100px; | 
|             position: absolute; | 
|             background-color: #ffffff; | 
|             display: none; | 
|             left: 50%; | 
|             top: 50%; | 
|             margin-left: -150px; | 
|             margin-top: -50px; | 
|             z-index: 11; | 
|             color: #000000; | 
|             border: 2px solid #FF7F50; | 
|             font-size: 14px; | 
|             line-height: 100px; | 
|             text-align: center; | 
|         } | 
|     </style> | 
|     <script type="text/javascript" | 
|             src="http://api.map.baidu.com/api?v=2.0&ak=rER1sgBIcQxkfNSlm2wmBGZGgEERrooM"></script> | 
|     <script type="text/javascript" src="/js/jquery.min.js"></script> | 
|     <script type="text/javascript" src="/js/utils.js"></script> | 
|     <script type="text/javascript"> | 
|         if (typeof (JSON) == 'undefined') { | 
|             $.getScript("js/json2.js"); | 
|         } | 
|     </script> | 
|     <script type="text/javascript" src="/js/paging.js"></script> | 
|     <title>地图展示</title> | 
| </head> | 
| <body> | 
| <div id="cpm">该时间存在设备无风向数据,数据不能作为参考</div> | 
| <div id="cpm1">该时间在线设备小于两台,数据不能作为参考</div> | 
| <div id="allmap" style="z-index: 0"> | 
| </div> | 
| <div id="box"> | 
|     <p> | 
|         <img src="/img/wind_dir02.png" style="width: 30px;height: 45px;margin-left: 20px;"/> <span | 
|             style="position: relative;top: -9px;">  :风向(尖头向上代表正北方向)</span> | 
|     </p> | 
|     <p> | 
|         <img src="/img/arrows01.png" style="margin-left: 20px;transform:rotate(90deg);width: 30px;height: 60px;"/> <span | 
|             style="position: relative;top: -25px;">  :浓度由高到低</span> | 
|     </p> | 
|     <p> | 
|         <img src="/img/arrows02.png" style="width: 30px;height: 60px;margin-left: 20px;transform:rotate(90deg);"/> <span | 
|             style="position: relative;top: -25px;">  :浓度由低到高</span> | 
|     </p> | 
|   | 
|     <p style="text-indent: 1em;line-height: 25px;color: red" id="alarm">浓度变化:<span id="diff"></span></br></br>    | 
|         注:浓度变化为下风向因子浓度减去上风向因子浓度</p> | 
| </div> | 
| <div id="mapParams" style="display: none;"> | 
|     ${requestScope.params} | 
| </div> | 
| </body> | 
|   | 
| </html> | 
| <script type="text/javascript"> | 
|     var hostAndPort = document.location.host; | 
|     // 百度地图API功能 | 
|     var map = new BMap.Map("allmap", {minZoom: 14, maxZoom: 19});    // 创建Map实例 | 
|     map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放 | 
|     var params = $.parseJSON($("#mapParams").html()); | 
|     var longitude = params["longitudeCompany"]; | 
|     var latitude = params["latitudeCompany"]; | 
|     var point = new BMap.Point(longitude, latitude); | 
|     map.centerAndZoom(point, 18.5);  // 初始化地图,设置中心点坐标和地图级别 | 
|     var devices = []; | 
|     var deviceList = params["deviceList"]; | 
|     var sensor = params["sensor"]; | 
|     var accountId = params["accountId"]; | 
|     var orgId = params["orgId"]; | 
|     var monitPointId = params["monitPointId"]; | 
|     var arrows=[]; | 
|     //添加地图类型控件 | 
|     map.addControl(new BMap.MapTypeControl({ | 
|         mapTypes: [ | 
|             BMAP_HYBRID_MAP, | 
|             BMAP_NORMAL_MAP | 
|         ] | 
|     })); | 
|     map.setMapType(BMAP_HYBRID_MAP); | 
|     if (deviceList != null) { | 
|         if (deviceList.length > 1) { | 
|             for (var i = 0; i < deviceList.length; i++) { | 
|                 var icon = new BMap.Icon("/img/ico00.png", new BMap.Size(48, 48)); | 
|                 var mark = new BMap.Marker(new BMap.Point(deviceList[i].longitude, deviceList[i].latitude), {icon: icon}); | 
|                 devices.push(new BMap.Point(deviceList[i].longitude, deviceList[i].latitude)); | 
|                 map.addOverlay(mark); | 
|             } | 
|         } else { | 
|             var icon1 = new BMap.Icon("/img/ico00.png", new BMap.Size(48, 48)); | 
|             var mark1 = new BMap.Marker(new BMap.Point(deviceList.longitude, deviceList.latitude), {icon: icon1}); | 
|             devices.push(new BMap.Point(deviceList.longitude, deviceList.latitude)); | 
|             map.addOverlay(mark1); | 
|             $("#alarm").css("visibility", "hidden"); | 
|         } | 
|     } | 
|     var ws; | 
|     if (typeof (WebSocket) === "undefined") { | 
|         alert("您的浏览器不支持WebSocket"); | 
|     } else { | 
|         var p=0; | 
|         ws = new WebSocket('ws://' + hostAndPort + '/screen/webSocketNew/' + orgId + '&' + accountId + '&' + monitPointId+ '&' +p); | 
|         ws.onopen = function () { | 
|         }; | 
|   | 
|         //获得消息事件 | 
|         ws.onmessage = function (msg) { | 
|             // $("#searchParam").val(JSON.parse(msg.data)); | 
|             if(deviceList.length>=2){ | 
|                 realTimeData(JSON.parse(JSON.parse(msg.data)), deviceList,monitPointId); | 
|             }else{ | 
|                 if(deviceList.length==0){ | 
|                     $("#box").css("visibility","hidden"); | 
|                     document.getElementById("cpm").style.display = 'block'; | 
|                 } | 
|                 if(deviceList.length==1){ | 
|                     $("#box").css("visibility","hidden"); | 
|                     document.getElementById("cpm1").style.display = 'block'; | 
|                 } | 
|   | 
|             } | 
|   | 
|             /*  if (moralMap.showSensors && typeof (moralMap.showSensors) == "function") { | 
|                   moralMap.showSensors(JSON.parse(JSON.parse(msg.data))); | 
|               }*/ | 
|         }; | 
|         window.onbeforeunload=function(e){ | 
|             e = window.event||e; | 
|   | 
|             e.returnValue=("确定离开当前页面吗?"); | 
|             ws.onclose = function () { | 
|             }; | 
|             alert(1) | 
|         } | 
|         //关闭事件 | 
|         /*ws.onclose = function () { | 
|         };*/ | 
|         //发生了错误事件 | 
|         ws.onerror = function () { | 
|         }; | 
|     } | 
|   | 
|     var marks = []; | 
|     function realTimeData(data, deviceList,monitPointId) { | 
|         for (var j = 0; j < marks.length; j++) { | 
|             map.removeOverlay(marks[j]); | 
|         } | 
|         var diffArr=[]; | 
|         for (var i = 0; i < deviceList.length; i++) { | 
|             var deviceInfo = data; | 
|             var mac = deviceInfo["mac"]; | 
|             if (mac == deviceList[i].mac) { | 
|                 deviceList[i]["deviceInfo"] = deviceInfo; | 
|             } | 
|             } | 
|   | 
|         for (var i = 0; i < deviceList.length; i++) { | 
|             for (var j = 0; j <deviceList.length ; j++) { | 
|                 if (j != i) { | 
|                         var maps={}; | 
|                         var windNumj=deviceList[j]["deviceInfo"]["e23"]; | 
|                         var windNumi=deviceList[i]["deviceInfo"]["e23"]; | 
|                         var diff=windNumj-windNumi; | 
|                         if (diff > 180) { | 
|                             diff = 360 - diff; | 
|                         } | 
|                         maps["j"]=j; | 
|                         maps["i"]=i; | 
|                         maps["diff"]=Math.abs(diff); | 
|                         diffArr.push(maps); | 
|                 } | 
|         } | 
|             var icon = new BMap.Icon("/img/wind_dir02.png", new BMap.Size(25, 25), {anchor: new BMap.Size(11, 21.5)}); | 
|             var mark = new BMap.Marker(new BMap.Point(deviceList[i].longitude, deviceList[i].latitude), {icon: icon}); | 
|             devices.push(new BMap.Point(deviceList[i].longitude, deviceList[i].latitude)); | 
|             var dirWind=0; | 
|             if (deviceList[i]["deviceInfo"]["e23"]<=180){ | 
|                 dirWind=180+parseInt(deviceList[i]["deviceInfo"]["e23"]); | 
|             }else { | 
|                 dirWind=deviceList[i]["deviceInfo"]["e23"].valueOf()-180 | 
|             } | 
|             mark.setRotation(dirWind); | 
|             marks.push(mark); | 
|             map.addOverlay(mark); | 
|   | 
|         } | 
|         var minIndex=0; | 
|         var minWindDir=0.0; | 
|         minWindDir=diffArr[0]["diff"]; | 
|         for (var i = 1; i <diffArr.length ; i++) { | 
|             if (minWindDir>diffArr[i]["diff"]){ | 
|                 minWindDir=diffArr[i]["diff"]; | 
|                 minIndex=i; | 
|             }else { | 
|                 minIndex=minIndex; | 
|             } | 
|         } | 
|         var firstDevice=deviceList[diffArr[minIndex]["j"]]; | 
|         var secondDevice=deviceList[diffArr[minIndex]["i"]]; | 
|         var fNum=Number(firstDevice["deviceInfo"]["e23"]); | 
|         var sNum=Number(secondDevice["deviceInfo"]["e23"]); | 
|         var wind=0; | 
|         if(Math.abs(fNum-secondDevice)>180){ | 
|             wind=(fNum+sNum)/2+180; | 
|             if (wind>360){ | 
|                 wind=wind-360; | 
|             } | 
|         }else { | 
|             wind=(fNum+sNum)/2 | 
|         } | 
|         $.ajax({ | 
|             url: "/screen/chooseDevice", | 
|             type: "get", | 
|             dataType: "json", | 
|             data:{"wind":wind,"monitPointId":monitPointId}, | 
|             success: function (info) { | 
|                 var locationList=info["locationList"]; | 
|                 var preAngleDeviceString = info["preAngleDeviceString"]; | 
|   | 
|                 var preAngleDeviceList=""; | 
|                 if (preAngleDeviceString!=0 &&preAngleDeviceString!=1){ | 
|                     var arrow=""; | 
|                     preAngleDeviceList=JSON.parse(preAngleDeviceString); | 
|   | 
|                     var mac0=preAngleDeviceList[0]["mac"]; | 
|                     var mac1=preAngleDeviceList[1]["mac"]; | 
|                     for (var i = 0; i <deviceList.length ; i++) { | 
|                         if (mac0==deviceList[i]["mac"]){ | 
|                             preAngleDeviceList[0]["sensors"]=deviceList[i]["deviceInfo"]; | 
|                         }else if (mac1==deviceList[i]["mac"]){ | 
|                             preAngleDeviceList[1]["sensors"]=deviceList[i]["deviceInfo"]; | 
|                         }else { | 
|                             continue; | 
|                         } | 
|                     } | 
|                     var diff=preAngleDeviceList[0]["sensors"][sensor]-preAngleDeviceList[1]["sensors"][sensor]; | 
|                     var diffSensor=preAngleDeviceList[1]["sensors"][sensor]-preAngleDeviceList[0]["sensors"][sensor]; | 
|                     diffSensor=String(diffSensor).replace(/^(.*\..{4}).*$/,"$1"); | 
|                     connectionDoublePoint(diff,preAngleDeviceList,locationList,diffSensor); | 
|             }}} | 
|         ); | 
|   | 
|     } | 
| function connectionDoublePoint(diff,preAngleDeviceList,locationList,diffSensor) { | 
|     for (var i = 0; i <arrows.length ; i++) { | 
|         map.removeOverlay(arrows[i]); | 
|     } | 
|     var info=""; | 
|     if (diff>0){ | 
|         info="厂区内无排放"; | 
|         var polyline = new BMap.Polyline([ | 
|             new BMap.Point(preAngleDeviceList[0].longitude, preAngleDeviceList[0].latitude), | 
|             new BMap.Point(locationList[0][0],locationList[0][1]) | 
|         ], {strokeColor:"red", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline);   //增加折线 | 
|         var polyline1 = new BMap.Polyline([ | 
|             new BMap.Point(locationList[0][0],locationList[0][1]), | 
|             new BMap.Point(locationList[1][0],locationList[1][1]) | 
|         ], {strokeColor:"Tomato", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline1);   //增加折线 | 
|         var polyline2 = new BMap.Polyline([ | 
|             new BMap.Point(locationList[1][0],locationList[1][1]), | 
|             new BMap.Point(locationList[2][0],locationList[2 ][1]) | 
|         ], {strokeColor:"Coral", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline2);   //增加折线 | 
|         var polyline3 = new BMap.Polyline([ | 
|             new BMap.Point(locationList[2][0],locationList[2][1]), | 
|             new BMap.Point(locationList[3][0],locationList[3][1]) | 
|         ], {strokeColor:"Orange", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline3);   //增加折线 | 
|         var polyline4 = new BMap.Polyline([ | 
|             new BMap.Point(locationList[3][0],locationList[3][1]), | 
|             new BMap.Point(locationList[4][0],locationList[4][1]) | 
|         ], {strokeColor:"Gold", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline4);   //增加折线 | 
|         var arrowLineList = new Array();//记录绘制的箭头线 | 
|         arrows.push(polyline); | 
|         arrows.push(polyline1); | 
|         arrows.push(polyline2); | 
|         arrows.push(polyline3); | 
|         arrows.push(polyline4); | 
|         color="Gold"; | 
|         arrowLineList[arrowLineList.length] = addArrow(polyline4,30,Math.PI/7,color);//记录绘制的箭头线 | 
|     } else { | 
|         info="厂区内有排放"; | 
|         var polyline = new BMap.Polyline([ | 
|             new BMap.Point(preAngleDeviceList[0].longitude, preAngleDeviceList[0].latitude), | 
|             new BMap.Point(locationList[0][0],locationList[0][1]) | 
|         ], {strokeColor:"Gold", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline);   //增加折线 | 
|         var polyline1 = new BMap.Polyline([ | 
|             new BMap.Point(locationList[0][0],locationList[0][1]), | 
|             new BMap.Point(locationList[1][0],locationList[1][1]) | 
|         ], {strokeColor:"Orange", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline1);   //增加折线 | 
|         var polyline2 = new BMap.Polyline([ | 
|             new BMap.Point(locationList[1][0],locationList[1][1]), | 
|             new BMap.Point(locationList[2][0],locationList[2 ][1]) | 
|         ], {strokeColor:"Coral", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline2);   //增加折线 | 
|         var polyline3 = new BMap.Polyline([ | 
|             new BMap.Point(locationList[2][0],locationList[2][1]), | 
|             new BMap.Point(locationList[3][0],locationList[3][1]) | 
|         ], {strokeColor:"Tomato", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline3);   //增加折线 | 
|         var polyline4 = new BMap.Polyline([ | 
|             new BMap.Point(locationList[3][0],locationList[3][1]), | 
|             new BMap.Point(locationList[4][0],locationList[4][1]) | 
|         ], {strokeColor:"red", strokeWeight:8, strokeOpacity:0.5});   //创建折线 | 
|         map.addOverlay(polyline4);   //增加折线 | 
|         arrows.push(polyline); | 
|         arrows.push(polyline1); | 
|         arrows.push(polyline2); | 
|         arrows.push(polyline3); | 
|         arrows.push(polyline4); | 
|         var arrowLineList = new Array();//记录绘制的箭头线 | 
|         color="red"; | 
|         arrowLineList[arrowLineList.length] = addArrow(polyline4,28,Math.PI/7,color);//记录绘制的箭头线 | 
|     } | 
|     $("#diff").html(diffSensor+" ("+info+")"); | 
| } | 
|     function addArrow(polyline, length, angleValue, color) { //绘制箭头的函数 | 
|         var linePoint = polyline.getPath();//线的坐标串 | 
|         var arrowCount = linePoint.length; | 
|         for (var i = 1; i < arrowCount; i++) { //在拐点处绘制箭头 | 
|             var pixelStart = map.pointToPixel(linePoint[i - 1]); | 
|             var pixelEnd = map.pointToPixel(linePoint[i]); | 
|             var angle = angleValue;//箭头和主线的夹角 | 
|             var r = length; // r/Math.sin(angle)代表箭头长度 | 
|             var delta = 0; //主线斜率,垂直时无斜率 | 
|             var param = 0; //代码简洁考虑 | 
|             var pixelTemX, pixelTemY;//临时点坐标 | 
|             var pixelX, pixelY, pixelX1, pixelY1;//箭头两个点 | 
|             if (pixelEnd.x - pixelStart.x == 0) { //斜率不存在是时 | 
|                 pixelTemX = pixelEnd.x; | 
|                 if (pixelEnd.y > pixelStart.y) { | 
|                     pixelTemY = pixelEnd.y - r; | 
|                 } else { | 
|                     pixelTemY = pixelEnd.y + r; | 
|                 } | 
|                 //已知直角三角形两个点坐标及其中一个角,求另外一个点坐标算法 | 
|                 pixelX = pixelTemX - r * Math.tan(angle); | 
|                 pixelX1 = pixelTemX + r * Math.tan(angle); | 
|                 pixelY = pixelY1 = pixelTemY; | 
|             } else  //斜率存在时 | 
|             { | 
|                 delta = (pixelEnd.y - pixelStart.y) / (pixelEnd.x - pixelStart.x); | 
|                 param = Math.sqrt(delta * delta + 1); | 
|   | 
|                 if ((pixelEnd.x - pixelStart.x) < 0) //第二、三象限 | 
|                 { | 
|                     pixelTemX = pixelEnd.x + r / param; | 
|                     pixelTemY = pixelEnd.y + delta * r / param; | 
|                 } else//第一、四象限 | 
|                 { | 
|                     pixelTemX = pixelEnd.x - r / param; | 
|                     pixelTemY = pixelEnd.y - delta * r / param; | 
|                 } | 
|                 //已知直角三角形两个点坐标及其中一个角,求另外一个点坐标算法 | 
|                 pixelX = pixelTemX + Math.tan(angle) * r * delta / param; | 
|                 pixelY = pixelTemY - Math.tan(angle) * r / param; | 
|   | 
|                 pixelX1 = pixelTemX - Math.tan(angle) * r * delta / param; | 
|                 pixelY1 = pixelTemY + Math.tan(angle) * r / param; | 
|             } | 
|   | 
|             var pointArrow = map.pixelToPoint(new BMap.Pixel(pixelX, pixelY)); | 
|             var pointArrow1 = map.pixelToPoint(new BMap.Pixel(pixelX1, pixelY1)); | 
|             arrow = new BMap.Polyline([ | 
|                 pointArrow, | 
|                 linePoint[i], | 
|                 pointArrow1 | 
|             ], {strokeColor: color, strokeWeight: 6, strokeOpacity: 0.5}); | 
|   | 
|             arrows.push(arrow); | 
|             map.addOverlay(arrow); | 
|             return arrow; | 
|         } | 
|     } | 
| </script> |