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