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
|
}
|