我想根据我的数据库数据中请求的lat和lon找到最近的位置。 我的代码结果很困惑,它的距离是对还是错?
$lat= mysql_real_escape_string($_REQUEST['lat']);
$lng= mysql_real_escape_string($_REQUEST['lon']);
$multiplier = 112.12;
$distance = 20;
$sql=" SELECT beach.id,county.title,municipality.title,beach.beach_name,beach.description,beach.latitude,beach.longitude,beach.rainfall,beach.temperature,beach.status_id,beach.status_details,beach.notice, (SQRT(POW((beach.latitude - $lat), 2) + POW((beach.longitude - $lng), 2)) * $multiplier) AS distance
from beach as beach,county as county,municipality as municipality where beach.county_id=county.id and beach.municipality_id=municipality.id and POW((beach.latitude - $lat), 2) + POW((beach.longitude - $lng), 2) < POW(($distance / $multiplier), 2) ORDER BY distance ASC LIMIT 0 , 3";
答案 0 :(得分:0)
两个任意点之间(大圆)距离的正确函数是一个比你使用的更复杂的公式。
假设“最近的海滩”意味着
A)不在北极或南极附近
B)不是很远
C)如果你有两个非常相似的距离你就不在乎你是否得到了“错误的”
然后你可以使用类似于你正在使用的方程,但有一些修正。
具体而言,您的公式需要两个因素。一个因素(你的multiplier
从度数转换为公里(或英里)。另一个因素说明两个经度点之间的距离是纬度的函数。在下面的代码中我将这两个因素称为{ {1}}(距离)和$dmult
(纬度修正)。
简单示例:
$lmult
参见http://phpfiddle.org/lite/code/9j6-iet的示例。它给出了大约136公里的距离。如果你想要以英里为单位的距离,你可以定义
<?php
$lat = 45;
$lon = 72;
$lat2 = 46;
$lon2 = 73;
$lmult = cos($lat * pi() / 180.0);
$dmult = 40000 / 360; // circumference of earth in km divided by 360 degrees
$dist = $dmult * sqrt(pow($lmult *($lon-$lon2),2) + pow($lat-$lat2,2));
echo "The distance between these points is approximately".$dist."\n";
?>
将结果(136公里)与“准确”在线计算器进行比较:
http://boulter.com/gps/distance/?from=N+45+0.0+W+72+0.0&to=N+46+0.0++W+73+0.0&units=k
这给出了$dmult = 24900 / 360; // circumference in miles divided by 360 degrees
km的值 - 足够靠近海滩工作......
注意 - 随着距离变大,上述计算的结果将变得更加不准确,因为它没有完全考虑到地球的曲率。
如果您需要帮助我将其放入您的查询中,请告诉我 - 它应该非常简单。
编辑看起来您似乎没有将变量的值连接到查询字符串中 - 换句话说,您看起来像“135.9
”这样的内容应该在哪里有“$multiplier
”。您希望在执行之前检查查询字符串。将其分配给变量(就像你一样),然后将其打印出来。