Статьи

Создание полилинии с использованием геолокации и API Карт Google

В разделе «Как получить маршрут с помощью API Карт Google» я объяснил, как создать службу, которая позволяет пользователю находить маршрут от одного адреса к другому. В этой статье вы узнаете, как использовать API геолокации вместе с API Карт Google для отображения полилинии на карте, объединяющей несколько точек.

В этой статье предполагается, что вы знакомы с материалами из раздела Работа с геолокацией и API Карт Google и Получение указаний с использованием API Карт Google . Если вы еще не читали их, я предлагаю сделать это сейчас.

Сделайте еще больше с Google Maps API

В последних двух статьях вы видели множество классов, методов и свойств, однако они были лишь небольшим кусочком головоломки API Карт Google. В этом разделе вы увидите еще одну часть API, которую мы будем использовать в финальной демонстрации.

Первый класс, который я представлю, это google.maps.Polyline Он рисует линию, которая соединяет несколько точек, используя параметры (объект google.maps.PolylineOptions Методы этого класса — просто геттеры и сеттеры, поэтому я не буду вдаваться в подробности, но имейте в виду, что наиболее важными сеттерами являются setPath()setMap()

Класс google.maps.PolylineOptions Двумя наиболее важными являются те, которые лежат в основе описанных ранее сеттеров — mappath Свойства штрихов также заслуживают внимания, так как они будут использованы в демоверсии. Как видно из названия, strokeColor#000000 strokeOpacity strokeWeight Я предлагаю прочитать официальную документацию PolylineOptions, чтобы узнать о других полезных свойствах.

Демонстрация также использует класс google.maps.LatLngBounds Ссылаясь на официальную документацию , LatLngBounds . Его конструктор принимает до двух параметров, которые, если даны, должны быть экземплярами LatLng Первая будет использоваться как юго-западная точка прямоугольника, а вторая — как северо-восточная точка. Единственный метод, который вы увидите в демоверсии, это extend()LatLng Другой метод класса LatLngBoundscontains()LatLng Этот класс также имеет другие полезные методы, которые работают с несколькими прямоугольниками. Фактически, вы можете объединять ( union()intersects()LatLngBounds

Построение Демо

Чтобы увидеть представленные классы в действии, давайте создадим демонстрацию, которая сохранит движения пользователя и нарисует ломаную, соединяющую их на карте. Поскольку мы должны отслеживать движения пользователя, в демонстрационной версии вместо метода watchPosition()getCurrentPosition() Позиции будут храниться в переменной с именем path

 // Save the positions' history
var path = [];

Когда метод watchPosition()google.maps.LatLng Затем этот объект будет вставлен в массив path И для каждой новой добавленной точки карта будет обновляться, чтобы показать движения пользователя.

 // Save the current position
path.push(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));

Нам также нужно настроить вид карты так, чтобы он содержал все точки полилинии. Это делается с помощью объекта LatLngBoundslatLngBounds Нам нужно перебрать все сохраненные точки и передать их, по одному, в метод extend() Обратите внимание, что на данный момент мы только подготавливаем данные для использования с fitBounds() Кроме того, мы также пометим каждую точку с помощью объекта Marker Код, который реализует это, приведен ниже.

 // Create the LatLngBounds object that will be used to fit the view to the points range and
// place the markers to the polyline's points
var latLngBounds = new google.maps.LatLngBounds();
for(var i = 0; i < path.length; i++) {
  latLngBounds.extend(path[i]);
  // Place the marker
  new google.maps.Marker({
    map: map,
    position: path[i],
    title: "Point " + (i + 1)
  });
}

Как только у вас появятся точки для отображения, нам нужно построить ломаную линию, используя классы PolylinePolylineOptions Это очень просто, потому что вам просто нужно создать новый объект Polyline В приведенном ниже коде обводка линии была изменена на синюю линию шириной в один пиксель с непрозрачностью 70%.

 // Creates the polyline object
var polyline = new google.maps.Polyline({
  map: map,
  path: path,
  strokeColor: '#0000FF',
  strokeOpacity: 0.7,
  strokeWeight: 1
});

Единственный оставшийся шаг — убедиться, что вид карты содержит все точки полилинии. Это делается путем передачи переменной latLngBoundsfitBounds()

 // Fit the bounds of the generated points
map.fitBounds(latLngBounds);

Добавление предустановленных точек

Используя приведенный выше код, у нас есть полностью рабочая демонстрация. Однако, если вы протестируете код в среде рабочего стола, метод watchPosition() Чтобы избежать этой проблемы, вы можете скопировать следующий фрагмент кода и вставить его перед блоком, который перебирает массив pathLatLngBounds Этот код просто создаст и вставит в массив path

 // Create the polyline's points
for(var i = 0; i < 5; i++) {
  // Create a random point using the user current position and a random generated number.
  // The number will be once positive and once negative using based on the parity of i
  // and to reduce the range the number is divided by 10
  path.push(
    new google.maps.LatLng(
      position.coords.latitude + (Math.random() / 10 * ((i % 2) ? 1 : -1)),
      position.coords.longitude + (Math.random() / 10 * ((i % 2) ? 1 : -1))
    )
  );
}

Демо-страница

Используя код, показанный в предыдущих разделах, финальная рабочая демонстрационная страница приведена ниже.

 <!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Create a polyline using Geolocation and Google Maps API</title>
    <script src="http://maps.google.com/maps/api/js?sensor=true"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script>
      $(document).ready(function() {
        // If the browser supports the Geolocation API
        if (typeof navigator.geolocation == "undefined") {
          $("#error").text("Your browser doesn't support the Geolocation API");
          return;
        }
        // Save the positions' history
        var path = [];

        navigator.geolocation.watchPosition(function(position) {
          // Save the current position
          path.push(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));

          // Create the map
          var myOptions = {
            zoom : 16,
            center : path[0],
            mapTypeId : google.maps.MapTypeId.ROADMAP
          }
          var map = new google.maps.Map(document.getElementById("map"), myOptions);

          /*
          Uncomment this block if you want to set a path

          // Create the polyline's points
          for(var i = 0; i < 5; i++) {
            // Create a random point using the user current position and a random generated number.
            // The number will be once positive and once negative using based on the parity of i
            // and to reduce the range the number is divided by 10
            path.push(
              new google.maps.LatLng(
                position.coords.latitude + (Math.random() / 10 * ((i % 2) ? 1 : -1)),
                position.coords.longitude + (Math.random() / 10 * ((i % 2) ? 1 : -1))
              )
            );
          }
          */

          // Create the array that will be used to fit the view to the points range and
          // place the markers to the polyline's points
          var latLngBounds = new google.maps.LatLngBounds();
          for(var i = 0; i < path.length; i++) {
            latLngBounds.extend(path[i]);
            // Place the marker
            new google.maps.Marker({
              map: map,
              position: path[i],
              title: "Point " + (i + 1)
            });
          }
          // Creates the polyline object
          var polyline = new google.maps.Polyline({
            map: map,
            path: path,
            strokeColor: '#0000FF',
            strokeOpacity: 0.7,
            strokeWeight: 1
          });
          // Fit the bounds of the generated points
          map.fitBounds(latLngBounds);
        },
        function(positionError){
          $("#error").append("Error: " + positionError.message + "<br />");
        },
        {
          enableHighAccuracy: true,
          timeout: 10 * 1000 // 10 seconds
        });
      });
    </script>
    <style type="text/css">
      #map {
        width: 500px;
        height: 400px;
        margin-top: 10px;
      }
    </style>
  </head>
  <body>
    <h1>Create a polyline</h1>
    <div id="map"></div>
    <p id="error"></p>
  </body>
</html>

Вывод

В этой статье описаны классы, свойства и методы, используемые для рисования ломаной линии, которая соединяет несколько точек на карте. Как вы видели в этой серии статей, эти API-интерфейсы можно использовать для создания множества отличных сервисов, которые повышают удобство работы ваших пользователей. Конечно, вы можете сделать гораздо больше, чем было показано здесь. Изучая другие классы в API Карт Google, возможности практически безграничны.