Получите широту и долготу маршрута от карт Google с PHP - PullRequest
0 голосов
/ 03 сентября 2018

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

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

В качестве примера, общий код JavaScript здесь и сказано, что это можно сделать с помощью DirectionsResult Object .

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?

1 Ответ

0 голосов
/ 04 сентября 2018

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

Это немного необычно, потому что люди обычно используют точки ломаной линии для рисования карты в браузере, и поэтому библиотеки 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/. Так что спасибо Peter Chng за эту работу еще в 2008 году! Питер также признает Марка MClure, который сделал оригинальное кодирование на 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 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...