123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604 |
- import { containsCoordinate } from 'ol/extent';
- import { OLMap } from "@/assets/map/OLMap";
- import '@/assets/map/popup.css'
- import { gradientColors, markerZoomSize, labelZoomSize, colorRGBtoHex, jqAjax } from "@/assets/map/maptool";
- import $ from "@/assets/map/jquery.min";
- OLMap.prototype.eventViewChange = function (func) {
- var view = this.map.getView();
- var map = this.map;
- view.on('change:resolution', function (event) {
- let z = view.getZoom();
- let r = view.getResolution();
- var region = view.calculateExtent(map.getSize());
-
- var overlays = map.getOverlays().getArray();
- var popups = [];
-
- for (var k in overlays) {
- let oid = overlays[k].getId();
- if (oid.indexOf('marker') >= 0) {
- let ediv = overlays[k].get('element');
- let params = JSON.parse(ediv.getAttribute("desc"));
- let level = params.level;
- if (level == 1) {
- if (z < 5.3) {
- var wh = markerZoomSize(5, z);
- ediv.style.setProperty('width', wh + 'px');
- ediv.style.setProperty('height', wh + 'px');
- } else if (z >= 5.3 && z < 6.3) {
- var wh = markerZoomSize(4, z);
- ediv.style.setProperty('width', wh + 'px');
- ediv.style.setProperty('height', wh + 'px');
- } else {
- var wh = markerZoomSize(3, z);
- ediv.style.setProperty('width', (wh * 1.5) + 'px');
- ediv.style.setProperty('height', wh + 'px');
- }
- }
- if (level == 2) {
- if (z < 7.2) {
- var wh = markerZoomSize(6, z);
- ediv.style.setProperty('width', wh + 'px');
- ediv.style.setProperty('height', wh + 'px');
- } else if (z >= 7.2 && z < 7.6) {
- var wh = markerZoomSize(5, z);
- ediv.style.setProperty('width', wh + 'px');
- ediv.style.setProperty('height', wh + 'px');
- } else if (z >= 7.6 && z < 8) {
- var wh = markerZoomSize(4, z);
- ediv.style.setProperty('width', wh + 'px');
- ediv.style.setProperty('height', wh + 'px');
- } else {
- var wh = markerZoomSize(3, z);
- ediv.style.setProperty('width', (wh * 1.5) + 'px');
- ediv.style.setProperty('height', wh + 'px');
- }
- }
- if (level == 3) {
- if (z < 8.5) {
- var wh = markerZoomSize(7, z);
- ediv.style.setProperty('width', wh + 'px');
- ediv.style.setProperty('height', wh + 'px');
- } else if (z >= 8.5 && z < 9) {
- var wh = markerZoomSize(5, z);
- ediv.style.setProperty('width', wh + 'px');
- ediv.style.setProperty('height', wh + 'px');
- } else {
- var wh = markerZoomSize(3, z);
- ediv.style.setProperty('width', (wh * 1.5) + 'px');
- ediv.style.setProperty('height', wh + 'px');
- }
- }
- }
- if (oid.indexOf("label") >= 0) {
-
- let ea = overlays[k].get('element');
- let params = JSON.parse(ea.getAttribute("desc"));
- let level = params.level;
- if (level == 1) {
- var fz = labelZoomSize(6.3, z);
- if (z >= 6.3) {
- fz = fz > 8 ? fz : 8;
- }
- ea.style.setProperty('font-size', fz + "px");
- }
- if (level == 2) {
- var fz = labelZoomSize(8, z);
- if (z >= 8) {
- fz = fz > 8 ? fz : 8;
- }
- ea.style.setProperty('font-size', fz + "px");
- }
- if (level == 3) {
- var fz = labelZoomSize(9, z);
- if (z >= 9) {
- fz = fz > 8 ? fz : 8;
- }
- ea.style.setProperty('font-size', fz + "px");
- }
- }
-
-
- if (oid.indexOf("popup") >= 0) {
- let ep = overlays[k].get('element');
- let pos = ep.getElementsByTagName('input')[0].value;
- pos = pos.split(',');
- let pt = [parseFloat(pos[0]), parseFloat(pos[1])];
-
- if (containsCoordinate(region, pt)) {
- popups.push(overlays[k]);
- }
- }
- }
-
-
- if (popups.length <= 8) {
- for (var p in popups) {
- if (popups[p].getPosition() != undefined) {
- continue;
- }
- let ep = popups[p].get('element');
- let pos = ep.getElementsByTagName('input')[0].value;
- pos = pos.split(',');
- let pt = [parseFloat(pos[0]), parseFloat(pos[1])];
-
- let id=popups[p].getId().split("popup_")[1];
- func(id,popups[p],pt);
- }
- }
- });
- view.on('change:center', function (event) {
- let z = view.getZoom();
- let r = view.getResolution();
- var region = view.calculateExtent(map.getSize());
-
- var overlays = map.getOverlays().getArray();
- var popups = [];
- for (var k in overlays) {
- let oid = overlays[k].getId();
-
- if (oid.indexOf("popup") >= 0) {
- let ep = overlays[k].get('element');
- let pos = ep.getElementsByTagName('input')[0].value;
- pos = pos.split(',');
- let pt = [parseFloat(pos[0]), parseFloat(pos[1])];
-
- if (containsCoordinate(region, pt)) {
- popups.push(overlays[k]);
- }
- }
- }
-
-
- if (popups.length <= 8) {
- for (var p in popups) {
- if (popups[p].getPosition() != undefined) {
- continue;
- }
- let ep = popups[p].get('element');
- let pos = ep.getElementsByTagName('input')[0].value;
- pos = pos.split(',');
- let pt = [parseFloat(pos[0]), parseFloat(pos[1])];
-
- let id=popups[p].getId().split("popup_")[1];
- func(id,popups[p],pt);
- }
- }
- });
- }
- OLMap.prototype.eventOverlayClose = function () {
- this.map.on('click', function (evt) {
-
-
- var overlays = this.getOverlays().getArray();
-
- for (var k in overlays) {
- let oid = overlays[k].getId();
- if (oid.indexOf('marker') >= 0) {
- let e = overlays[k].get('element');
- let c = e.style['background-color'];
- c = colorRGBtoHex(c);
-
- e.style.setProperty('border', '1px solid' + c);
- }
- if (oid.indexOf("popup") >= 0) {
- overlays[k].setPosition(undefined);
- }
- }
- });
- }
- export function updatePopupTitle(map, switch_flag) {
- var types = ['popup']
- var layers = map.getOverlays().getArray();
- for (let i = 0; i < layers.length; i++) {
- const layer = layers[i];
- let oid = layer.getId();
- let ediv = layer.get('element');
- let params = JSON.parse(ediv.getAttribute("desc"));
- let id = params.id;
- let name = params.name;
- for (let i in types) {
- if (oid.indexOf(types[i]) >= 0) {
-
- let x = $(ediv).find("#flag_switch");
- let sname = switch_flag ? strOmit(name, 8) : id;
- x.html(sname);
- }
- }
- }
- }
- export function rmOverlaysByLevel(map, levels = [3], types = ['marker', 'label', 'popup']) {
- var layers = map.getOverlays().getArray();
-
- var overlays = []
- for (let i = 0; i < layers.length; i++) {
- const layer = layers[i];
- let oid = layer.getId();
- let ediv = layer.get('element');
- let params = JSON.parse(ediv.getAttribute("desc"));
- let level = params.level;
- for (let i in types) {
- for (let j in levels) {
- if (oid.indexOf(types[i]) >= 0 && level == levels[j]) {
- overlays.push(layer);
- }
- }
- }
- }
- for (let i in overlays) {
- map.removeOverlay(overlays[i]);
- }
-
-
- }
- export function hiddenOverlaysByLevel(map, hidden = true, levels = [3], types = ['marker', 'label', 'popup']) {
- var layers = map.getOverlays().getArray();
- var overlays = []
- for (let i = 0; i < layers.length; i++) {
- const layer = layers[i];
- let oid = layer.getId();
- let ediv = layer.get('element');
- let params = JSON.parse(ediv.getAttribute("desc"));
- let level = params.level;
- for (let i in types) {
- for (let j in levels) {
- if (oid.indexOf(types[i]) >= 0 && level == levels[j]) {
- if (hidden) {
- ediv.classList.add("hidden");
- } else {
- ediv.classList.remove("hidden");
- }
- }
- }
- }
- }
- }
- export function updateMarkerAndLabel(map, data, dataFactor) {
- if (String(data.msg).toLowerCase() == "ok") {
-
- var feas = data.datas.list;
- var statis = null;
-
- switch (dataFactor) {
- case 'wd':
- statis = data.global_air_temp;
- break;
- case 'qy':
- statis = data.global_apressure;
- break;
- default:
- statis = data.global_air_temp;
- }
- if (statis == null) {
- throw ("统计参数为空!");
- }
- var max = parseFloat(statis.max) + 1;
- var min = parseFloat(statis.min) - 1;
- var color = gradientColors("#0000FF", "#FF0000", parseInt(max - min));
-
-
- var overlays = map.getOverlays().getArray();
-
- for (var k in overlays) {
- let oid = overlays[k].getId();
- for (var i = 0; i < feas.length; i++) {
- var fea = feas[i];
- var fid = fea.id;
- var fname = fea.name;
- var wd = '温度'
- var sd = '湿度';
- var qy = '气压';
- var fx = '风向';
- var yun = '云量';
- var yl = '雨量';
- var fs = '风速';
- var jd = '能见度';
- var tq = '天气';
- var time = null;
- var label = '';
- var cv = 0;
- var fd = null;
- switch (dataFactor) {
- case 'wd':
- fd = fea.AIR_TEMP;
- time = fd.time.slice(-8, -3);
- wd = parseFloat(fd.value).toFixed(1);
- label = wd + "°C";
- cv = wd;
- break;
- case 'qy':
- fd = fea.APRESSURE;
- time = fd.time.slice(-8, -3);
- qy = parseFloat(fd.value).toFixed(0);
- label = qy + "kPa";
- cv = qy;
- break;
- default:
- fd = fea.AIR_TEMP;
- time = fd.time.slice(-8, -3);
- wd = parseFloat(fd.value).toFixed(1);
- label = wd + "°C";
- cv = wd;
- }
-
-
-
- var color_idx = Math.floor((cv - min), 0);
- var fcolor = color[color_idx];
-
-
- if (oid.split('marker_')[1] == fid) {
- let ediv = overlays[k].get('element');
- ediv.style.setProperty('background-color', fcolor);
- ediv.style.setProperty('border', '1px solid' + fcolor);
- }
-
- if (oid.split('label_')[1] == fid) {
- let ediv = overlays[k].get('element');
- ediv.innerHTML = label;
- }
- }
- }
- }
- }
- export function getSiteStatus(map) {
- var overlays = map.getOverlays().getArray();
-
- var nTotal = 0;
- var nNormal = 0;
- var nAbnormal = 0;
- var nCease = 0;
- var nOther = 0;
- for (var k in overlays) {
- let oid = overlays[k].getId();
- if (oid.indexOf('marker') >= 0) {
- let ediv = overlays[k].get('element');
- let sdesc = ediv.getAttribute("desc");
- let params = JSON.parse(sdesc);
- let status = params.status;
- switch (status) {
- case "正常": nNormal++; break;
- case "故障": nAbnormal++; break;
- case "停用": nCease++; break;
- default: nOther++;
- }
- nTotal++;
- }
- }
- return { total: nTotal, normal: nNormal, abnormal: nAbnormal, cease: nCease, other: nOther };
- }
- export function getTableStyle(flag) {
- var styleList = [["正常", "popup_normal_border", "popup_normal_tdborder", "popup_normal_bg", "popup_normal_triangle"],
- ["故障", "popup_abnormal_border", "popup_abnormal_tdborder", "popup_abnormal_bg", "popup_abnormal_triangle"],
- ["停用", "popup_cease_border", "popup_cease_tdborder", "popup_cease_bg", "popup_cease_triangle"],
- ["未知", "popup_unknown_border", "popup_unknown_tdborder", "popup_unknown_bg", "popup_unknown_triangle"]];
- var arr;
- for (var i in styleList) {
- arr = styleList[i];
- if (arr[0] == flag) {
- return arr.slice(1, 5);
- }
- }
- return arr.slice(1, 5);
- }
- export function getALLMarkersId(map) {
- var overlays = map.getOverlays().getArray();
- var ids = [];
- for (var k in overlays) {
- let oid = overlays[k].getId();
- if (oid.indexOf('marker') >= 0) {
- ids.push(oid.split('marker_')[1]);
- }
- }
- return ids;
- }
- function strOmit(str, N = 8) {
- var n = str.length;
- if (n > N) {
- return str.slice(0, N);
- }
- return str;
- }
- function showPopup(id, popup, cpoint) {
-
- let div = popup.getElement();
- let trs = $(div).find("table tr");
- let tr1 = $(trs[1]).find("td");
- let tr2 = $(trs[2]).find("td");
- let tr3 = $(trs[3]).find("td");
-
- let url = 'http://debug.api.9poc.com/map/zhandian';
- let p = {
- "ID": id,
- "TOKEN": "SW6Q7Q74YX2V97JZSW6Q7Q74YX2V97JZ"
- }
- let params = {
- ACT: "GIRD9_DATA",
- PARAMETERS: JSON.stringify(p),
- }
- jqAjax(url, params, 'POST', function (data) {
- if(data.code==0){
- let grid = data.msg.grid;
- let wd = grid[0].value + "°C";;
- let sd = grid[1].value + grid[1].unit;
- let qy = grid[2].value + "kPa";
- let fx = grid[3].value + grid[3].unit;
- let yun = grid[4].value + grid[4].unit;
- let yl = grid[5].value + grid[5].unit;
- let fs = grid[6].value + grid[6].unit;
- let jd = grid[7].value + grid[7].unit;
- let tq = grid[8].value;
- let time = null;
-
- tr1[0].innerHTML = wd;
- tr1[1].innerHTML = sd;
- tr1[2].innerHTML = qy;
- tr2[0].innerHTML = fx;
- tr2[1].innerHTML = yun;
- tr2[2].innerHTML = yl;
- tr3[0].innerHTML = fs;
- tr3[1].innerHTML = jd;
- tr3[2].innerHTML = tq;
- }
- popup.setPosition(cpoint);
-
- });
- }
- export function load_data(mapDiv, data, dataFactor, sitelevel, switch_flag, leftClick, rightClick) {
- if (String(data.msg).toLowerCase() == "ok") {
- var feas = data.datas.list;
- var statis = null;
-
- switch (dataFactor) {
- case 'wd':
- statis = data.global_air_temp;
- break;
- case 'qy':
- statis = data.global_apressure;
- break;
- default:
- statis = data.global_air_temp;
- }
- if (statis == null) {
- throw ("统计参数为空!");
- }
- var max = parseFloat(statis.max) + 1;
- var min = parseFloat(statis.min) - 1;
- var color = gradientColors("#0000FF", "#FF0000", parseInt(max - min));
-
-
- for (var i = 0; i < feas.length; i++) {
- var fea = feas[i];
- var fid = fea.id;
- var fname = fea.name;
- var lon = fea.longitude;
- var lat = fea.latitude;
- var zt = fea.status.text;
- var style = getTableStyle(zt);
- var sname = switch_flag ? strOmit(fname, 8) : fid;
- var stitle = "站名:" + fname + ",站号:" + fid
- var params = { level: sitelevel, status: zt, name: fname, id: fid };
- var wd = '温度'
- var sd = '湿度';
- var qy = '气压';
- var fx = '风向';
- var yun = '云量';
- var yl = '雨量';
- var fs = '风速';
- var jd = '能见度';
- var tq = '天气';
- var time = null;
- var label = '';
- var cv = 0;
- var fd = null;
- switch (dataFactor) {
- case 'wd':
- fd = fea.AIR_TEMP;
- time = fd.time.slice(-8, -3);
- wd = parseFloat(fd.value).toFixed(1);
- label = wd + "°C";
- cv = wd;
- break;
- case 'qy':
- fd = fea.APRESSURE;
- time = fd.time.slice(-8, -3);
- qy = parseFloat(fd.value).toFixed(0);
- label = qy + "kPa";
- cv = qy;
- break;
- default:
- fd = fea.AIR_TEMP;
- time = fd.time.slice(-8, -3);
- wd = parseFloat(fd.value).toFixed(1);
- label = wd + "°C";
- cv = wd;
- }
-
- let styleh = 'popup';
- let style0 = style[0];
- let style1 = style[1];
- let style2 = style[2];
- let style3 = style[3];
- let div = `<div class='${styleh}'>`;
- let table = `<table class='${style0}' title='鼠标【左/右键】点击九宫格查看【详细信息/快捷菜单】'>`
- + `<tr class='${style2}' style='color:#FFF' title='点击[x]或弹窗外任意区域关闭弹窗'>`
- + `<td colspan=2><span id='flag_switch' style='margin-left:18px; font-size:12px; font-weight:bold' title='${stitle}'>${sname}</span></td>`
- + `<td style='text-align:center; font-size:12px'>${time}</td>`
- + `</tr>`
- + `<tr>`
- + `<td class='${style1}'>${wd}</td>`
- + `<td class='${style1}'>${sd}</td>`
- + `<td class='${style1}'>${qy}</td>`
- + `</tr>`
- + `<tr>`
- + `<td class='${style1}'>${fx}</td>`
- + `<td class='${style1}'>${yun}</td>`
- + `<td class='${style1}'>${yl}</td>`
- + `</tr>`
- + `<tr>`
- + `<td class='${style1}'>${fs}</td>`
- + `<td class='${style1}'>${jd}</td>`
- + `<td class='${style1}'>${tq}</td>`
- + `</tr>`
- + `</table>`;
- let info = div + table + `<div class='${style3}'></div></div>`;
-
- document.oncontextmenu = function (e) {
-
- e.preventDefault();
- };
-
-
-
- var color_idx = Math.floor((cv - min), 0);
-
-
-
- let m = mapDiv.markerIsExist([lon, lat]);
-
-
- if (!m) {
- mapDiv.addPopup([lon, lat], 0, fid, info, leftClick, rightClick, params);
- if (sitelevel != 3) {
- mapDiv.addMarkerAndLabel([lon, lat], fid, label, color[color_idx], 0.8,
- params, { width: '8px', height: '8px' }, showPopup);
- } else {
- mapDiv.addMarkerAndLabel([lon, lat], fid, label, color[color_idx], 0.8,
- params, { width: '12px', height: '12px' }, showPopup);
- }
- }
- }
- mapDiv.eventOverlayClose();
- mapDiv.eventViewChange(showPopup);
- } else {
- throw ("加载数据失败,数据标识:" + data.msg);
- }
- }
|