You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2058 lines
81 KiB
JavaScript

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//var TDT_API_KEY = "d7b1b7243fce9720e4e1ae73e41a47ad";//天地图库-----梁浩申请的key
var TDT_API_KEY = "489fa3b53cd351877dcf69e9ed899a04";//天地图库-----陈震申请的key
//var TDT_API_KEY = "a4f4b6000cb9d1bf148bb77452000f30";//天地图库-----力研天地图申请的key
var map = null;
var drawSource = null;
var draw, snap;
var MAP_DIV = "map";
var MapIndex = 0;//街道图
var PopupOverlay = null;
var selectTargetType = "";
var selectShipType = "";
var MapIcon = {
arrow_buoy: webHome + "/common/images/arrow/arrow_buoy.png",//20220303增加浮标图片
arrow_def: webHome + "/common/images/arrow/arrow01.png"
, arrow_b: webHome + "/common/images/arrow/arrow_b.png"
// , arrow_r: webHome + "/common/images/arrow/arrow_r.png"//报警
// , arrow_y: webHome + "/common/images/arrow/arrow_y.png"//融合
, arrow_r:'<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">'+    
'<polygon fill="#FF0000" stroke="#000000" points="25,2 18,14 18,41 20.4,48 29.6,48 32,41 32,14 "/></svg>'//报警
, arrow_y:'<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">'+    
'<polygon fill="#DFDF20" stroke="#000000" points="25,2 18,14 18,41 20.4,48 29.6,48 32,41 32,14 "/></svg>'//融合
, arrow_b2: webHome + "/common/images/arrow/arrow_b2.png"
, arrow_g: webHome + "/common/images/arrow/arrow_g.png"
, point01: webHome + "/common/images/point/point01.png"
, point02: webHome + "/common/images/point/point02.png"
, point03: webHome + "/common/images/point/point03.png"
, people01: webHome + "/common/images/point/p01.png"
, ship01: webHome + "/common/images/point/ship_b.png"
, ship02: webHome + "/common/images/arrow/arrow01.png"
, map_def: webHome + "/common/images/point/map.png"
, arrow_ld: webHome + "/common/images/arrow/arrow_ld.png"//雷达目标图片 暂时没用上
, arrow_rh: webHome + "/common/images/arrow/arrow_rh.png"//融合目标图片 暂时没用上
// , arrow_ais: webHome + "/common/images/arrow/arrow_ais.png"//ais目标图片
// , arrow_radar: webHome + "/common/images/arrow/arrow_radar.png"//雷达目标图片
, arrow_ais:'<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">'+    
'<polygon fill="#1AFA29" stroke="#000000" points="25,2 18,14 18,41 20.4,48 29.6,48 32,41 32,14 "/></svg>'//ais目标图片
, arrow_radar:'<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">'+    
'<polygon fill="#1AFA29" stroke="#000000" points="25,2 18,14 18,41 20.4,48 29.6,48 32,41 32,14 "/></svg>'//雷达目标图片
, arrow_jt: webHome + "/common/images/arrow/arrow_jt.png"//雷达目标图片
};
var BDMap = null;
var MarkList = {};
var MapFence = {};
var MapTarget = {};
var MapTrack = [];
var MapRadar = {};
var MapRadarShow = false;
var MapFenceShow = false;
var MapDevice = {};
var MapObject = {};
var DeviceMap = {};
var TargetMap = {};
var MapType = "";
var MapShow = [0, 1];
//var MapShow = [0, 1];
var MapCallBack = "";
var MapSectorShow = false;
var MapSector = {};//定义扇形数组
var MapLineLenghtShow = false;//测距
var MapTrack_yc = [];//预测位置
function MapIni(_div, _zoom, _click) {
_div = (_div == null ? MAP_DIV : _div);
drawSource = new ol.source.Vector();
map = new ol.Map({
//cvecva,ia,llcia,llcva,llimg
layers: [
/* //本机
new ol.layer.Tile({
source: new ol.source.XYZ({
url: "http://192.168.1.235:9090/mbtiles/index.jsp?mapindex=vecva&zoom={z}&col={x}&row={y}"
})
}),
new ol.layer.Tile({
source: new ol.source.XYZ({
url: "http://192.168.1.235:9090/mbtiles/index.jsp?mapindex=cia&zoom={z}&col={x}&row={y}"
}),
visible: false
}), */
// //局域网---服务器
// new ol.layer.Tile({
// source: new ol.source.XYZ({
// url: "http://192.168.2.235:9090/mbtiles/index.jsp?mapindex=vecva&zoom={z}&col={x}&row={y}"
// //url: "http://9090.haoqi100.top/mbtiles/index.jsp?mapindex=vecva&zoom={z}&col={x}&row={y}"
// })
// }),
// new ol.layer.Tile({
// source: new ol.source.XYZ({
// url: "http://192.168.2.235:9090/mbtiles/index.jsp?mapindex=cia&zoom={z}&col={x}&row={y}"
// //url: "http://9090.haoqi100.top/mbtiles/index.jsp?mapindex=cia&zoom={z}&col={x}&row={y}"
// }),
// visible: false
// }),
// new ol.layer.Tile({
// source: new ol.source.OSM(),//原始地图
// validity: false
// }),
// // // //局域网---岳阳服务器
// new ol.layer.Tile({
// source: new ol.source.XYZ({
// url: window.location.origin.split(":")[0]+":"+window.location.origin.split(":")[1]+":8085/xyz/vector/{z}/{x}/{y}.png"
// //url: "http://192.168.2.235:8085/xyz/vector/{z}/{x}/{y}.png"// 矢量图层
// //url: "http://9090.haoqi100.top/mbtiles/index.jsp?mapindex=vecva&zoom={z}&col={x}&row={y}"
// })
// }),
// new ol.layer.Tile({
// source: new ol.source.XYZ({
// url: "http://t{0-7}.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + TDT_API_KEY//天地图
// //url: "http://192.168.2.235:8085/xyz/mark/{z}/{x}/{y}.png"// 标注图层
// //url: "http://9090.haoqi100.top/mbtiles/index.jsp?mapindex=cia&zoom={z}&col={x}&row={y}"
// }),
// visible: false
// }),
// // new ol.layer.Tile({
// // source: new ol.source.XYZ({
// // url: "http://192.168.2.235:9090/xyz/satellite/{z}/{x}/{y}.png"//影像图层
// // //url: "http://9090.haoqi100.top/mbtiles/index.jsp?mapindex=cia&zoom={z}&col={x}&row={y}"
// // }),
// // visible: false
// // }),
// new ol.layer.Tile({
// source: new ol.source.XYZ({
// //url: "http://t{0-7}.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + TDT_API_KEY//天地图
// url: window.location.origin.split(":")[0]+":"+window.location.origin.split(":")[1]+":8085/xyz/mark/{z}/{x}/{y}.png"// 标注图层
// //url: "http://192.168.2.235:8085/xyz/mark/{z}/{x}/{y}.png"// 标注图层
// //url: "http://9090.haoqi100.top/mbtiles/index.jsp?mapindex=cia&zoom={z}&col={x}&row={y}"
// }),
// //visible: false
// }),
//本地
new ol.layer.Tile({
source: new ol.source.XYZ({
url: "http://t{0-7}.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=" + TDT_API_KEY//天地图
})
}),
new ol.layer.Tile({
source: new ol.source.XYZ({
url: "http://t{0-7}.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + TDT_API_KEY//天地图
}),
visible: false
}),
new ol.layer.Tile({
source: new ol.source.XYZ({
url: "http://t{0-7}.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=" + TDT_API_KEY//天地图
})
}),
// new ol.layer.Tile({
// source: new ol.source.XYZ({
// url: "http://localhost:8080/MapDownload/vec_w/{z}/{x}/{y}.png"//天地图
// })
// }),
// new ol.layer.Tile({
// source: new ol.source.XYZ({
// url: "http://localhost:8080/MapDownload/img_w/{z}/{x}/{y}.png"//天地图
// }), visible: false
// }),
// new ol.layer.Tile({
// source: new ol.source.XYZ({
// url: "http://localhost:8080/MapDownload/cva_w/{z}/{x}/{y}.png"//天地图
// })
// })
],
target: _div,
view: new ol.View({
projection: 'EPSG:4326',
center: [p.MapCenter[0], p.MapCenter[1]],
zoom: (_zoom != null&&_zoom != "" )? parseInt(_zoom) : 14,
maxZoom: 17
})
});
PopupOverlay = new ol.Overlay({
//设置弹出框的容器
element: $("#popup")[0],
//是否自动平移,即假如标记在屏幕边缘,弹出时自动平移地图使弹出框完全可见
autoPan: true,
autoPanAnimation: {
duration: 250
}
});
map.on('pointermove', function (evt) {
var feature = map.forEachFeatureAtPixel(evt.pixel,
function (feature) {
return feature;
});
if (feature) {
feature.dispatchEvent({type: 'pointermove', event: evt});
} else {
//pDiv.hide();
}
});
map.on('singleclick', function (event) {
let isFeature = false;
map.removeOverlay(PopupOverlay);
let feature = map.forEachFeatureAtPixel(event.pixel,
function (feature) {
return feature;
});
if (feature) {
feature.dispatchEvent({type: 'singleclick', event: event});
isFeature = true;
} else {
//pDiv.hide();
}
//map.forEachFeatureAtPixel(event.pixel, feature => {
//为移动到的feature发送自定义的singleclick消息
//isFeature = true;
//feature.dispatchEvent({type: 'singleclick', event: event});
//});
if (!isFeature && _click != null) {
_click();
}
});
map.on("contextmenu", function(event){//新增 鼠标右键点击事件20210625
//debugger
event.preventDefault();
rightclickPoint(event.coordinate[0],event.coordinate[1]);
});
}
function changeMapType() {
if (MapIndex == 0) {
//切换到影像图
map.getLayers().item(MapShow[MapIndex]).setVisible(false);
MapIndex = 1;
map.getLayers().item(MapShow[MapIndex]).setVisible(true);
} else {
//切换到街道图
map.getLayers().item(MapShow[MapIndex]).setVisible(false);
MapIndex = 0;
map.getLayers().item(MapShow[MapIndex]).setVisible(true);
}
}
function toMapCenter(_zoom) {
if (p.MapCenter != null && p.MapCenter.length == 2) {
map.getView().setCenter([p.MapCenter[0], p.MapCenter[1]]);
map.getView().setZoom(_zoom != null ? _zoom : 10);
}
}
function toMapCenterByPoint(_point, _zoom) {
if (_point != null && _point.length == 2) {
map.getView().setCenter([_point[0], _point[1]]);
map.getView().setZoom(_zoom != null ? _zoom : 11);
}
}
//标注
function addOverlay(_id, _point, _fun) {
let oneP = new ol.Feature({
geometry: new ol.geom.Point(_point)
});
if (_fun != null) {
oneP.on('singleclick', function (evt) {
_fun(evt.coordinate);
//overlay.setPosition(coordinate);
});
}
//oneP.set("desc", _desc);
oneP.setStyle(new ol.style.Style({
image: new ol.style.Icon(({
color: '#8959A8',
crossOrigin: 'anonymous',
rotation: 45 * (2 * Math.PI) / 360,
src: MapIcon.map_def,
scale: 0.8
//scale:1/Math.pow(map.getView().getZoom(), 1/5)//设置图标随层级缩放大小比例 另外一种写法map.getView().getZoom() / 10
}))
}));
// UserFeature["d_" + _data.eqpid] = oneP;
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: MarkList.length
});
map.addLayer(mapLayers);
MarkList["l_" + _id] = mapLayers;
}
//塔台标注
function addDevice(_id, _point, _img, _text, _angle, _fun) {
let oneP = new ol.Feature({
geometry: new ol.geom.Point(_point)
});
if (_fun != null) {
oneP.on('singleclick', function (evt) {
_fun(evt.coordinate);
//overlay.setPosition(coordinate);
});
}
oneP.setStyle(new ol.style.Style({
// fill: new ol.style.Fill({
// color: '#0a3399CC'
// }),
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
//color: '#8959A8',
crossOrigin: 'anonymous',
rotation: _angle * (2 * Math.PI) / 360,//设置角度
src: _img,//图标
scale: map.getView().getZoom()/22
//scale:1/Math.pow(map.getView().getZoom(), 1/5)//设置图标随层级缩放大小比例 另外一种写法map.getView().getZoom() / 10
})),
// text: new ol.style.Text({
// text: "" + _text,
// //scale:1/Math.pow(map.getView().getZoom(), 1/10),//设置文字缩放大小
// //scale:map.getView().getZoom() /16,
// //rotation: _angle * (2 * Math.PI) / 360,
// //scale: 1.3,
// fill: new ol.style.Fill({
// color: '#000000'
// }),
// stroke: new ol.style.Stroke({
// color: '#FFFF99',
// width: 3.5
// })
// })
}));
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: MarkList.length + 1
});
if(map!= null){
console.log("进入地图上绑定设备:"+getTimeStrfomart(new Date()))
map.addLayer(mapLayers);
MarkList["d_" + _id] = mapLayers;
MapDevice[_id] = mapLayers;
}
map.getView().on('change:resolution', function () {
var style = oneP.getStyle();
// 重新设置图标的缩放率基于层级10来做缩放
// console.log("塔台标注放大缩小尺寸:"+0.2*(this.getZoom()-13))
// console.log("地图放大缩小尺寸:"+this.getZoom())
// console.log("地图放大缩小计算值:"+this.getZoom()/22)
style.getImage().setScale(this.getZoom()/22);
oneP.setStyle(style);
})
}
//时间转换-------给调试用
function getTimeStrfomart(_dateObj, _showSend) {
let _timeStr = "";
try {
if (_dateObj != null) {
var month = _dateObj.getMonth() + 1 < 10 ? "0" + (_dateObj.getMonth() + 1) : _dateObj.getMonth() + 1;
var date = _dateObj.getDate() < 10 ? "0" + _dateObj.getDate() : _dateObj.getDate();
_timeStr += (" " + _dateObj.getFullYear() + "-" + month + "-" +date + " ");
_timeStr += (pad(_dateObj.getHours(), 2) + ":" + pad(_dateObj.getMinutes(), 2) + ":" + pad(_dateObj.getSeconds(), 2));
}
} catch (e) {
}
return _timeStr;
}
//暂时废弃 20211105
function addTarget_old(_id, _point, _img, _angle, _text, _clickfun, _moveFun) {
let oneP = new ol.Feature({
geometry: new ol.geom.Point(_point)
});
if (_clickfun != null) {
oneP.on('singleclick', function (evt) {
_clickfun(_id, evt.coordinate);
//overlay.setPosition(coordinate);
});
}
if (_moveFun != null) {
oneP.on('pointermove', function (evt) {
_moveFun(_id, evt.coordinate);
//overlay.setPosition(coordinate);
});
}
//oneP.set("desc", _desc);
oneP.setStyle(new ol.style.Style({
image: new ol.style.Icon(({
// color: '#8959A8',//此处颜色设置影响到了其他图标颜色显示 暂时去掉20210805 江边测试 增加雷达 ais 图标分别显示
// crossOrigin: 'anonymous',
rotation: _angle * (2 * Math.PI) / 360,
src: _img,
scale: 0.8
//scale:1/Math.pow(map.getView().getZoom(), 1/5)//设置图标随层级缩放大小比例 另外一种写法map.getView().getZoom() / 10
})), text: new ol.style.Text({
text: "" + _text,
//scale:1/Math.pow(map.getView().getZoom(), 1/10),//设置文字缩放大小
scale: 1,
fill: new ol.style.Fill({
color: '#000000'
}),
stroke: new ol.style.Stroke({
color: '#FFFF99',
width: 2.5
})
})
}));
// UserFeature["d_" + _data.eqpid] = oneP;
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: MapTarget.length + 101
});
let _sflg = false;
if (((selectTargetType != "" && TargetMap[_id].targetSource == selectTargetType) || selectTargetType == "")
&& ((selectShipType != "" && TargetMap[_id].shipType == selectShipType) || selectShipType == "")) {
_sflg = true;
}
if (_sflg) {
map.addLayer(mapLayers);
}
MarkList["t_" + _id] = mapLayers;
MapTarget[_id] = mapLayers;
}
function addTarget(_id, _point, _img, _angle, _text, _clickfun, _moveFun) {
let oneP = new ol.Feature({
geometry: new ol.geom.Point(_point)
});
if (_clickfun != null) {
oneP.on('singleclick', function (evt) {
_clickfun(_id, evt.coordinate);
//overlay.setPosition(coordinate);
});
}
if (_moveFun != null) {
oneP.on('pointermove', function (evt) {
_moveFun(_id, evt.coordinate);
//overlay.setPosition(coordinate);
});
}
//增加图标与文字间线条20220112
var styles = [];
var line =createLineStyle(_angle);
var textStyleA =createTextStyleA(_angle,_img);
var textStyleB =createTextStyleB(_text,_angle);
styles.push(textStyleA);
styles.push(line);
styles.push(textStyleB);
// oneP.setStyle(new ol.style.Style({
// image: new ol.style.Icon(({
// // color: '#8959A8',//此处颜色设置影响到了其他图标颜色显示 暂时去掉20210805 江边测试 增加雷达 ais 图标分别显示
// // crossOrigin: 'anonymous',
// rotation: _angle * (2 * Math.PI) / 360,
// src: _img,
// scale: map.getView().getZoom()/18
// //scale: 0.8
// //scale:1/Math.pow(map.getView().getZoom(), 1/5)//设置图标随层级缩放大小比例 另外一种写法map.getView().getZoom() / 10
// })), text: new ol.style.Text({
// text: "" + _text,
// //scale:1/Math.pow(map.getView().getZoom(), 1/10),//设置文字缩放大小
// //scale: 1,
// scale: map.getView().getZoom()/18,
// fill: new ol.style.Fill({
// color: '#000000'
// }),
// font: 'normal 12px 微软雅黑',
// stroke: new ol.style.Stroke({
// color: '#FFFF99',
// width: 2.5
// })
// })
// }));
// UserFeature["d_" + _data.eqpid] = oneP;
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
style: styles,
zindex: MapTarget.length + 101
});
let _sflg = false;
if (((selectTargetType != "" && TargetMap[_id].targetSource == selectTargetType) || selectTargetType == "")
&& ((selectShipType != "" && TargetMap[_id].shipType == selectShipType) || selectShipType == "")) {
_sflg = true;
}
if (_sflg) {
map.addLayer(mapLayers);
}
MarkList["t_" + _id] = mapLayers;
MapTarget[_id] = mapLayers;
map.getView().on('change:resolution', function () {
var style = mapLayers.getStyle();
// 重新设置图标的缩放率基于层级10来做缩放
// console.log("塔台标注放大缩小尺寸:"+0.2*(this.getZoom()-13))
// console.log("地图放大缩小尺寸:"+this.getZoom())
// console.log("地图放大缩小计算值:"+this.getZoom()/18)
style[0].getImage().setScale(this.getZoom()/18);
style[1].getImage().setScale(this.getZoom()/18);
style[2].getText().setScale(this.getZoom()/18);
mapLayers.setStyle(style);
})
}
//目标方法 20211105增加_points参数 该参数是位置预测数组
function addTargetshow(_id, _point, _img, _angle, _text, _clickfun, _moveFun,_points){
//画线
let oneP = new ol.Feature({
geometry: new ol.geom.Point(_point)
});
let onePs = new ol.Feature({
geometry: new ol.geom.LineString(_points)
});
if (_clickfun != null) {
oneP.on('singleclick', function (evt) {
_clickfun(_id, evt.coordinate);
//overlay.setPosition(coordinate);
});
}
if (_moveFun != null) {
oneP.on('pointermove', function (evt) {
_moveFun(_id, evt.coordinate);
//overlay.setPosition(coordinate);
});
}
var styles = [];
//oneP.set("desc", _desc);
var line =createLineStyle(_angle);
var textStyleA =createTextStyleA(_angle,_img);
var textStyleB =createTextStyleB(_text,_angle);
styles.push(textStyleA);
styles.push(line);
styles.push(textStyleB);
// oneP.setStyle(new ol.style.Style({
// image: new ol.style.Icon(({
// // color: '#8959A8',//此处颜色设置影响到了其他图标颜色显示 暂时去掉20210805 江边测试 增加雷达 ais 图标分别显示
// // crossOrigin: 'anonymous',
// rotation: _angle * (2 * Math.PI) / 360,
// src: _img,
// scale: map.getView().getZoom()/18
// //scale:1/Math.pow(map.getView().getZoom(), 1/5)//设置图标随层级缩放大小比例 另外一种写法map.getView().getZoom() / 10
// })),
// text: new ol.style.Text({
// text: "" + _text,
// //scale:1/Math.pow(map.getView().getZoom(), 1/10),//设置文字缩放大小
// scale: map.getView().getZoom()/18,
// textAlign: "right", //对齐方式
// textBaseline: "middle", //文本基线
// fill: new ol.style.Fill({
// color: '#fff'
// }),
// //placement:"line",
// //文字样式
// //font: 'normal 12px 微软雅黑',
// stroke: new ol.style.Stroke({
// //color: '#444F60',
// color: 'rgba(0,0,255,0.7)',//#EBF2FE
// width: 12.5,
// lineDash: [100]
// }),
// offsetY: 0,
// offsetX: -30,
// // backgroundFill: new ol.style.Stroke({
// // color: 'rgba(0,0,255,0.7)',
// // }),
// padding: [5, 5, 5, 5],
// //rotation: _angle * (2 * Math.PI) / 360,
// })
// }));
// UserFeature["d_" + _data.eqpid] = oneP;
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP,onePs]
}),
style: styles,
zindex: MapTarget.length + 101
});
let _sflg = false;
if (((selectTargetType != "" && TargetMap[_id].targetSource == selectTargetType) || selectTargetType == "")
&& ((selectShipType != "" && TargetMap[_id].shipType == selectShipType) || selectShipType == "")) {
_sflg = true;
}
if(_points.length>0){
onePs.setStyle(function (resolution) {
var lineStringForl = resolution.getGeometry();
var coordis = lineStringForl.getCoordinates();
var styles = [
new ol.style.Style({
stroke: new ol.style.Stroke({
//lineDash:[10,10new ol.style.,10,10],
//lineDash:[20, 10, 40, 20],
//lineDash:[1,2,3,4,5,6],
color: '#252E3B',
width: 1,
}),
})
];
//增加箭头-----暂时去掉存在bug目标没有线条方向 也会显示箭头。
// var geometry=onePs.getGeometry(); //几何对象:空间坐标信息等
// geometry.forEachSegment(function(start, end) {
// var dx = end[0] - start[0];
// var dy = end[1] - start[1];
// var rotation = Math.atan2(dy, dx);
// // arrows
// styles.push( new ol.style.Style({
// geometry: new ol.geom.Point(end),
// image:new ol.style.Icon({
// src: MapIcon.arrow_jt,
// anchor: [0.75, 0.5],
// rotateWithView: true,
// rotation: -rotation
// })
// }));
// });
return styles;
});
}
if (_sflg) {
//添加位置预测代码,整合到目标显示一起,放这里是因为目标来源筛选跟船型筛选的时候 位置预测线条可以随目标显示而显示,隐藏而隐藏----------开始20211108备注后期优化需要增加位置预测开关按钮
// if(_points.length>0){
// // for (let i = 0; i < MapTrack_yc.length; i++) {
// // map.removeLayer(MapTrack_yc[i]);
// // }
// // let onePs = new ol.Feature({
// // geometry: new ol.geom.LineString(_points)
// // });
// // let onePLayers = new ol.layer.Vector({
// // source: new ol.source.Vector({
// // features: [onePs]
// // }),
// // zindex: 10
// // });
// // MapTrack_yc[MapTrack_yc.length] = onePLayers;
// // map.addLayer(onePLayers);
// onePs.setStyle(function (resolution) {
// var lineStringForl = resolution.getGeometry();
// var coordis = lineStringForl.getCoordinates();
// var styles = [
// new ol.style.Style({
// stroke: new ol.style.Stroke({
// //lineDash:[10,10,10,10],
// //lineDash:[20, 10, 40, 20],
// //lineDash:[1,2,3,4,5,6],
// color: '#252E3B',
// width: 1,
// })
// })
// ];
// return styles;
// });
// }
//位置预测线------------------结束
//添加目标
map.addLayer(mapLayers);
}
MarkList["t_" + _id] = mapLayers;
MapTarget[_id] = mapLayers;
map.getView().on('change:resolution', function () {
var style = mapLayers.getStyle();
// 重新设置图标的缩放率基于层级10来做缩放
// console.log("塔台标注放大缩小尺寸:"+0.2*(this.getZoom()-13))
// console.log("地图放大缩小尺寸:"+this.getZoom())
// console.log("地图放大缩小计算值:"+this.getZoom()/18)
style[0].getImage().setScale(this.getZoom()/18);
style[1].getImage().setScale(this.getZoom()/18);
style[2].getText().setScale(this.getZoom()/18);
// var styles = [
// new ol.style.Style({
// image:new ol.style.Circle({
// radius: 10,
// stroke: new ol.style.Stroke({
// color: '#fff'
// }),
// fill: new ol.style.Fill({
// color: '#3399CC'
// }),
// scale:map.getView().getZoom()/20
// })
// })
// ];
// style.push(styles);
mapLayers.setStyle(style);
})
}
function createLineStyle(_angle) {
var canvas = document.createElement('canvas');
canvas.width = 100;
canvas.height = 20;
var ctx = canvas.getContext("2d");
ctx.lineWidth = 1;
ctx.strokeStyle = "#000";
ctx.beginPath(); //新建一条path
ctx.moveTo(20, 0);
ctx.lineTo(50,0);
//画线
ctx.stroke();
//封闭路径
ctx.closePath();
var lineStyle = new ol.style.Style({
image: new ol.style.Icon({
img: canvas,
imgSize: [canvas.width,canvas.height ],
//rotation: _angle * (2 * Math.PI) / 360,
//offset:[0,10]
//rotation: Math.PI/180
})
});
return lineStyle;
}
function createTextStyleA(_angle,_img) {
var mysvg = new Image();
mysvg.src = 'data:image/svg+xml,' + escape(_img);
var style = new ol.style.Style({
image: new ol.style.Icon(({
// color: '#8959A8',//此处颜色设置影响到了其他图标颜色显示 暂时去掉20210805 江边测试 增加雷达 ais 图标分别显示
// crossOrigin: 'anonymous',
rotation: _angle * (2 * Math.PI) / 360,
img: mysvg,
imgSize: [50, 50],
// src: _img,
scale: map.getView().getZoom()/18,
//offset:[0,10]
//scale:1/Math.pow(map.getView().getZoom(), 1/5)//设置图标随层级缩放大小比例 另外一种写法map.getView().getZoom() / 10
})),
});
return style;
}
function createTextStyleB(_text,_angle) {
var style = new ol.style.Style({
text: new ol.style.Text({
text: "" + _text,
//scale:1/Math.pow(map.getView().getZoom(), 1/10),//设置文字缩放大小
scale: map.getView().getZoom()/18,
textAlign: "right", //对齐方式
textBaseline: "middle", //文本基线
fill: new ol.style.Fill({
color: '#000'
}),
//placement:"line",
//文字样式
font: 'normal 12px 微软雅黑',
stroke: new ol.style.Stroke({
color: '#EBF2FE',
//color: 'rgba(0,0,255,0.7)',//#EBF2FE
width: 12.5,
lineDash: [100]
}),
//offsetY: 0,
offsetX: -35,
// backgroundFill: new ol.style.Stroke({
// color: 'rgba(0,0,255,0.7)',
// }),
padding: [5, 5, 5, 5],
//rotation: _angle * (2 * Math.PI) / 360,
})
});
return style;
}
//目标方法 20211105增加_points参数 该参数是位置预测数组
function addTarget_old2(_id, _point, _img, _angle, _text, _clickfun, _moveFun,_points){
//画线
let oneP = new ol.Feature({
geometry: new ol.geom.Point(_point)
});
if (_clickfun != null) {
oneP.on('singleclick', function (evt) {
_clickfun(_id, evt.coordinate);
//overlay.setPosition(coordinate);
});
}
if (_moveFun != null) {
oneP.on('pointermove', function (evt) {
_moveFun(_id, evt.coordinate);
//overlay.setPosition(coordinate);
});
}
//oneP.set("desc", _desc);
oneP.setStyle(new ol.style.Style({
image: new ol.style.Icon(({
// color: '#8959A8',//此处颜色设置影响到了其他图标颜色显示 暂时去掉20210805 江边测试 增加雷达 ais 图标分别显示
// crossOrigin: 'anonymous',
rotation: _angle * (2 * Math.PI) / 360,
src: _img,
scale: map.getView().getZoom()/18
//scale:1/Math.pow(map.getView().getZoom(), 1/5)//设置图标随层级缩放大小比例 另外一种写法map.getView().getZoom() / 10
})), text: new ol.style.Text({
text: "" + _text,
//scale:1/Math.pow(map.getView().getZoom(), 1/10),//设置文字缩放大小
scale: map.getView().getZoom()/18,
fill: new ol.style.Fill({
color: '#000000'
}),
stroke: new ol.style.Stroke({
color: '#FFFF99',
width: 2.5
})
})
}));
// UserFeature["d_" + _data.eqpid] = oneP;
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: MapTarget.length + 101
});
let _sflg = false;
if (((selectTargetType != "" && TargetMap[_id].targetSource == selectTargetType) || selectTargetType == "")
&& ((selectShipType != "" && TargetMap[_id].shipType == selectShipType) || selectShipType == "")) {
_sflg = true;
}
if (_sflg) {
//添加位置预测代码,整合到目标显示一起,放这里是因为目标来源筛选跟船型筛选的时候 位置预测线条可以随目标显示而显示,隐藏而隐藏----------开始20211108备注后期优化需要增加位置预测开关按钮
if(_points.length>0){
// for (let i = 0; i < MapTrack_yc.length; i++) {
// map.removeLayer(MapTrack_yc[i]);
// }
let onePs = new ol.Feature({
geometry: new ol.geom.LineString(_points)
});
let onePLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [onePs]
}),
zindex: 10
});
MapTrack_yc[MapTrack_yc.length] = onePLayers;
map.addLayer(onePLayers);
onePs.setStyle(function (resolution) {
var lineStringForl = resolution.getGeometry();
var coordis = lineStringForl.getCoordinates();
var styles = [
new ol.style.Style({
stroke: new ol.style.Stroke({
//lineDash:[10,10,10,10],
//lineDash:[20, 10, 40, 20],
//lineDash:[1,2,3,4,5,6],
color: '#252E3B',
width: 1,
})
})
];
return styles;
});
}
//位置预测线------------------结束
//添加目标
map.addLayer(mapLayers);
}
MarkList["t_" + _id] = mapLayers;
MapTarget[_id] = mapLayers;
map.getView().on('change:resolution', function () {
var style = oneP.getStyle();
// 重新设置图标的缩放率基于层级10来做缩放
// console.log("塔台标注放大缩小尺寸:"+0.2*(this.getZoom()-13))
// console.log("地图放大缩小尺寸:"+this.getZoom())
// console.log("地图放大缩小计算值:"+this.getZoom()/18)
style.getImage().setScale(this.getZoom()/18);
style.getText().setScale(this.getZoom()/18);
oneP.setStyle(style);
})
}
//添加雷达范围
function addCircle(_id, _point, _bj, _fun) {
if(map!=null) {
let oneP = new ol.Feature({
geometry: new ol.geom.Circle(_point, _bj / map.getView().getProjection().getMetersPerUnit())
});
oneP.setStyle(new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(100,149,237, 0.1)'
}),
stroke: new ol.style.Stroke({
color: '#ffcc33',
width: 2
})
}));
var mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: 0
});
//map.addLayer(mapLayers);
MarkList["c_" + _id] = mapLayers;
map.removeLayer(MapRadar[_id]);
MapRadar[_id] = mapLayers;
if (MapRadarShow) {
map.addLayer(mapLayers);
}
}
}
/**
* 创建扇形
* @param [x,y] center 扇形中心点
* @param number randius 扇形半径 与中心点对应的坐标系单位
* @param number sAngle 扇形起始边与X轴正方向夹角° 也就是 起点=设备角度+圆心角/2
* @param number angle 圆心角°(逆时针方向为正)
* @returns {ol.geom.Polygon}
* @constructor
*/
ol.geom.Sector = function (center, randius, sAngle, angle) {
sAngle = (360 - sAngle + 90) % 360;
var points = [];
points.push(center);
var ep = null;
for (var i = 0; i <= angle; ++i) {
var x = center[0] + randius * Math.cos((sAngle + i) * Math.PI / 180);
var y = center[1] + randius * Math.sin((sAngle + i) * Math.PI / 180);
points.push([x, y]);
}
points.push(center);
return new ol.geom.Polygon([points]);
};
/**
* _id:设备ID
* @param [x,y] _point 扇形中心点
* @param number _bj 扇形半径 m
* @param number sAngle 扇形起始边与X轴正方向夹角° 也就是 起点=设备角度+圆心角/2
* @param number angle 圆心角°(逆时针方向为正)
* @returns {ol.geom.Polygon}
* @constructor
*/
//添加扇形范围
function addRegularPolygon(_id,_point, _bj, sAngle, angle,_func){
debugger
let oneP = new ol.Feature({
geometry: new ol.geom.Sector(_point,_bj/ map.getView().getProjection().getMetersPerUnit(),sAngle,angle)
});
//oneP.set("desc", _desc);
oneP.setStyle(new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(0, 255, 0, 0.3)'
}),
stroke: new ol.style.Stroke({
color: '#ffcc33',
width: 2
})
}));
// UserFeature["d_" + _data.eqpid] = oneP;
var mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: 20
});
//map.addLayer(mapLayers);
//map.addLayer(mapLayers);
MarkList["tp_" + _id] = mapLayers;
map.removeLayer(MapSector[_id]);
MapSector[_id] = mapLayers;
if (MapSectorShow) {
map.addLayer(mapLayers);
}
}
//围栏判断是白名单区域(白色)还是黑名单区域(蓝色)还是水面区域(黄色)--------------最后一个参数(20210830)是 区域默认加载进来显示,地图进来默认不显示
function addFance(_id, _points,type,Show) {
MapFenceShow=Show;
let onePF = null;
let _cos = new Array();
for (var i = 0; i < _points.length; i++) {
_cos[_cos.length] = [_points[i].lon, _points[i].lat];
}
onePF = new ol.Feature({
geometry: new ol.geom.Polygon([_cos])
});
if (onePF != null) {
if(type=="0"||type==null){//0 黑区域 为蓝底
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [onePF]
}
), style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(25,25,112, 0.3)'
}),
stroke: new ol.style.Stroke({
color: '#191970',
width: 1
})
}),
zindex: 0
});
//map.addLayer(mapLayers);
MarkList["po" + _id] = mapLayers;
MapFence[_id] = mapLayers;
if (MapFenceShow) {
map.addLayer(mapLayers);
}
}else if(type=="1"){//type==1 白区域,围栏区域为白色样式 20210719
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [onePF]
}
), style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(221,221,221, 0.3)'
}),
stroke: new ol.style.Stroke({
color: '#191970',
width: 1
})
}),
zindex: 0
});
//map.addLayer(mapLayers);
MarkList["po" + _id] = mapLayers;
MapFence[_id] = mapLayers;
if (MapFenceShow) {
map.addLayer(mapLayers);
}
}else{//||type=="2" 2水面 橙色
let mapLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [onePF]
}
), style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255,102,0, 0.3)'
}),
stroke: new ol.style.Stroke({
color: '#191970',
width: 1
})
}),
zindex: 0
});
//map.addLayer(mapLayers);
MarkList["po" + _id] = mapLayers;
MapFence[_id] = mapLayers;
//默认false 隐藏区域显示
if (MapFenceShow) {
map.addLayer(mapLayers);
}
}
}
}
//优化后的轨迹样式20210804 待测试
function addTrack(_points) {
map.removeOverlay(PopupOverlay);
//画线
let oneP = new ol.Feature({
geometry: new ol.geom.LineString(_points)
});
let onePLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: 200
});
map.addLayer(onePLayers);
MapTrack[MapTrack.length] = onePLayers;
//oneP.set("desc", _desc);
var offset=0.001;
var stylesFunction=function () {
let resolution=map.getView().getResolution(); //分辨率:一个像素代表的距离
var geometry = oneP.getGeometry(); //几何对象:空间坐标信息等
var length = geometry.getLength(); //长度:线几何对象的长度
var radio = (300 * resolution) / length; //间隔分之一 分割了多少段
var dradio = 100000000; //投影坐标系如3857 等在EPSG:4326下可以设置dradio=10000
// 线段样式
var styles = [
new ol.style.Style({
stroke: new ol.style.Stroke({
color: '#02BB1A',
width: 10
})
})
];
// 添加箭头样式
for (var i = 0; i <= 1; i += radio) {
var arrowLocation = geometry.getCoordinateAt(i);
geometry.forEachSegment(function (start, end) {
if (start[0] == end[0] || start[1] == end[1])
return;
// 暂时不考虑这种情况
// if (start[0] == end[0] || start[1] == end[1]) return;
var dx1 = end[0] - arrowLocation[0];
var dy1 = end[1] - arrowLocation[1];
var dx2 = arrowLocation[0] - start[0];
var dy2 = arrowLocation[1] - start[1];
if (dx1 != dx2 && dy1 != dy2) {
if (Math.abs(dradio * dx1 * dy2 - dradio * dx2 * dy1) < 0.001) {
var dx = end[0] - start[0];
var dy = end[1] - start[1];
var rotation = Math.atan2(dy, dx); // 得到箭头方向角
styles.push(
new ol.style.Style({
geometry: new ol.geom.Point(arrowLocation),
image:  new ol.style.Icon({
src: webHome + '/common/images/arrow/arrow_t.png',
anchor: [0.75, 0.5],
scale: 0.5,
rotateWithView: false,
color:'white',
rotation: -rotation
})
})
);
}
}
});
}
return styles;
}
oneP.setStyle(stylesFunction);
// new ol.layer.on('postrender', (evt) => {
// oneP.setStyle(stylesFunction);
// offset+=0.001;
// if(offset>1) offset-=1;
// map.render();
// })
}
//之前的轨迹样式 addTrack_old
function addTrack_old(_points) {
map.removeOverlay(PopupOverlay);
//画线
let oneP = new ol.Feature({
geometry: new ol.geom.LineString(_points)
});
let onePLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: 200
});
map.addLayer(onePLayers);
MapTrack[MapTrack.length] = onePLayers;
//oneP.set("desc", _desc);
oneP.setStyle(function (resolution) {
var lineStringForl = resolution.getGeometry();
var coordis = lineStringForl.getCoordinates();
var styles = [
new ol.style.Style({
stroke: new ol.style.Stroke({
color: '#02BB1A',
width: 10
})
})
];
// 计算线段角度
let vs = calcLineStringD(coordis);
// direction_labeling_01(res, lineStringForl, coordis, vs, styles);
direction_labeling_02(100, lineStringForl, coordis, vs, styles);
return styles;
});
//添加点
for (let i = 0; i < _points.length; i++) {
addTrackText(_points[i], (i + 1));
}
}
function addTrackText(_points, _index) {
let oneP = new ol.Feature({
geometry: new ol.geom.Point(_points)
//geometry: new ol.geom.Circle([113.006943, 28.219305], 20 / map.getView().getProjection().getMetersPerUnit())
});
oneP.setStyle(new ol.style.Style({
fill: new ol.style.Fill({
color: '#0a3399CC'
}),
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
color: '#8959A8',
crossOrigin: 'anonymous',
rotation: 45 * (2 * Math.PI) / 360,
src: MapIcon.point01,
scale: 0.5
})),
text: new ol.style.Text({
text: "" + _index,
//scale: 1.3,
fill: new ol.style.Fill({
color: '#000000'
}),
stroke: new ol.style.Stroke({
color: '#FFFF99',
width: 3.5
})
})
}))
let onePLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: 210
});
map.addLayer(onePLayers);
MapTrack[MapTrack.length] = onePLayers;
}
function clearTrack() {
for (let i = 0; i < MapTrack.length; i++) {
map.removeLayer(MapTrack[i]);
}
}
//雷达圆形范围
function showRadar() {
MapRadarShow = !MapRadarShow;
$.each(MapRadar, function (key, value) {
map.removeLayer(value);
});
if ($("#t_radar").length > 0 && $("#t_radar").is(':checked')) {
MapRadarShow = true;
}
if (($("#t_radar").length > 0 && $("#t_radar").is(':checked')) || MapRadarShow) {
$.each(MapRadar, function (key, value) {
map.addLayer(value);
});
}
}
//雷达扇形范围
function showRadar2() {
//debugger
MapSectorShow = !MapSectorShow;
$.each(MapSector, function (key, value) {
map.removeLayer(value);
});
if ($("#t_radar").length > 0 && $("#t_radar").is(':checked')) {
MapSectorShow = true;
}
if (($("#t_radar").length > 0 && $("#t_radar").is(':checked')) || MapSectorShow) {
$.each(MapSector, function (key, value) {
map.addLayer(value);
});
}
}
function showFance() {
MapFenceShow = !MapFenceShow;
$.each(MapFence, function (key, value) {
map.removeLayer(value);
});
if ($("#t_fance").length > 0 && $("#t_fance").is(':checked')) {
MapFenceShow = true;
}
if (($("#t_fance").length > 0 && $("#t_fance").is(':checked')) || MapFenceShow) {
$.each(MapFence, function (key, value) {
map.addLayer(value);
});
}
}
function showFance2() {
$.each(MapFence, function (key, value) {
map.removeLayer(value);
});
if ($("#t_fance").is(':checked')) {
$.each(MapFence, function (key, value) {
map.addLayer(value);
});
}
}
function showTarget(_id) {
_id = (_id != null && _id != "") ? _id : "t_target";
$.each(MapTarget, function (key, value) {
if (value != null) {
map.removeLayer(value);
}
});
if ($("#" + _id).is(':checked')) {
$.each(MapTarget, function (key, value) {
if (value != null) {
map.addLayer(value);
}
});
}
}
//
function showTargetByType(_type, _targets) {
selectTargetType = _type;
$.each(MapTarget, function (key, value) {
if (value != null) {
map.removeLayer(value);
}
});
$.each(_targets, function (key, value) {
if (value != null) {
if ((value.targetSource == _type || _type == "") && (value.shipType == selectShipType || selectShipType == "")) {
if(MapTarget[value.targetCode]!=undefined&&MapTarget[value.targetCode]!=null) {
map.addLayer(MapTarget[value.targetCode]);
}
}
}
});
map.removeOverlay(PopupOverlay);
}
function showTargetByShipType(_type, _targets) {
selectShipType = _type;
//selectTargetType=p.DicMap.shiptype[_type].dictLabel;
$.each(MapTarget, function (key, value) {
if (value != null) {
map.removeLayer(value);
}
});
$.each(_targets, function (key, value) {
if (value != null) {
// if ((value.shipType == _type || _type == "") && (value.targetSource == selectTargetType || selectTargetType == "")) {
// map.addLayer(MapTarget[value.targetCode]);
// }
//船型增加筛选条件 从船舶库里面进行匹配船型20210715
if (((value.shipType == _type || _type == "") && (value.targetSource == selectTargetType || selectTargetType == ""))||(value.gtShipInfo!=null&&value.gtShipInfo.minotype==p.DicMap.shiptype[_type].dictLabel)) {
if(MapTarget[value.targetCode]!=undefined&&MapTarget[value.targetCode]!=null) {
map.addLayer(MapTarget[value.targetCode]);
}
}
}
});
map.removeOverlay(PopupOverlay);
}
//判断坐标点是否在围栏里面,并且还要在黑名单也就是蓝色区域围栏中才报警,白区域不变色,水面区域不在地图上显示
function checkPointInFance(_point) {
let isIn = false;
$.each(MapFence, function (key, value) {
if (value.getSource().getFeatures()[0].getGeometry().containsXY(_point[0], _point[1])&&value.style_.fill_.color_=="rgba(25,25,112, 0.3)") {
isIn = true;
}
});
return isIn;
}
// 将方向标注放在线段中间
function direction_labeling_02(res, lineStringForl, coordis, vs, styles) {
for (let i = 0; i < vs.length; i++) {
let line = vs[i]['line'];
let start = line[0];
let end = line[1];
let array_coor = [
(start[0] + end[0]) / 2, (start[1] + end[1]) / 2
];
let d = vs[i]['d'];
styles.push(new ol.style.Style({
geometry: new ol.geom.Point(array_coor),
image: new ol.style.Icon({
src: webHome + '/common/images/arrow/arrow_t.png',
scale: 0.5,
rotateWithView: true,
rotation: -d
})
}))
}
}
function calcD(start, end) {
if (start[0] == end[0] || start[1] == end[1])
return;
let dx = end[0] - start[0];
let dy = end[1] - start[1];
let rotation = Math.atan2(dy, dx);
console.log("角度" + rotation);
return rotation;
}
function calcLineStringD(coordis) {
let n = coordis.length;
let vs = [];
for (let i = 0; i < n; i++) {
if (i + 1 < n) {
vs.push({
"line": [coordis[i], coordis[i + 1]],
"d": calcD(coordis[i], coordis[i + 1])
})
}
}
return vs;
}
function clearDraw() {
drawSource.clear();
FancePoints = new Array();
}
function addInteractions(_fun) {
draw = new ol.interaction.Draw({
source: drawSource,
type: "Polygon"
});
//map.removeInteraction(draw);
map.addInteraction(draw);
snap = new ol.interaction.Snap({source: drawSource});
map.addInteraction(snap);
draw.on('drawstart',
function (evt) {
drawSource.clear();
}, this);
draw.on('drawend',
function (evt) {
// set sketch
FancePoints = [];
var geom = evt.feature.getGeometry().getCoordinates()[0];
for (var k = 0; k < geom.length; k++) {
FancePoints[FancePoints.length] = {lon: geom[k][0], lat: geom[k][1]};
}
map.removeInteraction(draw);
if (_fun != null) {
_fun(FancePoints);
} else {
addFance(_id, FancePoints);
}
clearDraw();
//showFance();
}, this);
}
//增加测距功能
// //点击测距方法
function showlineLength(){
//debugger
MapLineLenghtShow = !MapLineLenghtShow;
if ($("#t_linelength").length > 0 && $("#t_linelength").is(':checked')) {
MapLineLenghtShow = true;
//$("#t_linelength").parent().addClass("active");
}
if (($("#t_linelength").length > 0 && $("#t_linelength").is(':checked')) || MapLineLenghtShow) {
measure();
}
else {
//clear();
}
}
//测距开始
function measure() {
// 已绘制的坐标集合
var drawCoordinateArr = []
//定义一个控制鼠标点击次数的变量
var count = 0;
var listener;
//创建一个当前要绘制的对象
var sketch;
//创建一个WGS84球体对象
//var wgs84Sphere = new ol.sphere(6378137);
//创建一个帮助提示框对象
var helpTooltipElement;
//创建一个帮助提示信息对象
var helpTooltip;
//创建一个测量提示框对象
var measureTooltipElement;
//创建一个测量提示信息对象
var measureTooltip;
//继续绘制多边形的提示信息
var continuePolygonMsg;
//继续绘制线段的提示信息
var continueLineMsg;
//帮助提示信息
var helpMsg;
//定义矢量数据源
var source = new ol.source.Vector();
//定义矢量图层
var vector = new ol.layer.Vector({
source: source,
style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255,255,255,0.2)',
}),
stroke: new ol.style.Stroke({
color: '#e21e0a',
width: 2,
}),
image: new ol.style.Circle({
radius: 5,
fill: new ol.style.Fill({
color: '#ffcc33',
}),
}),
}),
});
sketch = new ol.Feature();
// continuePolygonMsg = 'Click to continue drawing the polygon';
// continueLineMsg = 'Click to continue drawing the line';
//将矢量图层添加到地图中
map.removeLayer(vector);
map.addLayer(vector);
//添加比例尺控件
// map.removeControl(scaleLineControl);
// map.addControl(scaleLineControl);
//鼠标移动触发的函数
var pointerMoveHandler = function (evt) {
//如果是平移地图则直接结束
if (evt.dragging) {
return;
}
//帮助提示信息
//helpMsg = 'Click to start drawing';
if (sketch) {
//获取绘图对象的几何要素
var geom = sketch.getGeometry();
//如果当前绘制的几何要素是多线段,则将绘制提示信息设置为多线段绘制提示信息
// if (geom instanceof ol.geom.Polygon) {
// helpMsg = continuePolygonMsg;
// } else if (geom instanceof ol.geom.LineString) {
// helpMsg = continueLineMsg;
// }
}
//设置帮助提示要素的内标签为帮助提示信息
// if (helpTooltipElement)
// helpTooltipElement.innerHTML = helpMsg;
//设置帮助提示信息的位置
// if (helpTooltip)
helpTooltip.setPosition(evt.coordinate);
//移除帮助提示要素的隐藏样式
// $(helpTooltipElement).removeClass('hidden');
removeClass(document.getElementsByClassName('tooltip')[0], 'hidden');
};
//触发pointermove事件
map.on('pointermove', pointerMoveHandler);
//当鼠标移除地图视图的时为帮助提示要素添加隐藏样式
document.querySelector('.ol-viewport').onmouseout = function () {
addClass(document.getElementsByClassName('tooltip')[0], 'hidden');
};
// 判断class有无
function hasClass(ele, cls) {
if (ele) {
cls = cls || '';
if (cls.replace(/\s/g, '').length == 0) return false; //当cls没有参数时返回false
return new RegExp(' ' + cls + ' ').test(' ' + ele.className + ' ');
}
}
//添加class
function addClass(ele, cls) {
if (!hasClass(ele, cls) && ele) {
ele.className = ele.className == '' ? cls : ele.className + ' ' + cls;
}
}
// 去除class
function removeClass(ele, cls) {
if (hasClass(ele, cls) && ele) {
var newClass = ' ' + ele.className.replace(/[\t\r\n]/g, '') + ' ';
while (newClass.indexOf(' ' + cls + ' ') >= 0) {
newClass = newClass.replace(' ' + cls + ' ', ' ');
}
ele.className = newClass.replace(/^\s+|\s+$/g, '');
}
}
//定义一个交互式绘图对象
var draw;
//添加交互式绘图对象的函数
function addInteraction() {
//创建一个交互式绘图对象
draw = new ol.interaction.Draw({
//绘制的数据源
source: source,
//绘制类型
type: 'LineString',
//样式
style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255,255,255,0.2)',
}),
stroke: new ol.style.Stroke({
color: 'rgba(0,0,0,0.5)',
lineDash: [10, 10],
width: 2,
}),
image: new ol.style.Circle({
radius: 5,
stroke: new ol.style.Stroke({
color: 'rgba(0,0,0,0.7)',
}),
fill: new ol.style.Fill({
color: 'rgba(255,255,255,0.2)',
}),
}),
}),
});
//将交互绘图对象添加到地图中
map.addInteraction(draw);
//创建测量提示框
createMeasureTooltip();
//创建帮助提示框
createHelpTooltip();
//定义一个事件监听
//var listener;
//绘制开始事件
draw.on(
'drawstart',
function (evt) {
//$("#deletePoint-"+count).bind('click', deleteClick);
//document.removeEventListener('click', deleteClick);
count++;
//The feature being drawn.
sketch = evt.feature;
//提示框的坐标
var tooltipCoord = evt.coordinate;
//监听几何要素的change事件
//Increases the revision counter and dispatches a 'change' event.
listener = sketch.getGeometry().on('change', function (evt) {
//The event target.
//获取绘制的几何对象
var geom = evt.target;
//定义一个输出对象,用于记录面积和长度
var output;
if (geom instanceof ol.geom.Polygon) {
map.removeEventListener('singleclick');
map.removeEventListener('dblclick');
//输出多边形的面积
output = formatArea(geom);
//Return an interior point of the polygon.
//获取多变形内部点的坐标
tooltipCoord = geom.getInteriorPoint().getCoordinates();
} else if (geom instanceof ol.geom.LineString) {
//输出多线段的长度
output = formatLength(geom);
//Return the last coordinate of the geometry.
//获取多线段的最后一个点的坐标
tooltipCoord = geom.getLastCoordinate();
}
//设置测量提示框的内标签为最终输出结果
// if (measureTooltipElement)
measureTooltipElement.innerHTML = output;
//设置测量提示信息的位置坐标
// if (measureTooltip)
measureTooltip.setPosition(tooltipCoord);
//setToolStyle(measureTooltipElement);
});
// //地图单击事件
// map.on('singleclick', function (evt) {
// //设置测量提示信息的位置坐标,用来确定鼠标点击后测量提示框的位置
// // if (measureTooltip)
// measureTooltip.setPosition(evt.coordinate);
// //如果是第一次点击,则设置测量提示框的文本内容为起点
// if (count == 0 && measureTooltipElement) {
// measureTooltipElement.innerHTML = '起点';
// }
// //根据鼠标点击位置生成一个点
// var point = new ol.geom.Point(evt.coordinate);
// //将该点要素添加到矢量数据源中
// source.addFeature(new ol.Feature(point));
// //更改测量提示框的样式,使测量提示框可见
// measureTooltipElement.className = 'tooltip tooltip-static';
// //创建测量提示框
// createMeasureTooltip();
// //点击次数增加
// count++;
// });
// //地图双击事件
// map.on('dblclick', function (evt) {
// //根据
// var point = new ol.geom.Point(evt.coordinate);
// source.addFeature(new ol.Feature(point));
// });
},
this
);
//绘制结束事件
draw.on(
'drawend',
function (evt) {
//count = 0;
// //设置测量提示框的样式
// measureTooltipElement.className = 'tooltip tooltip-static';
// //Set the offset for this overlay.
// //设置偏移量
// measureTooltip.setOffset([0, -7]);
// //清空绘制要素
// sketch = null;
// //清空测量提示要素
// measureTooltipElement = null;
// //创建测量提示框
// createMeasureTooltip();
// //Removes an event listener using the key returned by on() or once().
// //移除事件监听
ol.Observable.unByKey(listener);
// //移除地图单击事件
// map.removeEventListener('singleclick');
const coordinates = evt.feature.getGeometry().getCoordinates()
evt.feature.set('tempdata', count);
drawCoordinateArr.push(coordinates);
drawPoint(coordinates);
$("#deletePoint-"+count).bind('click', deleteClick);
clearDraws();
},
this
);
}
function drawPoint (coordinates) {
const tempArr = []
for (let i = 0; i < coordinates.length; i++) {
tempArr.push(coordinates[i])
if (i === 0) {
createDom(coordinates[i], '起点', i, coordinates, count)
} else {
createDom(coordinates[i], formatLength(new ol.geom.LineString(tempArr)), i, coordinates, count)
}
}
}
// 绘制之后放置测量内容
function createDom (point, inner, i, coordinates, count) {
console.log(point, inner, i, coordinates, count)
// 设置测量提示信息的位置坐标,用来确定鼠标点击后测量提示框的位置
measureTooltip.setPosition(point);
measureTooltipElement.innerHTML = inner +
// `<img class="deletePoint" id="deletePoint-${lengthMeasureCount}-${i}" tempimgdata="${lengthMeasureCount}" src="${deletePoint}" style="width: 15px;padding-left: 5px;" />` +
// (i === coordinates.length - 1 ? `<img class="deleteLine" id="deleteLine${lengthMeasureCount}" tempimgdata="${lengthMeasureCount}" src="${deleteLineArea}" style="width: 20px;padding-left: 5px;" />` : '')
`<img class="deletePoint" id="deletePoint-${count}" tempimgdata="${count}" src="/yyyzweb/common/images/yuntai/delete_icon.png" style="width: 20px;padding-left: 5px;padding-bottom: 2px;" />`;
// (i === coordinates.length - 1 ? `<img class="deleteLine" id="deleteLine${count}" tempimgdata="${count}" src="/yyyzweb/common/images/yuntai/up_icon.png" style="width: 20px;padding-left: 5px;" />` : '');
measureTooltipElement.parentNode.style.zIndex = i;
measureTooltipElement.className = 'tooltip tooltip-static';
// 创建测量提示框
if (i === coordinates.length - 1) {
createMeasureTooltip(count, true);
} else {
createMeasureTooltip('', true);
}
// 给所有测量提示框设置样式
// document.querySelectorAll('.tooltip.tooltip-static').forEach(n => {
// setToolStyle(n);
// })
// setToolStyle(measureTooltipElement)
// 根据鼠标点击位置生成一个点
const pointLine = new ol.geom.Point(coordinates[i]);
let onePF = null;
onePF = new ol.Feature({
geometry: pointLine
});
// 将该点要素添加到矢量数据源中
const tempLayer = new ol.layer.Vector({
source: new ol.source.Vector({
features: [onePF]
}),
//style,
tempdata: count,
updateWhileAnimating: true
})
map.addLayer(tempLayer);
}
function clearDraws () {
measureTooltipElement.innerHTML = ('总长:') + measureTooltipElement.innerHTML;
measureTooltipElement.className = 'ol-tooltip ol-tooltip-static measureNum';
setToolStyle(measureTooltipElement);
measureTooltip.setOffset([0, -7]);
// unset sketch
sketch = null
// unset tooltip so that a new one can be created
measureTooltipElement = null;
createMeasureTooltip();
//移除事件监听
ol.Observable.unByKey(listener);
map.un('pointermove', pointerMoveHandler);
map.removeInteraction(draw);
helpTooltipElement.classList.add('hidden');
}
// 点击测距的删除
function deleteClick (e) {
const target = e.target;
const eIndex = target.getAttribute('tempimgdata');
deleteLayers(eIndex, target);
drawCoordinateArr[parseInt(eIndex) - 1] = [];
// if (target.className === 'deleteLine') {
// deleteLayers(eIndex);
// drawCoordinateArr[parseInt(eIndex) - 1] = [];
// } else if (target.className === 'deletePoint') {
// deleteLayers(eIndex, target);
// }
}
// 删除某个点之后重新测量距离
function drawFresh (eIndex) {
console.log(eIndex)
const coordinates = drawCoordinateArr[parseInt(eIndex) - 1];
const lineString = new LineString(coordinates);
// 将该点要素添加到矢量数据源中
const tempLayer = new ol.layer.Vector({
source: new new ol.source.Vector({
features: [
new Feature({
geometry: lineString
})
]
}),
style,
tempdata: eIndex,
updateWhileAnimating: true
})
map.addLayer(tempLayer);
const tempArr = []
for (let i = 0; i < coordinates.length; i++) {
tempArr.push(coordinates[i])
if (i === 0) {
createDom(coordinates[i], '起点', i, coordinates, eIndex)
} else {
createDom(coordinates[i], formatLength(mapView, new LineString(tempArr)), i, coordinates, eIndex)
}
}
}
// 删除当前点击的图层
function deleteLayers (eIndex, target) {
const overlaysArr = map.getOverlays().getArray();
const layersArr = map.getLayers().getArray();
// 先把需要删除的Overlays存在一个数组中
// 如果不储存直接去删除Overlays就会出现需要删除却识别不到的图层
const deleteOverlayArr = [];
const deleteLayerArr = [];
for (let i = 0; i < overlaysArr.length; i++) {
const lastChild = overlaysArr[i].values_.element?.lastChild;
if (lastChild?.id && lastChild?.getAttribute('tempimgdata') === eIndex) {
deleteOverlayArr.push(overlaysArr[i]);
}
}
map.getLayers().getArray().forEach((n, i) => {
if (n.getSource() && n instanceof ol.layer.Vector && n.getSource().getFeatures()[0] && n.getSource().getFeatures()[0].get('tempdata') && n.getSource().getFeatures()[0].get('tempdata').toString() === eIndex) {
deleteLayerArr.push(n);
}
})
for (let i = 0; i < layersArr.length; i++) {
if (layersArr[i].values_.tempdata && layersArr[i].values_.tempdata.toString() === eIndex) {
deleteLayerArr.push(layersArr[i])
}
}
// 单独处理需要删除的Overlays和Layers
deleteOverlayArr.forEach(n => map.removeOverlay(n));
deleteLayerArr.forEach(n => map.removeLayer(n));
// 删除之后重新画
if (target) {
const index = target.id.split('-');
drawCoordinateArr[parseInt(index[1]) - 1].splice(parseInt(index[2]), 1);
if (drawCoordinateArr[parseInt(index[1]) - 1].length > 1){
drawFresh(index[1]);
}
}
//$("#t_linelength").next() 需要清除这个伪元素before
$("#t_linelength").parent().removeClass("active");
//$("#t_linelength").next().removeClass("icon-check");
//$("#t_linelength").removeClass("icon-check");
//   $("#bt_target_cz").removeClass("icon-check");
//     targetCZChecked = !targetCZChecked;
//     if (targetCZChecked) {
//         $.each(MapTarget, function (key, value) {
//             map.addLayer(value);
//         });
//         $("#bt_target_cz").next().addClass("icon-check");
//     }
}
function setToolStyle(measureTooltipElement){
// 这里可以根据你需要的测量提示框的样式做修改
measureTooltipElement.style.color = '#C3C5C9'
measureTooltipElement.style.padding = '0 10px'
measureTooltipElement.style.height = '25px'
measureTooltipElement.style.lineHeight = '20px'
measureTooltipElement.style.background = '#1A1A1B'
measureTooltipElement.style.fontSize = '15px'
measureTooltipElement.style.fontWeight = '400'
}
//创建帮助提示框
function createHelpTooltip() {
//如果已经存在帮助提示框则移除
if (helpTooltipElement) {
helpTooltipElement.parentNode.removeChild(helpTooltipElement);
}
//创建帮助提示要素的div
if (!helpTooltipElement) helpTooltipElement = document.createElement('div');
//设置帮助提示要素的样式
helpTooltipElement.className = 'tooltip hidden';
//创建一个帮助提示的覆盖标注
helpTooltip = new ol.Overlay({
element: helpTooltipElement,
offset: [15, 0],
positioning: 'center-left',
});
//将帮助提示的覆盖标注添加到地图中
map.addOverlay(helpTooltip);
}
//创建测量提示框
function createMeasureTooltip() {
//创建测量提示框的div
// if (!measureTooltipElement)
measureTooltipElement = document.createElement('div');
measureTooltipElement.setAttribute('id', 'lengthLabel');
//设置测量提示要素的样式
measureTooltipElement.className = 'tooltip tooltip-measure';
//创建一个测量提示的覆盖标注
measureTooltip = new ol.Overlay({
element: measureTooltipElement,
offset: [0, -15],
positioning: 'bottom-center',
});
//将测量提示的覆盖标注添加到地图中
map.addOverlay(measureTooltip);
}
//格式化测量长度
var formatLength = function (line) {
//定义长度变量
var length;
//获取坐标串
var coordinates = line.getCoordinates();
//初始长度为0
length = 0;
//获取源数据的坐标系
var sourceProj = map.getView().getProjection();
//进行点的坐标转换
for (var i = 0; i < coordinates.length - 1; i++) {
//第一个点
var c1 = ol.proj.transform(coordinates[i], sourceProj, 'EPSG:4326');
//第二个点
var c2 = ol.proj.transform(coordinates[i + 1], sourceProj, 'EPSG:4326');
//获取转换后的球面距离
//Returns the distance from c1 to c2 using the haversine formula.
length += ol.sphere.getDistance(c1, c2);
}
//计算平面距离
//length = Math.round(line.getLength() * 100) / 100;
//定义输出变量
var output;
//如果长度大于1000则使用km单位否则使用m单位
if (length > 100) {
output = Math.round((length / 1000) * 100) / 100 + ' ' + 'km'; //换算成KM单位
} else {
output = Math.round(length * 100) / 100 + ' ' + 'm'; //m为单位
}
return output;
};
//格式化测量面积
var formatArea = function (polygon) {
//定义面积变量
var area;
//获取初始坐标系
var sourceProj = map.getView().getProjection();
var geom = polygon.clone().transform(sourceProj, 'EPSG:4326');
//获取多边形的坐标系
var coordinates = geom.getLinearRing(0).getCoordinates();
//获取球面面积
area = Math.abs(ol.sphere.geodesicArea(coordinates));
//获取平面面积
//area = polygon.getArea();
// }
//定义输出变量
var output;
//当面积大于10000时转换为平方千米否则为平方米
if (area > 1000) {
output = Math.round((area / 1000000) * 100) / 100 + ' ' + '公里<sup>2</sup>';
} else {
output = Math.round(area * 100) / 100 + ' ' + 'm<sup>2</sup>';
}
return output;
};
//添加交互绘图对象
addInteraction();
}
//目标尾迹方法/目标位置预测-----------位置预测是传
function addwakeLine(_points) {
//map.removeOverlay(PopupOverlay);
// //清除原来的
// for (let i = 0; i < MapTrack_yc.length; i++) {
// map.removeLayer(MapTrack_yc[i]);
// }
//画线
let oneP = new ol.Feature({
geometry: new ol.geom.LineString(_points)
});
let onePLayers = new ol.layer.Vector({
source: new ol.source.Vector({
features: [oneP]
}),
zindex: 10
});
MapTrack_yc[MapTrack_yc.length] = onePLayers;
map.addLayer(onePLayers);
// // let oneP = new ol.Feature({
// // geometry: new ol.geom.LineString([
// // [113.006943, 28.219305],
// // [113.009943, 28.219605],
// // // [113.010943, 28.220305],
// // ]),
// // });
// let onePLayers = new ol.layer.Vector({
// source: new ol.source.Vector({
// features: [oneP]
// }),
// zindex: 200
// });
//map.addLayer(onePLayers);
//MapTrack[MapTrack.length] = onePLayers;
oneP.setStyle(function (resolution) {
var lineStringForl = resolution.getGeometry();
var coordis = lineStringForl.getCoordinates();
var styles = [
new ol.style.Style({
stroke: new ol.style.Stroke({
//lineDash:[10,10,10,10],
//lineDash:[20, 10, 40, 20],
//lineDash:[1,2,3,4,5,6],
color: 'red',
width: 2,
})
})
];
// // 计算线段角度
// let vs = calcLineStringD(coordis);
// // direction_labeling_01(res, lineStringForl, coordis, vs, styles);
// direction_labeling_02(100, lineStringForl, coordis, vs, styles);
return styles;
});
}
//目标位置预测清除
function clearTrack_yc() {
for (let i = 0; i < MapTrack_yc.length; i++) {
map.removeLayer(MapTrack_yc[i]);
}
}