我有一个项目,可以根据我设定的半径来检测附近的标志物建立。我有 5km/3km/1km
选择。我暂时将中心设置为一个静态的 lat
和 lng
. 在获取标志物的坐标时,我有一个数据库,在计算坐标时。我使用一些公式,我 创办.
这是我在后台根据中心标记获取附近标记的代码。
Static lat lng from frontend // lat: 1.3182001528756,lng: 103.84650707245
$km = $request->radius/1000; //1km
$centerLat = $request->centerLat;
$centerLng = $request->centerLng;
$ky = 40000 / 360;
$originParm = $centerLat.','.$centerLng;
$test = \DB::select(\DB::raw("SELECT school_name as name, lng, lat,
( 6371 * acos( cos( radians(" . $centerLat . ") )
* cos( radians( lat ) ) * cos( radians( lng ) - radians(" . $centerLng . ") )
+ sin( radians(" . $centerLat . ") ) * sin( radians( lat ) ) ) )
AS distance FROM xp_pn_schools HAVING distance < ".$km.""));
$test = json_decode(collect($test),true);
foreach($test as $data) {
$arr['data'][] = array(
'coord' => ['lat' => $data['lat'], 'lng' => $data['lng']],
'name' => ucwords(strtolower($data['name'])),
'distance' => $data['distance'],
);
$coordArr[] = $data['lat'].','.$data['lng']; //concat for google api link
}
使用goole距离矩阵api的后台(用于获取基于位置的ETA和距离)
$destination = implode('|',$coordArr);
$ch = curl_init();
$url = 'https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins='.$originParm.'&destinations='.rawurlencode($destination).'&key=***********&mode=driving';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$output = json_decode($output,true);
curl_close($ch);
return response()->json(array(
'markers' => $arr,
'time' => $output
));
但在我的前台,当我检查响应时,我得到了这样的东西
我为了呈现小的结果比较,我把半径设置为距离我的前端1公里或1000的地方。
你可以看到,第一个结果是 Farrer School
距离 0.8 km
从公式。但在google地图api中,它是 2.1 km
. 我如何验证哪一个是正确的?
哈弗辛公式给出的是大圆直线距离,距离矩阵给出的是行驶距离。 这两个几乎都会不同,行驶距离是两者中较大的。