为我的本地社区构建一个基于 PHP 和 SQL 的拼车应用程序。虽然我通常使用 php 编码,但我很难寻找列出所需的数学公式:
- 附近的前 5 个用户,根据主要用户的经度/纬度,从最近到最远排序
- 仅限于主用户long/lat 500米范围内
SQL 数据库包含每 5 分钟更新一次的每个在线用户的经度/纬度。
已经四处寻找,但认为我可能正在寻找错误的东西。非常感谢任何指导。
为我的本地社区构建一个基于 PHP 和 SQL 的拼车应用程序。虽然我通常使用 php 编码,但我很难寻找列出所需的数学公式:
SQL 数据库包含每 5 分钟更新一次的每个在线用户的经度/纬度。
已经四处寻找,但认为我可能正在寻找错误的东西。非常感谢任何指导。
以下 SQL 查询使用球面余弦定律计算坐标与表中坐标之间的距离。
d = acos( sin(lat1).sin(lat2) + cos(lat1).cos(lat2).cos(lng2-lng1) ).R
查询使用SQL 数学函数
require("dbinfo.php");//database parameters
¢er_lat = primaryLat;
$center_lng = primarylng;
$radius = 0.5;//500 meters
$arr = array();
//Connect to database
$dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// Prepare statement
$stmt = $dbh->prepare("SELECT name, lat, lng, ( 3959 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance FROM gbstn HAVING distance < ? ORDER BY distance LIMIT 0 , 5");
// Assign parameters
$stmt->bindParam(1,$center_lat);
$stmt->bindParam(2,$center_lng);
$stmt->bindParam(3,$center_lat);
$stmt->bindParam(4,$radius);
//Execute query
$stmt->setFetchMode(PDO::FETCH_OBJ);
$stmt->execute();
//Show the results
while($obj = $stmt->fetch()) {
$arr[] = $obj;
}
if (count($arr) >= 1)
{
echo '{"marker":'.json_encode($arr).'}';
}else{
echo '{"marker":[{"name":"No Results","lat":'.$center_lat.',"lng":'.$center_lng.',"distance":0}]}';
}
}
catch(PDOException $e) {
echo "I'm sorry I'm afraid you can't do that.". $e->getMessage() ;// Remove or modify after testing
file_put_contents('PDOErrors.txt',date('[Y-m-d H:i:s]').", mapSelect.php, ". $e->getMessage()."\r\n", FILE_APPEND);
}
//Close the connection
$dbh = null;
?>
使用PDO代替不推荐使用的mysql_
函数。
您将需要修改语句以适应 . 调试后还要删除 catch 块中的 echo。