Google Maps API V3: Как показать направление из точки A в точку B (синяя линия)?

#google-maps #google-maps-api-3

#javascript #google-карты #google-maps-api-3

Вопрос:

У меня есть широта и долгота для 2 точек в базе данных, я хочу, чтобы моя карта Google отображала маршрут из точки A в точку B…

Точно так же, как мы видим здесь (направления Google Maps)

Изображение по ссылке

Как нарисовать эту линию направления на карте?

Ответ №1:

Используйте службу маршрутов Google Maps API v3. Это в основном то же самое, что и directions API, но красиво упакованный в Google Maps API, который также предоставляет удобный способ простого отображения маршрута на карте.

Информацию и примеры о отображении маршрута directions на карте можно найти в разделе rendering directionsдокументации Google Maps API v3.

Комментарии:

1. @Tomik возможно ли, чтобы код делал снимок изображения после того, как линия была нарисована?

2. Пожалуйста, посмотрите на второй пример: там есть код 🙂

Ответ №2:

Использование Javascript

Я создал рабочую демонстрационную версию, которая показывает, как использовать службу навигации Google Maps API на Javascript через

  • DirectionsService объект для отправки и получения запросов направления
  • DirectionsRenderer объект для отображения возвращаемого маршрута на карте

 function initMap() {
  var pointA = new google.maps.LatLng(51.7519, -1.2578),
    pointB = new google.maps.LatLng(50.8429, -0.1313),
    myOptions = {
      zoom: 7,
      center: pointA
    },
    map = new google.maps.Map(document.getElementById('map-canvas'), myOptions),
    // Instantiate a directions service.
    directionsService = new google.maps.DirectionsService,
    directionsDisplay = new google.maps.DirectionsRenderer({
      map: map
    }),
    markerA = new google.maps.Marker({
      position: pointA,
      title: "point A",
      label: "A",
      map: map
    }),
    markerB = new google.maps.Marker({
      position: pointB,
      title: "point B",
      label: "B",
      map: map
    });

  // get route from A to B
  calculateAndDisplayRoute(directionsService, directionsDisplay, pointA, pointB);

}



function calculateAndDisplayRoute(directionsService, directionsDisplay, pointA, pointB) {
  directionsService.route({
    origin: pointA,
    destination: pointB,
    travelMode: google.maps.TravelMode.DRIVING
  }, function(response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      directionsDisplay.setDirections(response);
    } else {
      window.alert('Directions request failed due to '   status);
    }
  });
}

initMap();  
     html,
    body {
      height: 100%;
      margin: 0;
      padding: 0;
    }
    #map-canvas {
      height: 100%;
      width: 100%;
    }  
 <script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>

<div id="map-canvas"></div>  

Также в Jsfiddle: http://jsfiddle.net/user2314737/u9no8te4

Использование веб-сервисов Google Maps

Вы можете использовать веб-сервисы, используя API_KEY, выдающий запрос, подобный этому:

https://maps.googleapis.com/maps/api/directions/json?origin=Torontoamp;destination=Montrealamp;key=API_KEY

API_KEY можно получить в консоли разработчика Google с квотой в 2500 бесплатных запросов в день.

Запрос может возвращать результаты в формате JSON или XML, которые можно использовать для рисования пути на карте.

Официальная документация для веб-сервисов, использующих Google Maps Directions API, находится здесь

Комментарии:

1. Привет, я использую этот код, и он работает нормально, но я хочу добавить еще один маркер A в C с другим направлением, я пробую много способов, но не работает

2. Я довольно новичок в Google Maps API, он работает для меня, но как я могу определить расстояние с маршрутом?

3. @Sarz взгляните на эту другую демонстрацию, которую я сделал jsfiddle.net/user2314737/fLogwsff

Ответ №3:

В вашем случае здесь представлена реализация с использованием службы маршрутов.

 function displayRoute() {

    var start = new google.maps.LatLng(28.694004, 77.110291);
    var end = new google.maps.LatLng(28.72082, 77.107241);

    var directionsDisplay = new google.maps.DirectionsRenderer();// also, constructor can get "DirectionsRendererOptions" object
    directionsDisplay.setMap(map); // map should be already initialized.

    var request = {
        origin : start,
        destination : end,
        travelMode : google.maps.TravelMode.DRIVING
    };
    var directionsService = new google.maps.DirectionsService(); 
    directionsService.route(request, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            directionsDisplay.setDirections(response);
        }
    });
}
  

Комментарии:

1. Для полноты добавьте это в код: var DirectionsService = new google.maps. DirectionsService();

2. Спасибо @Dabbler, я отредактировал, можете редактировать, если увидите ошибки в ответах.

3. возможно ли, чтобы код делал снимок изображения после того, как линия была нарисована?

4. Я не уверен, предоставляет ли «служба маршрутов» такую функциональность ((

5. хороший ответ! Тем не менее, при многократном нажатии на направления продукт B указывает на каждое нажатие — как вы сбрасываете маршрут / маркеры? 🙂

Ответ №4:

   // First Initiate your map. Tie it to some ID in the HTML eg. 'MyMapID'
  var map = new google.maps.Map(
    document.getElementById('MyMapID'),
    {
      center: {
        lat: Some.latitude,
        lng: Some.longitude
      }
    }
  );
  // Create a new directionsService object.
  var directionsService = new google.maps.DirectionsService;
    directionsService.route({
      origin: origin.latitude  ','  origin.longitude,
      destination: destination.latitude  ','  destination.longitude,
      travelMode: 'DRIVING',
    }, function(response, status) {
      if (status === google.maps.DirectionsStatus.OK) {
        var directionsDisplay = new google.maps.DirectionsRenderer({
          suppressMarkers: true,
          map: map,
          directions: response,
          draggable: false,
          suppressPolylines: true, 
          // IF YOU SET `suppressPolylines` TO FALSE, THE LINE WILL BE
          // AUTOMATICALLY DRAWN FOR YOU.
        });

        // IF YOU WISH TO APPLY USER ACTIONS TO YOUR LINE YOU NEED TO CREATE A 
        // `polyLine` OBJECT BY LOOPING THROUGH THE RESPONSE ROUTES AND CREATING A 
        // LIST
        pathPoints = response.routes[0].overview_path.map(function (location) {
          return {lat: location.lat(), lng: location.lng()};
        });

        var assumedPath = new google.maps.Polyline({
         path: pathPoints, //APPLY LIST TO PATH
         geodesic: true,
         strokeColor: '#708090',
         strokeOpacity: 0.7,
         strokeWeight: 2.5
       });

       assumedPath.setMap(map); // Set the path object to the map
  

Ответ №5:

Используйте directions API.

Выполните вызов ajax, т.Е.

 https://maps.googleapis.com/maps/api/directions/json?parameters
  

а затем проанализировать ответ

Комментарии:

1. возможно ли, чтобы код делал снимок изображения после того, как линия была нарисована?

Ответ №6:

Я использую всплывающее окно, чтобы показать карту в новом окне. Я использую следующий URL

 https://www.google.com/maps?z=15amp;daddr=LATITUDE,LONGITUDE
  

Фрагмент HTML

 <a target='_blank' href='https://www.google.com/maps?z=15amp;daddr=${location.latitude},${location.longitude}'>Calculate route</a>