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);
我提供一项服务,将 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);