Получите широту и долготу маршрута с карт Google с помощью PHP

Я хочу указать широту и долготу маршрута. Это могут быть все точки или все точки на расстоянии 1-2 км.

Я пытаюсь сделать следующее: пользователь выбрал A как начальную точку и B как конечную точку. Я хочу показать на карте несколько мест возле дороги между пунктами А и Б. Но мне для этого нужны позиции.

Например, код JavaScript является общим здесь, и говорят, что это можно сделать с помощью Объект DirectionsResult.

var request = {
  origin: start_point,
  destination: end_point,
  travelMode: google.maps.TravelMode.DRIVING
};

var directionsService = new google.maps.DirectionsService();
  directionsService.route(request, function(response, status) {
  if (status == google.maps.DirectionsStatus.OK) {
    var path = (response.routes[0].overview_path);
  }
});

Но я пытаюсь сделать это с помощью php, и я должен сделать это с помощью php.

Я читал API карт Google. Я также читал api карты яндекса, но, похоже, это делается только с помощью javascript.

Кто-нибудь знает, как это сделать с помощью php?

Maps JS API предназначен для встраивания карт в Интернет. Для доступа к нему со стороны сервера вам необходимо использовать Places API developers.google.com/places/web-service/intro

Ananth 03.09.2018 13:37

«Но я пытаюсь сделать это с помощью php, и я должен сделать это с помощью php». Почему вы ДОЛЖНЫ использовать php?

Alberto 03.09.2018 13:53

Если вам нужна сторона сервера маршрутов, используйте Google Maps Directions API

geocodezip 03.09.2018 14:01

Я не понимаю. Я консультируюсь с вами по действительно тревожной для меня теме, и вы не задумываясь ставите -1.

hkucuk 03.09.2018 14:23

Я знаю, что Map js api предназначен для Интернета. Думаю, я достаточно объяснил свое требование выше. @Alberto, потому что я должен выполнить этот процесс из-за бизнес-логики, которую я пытаюсь выполнить.

hkucuk 03.09.2018 14:24

Вы имеете в виду, что вам нужна помощь в использовании PHP для вызова API маршрутов GoogleMap?

bcperth 03.09.2018 14:50

@bcperth Нет. Я знаю, как вызвать. Я хочу знать, как использовать URL-адрес для получения списка значений широты и долготы от начала до конца пути между точкой a и точкой b? Например: maps.googleapis.com/maps/api/directions/… дает мне шаги между двумя точками, но вызов со всеми точками будет видеть больше.

hkucuk 03.09.2018 15:15

Я проверил это, и API дает Routes, Legs и Steps - с длинной широтой для каждого шага. Однако он также дает точки на ломаной линии, которые, как мне кажется, дают больше промежуточных точек, которые предполагается использовать для рисования. Все это можно сделать на PHP, но потребуется некоторое декодирование. Это единственный способ получить более подробные сведения о местоположении без многократных вызовов API (о которых я знал!)

bcperth 03.09.2018 16:34

Ваш пример Javascript определенно можно сделать на PHP. Обзор_path менее точен, чем использование шагов, как я сказал выше, но я могу сделать то же самое. Если вам нужен код для этого, дайте мне знать, и я сделаю это завтра утром. Здесь, в Австралии, поздняя ночь.

bcperth 03.09.2018 16:45

См. Ответ ниже, который, я думаю, отвечает вашим потребностям. Согласитесь, если вам это нравится, или не стесняйтесь задавать больше вопросов.

bcperth 04.09.2018 03:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
10
319
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из комментариев я понимаю, что вопрос заключается в том, чтобы найти (с использованием PHP) промежуточные пары широты и долготы, которые можно извлечь из точки ломаной линии в запросе направление Googles.

Это немного необычно, потому что люди обычно используют точки ломаной линии для рисования карты в браузере, и поэтому библиотеки JavaScript хорошо оснащены для этой задачи. Однако в PHP все иначе.

Данные точек отображаются в объекте результата JSON в виде строки символов ascii, иногда довольно длинной и всегда «нечитаемой». В этой строке закодирован список пар промежуточных широт и длин между началом и концом каждого отрезка. Метод кодирования представлен на сайте Google https://developers.google.com/maps/documentation/utilities/polylinealgorithm, а приведенный ниже алгоритм - это просто противоположность этого метода, и он соответствующим образом прокомментирован.

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

