【发布时间】:2015-05-07 04:53:22
【问题描述】:
我正在使用论坛在给定位置和半径的数据库中选择纬度/经度点,但是我无法正常工作。只有当我使用 6371 公里(世界的大小)的半径时,我才能让查询工作,我认为论坛存在问题,但我似乎无法弄清楚在哪里......
这是我的 sql 查询
$latitude = $_POST["latitude"]; // latitude of centre of bounding circle in degrees
$longitude = $_POST["longitude"];; // longitude of centre of bounding circle in degrees
$rad = $_POST["radius"]; // radius of bounding circle in kilometers
$R = 6371;// earth's mean radius, km
$maxLat = $latitude + rad2deg($rad/$R);
$minLat = $latitude - rad2deg($rad/$R);
// compensate for degrees longitude getting smaller with increasing latitude
$maxLon = $longitude + rad2deg($rad/$R/cos(deg2rad($latitude)));
$minLon = $longitude - rad2deg($rad/$R/cos(deg2rad($latitude)));
$con = mysqli_connect("localhost","root","Winter#05");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysqli_select_db($con, "appdatabase");
$result = mysqli_query($con,"select id, PostTitle, SubmitDate, PostVotes, ImagePath, comments, latitude, longitude, acos(sin($latitude)*sin(radians(latitude)) + cos($latitude)*cos(radians(latitude))*cos(radians(longitude)-($longitude))) * $R as D
from ( select id, PostTitle, SubmitDate, PostVotes, comments, ImagePath, latitude, longitude
from posts where latitude > $minLat and latitude < $maxLat and longitude > $minLon and longitude < $maxLon ) as first_cut
where acos(sin($latitude)*sin(radians(latitude)) + cos($latitude)*cos(radians(latitude))*cos(radians(longitude) - ($longitude))) * $R < $rad order by D") or die('Errant query:');
while($row = mysqli_fetch_assoc($result))
{
$output[]=$row;
}
print(json_encode($output));
mysqli_close($con);
【问题讨论】:
-
您的 rad2deg 调用没有任何意义。你基本上是在做
rad2deg(6371/6371)。那只是计算两个长度的比例。您需要将该比例转换为弧度。 -
这个表达式似乎是错误的(它出现的两个地方):
rad2deg($rad/$R/cos(deg2rad($latitude)))。应该是rad2deg($rad/($R*cos(deg2rad($latitude))))。不过,您的其他rad2deg()电话在我看来是正确的。 -
@MarB 并不总是这样 (6371/6371),我只是将半径设置为最大的,以便进行调试。但是,如果我想减少我选择的点的半径,那么我需要调整 $rad
-
@JohnBollinger 嗯,试过了。似乎没有工作。没有给我任何结果。