【问题标题】:Calculate Multiple Distance Between Multiple Lat/Long in PHP Loop在 PHP 循环中计算多个纬度/经度之间的多个距离
【发布时间】:2020-03-27 20:46:15
【问题描述】:

我有以下两个 Driver_positionuser_position 表,其中正在更新用户和驱动程序的纬度/经度位置。我需要找出每个 user_id 接近 5km 的 user_position 的 driver_id,这样结果就像user_id1 = driver_id1,driver_id2,driver_id3 etc For user_id2=driver_id5

到目前为止,我有以下代码来计算以公里为单位的距离。如何在 PHP 中实现上述目标

$lat1 = deg2rad($user_latitude);
        $lon1 = deg2rad($user_longitude);
        $lat2 = deg2rad($driver_latitude);
        $lon2 = deg2rad($driver_longitude);

        $latDelta = $lat1 - $lat2;
        $lonDelta = $lon1 - $lon2;

        $earthRadius=3959;

        $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
        cos($lat2) * cos($lat1) * pow(sin($lonDelta / 2), 2)));

        //return $angle * $earthRadius;  

        $dis= ($angle * $earthRadius)/0.62137; // miles to km conversion mi / 0.62137 = km

【问题讨论】:

    标签: php latitude-longitude


    【解决方案1】:

    您可以使用下面的 Mysql 查询来解决您的问题

    // To search by kilometers instead of miles, replace 3959 with 6371
    
    SELECT user_position.*,driver_position.driver_id, ( 3959 * acos( cos( radians(37.4219983) ) * cos( radians( driver_position.latitude ) ) * cos( radians( driver_position.longitude ) - radians(-122.0844) ) + sin( radians(37.4219983) ) * sin(radians(driver_position.latitude)) ) ) AS distance FROM user_position ,driver_position where user_position.user_id=10002 HAVING distance < 10000
    

    希望这会对您有所帮助。

    【讨论】:

    • 您可以将我给定的查询直接运行到 phpmyadmin 或 mysql 中进行检查。它正在工作。
    • 我可以用 user_position.latitude 代替固定值弧度 (37.4219983) 我试过但不是那样工作
    【解决方案2】:

    是的,您可以根据您的要求传递动态值。检查您下面给定的代码

    $pickup_latitude='37.4219983'; $pickup_longitude='-122.084'; 
    
    $sql="(SELECT *,driver_location.driver_id, ( 6371 * acos( cos( radians('".$pickup_latitude."') ) * cos( radians( driver_location.latitude ) ) * cos(radians( driver_location.longitude ) - radians('".$pickup_longitude."') ) + sin( radians('".$pickup_latitude."') ) * sin( radians( driver_location.latitude ) ) ) ) as distance FROM driver_location where driver_location.status='Online' HAVING distance >=0)"
    

    您使用单引号传递 $pickup_longitude 变量值,因此将其视为“$pickup_longitude”。您需要使用双引号传递其值,例如 '".$pickup_longitude."'

    试试上面的代码。

    【讨论】:

    • 是的,它适用于单个 $pickup_latitude 和 $pickup_longitude。如果我尝试将 user_position 表中可用的每个 $pickup_latitude 和 $pickup_longitude 与 driver_position 表中的每个 lat/long 进行比较,我的意思是每个用户都有每个司机
    猜你喜欢
    • 2023-03-08
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2011-09-16
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多