362 lines
10 KiB
Plaintext
362 lines
10 KiB
Plaintext
|
|
let map;
|
||
|
|
$(function () {
|
||
|
|
initMap();
|
||
|
|
})
|
||
|
|
|
||
|
|
// 初始化地图
|
||
|
|
function initMap() {
|
||
|
|
createMap(); // 创建地图
|
||
|
|
madeBoundary(); //加载区域图
|
||
|
|
addMapControl(); // 添加自定义控件
|
||
|
|
setMapEvent(); //地图控件设置
|
||
|
|
// setTimeout(riskIcon,3000);
|
||
|
|
riskIcon();
|
||
|
|
}
|
||
|
|
|
||
|
|
//地图设置start
|
||
|
|
function setMapEvent() {
|
||
|
|
map.enableScrollWheelZoom();
|
||
|
|
map.enableKeyboard();
|
||
|
|
map.enableDragging();
|
||
|
|
map.enableDoubleClickZoom();
|
||
|
|
}
|
||
|
|
|
||
|
|
//地图设置end
|
||
|
|
|
||
|
|
// 创建地图
|
||
|
|
function createMap() {
|
||
|
|
map = new BMap.Map("map", {
|
||
|
|
mapType: BMAP_NORMAL_MAP
|
||
|
|
}); // 创建Map实例
|
||
|
|
map.centerAndZoom('合肥', 8); // 初始化地图,设置中心点坐标和地图级别
|
||
|
|
/* //添加地图类型控件
|
||
|
|
map.addControl(new BMap.MapTypeControl({
|
||
|
|
mapTypes: [
|
||
|
|
BMAP_NORMAL_MAP,
|
||
|
|
BMAP_HYBRID_MAP
|
||
|
|
]
|
||
|
|
}));*/
|
||
|
|
map.setCurrentCity("合肥"); // 设置地图显示的城市 此项是必须设置的
|
||
|
|
}
|
||
|
|
|
||
|
|
//设置区域图 start
|
||
|
|
function madeBoundary() {
|
||
|
|
datas = new Array("安徽省-");
|
||
|
|
let bdary = new BMap.Boundary();
|
||
|
|
for (let i = 0; i < datas.length; i++) {
|
||
|
|
getBoundary(datas[i], bdary);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function getBoundary(data, bdary) {
|
||
|
|
data = data.split("-");
|
||
|
|
bdary.get(data[0], function (rs) { //获取行政区域
|
||
|
|
let count = rs.boundaries.length; //行政区域的点有多少个
|
||
|
|
let pointArray = [];
|
||
|
|
for (let i = 0; i < count; i++) {
|
||
|
|
let ply = new BMap.Polygon(rs.boundaries[i], {
|
||
|
|
strokeWeight: 3,
|
||
|
|
strokeColor: "#1066FC",
|
||
|
|
fillOpacity: 1,
|
||
|
|
fillColor: data[1]
|
||
|
|
}); //建立多边形覆盖物
|
||
|
|
map.addOverlay(ply); //添加覆盖物
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 设置区域图end
|
||
|
|
//向地图添加控件start
|
||
|
|
function addMapControl() {
|
||
|
|
let mystyleJson = [{
|
||
|
|
"featureType": "road",
|
||
|
|
"elementType": "all",
|
||
|
|
"stylers": {
|
||
|
|
"lightness": 20
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"featureType": "railway",
|
||
|
|
"elementType": "all",
|
||
|
|
"stylers": {
|
||
|
|
"visibility": "off"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"featureType": "local",
|
||
|
|
"elementType": "labels",
|
||
|
|
"stylers": {
|
||
|
|
"visibility": "off"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"featureType": "water",
|
||
|
|
"elementType": "all",
|
||
|
|
"stylers": {
|
||
|
|
"color": "#d1e5ff"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"featureType": "highway",
|
||
|
|
"elementType": "labels",
|
||
|
|
"stylers": {}
|
||
|
|
}
|
||
|
|
];
|
||
|
|
map.setMapStyle({
|
||
|
|
styleJson: mystyleJson
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
//向地图添加控件end
|
||
|
|
|
||
|
|
|
||
|
|
// 获取无人机
|
||
|
|
function getTerminal(arr) {
|
||
|
|
let result = [];
|
||
|
|
if (JSON.stringify(arr).indexOf("Longitude") != -1) {
|
||
|
|
let lon = arr.Res.GPS.Longitude;
|
||
|
|
let lat = arr.Res.GPS.Latitude
|
||
|
|
let data = wgs84tobd09(parseFloat(lon), parseFloat(lat));
|
||
|
|
result.push({
|
||
|
|
"lon": data[0],
|
||
|
|
"lat": data[1],
|
||
|
|
"puid": arr.Res.PUID
|
||
|
|
});
|
||
|
|
|
||
|
|
if (result != null && result.length > 0) {
|
||
|
|
for (let i = 0; i < result.length; i++) {
|
||
|
|
map.addOverlay(createMarker(result[i]));
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
layer.alert("数据获取失败");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取施工现场点坐标
|
||
|
|
function getJobLocation() {
|
||
|
|
let result = [];
|
||
|
|
if (result != null && result.length > 0) {
|
||
|
|
for (let i = 0; i < result.length; i++) {
|
||
|
|
map.addOverlay(createJobLocationMarker(result[i]));
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
layer.alert("数据获取失败");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//创建地图覆盖物start
|
||
|
|
function createMarker(obj) { //创建地图覆盖物
|
||
|
|
let cent = "";
|
||
|
|
let pt = new BMap.Point(obj.lon, obj.lat);
|
||
|
|
let myIcon = getIcon();
|
||
|
|
return new BMap.Marker(pt, {
|
||
|
|
icon: myIcon
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
//设置无人机图标 start
|
||
|
|
function getIcon() {
|
||
|
|
let url = "../../img/无人机.png";
|
||
|
|
return new BMap.Icon(url, new BMap.Size(20, 20));
|
||
|
|
}
|
||
|
|
|
||
|
|
//设置无人机图标 end
|
||
|
|
function createWorksiteMarker(obj) { //创建地图覆盖物
|
||
|
|
let pt = new BMap.Point(obj.lon, obj.lat);
|
||
|
|
let myIcon = getWorksiteIcon(obj.isUAV);
|
||
|
|
let marker = new BMap.Marker(pt, {
|
||
|
|
icon: myIcon
|
||
|
|
});
|
||
|
|
return marker;
|
||
|
|
}
|
||
|
|
|
||
|
|
//根据状态设置作业现场图标 start
|
||
|
|
function getWorksiteIcon(isUAV) {
|
||
|
|
let url = '';
|
||
|
|
if (isUAV === "0") {
|
||
|
|
url = "../../img/作业现场1.png"; //作业现场无无人机
|
||
|
|
} else if (isUAV === "1") {
|
||
|
|
url = "../../img/作业现场2.png"; //作业现场有无人机
|
||
|
|
} else {
|
||
|
|
url = "../../img/作业现场2.png"; //作业现场有无人机
|
||
|
|
}
|
||
|
|
return new BMap.Icon(url, new BMap.Size(28, 28));
|
||
|
|
}
|
||
|
|
|
||
|
|
//根据状态设置作业现场图标 end
|
||
|
|
|
||
|
|
|
||
|
|
//创建施工现场覆盖物start
|
||
|
|
function createJobLocationMarker(obj) { //创建地图覆盖物
|
||
|
|
console.log(obj);
|
||
|
|
let cent = "";
|
||
|
|
let pt = new BMap.Point(obj.lon, obj.lat);
|
||
|
|
let myIcon = getJobLocationIcon(obj.riskType);
|
||
|
|
let marker = new BMap.Marker(pt, {
|
||
|
|
icon: myIcon
|
||
|
|
});
|
||
|
|
addClickHandler(marker, obj);
|
||
|
|
return marker;
|
||
|
|
}
|
||
|
|
|
||
|
|
//施工现场覆盖物图标
|
||
|
|
function getJobLocationIcon(riskType) {
|
||
|
|
let url = "";
|
||
|
|
if (riskType === '2') {
|
||
|
|
url = '../../img/compreDisplay/two-risk.png';
|
||
|
|
} else if (riskType === '3') {
|
||
|
|
url = '../../img/compreDisplay/three-risk.png';
|
||
|
|
} else if (riskType === '4') {
|
||
|
|
url = '../../img/compreDisplay/four-risk.png';
|
||
|
|
} else if (driskType === '5') {
|
||
|
|
url = '../../img/compreDisplay/five-risk.png';
|
||
|
|
}
|
||
|
|
return new BMap.Icon(url, new BMap.Size(33, 33));
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//覆盖物事件start
|
||
|
|
function addClickHandler(marker, obj) {
|
||
|
|
let steelContent = '<div><p class="terrain-map-p">' + obj.proName + '</p>' +
|
||
|
|
'<p class="terrain-map-p">风险等级:' + obj.riskType + '</p>' +
|
||
|
|
'<p class="terrain-map-p" title="' + obj.workContent + '">作业内容:' + sliceStr(obj.workContent) + '</p>' +
|
||
|
|
'<p class="terrain-map-p">班组长:' + dealEmptyString(obj.foreman) + '' + dealEmptyString(obj.foremanPhone) + '</p></div>';
|
||
|
|
let steelOpts = {
|
||
|
|
width: 300, //信息窗口宽度
|
||
|
|
height: 170, //信息窗口高度
|
||
|
|
enableMessage: false //设置允许信息窗发送短息
|
||
|
|
};
|
||
|
|
marker.addEventListener("mouseover", function (e) {
|
||
|
|
this.openInfoWindow(new BMap.InfoWindow(steelContent, steelOpts));
|
||
|
|
});
|
||
|
|
/* marker.addEventListener("mouseout", function () {
|
||
|
|
this.closeInfoWindow();
|
||
|
|
}
|
||
|
|
);*/
|
||
|
|
}
|
||
|
|
|
||
|
|
function riskIcon() {
|
||
|
|
$.ajax({
|
||
|
|
type: "post",
|
||
|
|
data: {},
|
||
|
|
headers: {
|
||
|
|
"encrypt": sm3(JSON.stringify({}))
|
||
|
|
},
|
||
|
|
async: true,
|
||
|
|
url: dataUrl + 'proteam/pot/home/getRiskMap?token=' + token,
|
||
|
|
success: function (obj) {
|
||
|
|
console.log(obj.data);
|
||
|
|
for (let i = 0; i < obj.data.length; i++) {
|
||
|
|
console.log(obj.data[i]);
|
||
|
|
map.addOverlay(createJobLocationMarker(obj.data[i]));
|
||
|
|
}
|
||
|
|
}, error: function () {
|
||
|
|
console.error("获取数据失败");
|
||
|
|
}
|
||
|
|
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 定义一些常量
|
||
|
|
let x_PI = 3.14159265358979324 * 3000.0 / 180.0
|
||
|
|
let PI = 3.1415926535897932384626
|
||
|
|
let a = 6378245.0
|
||
|
|
let ee = 0.00669342162296594323
|
||
|
|
|
||
|
|
function gcj02tobd09(lng, lat) {
|
||
|
|
let z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI)
|
||
|
|
let theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI)
|
||
|
|
let bd_lng = z * Math.cos(theta) + 0.0065
|
||
|
|
let bd_lat = z * Math.sin(theta) + 0.006
|
||
|
|
return [bd_lng, bd_lat]
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* WGS84坐标系转火星坐标系GCj02 / 即WGS84 转谷歌、高德
|
||
|
|
* @param { Number } lng
|
||
|
|
* @param { Number } lat
|
||
|
|
*/
|
||
|
|
function wgs84togcj02(lng, lat) {
|
||
|
|
if (outOfChina(lng, lat)) {
|
||
|
|
return [lng, lat]
|
||
|
|
} else {
|
||
|
|
let dlat = transformlat(lng - 105.0, lat - 35.0)
|
||
|
|
let dlng = transformlng(lng - 105.0, lat - 35.0)
|
||
|
|
let radlat = lat / 180.0 * PI
|
||
|
|
let magic = Math.sin(radlat)
|
||
|
|
magic = 1 - ee * magic * magic
|
||
|
|
let sqrtmagic = Math.sqrt(magic)
|
||
|
|
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI)
|
||
|
|
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI)
|
||
|
|
let mglat = lat + dlat
|
||
|
|
let mglng = lng + dlng
|
||
|
|
return [mglng, mglat]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* wgs84坐标系转百度坐标系
|
||
|
|
* @param {*} lng
|
||
|
|
* @param {*} lat
|
||
|
|
*/
|
||
|
|
function wgs84tobd09(lng, lat) {
|
||
|
|
// wgs84先转为火星坐标系
|
||
|
|
let gcj02 = wgs84togcj02(lng, lat)
|
||
|
|
// 火星坐标系转百度坐标系
|
||
|
|
return gcj02tobd09(gcj02[0], gcj02[1])
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 经度转换
|
||
|
|
* @param { Number } lng
|
||
|
|
* @param { Number } lat
|
||
|
|
*/
|
||
|
|
function transformlat(lng, lat) {
|
||
|
|
let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng))
|
||
|
|
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0
|
||
|
|
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0
|
||
|
|
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0
|
||
|
|
return ret
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 纬度转换
|
||
|
|
* @param { Number } lng
|
||
|
|
* @param { Number } lat
|
||
|
|
*/
|
||
|
|
function transformlng(lng, lat) {
|
||
|
|
let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng))
|
||
|
|
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0
|
||
|
|
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0
|
||
|
|
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0
|
||
|
|
return ret
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 判断是否在国内,不在国内则不做偏移
|
||
|
|
* @param {*} lng
|
||
|
|
* @param {*} lat
|
||
|
|
*/
|
||
|
|
function outOfChina(lng, lat) {
|
||
|
|
return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false)
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
// 超长设置隐藏
|
||
|
|
function sliceStr(value) {
|
||
|
|
if (value) {
|
||
|
|
return value.length > 12 ? value.slice(0, 12) + '...' : value;
|
||
|
|
} else {
|
||
|
|
return '';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*判空*/
|
||
|
|
function dealEmptyString(str) {
|
||
|
|
if (str) {
|
||
|
|
return str;
|
||
|
|
}
|
||
|
|
return '';
|
||
|
|
}
|