PHP经纬度半径

PHP latitude and longitude radius

我提供一项服务,将 driver 附近的位置提供给乘客。

这个查询有效吗?它实际上是搜索乘客附近的位置半径吗?

我只是把纬度和经度写成一个数字。

你们可以验证一下或者解释一下吗?

SELECT  b.id, b.name, b.latitude, b.longitude
FROM    passenger a
JOIN    driver b
ON      ACOS(COS(RADIANS(a.latitude)) * COS(RADIANS(b.latitude)) * COS(RADIANS(b.longitude) - RADIANS(a.longitude)) + SIN(RADIANS(a.latitude)) * SIN(RADIANS(b.latitude))) <= 10 / 6371.0
WHERE   a.latitude = 3.2046532 AND a.longitude = 101.7808791

<?php
error_reporting(E_ERROR | E_PARSE);
error_reporting(E_ALL);
ini_set('display_errors', '0');
include ("conn.php");

$latitude1 = 3.2046532;
$longitude1 = 101.7808791;

$stmt = $dbi->prepare("SELECT b.id, b.name, b.latitude, b.longitude
                FROM passenger a
                JOIN driver b
                ON ACOS(COS(RADIANS(a.latitude)) * COS(RADIANS(b.latitude)) * COS(RADIANS(b.longitude) - RADIANS(a.longitude)) + SIN(RADIANS(a.latitude)) * SIN(RADIANS(b.latitude))) <= 10 / 6371.0
                WHERE   a.latitude = ? AND a.longitude = ?");
$stmt->bind_param('ss', $latitude1,$longitude1); 
mysqli_stmt_execute($stmt) or die (mysqli_error());
mysqli_stmt_store_result($stmt) or die (mysqli_error());
mysqli_stmt_num_rows($stmt);
$stmt->bind_result($newID, $newName, $latitude2, $longitude2);
$stmt->fetch();
$stmt->close();

echo $newName.'<br>';
echo $latitude2.'<br>';
echo $longitude2.'<br>';

?>

您的 sql 查询将如下所示:

$stmt = $dbi->prepare("SELECT id, name, latitude, longitude,
                (ACOS(COS(RADIANS(?)) * COS(RADIANS(b.latitude)) * COS(RADIANS(b.longitude) - RADIANS(?)) + SIN(RADIANS(?)) * SIN(RADIANS(b.latitude)))) as distance 
                FROM driver
                WHERE   distance <= 10/6371.0");
$stmt->bind_param('sss', $latitude1,$longitude1,$latitude1); 

解释:
在上面的查询中,我将 driver 与乘客的距离计算为 distance,然后选择 10 公里区域内的那些 driver。
distance <= 10/6371 语句中,使用 6371 因为它是以公里为单位的地球半径值。如果您想以英里为单位计算距离,可以使用 3956 代替 6371,因为 3956 是以英里为单位的地球半径。
有关此的更多信息,请参见 here.
如果您还想检索乘客的详细信息,请使用不同的查询而不是加入,因为您必须拥有乘客的主键,因为他是请求 driver 列表的人。

更新:

$stmt = $dbi->prepare("SELECT id, name, latitude, longitude,
            6371 * (ACOS(COS(RADIANS(?)) * COS(RADIANS(b.latitude)) * COS(RADIANS(b.longitude) - RADIANS(?)) + SIN(RADIANS(?)) * SIN(RADIANS(b.latitude)))) AS distance
            FROM     driver
            HAVING distance <= 10
            ORDER BY distance ASC");
    $stmt->bind_param('sss', $latitude1,$longitude1,$latitude1);