Из комментариев я понимаю, что вопрос заключается в том, чтобы найти (используя 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
}