计算多个地理位置点之间的距离

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 公式会影响性能。所以,请提出一些更好的解决方案。