Кратные маркеры Google Maps - PullRequest
       13

Кратные маркеры Google Maps

0 голосов
/ 28 января 2019

Мне нужно создать экран, на котором я показываю положение транспортных средств в соответствии с широтой и долготой от БД.

У меня есть div для карты:

"<div id='map' style='width:100%; height:100%'></div>"

ИJavaScript, чтобы заполнить экран:

"<script src='https://maps.googleapis.com/maps/api/js?key=" + Site.GoogleMapAPIKey + 
"&v=3.exp&libraries=geometry, places&language=en&region=UK'></script>
<script>
var markers = [];
var events = [];
var map, GPSPath, GPSPathBorder, line, border
function initMap() {
        map = new google.maps.Map(document.getElementById('map'), {
          mapTypeId: 'terrain'
        });

        var Polyline = [];

        if('" + PolylineJson + "')
        {
            Polyline = JSON.parse('" + PolylineJson + "');
        }   

        for (i = 0; i < Polyline.length; i++) 
        {
            var encoded_data = unescape(Polyline[i]);

            var decode = google.maps.geometry.encoding.decodePath(encoded_data);

            border = new google.maps.Polyline({
                                path: decode,
                                strokeColor: getRandomColor(),
                                strokeOpacity: 0.8,
                                strokeWeight: 7,
                                zIndex: 2
                            });

            border.setMap(map);

            line = new google.maps.Polyline({
                                path: decode,
                                strokeColor: getRandomColor(),
                                strokeOpacity: 0.8,
                                strokeWeight: 5,
                                zIndex: 3
                            });

            line.setMap(map);  

        }

        var GPSCoordinates = [" + GPSPolygons + "];

        GPSPathBorder = new google.maps.Polyline({
                                  path: GPSCoordinates,
                                  geodesic: true,
                                  strokeColor: '#BF360C',
                                  strokeOpacity: 0.8,
                                  strokeWeight: 7,
                                  zIndex: 2
        });

        GPSPathBorder.setMap(map);    

        GPSPath = new google.maps.Polyline({
                                  path: GPSCoordinates,
                                  geodesic: true,
                                  strokeColor: '#FF5722',
                                  strokeOpacity: 0.8,
                                  strokeWeight: 5,
                                  zIndex: 3
        });

        GPSPath.setMap(map);

        var Trucks = [" + LastMarker + "];

        for (i = 0; i < Trucks.length; i++) 
        {
            LastPosition = new google.maps.Marker({
                position: new google.maps.LatLng(Trucks[i][0],Trucks[i][1]),
                    icon: {
                            path: '" + Path + "',
                            rotation:Trucks[i][2], 
                            id:Trucks[i][3], 
                            fillColor: '#000000',
                            fillOpacity: 1,
                            scale: .025,
                            anchor: new google.maps.Point(200, 500)
                           },
                    map: map
            });

            LastPositioni = new google.maps.Marker({
                position: new google.maps.LatLng(Trucks[i][0],Trucks[i][1]),
                    icon: {
                            path: '" + PathInside + "',
                            rotation:Trucks[i][2], 
                            id:Trucks[i][3], 
                            fillColor: '" + Site.MainColor + "',
                            fillOpacity: 1,
                            scale: .025,
                            anchor: new google.maps.Point(200, 500)
                    },
                map: map
          });
        }


        var BreakStartCoor = [" + StartBreak + "];

        for (i = 0; i < BreakStartCoor.length; i++) {  
          marker = new google.maps.Marker({
            position: new google.maps.LatLng(BreakStartCoor[i][1], BreakStartCoor[i][2]),
            icon: {
                url : '/Routilogix/img/breakStart.png'
            },
            map: map
          });
        events.push(marker);
        }

        var BreakEndCoor = [" + EndBreak + "];

        for (i = 0; i < BreakEndCoor.length; i++) {  
          marker = new google.maps.Marker({
            position: new google.maps.LatLng(BreakEndCoor[i][1], BreakEndCoor[i][2]),
            icon: {
                url : '/Routilogix/img/breakEnd.png'
            },
            map: map
          });
        events.push(marker);
        }

        var BreakDownCoor = [" + BreakDown + "];

        for (i = 0; i < BreakDownCoor.length; i++) {  
          marker = new google.maps.Marker({
            position: new google.maps.LatLng(BreakDownCoor[i][1], BreakDownCoor[i][2]),
            icon: {
                url : '/Routilogix/img/breakdown.png'
            },
            map: map
          });
        events.push(marker);
        }

        var DelayCoor = [" + Delay + "];

        for (i = 0; i < DelayCoor.length; i++) {  
          marker = new google.maps.Marker({
            position: new google.maps.LatLng(DelayCoor[i][1], DelayCoor[i][2]),
            icon: {
                url : '/Routilogix/img/delay.png'
            },
            map: map
          });
        events.push(marker);
        }

        var TipCoor = [" + Tip + "];

        for (i = 0; i < TipCoor.length; i++) {  
          marker = new google.maps.Marker({
            position: new google.maps.LatLng(TipCoor[i][1], TipCoor[i][2]),
            icon: {
                url : '/Routilogix/img/tip.png'
            },
            map: map
          });
        events.push(marker);
        }

        var infowindow = new google.maps.InfoWindow();

        var marker, i;

        bounds  = new google.maps.LatLngBounds();

        var userCoor = [" + Markers + "];

        for (i = 0; i < userCoor.length; i++) {  
          marker = new google.maps.Marker({
            position: new google.maps.LatLng(userCoor[i][1], userCoor[i][2]),
            icon: {
                path: google.maps.SymbolPath.CIRCLE,
                fillOpacity: 1.0,
                fillColor: userCoor[i][5],
                scale: 5,
                strokeWeight: 2
            },
            map: map
          });

        markers.push(marker);

          markerLbl = new google.maps.Marker ({
            position: new google.maps.LatLng(userCoor[i][1], userCoor[i][2]),
            //label: userCoor[i][3],
            label: {
                    text: userCoor[i][3],
                    color: 'black',
                    fontSize: '10px'
                    },
            map: map
          });

        markers.push(markerLbl)

        loc = new google.maps.LatLng(userCoor[i][1], userCoor[i][2]); 
        bounds.extend(loc);

          google.maps.event.addListener(markerLbl, 'click', (function(markerLbl, i) {
            return function() {
              infowindow.setContent(userCoor[i][0] + '<br>' + '<strong>ETA: </strong>' + userCoor[i][4]);
              infowindow.open(map, markerLbl);
            }
          })(markerLbl, i));

          google.maps.event.addListener(marker, 'click', (function(marker, i) {
            return function() {
              infowindow.setContent(userCoor[i][0] + '<br>' + '<strong>ETA: </strong>' + userCoor[i][4]);
              infowindow.open(map, marker);
            }
          })(marker, i));
      }
    map.fitBounds(bounds);
    map.panToBounds(bounds);
}

