varios multiple marcadores google example custom añadir agregar javascript google-maps animation handheld

javascript - multiple - ¿Cómo animar un marcador personalizado de Google Maps a lo largo de una ruta?



google maps multiple markers (5)

He escrito una pequeña aplicación para un dispositivo portátil con JavaScript y la API de Google Maps, ahora necesito mover el ícono de mi marcador a cualquier lugar del mapa a lo largo de una ruta usando una función de temporizador. Tengo un icono de hombre y necesito moverlo automáticamente en el mapa. ¿Cómo puedo hacer esto?


Aquí está mi solución que funciona con la API v3. Esto anima el marcador no con una velocidad fija, sino en función de la duración calculada de la ruta. Hay un factor de velocidad, por lo que, por ejemplo, puede conducir por la ruta 10 veces más rápido que en la realidad.

He tratado de hacerlo lo más simple posible. Sientase libre de usarlo.

var autoDriveSteps = new Array(); var speedFactor = 10; // 10x faster animated drive function setAnimatedRoute(origin, destination, map) { // init routing services var directionsService = new google.maps.DirectionsService; var directionsRenderer = new google.maps.DirectionsRenderer({ map: map }); //calculate route directionsService.route({ origin: origin, destination: destination, travelMode: google.maps.TravelMode.DRIVING }, function(response, status) { if (status == google.maps.DirectionsStatus.OK) { // display the route directionsRenderer.setDirections(response); // calculate positions for the animation steps // the result is an array of LatLng, stored in autoDriveSteps autoDriveSteps = new Array(); var remainingSeconds = 0; var leg = response.routes[0].legs[0]; // supporting single route, single legs currently leg.steps.forEach(function(step) { var stepSeconds = step.duration.value; var nextStopSeconds = speedFactor - remainingSeconds; while (nextStopSeconds <= stepSeconds) { var nextStopLatLng = getPointBetween(step.start_location, step.end_location, nextStopSeconds / stepSeconds); autoDriveSteps.push(nextStopLatLng); nextStopSeconds += speedFactor; } remainingSeconds = stepSeconds + speedFactor - nextStopSeconds; }); if (remainingSeconds > 0) { autoDriveSteps.push(leg.end_location); } } else { window.alert(''Directions request failed due to '' + status); } }); } // helper method to calculate a point between A and B at some ratio function getPointBetween(a, b, ratio) { return new google.maps.LatLng(a.lat() + (b.lat() - a.lat()) * ratio, a.lng() + (b.lng() - a.lng()) * ratio); } // start the route simulation function startRouteAnimation(marker) { var autoDriveTimer = setInterval(function () { // stop the timer if the route is finished if (autoDriveSteps.length === 0) { clearInterval(autoDriveTimer); } else { // move marker to the next position (always the first in the array) marker.setPosition(autoDriveSteps[0]); // remove the processed position autoDriveSteps.shift(); } }, 1000); }

Uso:

setAnimatedRoute("source address or LatLng ...", "destination address or LatLng ...", map); // start simulation on button click... $("#simulateRouteButton").click(function() { startRouteAnimation(agentMarker); });


Desafortunadamente, no hay una función automática de movimiento de marcadores en la colección oficial de GMaps.

Sin embargo, si tienes un GRoute, eso significa que tienes un conjunto de puntos. Para recorrer los pasos de la ruta, puedes usar algo como esto:

for (var c = 0; c < yourroute.getNumSteps(); c++) { yourmarker.setLatLng(yourroute.getStep(c).getLatLng()); }

Por supuesto, probablemente querrá hacer esto de forma asincrónica usando los temporizadores:

function moveToStep(yourmarker,yourroute,c) { if {yourroute.getNumSteps() > c) { yourmarker.setLatLng(yourroute.getStep(c).getLatLng()); window.setTimeout(function(){ moveToStep(yourmarker,yourroute,c+1); },500); } } moveToStep(marker,route,0);

Para un movimiento aún más suave, podría interpolar los puntos de los que ya tiene.


Espero que esto le ayude aquí es un botón y cuando haga clic en ellos, el marcador se moverá de la ruta de origen a la de destino. El método setRoutes se usa para establecer la ruta del marcador.

function setRoutes(){ var directionsDisplay = new Array(); for (var i=0; i< startLoc.length; i++){ var rendererOptions = { map: map, suppressMarkers : true, preserveViewport: true } directionsService = new google.maps.DirectionsService(); var travelMode = google.maps.DirectionsTravelMode.DRIVING; var request = { origin: startLoc[i], destination: endLoc[i], travelMode: travelMode }; directionsService.route(request,makeRouteCallback(i,directionsDisplay[i])); }

Hacer ruta después de configurarlos.

function makeRouteCallback(routeNum,disp){ if (polyline[routeNum] && (polyline[routeNum].getMap() != null)) { startAnimation(routeNum); return; } return function(response, status){ if (status == google.maps.DirectionsStatus.OK){ var bounds = new google.maps.LatLngBounds(); var route = response.routes[0]; startLocation[routeNum] = new Object(); endLocation[routeNum] = new Object(); polyline[routeNum] = new google.maps.Polyline({ path: [], strokeColor: ''#FFFF00'', strokeWeight: 3 }); poly2[routeNum] = new google.maps.Polyline({ path: [], strokeColor: ''#FFFF00'', strokeWeight: 3 }); // For each route, display summary information. var path = response.routes[0].overview_path; var legs = response.routes[0].legs; disp = new google.maps.DirectionsRenderer(rendererOptions); disp.setMap(map); disp.setDirections(response); //Markers for (i=0;i<legs.length;i++) { if (i == 0) { startLocation[routeNum].latlng = legs[i].start_location; startLocation[routeNum].address = legs[i].start_address; // marker = google.maps.Marker({map:map,position: startLocation.latlng}); marker[routeNum] = createMarker(legs[i].start_location,"start",legs[i].start_address,"green"); } endLocation[routeNum].latlng = legs[i].end_location; endLocation[routeNum].address = legs[i].end_address; var steps = legs[i].steps; for (j=0;j<steps.length;j++) { var nextSegment = steps[j].path; var nextSegment = steps[j].path; for (k=0;k<nextSegment.length;k++) { polyline[routeNum].getPath().push(nextSegment[k]); //bounds.extend(nextSegment[k]); } } } } polyline[routeNum].setMap(map); //map.fitBounds(bounds); startAnimation(routeNum); } // else alert("Directions request failed: "+status); } }

Por fin llamamos inicio a la función de animación.

function startAnimation(index) { if (timerHandle[index]) clearTimeout(timerHandle[index]); eol[index]=polyline[index].Distance(); map.setCenter(polyline[index].getPath().getAt(0)); poly2[index] = new google.maps.Polyline({path: [polyline[index].getPath().getAt(0)], strokeColor:"#FFFF00", strokeWeight:3}); timerHandle[index] = setTimeout("animate("+index+",50)",2000); // Allow time for the initial map display }

Puede encontrar el código completo en el blog GeekOnJava y copiar ese código y ejecutarlo y publicarlo en youtube .


No mueve algo automáticamente, pero debe revisar el experimento de Google Drive por phatfusion. Mirar el código podría ayudarte.