// import L from 'leaflet'
import config from '@/utils/map/sub/config'
import global from '@/utils/map/sub/global'
// var interval_creatCircleMarker = null
// var interval_showTrail = null
var togglePlayerFlag = true
var toggleTooltipFlag = true
var toggleTrailFlag = true
export default {
playerLayerGroup: null, // 玩家标记图层组
trailLayerGroup: null, // 玩家轨迹图层组
init() {
this.playerLayerGroup = new L.layerGroup()
this.trailLayerGroup = new L.layerGroup()
},
// 即将开始地图缩放时触发本方法
onZoomStart(e) {},
// 地图发生缩放时触发本方法
onZoom(e) {},
// 地图缩放结束时触发本方法
onZoomEnd(e) {},
togglePlayer(flag) {
if (flag != null) {
togglePlayerFlag = !flag
}
if (togglePlayerFlag) {
this.playerLayerGroup.removeFrom(global.map)
togglePlayerFlag = false
} else {
this.playerLayerGroup.addTo(global.map)
togglePlayerFlag = true
}
},
toggleTooltip(flag) {
if (flag != null) {
toggleTooltipFlag = !flag
}
if (!togglePlayerFlag) {
this.togglePlayer(true)
toggleTooltipFlag = false
}
for (let i = 0; i < global.storePlayers.length; i++) {
var player = global.storePlayers[i]
if (player != null && player.marker != null) {
// player.marker.toggleTooltip()
// let isopen = player.marker.isTooltipOpen()
if (toggleTooltipFlag) {
player.marker.closeTooltip()
} else {
player.marker.openTooltip()
}
}
}
toggleTooltipFlag = !toggleTooltipFlag
},
toggleTrail(flag) {
if (flag != null) {
toggleTrailFlag = !flag
}
if (toggleTrailFlag) {
this.trailLayerGroup.removeFrom(global.map)
toggleTrailFlag = false
} else {
this.trailLayerGroup.addTo(global.map)
toggleTrailFlag = true
}
},
// 处理过期数据
dealStaleData() {
for (let i = 0; i < global.storePlayers.length; i++) {
var storePlayer = global.storePlayers[i]
if (!(storePlayer.id > 0)) {
continue
}
// 查找最新的玩家记录列表
var player = global.getPlayerById(storePlayer.id)
if (player == null) { // 未找到 说明记录已过期
console.warn('[dealStaleData] 发现过期数据', storePlayer)
if (storePlayer.marker != null) {
storePlayer.marker.removeFrom(this.playerLayerGroup)
storePlayer.marker = null
}
if (storePlayer.trail != null) {
storePlayer.trail.removeFrom(this.trailLayerGroup)
storePlayer.trail = null
storePlayer.trailData = []
}
if (storePlayer.interval_creatCircleMarker != null) {
clearInterval(storePlayer.interval_creatCircleMarker)
}
if (storePlayer.interval_creatCircleMarker != null) {
clearInterval(storePlayer.interval_showTrail)
}
}
}
},
drawAllPlayers() {
// console.log('[drawAllPlayers]', global.players)
// if (this.playerLayerGroup != null)
// this.playerLayerGroup.clearLayers()
for (let i = 0; i < global.players.length; i++) {
this.drawOnePlayer(global.players[i].id)
// this.drawOnePlayer2(global.players[i].id)
}
},
drawOnePlayer2(playerId, animate = true) {
var that = this
var player = global.getPlayerById(playerId)
var player_position = global.getPlayerPositionById(playerId)
var storePlayer = global.getStorePlayersById(playerId)
// console.log(player, player_position)
if (player == null || player_position == null) {
console.warn('[drawOnePlayer2] 关键数据为空', player, player_position)
return
}
// 首次创建
if (storePlayer == null || storePlayer.marker == null) {
// 在地图上创建 marker 并存储用户信息
var playerIcon = L.icon({
iconUrl: 'static/image/marker-icon.png',
iconSize: [20, 32.8],
iconAnchor: [10, 30]
});
var marker = L.marker([player_position.latitude, player_position.longitude], {
icon: playerIcon
})
.addTo(this.playerLayerGroup)
// .addTo(global.map)
// .bindPopup("Hello, I'm a Marker!
").openPopup();
.bindTooltip(`${player.name}`, {
permanent: true,
offset: [0, -30],
direction: 'top',
interactive: true
})
marker.type = 'marker'
marker.playerId = player.id // 存储用户信息
marker.animate = animate
marker.on('click', function(e) {
var playerId = e.target.playerId; // 获取点击的 marker 的用户信息
console.log("Selected player ID: " + playerId);
that.handleFocusPlayer(playerId)
});
var tooltip = marker.getTooltip()
tooltip.playerId = player.id // 存储用户信息
tooltip.animate = animate
tooltip.on('click', function(e) {
// console.log("[Marker.Tooltip]", e)
var playerId = e.target.playerId; // 获取点击的 marker 的用户信息
console.log("[Marker.Tooltip] Selected player ID: " + playerId)
that.handleFocusPlayer(playerId)
})
// this.playerLayerGroup.addTo(global.map)
if (storePlayer == null) {
storePlayer = {
id: playerId,
marker: marker, // 玩家标识
trail: null, // 玩家轨迹
trailData: [], // 玩家轨迹信息
interval_creatCircleMarker: null,
interval_showTrail: null,
}
global.storePlayers.push(storePlayer)
} else {
storePlayer.marker = marker
}
}
// 非首次创建,直接移动位置
else {
if (!toggleTrailFlag) {
var marker = storePlayer.marker
var curPoint = [player_position.latitude, player_position.longitude]
// console.warn('[drawOnePlayer] 更新玩家的标记位置', storePlayer.marker, curPoint)
marker.setLatLng(curPoint)
}
}
},
// 创建动画效果函数,用于实现circleMarker的大小和透明度随时间变化
animateCircle(circle, minRadius, maxRadius, step = 1) {
var radius = circle.getRadius();
var opacity = circle.options.fillOpacity;
var zoomType = 'zoomIn' // zoomIn: 放大 zoomOut: 缩小
var interval_creatCircleMarker = setInterval(function() {
if (!circle.animate) {
clearInterval(interval_creatCircleMarker)
return
}
// 改变圆形半径和透明度
if (zoomType == 'zoomIn') {
radius = radius + step
// opacity = opacity - 0.1
} else if (zoomType == 'zoomOut') {
radius = radius - step
// opacity = opacity - 0.1
}
circle.setRadius(radius);
circle.setStyle({
fillOpacity: opacity
});
if (radius >= maxRadius) {
zoomType = 'zoomOut'
} else if (radius <= minRadius) {
zoomType = 'zoomIn'
}
}, 50);
return interval_creatCircleMarker
},
drawOnePlayer(playerId, animate = true) {
var that = this
var player = global.getPlayerById(playerId)
var player_position = global.getPlayerPositionById(playerId)
var storePlayer = global.getStorePlayersById(playerId)
// console.log('[drawOnePlayer]', player, player_position)
if (player == null || player_position == null) {
console.warn('[drawOnePlayer] 关键数据为空', player, player_position)
return
}
// 首次创建
if (storePlayer == null || storePlayer.marker == null) {
// console.log('[drawOnePlayer] storePlayer == null', playerId)
var marker = L.circleMarker([player_position.latitude, player_position.longitude], config.gStyle.marker
.default)
.addTo(this.playerLayerGroup)
// .addTo(global.map)
// .bindPopup("Hello, I'm a Marker!
").openPopup()
.bindTooltip(`${player.name}`, config.gStyle.marker.tooltip)
marker.type = 'circleMarker'
marker.playerId = player.id // 存储用户信息
marker.animate = animate
marker.on('click', function(e) {
// console.log("[Marker]", e)
var playerId = e.target.playerId; // 获取点击的 marker 的用户信息
console.log("[Marker] Selected player ID: " + playerId)
that.handleFocusPlayer(playerId)
})
var tooltip = marker.getTooltip()
tooltip.playerId = player.id // 存储用户信息
tooltip.animate = animate
tooltip.on('click', function(e) {
// console.log("[Marker.Tooltip]", e)
var playerId = e.target.playerId; // 获取点击的 marker 的用户信息
console.log("[Marker.Tooltip] Selected player ID: " + playerId)
that.handleFocusPlayer(playerId)
})
var interval_creatCircleMarker = null
if (animate) {
interval_creatCircleMarker = this.animateCircle(marker, 3, 9, 0.5)
}
// this.playerLayerGroup.addTo(global.map)
if (storePlayer == null) {
storePlayer = {
id: playerId,
marker: marker, // 玩家标识
trail: null, // 玩家轨迹
trailData: [], // 玩家轨迹信息
interval_creatCircleMarker: interval_creatCircleMarker,
interval_showTrail: null,
}
global.storePlayers.push(storePlayer)
} else {
storePlayer.marker = marker
storePlayer.interval_creatCircleMarker = interval_creatCircleMarker
}
}
// 非首次创建,直接移动位置
else {
if (!toggleTrailFlag) {
var marker = storePlayer.marker
var curPoint = [player_position.latitude, player_position.longitude]
// console.warn('[drawOnePlayer] 更新玩家的标记位置', storePlayer.marker, curPoint)
marker.setLatLng(curPoint)
}
}
},
handleFocusPlayer(playerId) {
console.log("[handleFocusPlayer] 当前选中玩家ID: " + playerId)
if (global.focusPlayerId > 0) {
// 先把之前选中的目标恢复成默认状态
var unfocusPlayer = global.getStorePlayersById(global.focusPlayerId)
// var unfocusPlayer = global.getPlayerById(global.focusPlayerId)
if (unfocusPlayer.marker != null && unfocusPlayer.marker.type == 'circleMarker') {
unfocusPlayer.marker.setStyle(config.gStyle.marker.default)
}
if (unfocusPlayer.trail != null) {
unfocusPlayer.trail.setStyle(config.gStyle.trail.default)
}
}
global.focusPlayerId = playerId
var focusPlayer = global.getStorePlayersById(global.focusPlayerId)
// var focusPlayer = global.getPlayerById(global.focusPlayerId)
if (focusPlayer.marker != null && focusPlayer.marker.type == 'circleMarker') {
focusPlayer.marker.setStyle(config.gStyle.marker.focus)
}
if (focusPlayer.trail != null) {
focusPlayer.trail.setStyle(config.gStyle.trail.focus)
}
},
drawAllTrails(duration) {
if (this.trailLayerGroup != null)
this.trailLayerGroup.clearLayers()
for (let i = 0; i < global.players.length; i++) {
this.drawOneTrail(global.players[i].id, duration)
}
},
// 显示运动轨迹 duration:毫秒
drawOneTrail(playerId, duration) {
var player = global.getPlayerById(playerId)
var player_position = global.getPlayerPositionById(playerId)
var storePlayer = global.getStorePlayersById(playerId)
// console.log('[drawOneTrail] param', player, player_position, storePlayer)
if (player == null || player_position == null) {
console.warn('[drawOneTrail] 关键数据为空', player, player_position)
return
}
var trail = null
var curPoint = [player_position.latitude, player_position.longitude, new Date()]
// console.log('[drawOneTrail] curPoint', curPoint)
if (storePlayer == null || storePlayer.trail == null) {
// console.warn('[drawOneTrail] 轨迹数据为空', player, storePlayer)
var trailData = [curPoint]
trail = L.polyline(trailData, config.gStyle.trail.default)
.addTo(this.trailLayerGroup)
// .addTo(global.map)
// console.log('[drawOneTrail] trail', trail)
if (storePlayer == null) {
storePlayer = {
id: playerId,
marker: null, // 玩家标识
trail: trail, // 玩家轨迹
trailData: trailData, // 玩家轨迹信息
interval_creatCircleMarker: null,
interval_showTrail: null,
}
global.storePlayers.push(storePlayer)
} else {
storePlayer.trail = trail
storePlayer.trailData = trailData
}
// var that = this
var interval_showTrail = setInterval(function() {
// 去除过期的历史轨迹
if (duration > 0) {
var now = +new Date();
storePlayer.trailData = storePlayer.trailData.filter(function(point) {
return now - point[2] < duration;
});
}
player_position = global.getPlayerPositionById(playerId)
curPoint = [player_position.latitude, player_position.longitude, new Date()]
storePlayer.trailData.push(curPoint)
// storePlayer.trailData.push(curPoint.slice(0, 2))
// console.log('interval_showTrail', storePlayer.trailData)
trail.setLatLngs(storePlayer.trailData);
if (storePlayer.marker != null) {
if (toggleTrailFlag) {
// console.warn('[drawOneTrail] 更新玩家的标记位置', storePlayer.marker, curPoint)
storePlayer.marker.setLatLng(curPoint.slice(0, 2)) // 更新玩家的标记位置
}
}
// global.map.setView(point.slice(0, 2), 18); //地图中心跟踪最新位置
}, 500);
storePlayer.interval_showTrail = interval_showTrail
}
},
// duration: 轨迹保存时间 为0表示保存全部轨迹
getCurPos(lastpos, duration, player_trail) {
// console.log(lastpos, pointsT)
var now = +new Date();
if (duration > 0) {
player_trail.points = player_trail.points.filter(function(point) {
return now - point[2] < duration;
});
}
var step = 0.00001
var t = 10
var point = null
if (player_trail.pointsT < 20 * t)
point = [lastpos[0] + Math.random() * step, lastpos[1] + Math.random() * step, now];
else if (player_trail.pointsT >= 20 * t && player_trail.pointsT < 40 * t)
point = [lastpos[0] - Math.random() * step, lastpos[1] + Math.random() * step, now];
else if (player_trail.pointsT >= 40 * t && player_trail.pointsT < 60 * t)
point = [lastpos[0] - Math.random() * step, lastpos[1] - Math.random() * step, now];
else if (player_trail.pointsT >= 60 * t && player_trail.pointsT < 80 * t)
point = [lastpos[0] + Math.random() * step, lastpos[1] - Math.random() * step, now];
// point = [point[0] - Math.random() * 0.00001, point[1] - Math.random() * 0.00001, now];
player_trail.pointsT++
if (player_trail.pointsT >= 80 * t)
player_trail.pointsT = 0
player_trail.points.push(point);
return point
},
free() {
for (let i = 0; i < global.storePlayers.length; i++) {
var storePlayer = global.storePlayers[i]
if (storePlayer.interval_creatCircleMarker != null) {
clearInterval(storePlayer.interval_creatCircleMarker)
}
if (storePlayer.interval_creatCircleMarker != null) {
clearInterval(storePlayer.interval_showTrail)
}
}
}
}