首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -函数正常工作,直到我尝试使用while循环和数据库来定义输入变量。

PHP -函数正常工作,直到我尝试使用while循环和数据库来定义输入变量。
EN

Stack Overflow用户
提问于 2016-05-26 19:42:28
回答 1查看 37关注 0票数 0

基本上,我试图找出一个特定的“中心城市”与该州所有其他城市之间的距离(以英里为单位)。所以我取一个城市,找出这一个城市和多个城市之间的多个距离。

我使用Haversine函数,当我简单地给每个变量分配一个纬度和经度时,它会产生正确的结果,如下所示。然而,当我从数据库中检索到多纬度和经度时,距离结果从0到300范围到4,500-5,000范围非常接近。

代码语言:javascript
复制
//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循环:

代码语言:javascript
复制
// 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 --变量被精确地回显,但是函数的结果是不准确的?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-26 19:57:28

在调用函数时,您使用了$lng而不是$lon,而$lon没有定义,因此它被传递为0--导致计算不准确。抄录自上:

代码语言:javascript
复制
$lon = $row2['lon'];
$distance = haversineGreatCircleDistance($center_lat, $center_lng, $lat, $lng, 3961);

打字,伙计。打字。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37469682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档