function toggleMarkers() {
    if (markers[0].getMap() != null) {
        var arg = null;
    } else {
        var arg = map;
    }
    for (var i = 0; i < markers.length; i++) {
        markers[i].setMap(arg);
    }
}

function toggleGPSPath() {

    if (GPSPath.getMap() != null) {
        GPSPath.setMap(null);
        GPSPathBorder.setMap(null);
    } else {
        GPSPath.setMap(map);
        GPSPathBorder.setMap(map);
    }
}

function toggleLine() {

    if (line.getMap() != null) {
        line.setMap(null);
        border.setMap(null);
    } else {
        line.setMap(map);
        border.setMap(map);
    }
}

function toggleEvents() {
    if (events[0].getMap() != null) {
        var arg = null;
    } else {
        var arg = map;
    }
    for (var i = 0; i < events.length; i++) {
        events[i].setMap(arg);
    }
}

function newLocation(newLat,newLng)
{
    map.setCenter({
        lat : newLat,
        lng : newLng
    });
}

function updatePolyline(newLat,newLng, vehicleId)
{
    var pathBorder = GPSPathBorder.getPath();
    var path = GPSPath.getPath();


            pathBorder.push(new google.maps.LatLng(newLat, newLng, vehicleId));
            path.push(new google.maps.LatLng(newLat, newLng, vehicleId));
            GPSPathBorder.setPath(pathBorder);
            GPSPath.setPath(path);

}

function getRandomColor() {
  var letters = '0123456789ABCDEF';
  var color = '#';
  for (var i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}

function animatedMove(marker, t, current, latitude, longitude, rotation) {
  var lat = current.lat();
  var lng = current.lng();

  var deltalat = (latitude - current.lat()) / 100;
  var deltalng = (longitude - current.lng()) / 100;

//  var deltalat = (moveto.lat() - current.lat()) / 100;
//  var deltalng = (moveto.lng() - current.lng()) / 100;

  var delay = 10 * t;
  for (var i = 0; i < 100; i++) {
    (function(ind) {
      setTimeout(
        function() {
          var lat = marker.position.lat();
          var lng = marker.position.lng();
          lat += deltalat;
          lng += deltalng;
          latlng = new google.maps.LatLng(lat, lng);
          marker.setPosition(latlng);
          var icon = marker.getIcon();
          icon.rotation = rotation;
          marker.setIcon(icon);
        }, delay * ind
      );
    })(i)
  }
}

initMap()
</script>"

Я использую эту функцию для обновления экрана время от времени:

"<script>
setInterval(
    function () {
        document.getElementById('" + Live.Id + "').click();
    }, 5000);
</script>"

И в конце я вызываю нижеприведенную функцию JavaScript, чтобы обновитьposition:

"updatePolyline(" + Live_GPS.List.Current.GPSCoordinates.Latitude + "," + Live_GPS.List.Current.GPSCoordinates.Longitude + "," + Live_GPS.List.Current.VehicleId.Value + ")"

Я сомневаюсь, что я создаю объекты с помощью VehicleId и правильно вызываю функцию обновления с VehicleId, потому что она обновляет только позицию последнего объекта, добавленного на экран, я полагаюигнорирование идентификатора.

LastMarker: "[" + GPSDesc.List[0].GPSCoordinates.Latitude + "," + GPSDesc.List[0].GPSCoordinates.Longitude + "," + GPSDesc.List[0].Heading.Value + ",""" + GetRoutes2.List.Current.RouteVehicle.VehicleId + """]"

Obs.Я использую Outsystems.

...