我想列出行程的纬度和经度。它可能是所有点,也可能是1-2公里内的所有点。
我要做的是:用户选择A作为起点,B作为终点。我想在地图上显示A和B之间的道路附近的一些地方。但我需要一个立场。
例如,一个JavaScript代码是共享here,据说这可以用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。我也读过yandex map api,但这似乎只能用javascript完成。
有谁知道用PHP做到这一点的方法?
从评论我理解的问题是找到(使用PHP)中间lat,lng对,可以从谷歌方向查询中的折线点提取。
这有点不寻常,因为人们通常在浏览器中使用折线点进行地图绘制,因此JavaScript库可以很好地完成此任务。但是,在PHP中并非如此。
点数据作为ascii字符串出现在JSON结果对象中,有时很长并且总是“不可读”。在该字符串中编码每个分支的开始和结束之间的中间lat lng对的列表。编码方法在谷歌网站https://developers.google.com/maps/documentation/utilities/polylinealgorithm上呈现,下面的算法只是一个逆转,并相应地评论。
该示例显示了在澳大利亚珀斯的新月形街道上的2个点之间找到的方向。选择起始点以鼓励绘制路线所需的多个中间点。根据需要替换您自己的搜索。
请注意,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年的这项工作! Peter还承认Mark MClure是用JavaScript编写原始编码的。我讨厌并添加了更多评论 - 与谷歌食谱更加一致,但没有更多。
我也刚刚意识到这个链接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
}