#javascript #google-maps #vue.js #google-maps-api-3 #google-maps-markers
#javascript #google-карты #vue.js #google-maps-api-3 #google-карты-маркеры
Вопрос:
У меня есть игра, которая отслеживает каждого игрока и отображает его в реальном времени в таблице лидеров. У меня возникли некоторые проблемы, и я надеялся, что кто-нибудь сможет помочь. Я думаю, что это как-то связано с currentPositionMarker
.
Ниже приведен мой код. Это два основных метода:
setCurrentPosition(tracker,team,icon) {
this.currentPositionMarker = new google.maps.Marker({
map: this.map,
position: new google.maps.LatLng(
tracker.geolocation.lat,
tracker.geolocation.lng
),
title: team.team_name,
icon: icon
});
// this.map.panTo(new google.maps.LatLng(
// tracker.geolocation.lat,
// tracker.geolocation.lng
// ));
var myoverlay = new google.maps.OverlayView();
myoverlay.draw = function () {
this.getPanes().markerLayer.id='markerLayer';
};
myoverlay.setMap(this.map);
var contentString = '<div id="content">'
'<p class="team-name">' team.team_name '</p>'
'<p class="time"><span>' moment(tracker.timestamp).format('h:mm a') '</span></p>'
'</div>';
var infowindow = new google.maps.InfoWindow({
content: contentString
});
infowindow.open(this.map, this.currentPositionMarker);
},
setMarkerPosition(marker, position) {
let bounds, loc;
bounds = new google.maps.LatLngBounds();
loc = new google.maps.LatLng(marker.position.lat(), marker.position.lng());
bounds.extend(loc);
marker.setPosition(
new google.maps.LatLng(
position.lat,
position.lng,)
);
},
Мой код отслеживания работает нормально и находится в другом месте. Мой код отслеживания обновляет базу данных каждые 15 секунд. Я использую Google Firestore.
В моем смонтированном методе у меня есть этот код:
let mapRef = db.collection('map')
mapRef = mapRef.where('gid', '==', this.$store.getters.gid)
mapRef.onSnapshot(snapshot => {
snapshot.docChanges().forEach(change => {
if(change.type == 'added') {
let docs = change.doc
this.tracker = docs.data(),
this.tracker.id = docs.data().id
let teamRef = db.collection('teams')
teamRef = teamRef.where('team_id', '==', this.tracker.team)
teamRef = teamRef.where('gid', '==', this.$store.getters.gid)
teamRef.get().then((snapshot) => {
snapshot.forEach(doc => {
this.team = doc.data(),
this.team.id = doc.id
let image = this.team.url
var icon = {
url: image, // url
scaledSize: new google.maps.Size(50, 50), // scaled size
origin: new google.maps.Point(0,0), // origin
anchor: new google.maps.Point(0, 0), // anchor
optimized:false
};
this.setCurrentPosition(this.tracker, this.team, icon)
[... additional code]
При обновлении базы данных (каждые 15 секунд) вызывается метод, приведенный ниже:
let mapRef = db.collection('map')
mapRef = mapRef.where('gid', '==', this.$store.getters.gid)
mapRef = mapRef.orderBy('timestamp')
mapRef.onSnapshot(snapshot => {
snapshot.docChanges().forEach(change => {
let tracker = change.doc
let teamRef = db.collection('teams')
teamRef = teamRef.where('team_id', '==', tracker.data().team)
teamRef = teamRef.where('gid', '==', this.$store.getters.gid)
teamRef.get().then((snapshot) => {
snapshot.forEach(doc => {
this.team = doc.data(),
this.team.id = doc.id
// create a marker
if(tracker.data().geolocation){
let image = this.team.url
var icon = {
url: image, // url
scaledSize: new google.maps.Size(50, 50), // scaled size
origin: new google.maps.Point(0,0), // origin
anchor: new google.maps.Point(0, 0), // anchor
optimized:false
};
this.setMarkerPosition(
this.currentPositionMarker,
tracker.data().geolocation
);
[.... additional code]
Комментарии:
1. В чем проблема?
2. Я думаю, что я неправильно обрабатываю свои маркеры. Мои маркеры продолжают прыгать вперед и назад, как будто они обмениваются информацией
3. Вы инициализируете новый объект отслеживания для каждого игрока?
4. в моем смонтированном методе я вызываю setCurrentPosition для инициализации, затем каждый раз при обновлении базы данных я выполняю цикл foreach и вызываю setMarkerPosition
5. Но я использую this.currentPositionMarker для его первого параметра. и я думаю, что именно здесь возникает проблема