基本上,我试图找出一个特定的“中心城市”与该州所有其他城市之间的距离(以英里为单位)。所以我取一个城市,找出这一个城市和多个城市之间的多个距离。
我使用Haversine函数,当我简单地给每个变量分配一个纬度和经度时,它会产生正确的结果,如下所示。然而,当我从数据库中检索到多纬度和经度时,距离结果从0到300范围到4,500-5,000范围非常接近。
//Works as it should
$center_lat = 30.332184;
$center_lng = -81.655651;
$lat = 29.901244;
$lng = -81.312434;
function haversineGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 3961000)
{
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
}
$distance = haversineGreatCircleDistance($center_lat, $center_lng, $lat, $lng, 3961);
print($distance) . "<br/><br/>";
// The output should be between 35-36下面是我的代码--问题似乎来自于第二个SQL查询或while循环:
// This first section works - I also have an input form to get the $_POST['state'] and $_POST['city'] which works fine
if($_SERVER["REQUEST_METHOD"] == "POST") {
$state = $_POST['state'];
$city = $_POST['city'];
$sql = "SELECT DISTINCT lat, lon FROM foodtruck_user WHERE city = '$city' AND state = '$state' LIMIT 1";
$result = mysqli_query($connection, $sql);
while($row = mysqli_fetch_array($result)) {
echo $row['lat'] . "<br/>";
echo $row['lon'] . "<br/><br/>";
$center_lat = $row['lat'];
$center_lng = $row['lon'];
}
// Below is where the I am having the issue...the output from "echo" is accurate, but the calculated $distance is very wrong.
$sql2 = "SELECT DISTINCT lat, lon, city FROM foodtruck_user WHERE state = '$state'";
$result2 = mysqli_query($connection, $sql2);
while($row2 = mysqli_fetch_array($result2)) {
if(!empty($row2['lat']) && !empty($row2['lon']) && !empty($row2['city'])){
echo "Lat: " . $row2['lat'] . " Lon: " . $row2['lon'] . " City: " . $row2['city'] . " center_lat: " . $center_lat . " center_lng: " . $center_lng . " Distance: ";
$lat = $row2['lat'];
$lon = $row2['lon'];
$distance = haversineGreatCircleDistance($center_lat, $center_lng, $lat, $lng, 3961);
print($distance) . "<br/><br/>";
}
}
}下面是一些例子,说明browser...everything中的输出是正确的,除了“距离”--这是我的question...why --变量被精确地回显,但是函数的结果是不准确的?
30.329882
-81.651672
Lat: 30.329882 Lon: -81.651672 City: Jacksonville center_lat: 30.329882 center_lng: -81.651672 Distance: 4749.7501036981 // distance should be 0
Lat: 27.961381 Lon: -82.45972 City: Tampa center_lat: 30.329882 center_lng: -81.651672 Distance: 4816.3124301703
Lat: 26.231529 Lon: -80.12346 City: Pompano Beach center_lat: 30.329882 center_lng: -81.651672 Distance: 4866.2490051465
Lat: 26.113536 Lon: -80.224272 City: Plantation center_lat: 30.329882 center_lng: -81.651672 Distance: 4869.6942811343
Lat: 28.539882 Lon: -81.372668 City: Orlando center_lat: 30.329882 center_lng: -81.651672 Distance: 4799.8575314421
Lat: 26.51747 Lon: -80.083427 City: Boynton Beach center_lat: 30.329882 center_lng: -81.651672 Distance: 4857.9202539164
Lat: 26.249221 Lon: -80.211483 City: Margate center_lat: 30.329882 center_lng: -81.651672 Distance: 4865.7328403355发布于 2016-05-26 19:57:28
在调用函数时,您使用了$lng而不是$lon,而$lon没有定义,因此它被传递为0--导致计算不准确。抄录自上:
$lon = $row2['lon'];
$distance = haversineGreatCircleDistance($center_lat, $center_lng, $lat, $lng, 3961);打字,伙计。打字。
https://stackoverflow.com/questions/37469682
复制相似问题