计算多个地理位置点之间的距离
Calculate the distance between multi geolocations points
我的应用程序每隔一定时间从用户那里收集地理定位点,我正在尝试使用这些点来计算从第一个点到所有点的距离。
请注意,当用户沿直线移动时,地理定位点不会形成一条直线,因为我收集的点由于不准确而存在误差,因此我不能使用类似Haversine formula 因为它会给出不正确的值(比实际距离更长的距离)
而且我不能使用 Google Maps Distance API 因为它只计算 2 个点之间的距离,调用它 200 次来计算所有点的距离会非常昂贵。
我想在服务器端计算这个值,因为我有一些安全规则。所以在前端使用 google maps SDK 来计算它也不是一个选项。
任何想法...
一个选项是简化线,然后 运行 通过 Google Roads API 的数据(假设行驶在道路上),然后测量生成的线的长度(沿着道路).
对于遇到同样问题的任何人,我都遵循了这个link
https://developers-dot-devsite-v2-prod.appspot.com/maps/documentation/roads/snap
这是我在 PHP
中的代码
// snap the collected points from user to the nearest road using google API
$fields = array(
'path' => '60.170880,24.942795|60.170879,24.942796|60.170877,24.942796|60.170902,24.942654',
'key' => '<YOUR_KEY_HERE>'
);
$url = "https://roads.googleapis.com/v1/snapToRoads?" . http_build_query($fields, '', '&');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$response = json_decode($response);
$totalDistance = 0;
$previousPoint = null;
foreach ($response->snappedPoints as $pointOnRoad) {
if(!$previousPoint){
$previousPoint = $pointOnRoad;
continue;
}
$totalDistance += getDistance($pointOnRoad->location->latitude, $pointOnRoad->location->longitude,
$previousPoint->location->latitude, $previousPoint->location->longitude);
}
echo $totalDistance;
// calculate distance between 2 geo points
function getDistance($latitude1, $longitude1, $latitude2, $longitude2) {
$earth_radius = 6371;
$dLat = deg2rad($latitude2 - $latitude1);
$dLon = deg2rad($longitude2 - $longitude1);
$a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2);
$c = 2 * asin(sqrt($a));
$d = $earth_radius * $c;
return $d;
}
我们有类似的要求。有 2 条路径,我们需要确保第 1 条路径中的每个节点(起点和终点除外)与第 2 条路径的彼此至少相距 100 KM。
能否分享代码片段或背后的逻辑。
在循环中使用 Haversine 公式会影响性能。所以,请提出一些更好的解决方案。
我的应用程序每隔一定时间从用户那里收集地理定位点,我正在尝试使用这些点来计算从第一个点到所有点的距离。
请注意,当用户沿直线移动时,地理定位点不会形成一条直线,因为我收集的点由于不准确而存在误差,因此我不能使用类似Haversine formula 因为它会给出不正确的值(比实际距离更长的距离)
而且我不能使用 Google Maps Distance API 因为它只计算 2 个点之间的距离,调用它 200 次来计算所有点的距离会非常昂贵。
我想在服务器端计算这个值,因为我有一些安全规则。所以在前端使用 google maps SDK 来计算它也不是一个选项。
任何想法...
一个选项是简化线,然后 运行 通过 Google Roads API 的数据(假设行驶在道路上),然后测量生成的线的长度(沿着道路).
对于遇到同样问题的任何人,我都遵循了这个link https://developers-dot-devsite-v2-prod.appspot.com/maps/documentation/roads/snap
这是我在 PHP
中的代码// snap the collected points from user to the nearest road using google API
$fields = array(
'path' => '60.170880,24.942795|60.170879,24.942796|60.170877,24.942796|60.170902,24.942654',
'key' => '<YOUR_KEY_HERE>'
);
$url = "https://roads.googleapis.com/v1/snapToRoads?" . http_build_query($fields, '', '&');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$response = json_decode($response);
$totalDistance = 0;
$previousPoint = null;
foreach ($response->snappedPoints as $pointOnRoad) {
if(!$previousPoint){
$previousPoint = $pointOnRoad;
continue;
}
$totalDistance += getDistance($pointOnRoad->location->latitude, $pointOnRoad->location->longitude,
$previousPoint->location->latitude, $previousPoint->location->longitude);
}
echo $totalDistance;
// calculate distance between 2 geo points
function getDistance($latitude1, $longitude1, $latitude2, $longitude2) {
$earth_radius = 6371;
$dLat = deg2rad($latitude2 - $latitude1);
$dLon = deg2rad($longitude2 - $longitude1);
$a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2);
$c = 2 * asin(sqrt($a));
$d = $earth_radius * $c;
return $d;
}
我们有类似的要求。有 2 条路径,我们需要确保第 1 条路径中的每个节点(起点和终点除外)与第 2 条路径的彼此至少相距 100 KM。
能否分享代码片段或背后的逻辑。
在循环中使用 Haversine 公式会影响性能。所以,请提出一些更好的解决方案。