Обратите внимание, что JSON также предоставляет эти поля в конце каждого объекта результатов.

     "overview_polyline" : {
        "points" : "~n{aEmbwaU_B@cCBk@Lo@d@UVOb@Mh@Ab@@@@BBF@DGNABD`@Fh@Pb@VZn@b@d@J"
     },

Это гораздо менее детально и менее точно (если вы рисуете, вероятно, с отклонением от реальных линий дороги на карте), но также может быть декодирован таким же образом.

Однако лучшие промежуточные точки - это итерация шагов с использованием:

    "polyline" : {
        "points" : "~n{aEmbwaUg@@w@?{A?g@BUBUHSJ[XUVOb@Mh@Ab@"
     }, 

Наконец, исходный источник алгоритма можно найти здесь http://unitstep.net/blog/2008/08/02/decoding-google-maps-encoded-polylines-using-php/. Так что спасибо Питеру Чангу за эту работу в 2008 году! Питер также благодарит Марка Маклюра, написавшего исходное кодирование на JavaScript. Я пошарил и добавил больше комментариев - чтобы больше соответствовало рецепту Google, но не более того.

Я также только что понял, что есть эта ссылка https://github.com/emcconville/google-map-polyline-encoding-tool, которая (я думаю, но не тестировал) предоставляет класс и инструмент CLI для преобразования в обоих направлениях.

$json = file_get_contents("https://maps.googleapis.com/maps/api/directions/json?origin=20%20%20Kintyre%20Crescent,%20Churchlands&destination=%2018Kinross%20Crescent,%20Churchlands&key = "); 
$details = json_decode($json,true);
print_r($details);    // show the full result

$points = $details['routes'][0]['legs'][0]['steps'][0]['polyline']['points'];
echo($points);        // show the points string for one leg

// show the start and end locations for that leg
print_r($details['routes'][0]['legs'][0]['steps'][0]['start_location']);
print_r($details['routes'][0]['legs'][0]['steps'][0]['end_location']);

// work out the intermdiate points (normally used for drawing)
$decodedPoints= decodePolylinePoints($points);
print_r($decodedPoints);   // print out the intermediate points

// This function decodes the polylone points in PHP
function decodePolylinePoints($pointsString)
{
    $len = strlen($pointsString);
    $latLons = array();   // the output array
    $lat = 0;             // temp storage for lat and lng
    $lng = 0;

    $index = 0;           // index to curent character
    while ($index < $len)   // process each lat,lng pair
      {
        // first build the lat
        // NOTE: first lat is an absolute value
        // NOTE: subsequent lats are offsets from previous values for coding efficiency
        $char = 0;   // char as read from points string
        $shift = 0;  // cumulative shift amount
        $value = 0;  // temp value during computation

        do // Read, convert and shift 5 bit chunks until terminator is reached to get lat
        {
          $char = ord(substr($pointsString, $index++)) - 63; // return ascii value less 63
          $value |= ($char & 0x1f) << $shift;                // convert to 5 bit and shift left
          $shift += 5;                                       // next shift is 5 extra
        }
        while ($char >= 0x20);                               // value of 20 indicates end of lat

        $lat += (($value & 1) ? ~($value >> 1) : ($value >> 1));  // convert negative values and save

        // now build the lng
        // NOTE: first lng is an absolute value
        // NOTE: subsequent lngs are offsets from previous values for coding efficiency
        $shift = 0;
        $value = 0;

        do  // build up lng from 5 bit chunks
        {
          $char= ord(substr($pointsString, $index++)) - 63;  // return ascii value less 63
          $value |= ($char & 0x1f) << $shift;               // convert to 5 bit and shift left
          $shift += 5;                                       // next shift is 5 extra
        }
        while ($char >= 0x20);                               // value of 20 indicates end of lng

        $lng += (($value & 1) ? ~($value >> 1) : ($value >> 1)); // convert negative values and save

        $latLons[] = array($lat * 1e-5, $lng * 1e-5);        // original values were * 1e5
      }

      return $latLons;    // points array converted to lat,lngs 
}

С удовольствием .. было весело исследовать ответ!

bcperth 04.09.2018 17:04

Другие вопросы по теме