使用PHP从谷歌地图获取行程纬度和经度

问题描述 投票:0回答:1

我想列出行程的纬度和经度。它可能是所有点,也可能是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 google-maps
1个回答
1
投票

从评论我理解的问题是找到(使用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 
}
© www.soinside.com 2019 - 2024. All rights reserved.