Я хочу указать широту и долготу маршрута. Это могут быть все точки или все точки на расстоянии 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?
«Но я пытаюсь сделать это с помощью php, и я должен сделать это с помощью php». Почему вы ДОЛЖНЫ использовать php?
Если вам нужна сторона сервера маршрутов, используйте Google Maps Directions API
Я не понимаю. Я консультируюсь с вами по действительно тревожной для меня теме, и вы не задумываясь ставите -1.
Я знаю, что Map js api предназначен для Интернета. Думаю, я достаточно объяснил свое требование выше. @Alberto, потому что я должен выполнить этот процесс из-за бизнес-логики, которую я пытаюсь выполнить.
Вы имеете в виду, что вам нужна помощь в использовании PHP для вызова API маршрутов GoogleMap?
@bcperth Нет. Я знаю, как вызвать. Я хочу знать, как использовать URL-адрес для получения списка значений широты и долготы от начала до конца пути между точкой a и точкой b? Например: maps.googleapis.com/maps/api/directions/… дает мне шаги между двумя точками, но вызов со всеми точками будет видеть больше.
Я проверил это, и API дает Routes, Legs и Steps - с длинной широтой для каждого шага. Однако он также дает точки на ломаной линии, которые, как мне кажется, дают больше промежуточных точек, которые предполагается использовать для рисования. Все это можно сделать на PHP, но потребуется некоторое декодирование. Это единственный способ получить более подробные сведения о местоположении без многократных вызовов API (о которых я знал!)
Ваш пример Javascript определенно можно сделать на PHP. Обзор_path менее точен, чем использование шагов, как я сказал выше, но я могу сделать то же самое. Если вам нужен код для этого, дайте мне знать, и я сделаю это завтра утром. Здесь, в Австралии, поздняя ночь.
См. Ответ ниже, который, я думаю, отвечает вашим потребностям. Согласитесь, если вам это нравится, или не стесняйтесь задавать больше вопросов.






Из комментариев я понимаю, что вопрос заключается в том, чтобы найти (с использованием 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
}
С удовольствием .. было весело исследовать ответ!
Maps JS API предназначен для встраивания карт в Интернет. Для доступа к нему со стороны сервера вам необходимо использовать Places API developers.google.com/places/web-service/intro