import { TUVector3, TURotator } from 'tumap'; //TUVector3, TUVector2, TURotator import { post, getUrl, gcj02ToWgs84 } from './api'; import setting from './setting'; let arr = []; let fencing = []; let map = null; let valData = null; let modelFlag = null; let dzwlFlag = null; let lastIndex = null; // 初始化 export function init (Map) { map = Map; } // 获取传值信息 export function queryMajor (index, flag) { // eslint-disable-next-line if (index == null || isNaN(index)) return; if (modelFlag === index && flag !== -1 && modelFlag !== 3 && modelFlag !== 5) return locateByVal(flag); clsAll(); modelFlag = index; switch (index) { case 0: // 重大项目 case 1: // 园区产值-园区撒点 case 2: // 重点企业 case 4: // 商圈产值 let urls = [setting.xmUrl, setting.yqUrl, setting.zdUrl, "", setting.sqUrl]; getAjaxData(urls[index], null, flag); break; case 5: getAjaxData(setting.xmLeftUrl, JSON.stringify({ "project_category_name": flag }), -1); break; case 3: dzwlFlag = flag; loadFencing(flag); // 区域产值-电子围栏 break; default: break; } } // 获取ajax请求数据 export async function getAjaxData (url, data, flag) { let rs = await post(url, data); console.log("getAjaxData => ", url, rs); if (!rs || rs.status !== 200 || !rs.data || !rs.data.length) return; pretreat(rs.data); showPosition(rs.data); flag === -1 ? flyToData(rs.data) : locateByVal(flag); } function pretreat (data) { let i = 0; while (i < data.length) { let d = data[i]; if (!d.lng || isNaN(d.lng) || !d.lat || isNaN(d.lat)) { data.splice(i, 1); continue; }; d.lng = parseFloat(d.lng); d.lat = parseFloat(d.lat); i++; } } // 添加点位方法 export function showPosition (data) { let flag = modelFlag === 1; for (let i in data) { let d = data[i]; let p = getLocalCoord(d.lng, d.lat, flag); let params = createPosition(p.x, p.y, d, false); map.execute('grapi', 'Creat3DPOI', params, function (e) { locateGrave(e.args.id); }); arr.push(params); } } function getLocalCoord (x, y, flag) { let arr = flag ? [x, y] : gcj02ToWgs84(x, y); //console.log([x, y], arr); //return map.transformWGS84ToLocal(x + setting.xOffset, y + setting.yOffset); return map.transformWGS84ToLocal((arr[0] - 26.897633220927) * 1.3, (arr[1] - 9.16663529527973) * 1.3); } // 创建点位方法 export function createPosition (ue4x, ue4y, d, flag) { let url = getImgUrl(d, flag); let win = getAlertWin(d); let pp = setting.popups[modelFlag]; return { id: d.id, // poi点的id name: "MJ", URL: win.url,//弹窗地址 location: new TUVector3(ue4x, ue4y, 15000), // poi点位置 icon: url, // icon图标 size: pp.size, // icon的大小,1是正常大小 labeltext: getLabelTitle(d), // 标签文字 color: { r: 255, g: 255, b: 255, a: 1 }, // label文字颜色 labelsize: 90, // label大小,默认为1-20 labelHigh: 1000, // label高度 wide: pp.height, // 弹窗宽度 high: pp.width, // 弹窗高度 horizontal: pp.xOffset, // 水平偏移 vertical: pp.yOffset, // 垂直偏移 data: d } } // 获取图片Url function getImgUrl (d, flag) { let url = getUrl(); if (modelFlag === 0 || modelFlag === 5) { if (d.has_exception) { url += flag ? 'UE/img/grave2.png' : 'UE/img/grave1.png'; } else { url += flag ? 'UE/img/grave3.png' : 'UE/img/grave4.png'; } } else if (modelFlag === 2) { url += flag ? 'UE/img/grave11.png' : 'UE/img/grave12.png'; } else { url += flag ? 'UE/img/grave5.png' : 'UE/img/grave6.png'; } return url; } // 获取弹窗信息 export function getAlertWin (d) { //if (modelFlag === 5) return { url: null }; //let p = [setting.xmPower, setting.yqPower, setting.zdPower, setting.dzPower, setting.sqPower, setting.xmPower][modelFlag]; var pp = setting.popups[modelFlag]; return { //size: new TUVector2(p.width, p.height), // 弹窗大小 //offset: new TUVector2(-p.imgWidth, 5 - p.height / p.num), // 弹窗位置,右:x正,下:y正 url: getUrl() + pp.html + '.html?v=' + encodeURI(JSON.stringify(valData)) // 弹窗地址 }; } // 获取label名字 function getLabelTitle (d) { switch (modelFlag) { case 0: case 5: return d.project_name && d.project_name.length > 10 ? d.project_name.substring(0, 10) + "..." : d.project_name; case 1: return d.park_name; default: return d.name; } } // 飞向数据 export function flyToData (data) { if (modelFlag === 5) return flyToArea(data); let views = [setting.xmView, setting.yqView, setting.zdView, '', setting.sqView]; if (views[modelFlag]) flyTo(views[modelFlag]); } function flyToArea (data) { /*locateGrave(arr[0].data.id);*/ // let minX = 180, minY = 90, maxX = 0, maxY = 0; // for (let i = 0, c = data.length; i < c; i++) { // let x = data[i].lng, y = data[i].lat; // if (!x || !y) continue; // if (x > maxX) maxX = x; // if (y > maxY) maxY = y; // if (x < minX) minX = x; // if (y < minY) minY = y; // } // let cx = (minX + maxX) / 2; // let cy = (minY + maxY) / 2; // let p = getLocalCoord(cx, cy, false); //map.flyTo(p.x, p.y, 0, 0, -42, 0, 500000, null, 3); let p = getLocalCoord(data[0].lng, data[0].lat, false); map.flyTo(p.x, p.y, 0, 0, -42, 0, 150000, null, 3); //map.focusOn(new TUVector3(p.x, p.y, 0), new TURotator(0, -42, 0)); } // 根据值定位 export function locateByVal (val) { if (modelFlag === 0 || modelFlag === 5) { let id = findPoiByKey("project_name", val); if (id !== -1) locateGrave(id); } return null; } // 点位定位 export async function locateGrave (id) { let idx = findPOI(id); if (idx === -1 || lastIndex === idx) return; // eslint-disable-next-line if (modelFlag == null || isNaN(modelFlag) || modelFlag < 0 || modelFlag > 5) return; let rs, urls = [setting.jhUrl, setting.yqxqUrl, null, setting.jjqxqurl, setting.sqxqUrl, setting.jhUrl]; if (urls[modelFlag] === null) { rs = getRS(idx); } else { let args = modelFlag === 3 ? { belong_area: setting.jjqName[dzwlFlag] } : { "id": id }; rs = await post(urls[modelFlag], args); } setVData(rs); if (modelFlag === 3) { let view = [null, setting.fencing.dxbf.point, setting.fencing.hxbf.point, setting.fencing.tzbf.point][dzwlFlag]; flyTo(view); } else { let pp = setting.popups[modelFlag]; map.flyTo(arr[idx].location.x + pp.winXOffset - (modelFlag === 2 ? 3000 : 0), arr[idx].location.y, 0, 0, -42, 0, 75000, null, 3); } //map.focusOn(new TUVector3(arr[idx].ue4x + setting.winXOffset, arr[idx].ue4y, setting.poiHeight), new TURotator(0, -53, 0)); changeImg(id); } function getRS (idx) { let d = arr[idx].data; return { status: 200, data: { "name": getVal(d.name), "industry": getVal(d.industry), "type": getVal(d.type), "output_value": getVal(d.output_value), "tax_pay": getVal(d.tax_pay), "registered_capital": getVal(d.registered_capital), "insured_num": getVal(d.insured_num), "sscy": '', "ycqk": '' } }; } function getVal (val) { return val == null ? "" : val; } function setVData (rs) { console.log("setVData => ", rs); if (!rs || rs.status !== 200) return; if (modelFlag === 0 || modelFlag === 5) { valData = []; for (let i = 0, c = rs.data.length; i < c; i++) { valData.push({ 'm': rs.data[i].month, 'd': rs.data[i].proj_desc, 's': rs.data[i].state, 'c': rs.data[i].content }); } } else { valData = rs.data; } console.log("valData => ", valData); } // 切换图片 export function changeImg (id) { let idx = findPOI(id); if (lastIndex != null) { changePOI(lastIndex, false); lastIndex = null; } lastIndex = idx; changePOI(idx, true); map.execute('grapi', 'ShowLabel', { id: id, visibility: false }, null); // 隐藏Label map.execute('grapi', 'ShowPopup', { id: id, visibility: true }, null); // 显示Popup if (modelFlag === 1) showXQFencing(); } // 根据键值查找POI function findPoiByKey (key, val) { for (let i = 0, c = arr.length; i < c; i++) { if (arr[i].data[key] === val) return arr[i].id; } return -1; } // 查找POI export function findPOI (id) { for (let i = 0, c = arr.length; i < c; i++) { if (arr[i].data.id === id) return i; } return -1; } // 切换POI export function changePOI (index, flag) { let poi = arr[index]; console.log("changePOI =>", poi); let bb = createPosition(poi.location.x, poi.location.y, poi.data, flag); map.execute('grapi', 'Remove3DPOI', { id: poi.id }, null); map.execute('grapi', 'Creat3DPOI', bb, function (e) { locateGrave(e.args.id); }); arr.splice(index, 1, bb); } // 获取电子围栏信息 export function loadFencing (flag) { let db = [[], setting.fencing.dxbf, setting.fencing.hxbf, setting.fencing.tzbf][flag]; // 1-大兴部分,2-核心区,3-通州部分 for (let i in db.coordinates) { let p = getLocalCoord(db.position[i][0], db.position[i][1], flag); let bb = createPosition(p.x, p.y, { id: i }, false); arr.push(bb); let std = getFencingCoords(db.coordinates[i], false); let area = createFencing(std); fencing.push(area); } locateGrave(arr[0].id); // flyTo(db.view); } function getFencingCoords (rs, flag) { let std = []; for (let j in rs) { let p = getLocalCoord(rs[j][0], rs[j][1], flag); std.push(new TUVector3(p.x, p.y)); } return std; } // 飞向 export function flyTo (view) { map.flyTo(view.x, view.y, view.z, view.roll, view.pitch, view.yaw, view.distance, view.callback, view.time || 3); } // 创建围栏的方法 export function createFencing (param) { return map.createAreaBoundary({ data: param, type: 0, //0上浮横格,1实色,2箭头,3三角 height: 10000, //默认5000 color: "#00ff9e",//默认白色 brightness: 10 //默认10 }); } // 清除信息地图加载所有信息 export function clsAll () { map.clearAllCovering(); lastIndex = null; fencing.length = 0; arr.length = 0; } // 显示详情围栏-园区 function showXQFencing () { if (!valData || !valData.park_border) { console.log("园区围栏 => park_border 为空!"); return; } try { let db = typeof valData.park_border === "string" ? JSON.parse(valData.park_border) : valData.park_border; let g = db.features ? db.features[0].geometry : db.geometry; let std = getFencingCoords(g.coordinates[0], true); let area = createFencing(std); addFencing(area); } catch (e) { console.log("园区围栏 => ", e, valData.park_border); } } function addFencing (area) { for (let i = 0, c = fencing.length; i < c; i++) { fencing[i].removeFromMap(); } fencing.length = 0; fencing.push(area); } // 打印 export function print () { console.log("major.js", arr, fencing, valData, modelFlag, lastIndex); } export default { arr, fencing, map, valData, modelFlag, lastIndex, dzwlFlag, init, queryMajor, getAjaxData, showPosition, flyToData, locateByVal, locateGrave, findPOI, changeImg, changePOI, createPosition, getAlertWin, loadFencing, flyTo, createFencing, clsAll, print }