使用PHP实现NMEA0183协议中的GGA语句解析

NMEA0183协议 百恒 2023-02-03 2043
NMEA0183协议是接收机输出定位信息的通用标准之一,其中GGA语句包含了关键的时间、经纬度、定位状态等内容。如何使用PHP实现该数解析功能,接下来由百恒物联技术部工程师向大家介绍实现方法。

NMEA0183协议是接收机输出定位信息的通用标准之一,其中GGA语句包含了关键的时间、经纬度、定位状态等内容

格式:
$GPGGA,134658.00,5106.9792,N,11402.3003,W,2,09,1.0,1048.47,M,-16.27,M,08,AAAA*60




Num 字段 具体内容 格式 示例
1 $GPGGA 记录头 $GPGGA
2 utc 定位时间 hhmmss.ss 134658.00
3 lat 纬度 DDmm.mm 5106.9792
4 lat direction 纬度方向,北纬N或南纬S N
5 lon 经度 DDDmm.mm 11402.300
6 lon direction 经度方向,东经E或西经W W
7 quality 表示定位解的状态,常用有1=单点解,2=伪距差分解,4=RTK固定解,5=RTK浮点解 2
8 # sats 参与定位解算的卫星数 09
9 hdop 水平精度因子 1.0
10 altitude 天线海拔高,相距于平均海水面 1048.47
11 altitude units 天线海拔高单位,M=meters M
12 undulation 大地水准面与参考椭球面的偏差 -16.27
13 undulation units 大地水准面与参考椭球面的偏差单位,M=meters M
14 age 差分时间或龄期,没有差分数据时通常为空 08
15 station ID 差分基站ID AAAA
16 *xx 校验和 *60
17 [CR][LF] 语句中止符 [CR][LF]



解析GPS坐标 protected function dwgps( string $gps = '' )
{ if ( $gps == '' ) return ['success'=>0,'msg'=>'gps data is empty']; try {
        
        $gps  = explode(',',$gps);
        $date = isset($gps[0]) ? $gps[0] : 0; //定位时间 $wd   = isset($gps[1]) ? $gps[1] : ''; //纬 0-90 lat $wd2  = isset($gps[2]) ? $gps[2] : ''; //纬度 (N北纬)(S南纬) $jd   = isset($gps[3]) ? $gps[3] : ''; //经度 0-180 lng $jd2  = isset($gps[4]) ? $gps[4] : ''; //经度 (E东经)(W西经) $state= isset($gps[5]) ? $gps[5] : ''; //0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算 $count= isset($gps[6]) ? $gps[6] : ''; //使用的卫星数量(00 - 12)(前导位数不足则补0) $hdop = isset($gps[7]) ? $gps[7] : ''; //HDOP水平精度因子(0.5 - 99.9) $high = isset($gps[8]) ? $gps[8] : ''; //海拔高度 $unit = isset($gps[9]) ? $gps[9] : ''; //天线海拔高单位 if ( $wd == '' || $jd == '' ) return ['success'=>0,'msg'=>'data is null'];
        $wd = ltrim($wd,'0');
        $jd = ltrim($jd,'0');
        $wdw = explode('.',$wd);
        $wdw1 = $wdw[0];
        $wdw2 = $wdw[1];
        $wd   = intval($wdw1/100) + floatval(($wdw1%100).'.'.$wdw2)/60;
        $jdw  = explode('.',$jd);
        $jdw1 = $jdw[0];
        $jdw2 = $jdw[1];
        $jd	  = intval($jdw1/100) + floatval(($jdw1%100).'.'.$jdw2)/60;
        $res  = ['date'=>$date,'lat'=>(string)$wd,'wd2'=>$wd2,'lng'=>(string)$jd,'jd2'=>$jd2,'state'=>$state,'count'=>$count,'hdop'=>$hdop,'high'=>$high,'unit'=>$unit]; return ['success'=>1,'data'=>$res,'msg'=>''];
    } catch ( \Exception $e ) { return ['success'=>0,'msg'=>'解析失败'];
    }
}



转换GPS坐标 public function changepgsv2( array $list = [] )
{
    $conf   = ['ssl' => ['verify_peer' => false,'verify_peer_name' => false,]];
    $max    = 20;
    $res 	= [];
    $count  = count($list);
    $psize  = ceil($count/$max); for( $i=0;$i<$psize;$i++ ) { $gpsstring = ''; for( $j=($i*$max);$j<($i*$max)+$max;$j++ ) { if ( $j<$count ) { $obj = $list[$j]; $gpsstring .= $obj['lat'].','.$obj['lng'].';'; } } $gpsstring = trim($gpsstring,';'); $url = "https://apis.map.qq.com/ws/coord/v1/translate?locations={$gpsstring}&type=1&key=G7GBZ-WL66U-GKCV5-4O5DP-KPGNO-4XFNG"; $vres = file_get_contents($url,false,stream_context_create($conf)); $vres = json_decode($vres,true); if ( $vres['status'] == 0 ) { foreach( $vres['locations'] as $vk=>$vv ) {
                $res[] = ['lng'=>(string)$vv['lng'],'lat'=>(string)$vv['lat']];
            }
        } if ( $psize >1 ) sleep(1);
    } return $res;
}

百恒物联专业、专注于物联网应用开发物联网综合管控平台开发,欢迎广大用户来电洽谈。
希望本文对广大物联网技术研发人员或从事企业物联网应用开发公司的团队有所帮助,如对此不太理解的,可以与百恒物联研发部联系。文章均为百恒物联原创,转载请注明来自http://www.iotbh.cn/index.php/article/417.html
400-680-9298,0791-88117053
扫一扫关注百恒网络微信公众号
欢迎您的光顾,我们将竭诚为您服务×
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售后服务 售后服务
 
售后服务 售后服务
 
×