Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 南华早报_Php_Nan - Fatal编程技术网

Php 南华早报

Php 南华早报,php,nan,Php,Nan,我有一个计算两个GPS坐标之间距离的函数。然后,我从数据库中获取所有坐标,并对它们进行循环,以获得当前坐标和前一坐标之间的距离,然后将其添加到特定GPS设备的阵列中。出于某种原因,这是一种回归。我尝试将其转换为双精度整数,并将数字四舍五入 以下是我的PHP代码: function distance($lat1, $lon1, $lat2, $lon2) { $lat1 = round($lat1, 3); $lon1 = round($lon1, 3); $l

我有一个计算两个GPS坐标之间距离的函数。然后,我从数据库中获取所有坐标,并对它们进行循环,以获得当前坐标和前一坐标之间的距离,然后将其添加到特定GPS设备的阵列中。出于某种原因,这是一种回归。我尝试将其转换为双精度整数,并将数字四舍五入

以下是我的PHP代码:

function distance($lat1, $lon1, $lat2, $lon2) {
      $lat1 = round($lat1, 3);
      $lon1 = round($lon1, 3);
      $lat2 = round($lat2, 3);
      $lon2 = round($lon2, 3);
      $theta = $lon1 - $lon2; 
      $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
      $dist = acos($dist); 
      $dist = rad2deg($dist); 
      $miles = $dist * 60 * 1.1515;
      if($miles < 0) $miles = $miles * -1;
      return ($miles * 1.609344);  
}
$this->db->query("SELECT * FROM `gps_loc` WHERE `imeiN`='" . $sql . "' AND `updatetime`>=$timeLimit ORDER BY `_id` DESC");
    $dist = array();
    $dist2 = array();
    while($row = $this->db->getResults()) {
        $dist2[$row['imeiN']] = 0;
        $dist[$row['imeiN']][]["lat"] = $row['lat'];
        $dist[$row['imeiN']][count($dist[$row['imeiN']]) - 1]["lng"] = $row['lon'];
    }

    foreach($dist as $key=>$d) {
        $a = 0;
        $b = 0;
        foreach($dist[$key] as $n) {
            if($a > 0) {
                $dist2[$key] += $this->distance($n['lat'], $n['lng'], $dist[$key][$a - 1]['lat'], $dist[$key][$a - 1]['lng']);
            }
            $a++;
        }

    }
    echo json_encode($dist2);
功能距离($lat1、$lon1、$lat2、$lon2){
$lat1=圆形($lat1,3);
$lon1=圆形($lon1,3);
$lat2=圆形($lat2,3);
$lon2=圆形($lon2,3);
$theta=$lon1-$lon2;
$dist=sin(deg2rad($lat1))*sin(deg2rad($lat2))+cos(deg2rad($lat1))*cos(deg2rad($lat2))*cos(deg2rad($theta));
$dist=acos($dist);
$dist=rad2deg($dist);
$miles=$dist*60*1.1515;
如果($miles<0)$miles=$miles*-1;
返回(英里*1.609344);
}
$this->db->query(“从`gps\u loc`中选择*,其中`imeiN`=''.$sql.”和`updatetime`>=$timeLimit ORDER BY``u id`DESC”);
$dist=array();
$dist2=数组();
而($row=$this->db->getResults()){
$dist2[$row['imeiN']]=0;
$dist[$row['imeiN'][[“lat”]=$row['lat'];
$dist[$row['imeiN']][count($dist[$row['imeiN']])-1][“lng”]=$row['lon'];
}
foreach($key=>d){
$a=0;
$b=0;
foreach($dist[$key]作为$n){
如果($a>0){
$dist2[$key]+=$this->distance($n['lat'],$n['lng'],$dist[$key][$a-1]['lat'],$dist[$key][$a-1]['lng']);
}
$a++;
}
}
echo json_编码($dist2);
sin()
cos()
的范围介于-1和1之间。因此,在第一次计算
$dist
时,结果范围为-2到2。然后将其传递给
acos()
,其参数必须介于-1和1之间。因此,
acos(2)
例如给出了NaN。从那里得到的其他东西也给了南

我不确定公式应该是什么,但那就是你的NaN的来源。仔细检查三角函数。

sin()
cos()
的范围介于-1和1之间。因此,在第一次计算
$dist
时,结果范围为-2到2。然后将其传递给
acos()
,其参数必须介于-1和1之间。因此,
acos(2)
例如给出了NaN。从那里得到的其他东西也给了南


我不确定公式应该是什么,但那就是你的NaN的来源。仔细检查三角函数。

从数据库中提取的值可能是字符串,这可能会导致此问题


您可能还需要检查Kolink在其帖子中提出的问题。

您从数据库中提取的值可能是字符串,这可能会导致此问题


您可能还想检查一下Kolink在其帖子中提出的问题。

您使用的是余弦球面定律吗?我想换成哈弗森公式:

function distance($lat1, $lon1, $lat2, $lon2) 
{  
    $radius = 3959;  //approximate mean radius of the earth in miles, can change to any unit of measurement, will get results back in that unit

    $delta_Rad_Lat = deg2rad($lat2 - $lat1);  //Latitude delta in radians
    $delta_Rad_Lon = deg2rad($lon2 - $lon1);  //Longitude delta in radians
    $rad_Lat1 = deg2rad($lat1);  //Latitude 1 in radians
    $rad_Lat2 = deg2rad($lat2);  //Latitude 2 in radians

    $sq_Half_Chord = sin($delta_Rad_Lat / 2) * sin($delta_Rad_Lat / 2) + cos($rad_Lat1) * cos($rad_Lat2) * sin($delta_Rad_Lon / 2) * sin($delta_Rad_Lon / 2);  //Square of half the chord length
    $ang_Dist_Rad = 2 * asin(sqrt($sq_Half_Chord));  //Angular distance in radians
    $distance = $radius * $ang_Dist_Rad;  

    return $distance;  
}  

你应该能够将地球的半径改变为任何形式的测量,从光年半径到纳米半径,并得到所用单位的正确数字。

你使用的是余弦球面定律吗?我想换成哈弗森公式:

function distance($lat1, $lon1, $lat2, $lon2) 
{  
    $radius = 3959;  //approximate mean radius of the earth in miles, can change to any unit of measurement, will get results back in that unit

    $delta_Rad_Lat = deg2rad($lat2 - $lat1);  //Latitude delta in radians
    $delta_Rad_Lon = deg2rad($lon2 - $lon1);  //Longitude delta in radians
    $rad_Lat1 = deg2rad($lat1);  //Latitude 1 in radians
    $rad_Lat2 = deg2rad($lat2);  //Latitude 2 in radians

    $sq_Half_Chord = sin($delta_Rad_Lat / 2) * sin($delta_Rad_Lat / 2) + cos($rad_Lat1) * cos($rad_Lat2) * sin($delta_Rad_Lon / 2) * sin($delta_Rad_Lon / 2);  //Square of half the chord length
    $ang_Dist_Rad = 2 * asin(sqrt($sq_Half_Chord));  //Angular distance in radians
    $distance = $radius * $ang_Dist_Rad;  

    return $distance;  
}  

您应该能够将地球半径更改为任何形式的测量,从光年半径更改为纳米半径,并根据所使用的单位重新计算出正确的数字。

如果点之间的距离太近,algo将生成NaN。在这种情况下,$dist的值为1。acos(1)是NaN。所有的太阳序列计算也会产生NaN。
第一步是对坐标进行舍入,因此舍入后更可能使值相等,并产生NaN

如果点彼此太近,则算法将产生NaN。在这种情况下,$dist的值为1。acos(1)是NaN。所有的太阳序列计算也会产生NaN。
第一步是对坐标进行四舍五入,因此四舍五入后更可能使值相等,并生成NaN

,感谢这里的所有响应-因此,我制作了一个函数,将计算和测试结合在一起,如果两者都不是NaN-它将计算平均,如果一个为NaN,另一个为非NaN-它使用有效的坐标,并为计算失败的坐标提供错误报告:

function distance_slc($lat1, $lon1, $lat2, $lon2) {
        $earth_radius = 3960.00; # in miles
        $distance  = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon2-$lon1)) ;
        $distance  = acos($distance);
        $distance  = rad2deg($distance);
        $distance  = $distance * 60 * 1.1515;
        $distance1  = round($distance, 4);

        // use a second method as well and average          
        $radius = 3959;  //approximate mean radius of the earth in miles, can change to any unit of measurement, will get results back in that unit
    $delta_Rad_Lat = deg2rad($lat2 - $lat1);  //Latitude delta in radians
    $delta_Rad_Lon = deg2rad($lon2 - $lon1);  //Longitude delta in radians
    $rad_Lat1 = deg2rad($lat1);  //Latitude 1 in radians
    $rad_Lat2 = deg2rad($lat2);  //Latitude 2 in radians

    $sq_Half_Chord = sin($delta_Rad_Lat / 2) * sin($delta_Rad_Lat / 2) + cos($rad_Lat1) * cos($rad_Lat2) * sin($delta_Rad_Lon / 2) * sin($delta_Rad_Lon / 2);  //Square of half the chord length
    $ang_Dist_Rad = 2 * asin(sqrt($sq_Half_Chord));  //Angular distance in radians
    $distance2 = $radius * $ang_Dist_Rad;  
        //echo "distance=$distance and distance2=$distance2\n";
    $avg_distance=-1;
    $distance1=acos(2);
        if((!is_nan($distance1)) && (!is_nan($distance2))){
            $avg_distance=($distance1+$distance2)/2;
        } else {
            if(!is_nan($distance1)){
                $avg_distance=$distance1;
                try{
                    throw new Exception("distance1=NAN with lat1=$lat1 lat2=$lat2 lon1=$lon1 lon2=$lon2");
                } catch(Exception $e){
                    trigger_error($e->getMessage());
                    trigger_error($e->getTraceAsString());
                }
            }
            if(!is_nan($distance2)){
                $avg_distance=$distance2;
                try{
                    throw new Exception("distance1=NAN with lat1=$lat1 lat2=$lat2 lon1=$lon1 lon2=$lon2");
                } catch(Exception $e){
                    trigger_error($e->getMessage());
                    trigger_error($e->getTraceAsString());
                }
            }
        }
        return $avg_distance;
}

HTH未来也会有人。

感谢这里的所有回复-因此我制作了一个函数,该函数将计算和测试结合在一起,如果两者都不是NaN-则计算平均值,如果一个为NaN,另一个为非NaN-它使用有效的坐标,并为计算失败的坐标提供错误报告:

function distance_slc($lat1, $lon1, $lat2, $lon2) {
        $earth_radius = 3960.00; # in miles
        $distance  = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon2-$lon1)) ;
        $distance  = acos($distance);
        $distance  = rad2deg($distance);
        $distance  = $distance * 60 * 1.1515;
        $distance1  = round($distance, 4);

        // use a second method as well and average          
        $radius = 3959;  //approximate mean radius of the earth in miles, can change to any unit of measurement, will get results back in that unit
    $delta_Rad_Lat = deg2rad($lat2 - $lat1);  //Latitude delta in radians
    $delta_Rad_Lon = deg2rad($lon2 - $lon1);  //Longitude delta in radians
    $rad_Lat1 = deg2rad($lat1);  //Latitude 1 in radians
    $rad_Lat2 = deg2rad($lat2);  //Latitude 2 in radians

    $sq_Half_Chord = sin($delta_Rad_Lat / 2) * sin($delta_Rad_Lat / 2) + cos($rad_Lat1) * cos($rad_Lat2) * sin($delta_Rad_Lon / 2) * sin($delta_Rad_Lon / 2);  //Square of half the chord length
    $ang_Dist_Rad = 2 * asin(sqrt($sq_Half_Chord));  //Angular distance in radians
    $distance2 = $radius * $ang_Dist_Rad;  
        //echo "distance=$distance and distance2=$distance2\n";
    $avg_distance=-1;
    $distance1=acos(2);
        if((!is_nan($distance1)) && (!is_nan($distance2))){
            $avg_distance=($distance1+$distance2)/2;
        } else {
            if(!is_nan($distance1)){
                $avg_distance=$distance1;
                try{
                    throw new Exception("distance1=NAN with lat1=$lat1 lat2=$lat2 lon1=$lon1 lon2=$lon2");
                } catch(Exception $e){
                    trigger_error($e->getMessage());
                    trigger_error($e->getTraceAsString());
                }
            }
            if(!is_nan($distance2)){
                $avg_distance=$distance2;
                try{
                    throw new Exception("distance1=NAN with lat1=$lat1 lat2=$lat2 lon1=$lon1 lon2=$lon2");
                } catch(Exception $e){
                    trigger_error($e->getMessage());
                    trigger_error($e->getTraceAsString());
                }
            }
        }
        return $avg_distance;
}

HTH将来也会有人。

你能更详细地说明什么时候出错了吗?你确定从数据库中得到的值是数字而不是字符串吗?我建议在距离()公式的每个阶段输入调试输出,准确地找出nan产生的位置。这行代码看起来确实很有趣:
$dist[$row['imeiN']][][“lat”]=美元行[“lat”]--解释器如何知道如何处理这组空的
[]
数组索引?我很惊讶它并没有马上退出。@sarnold这是一个正常的PHP附加功能。然后,他让伯爵()知道了印度,这是丑陋的。一个非常简单的方法是使用计数器,他必须使用层…你能更详细地说明什么时候出错了吗?你确定你从数据库中得到的值是数字而不是字符串吗?我建议在distance()公式的每个阶段输入调试输出,弄清楚nan是在哪里产生的。这一行看起来确实很有趣:
$dist[$row['imeiN']][“lat”]=$row['lat']--解释器如何知道如何处理这组空的
[]
数组索引?我是苏