错误地生成GGA数据

一、GGA数据内容

GPS固定数据输出语句($GPGGA)

GGA为GPS定位的主要数据,也是应用最为广泛的数据。

其数据格式为17个字段:

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx<CR><LF>

 分别为语句标识头,世界时间,纬度,纬度半球,经度,精度半球,定位质量指示,使用卫星数量,水平精确度,海拔高度,高度位置,大地水准平面高度,高度单位,差分GPS数据期限,查分参考基站标号,校验和结束标记,用14个逗号分隔。

其数据具体含义为

1.png

2.png


二、生成一行GGA数据

# -*- coding: utf-8 -*-
"""
Created on Fri Jul 27 10:11:47 2018

@author: syn.van
"""



print("输出GPGGA数据之前的准备,需要输入一些默认数据")
#提示用户需要输入的参数
InitiatingCharacter='GPGGA'
#定义起始引导符和语句格式说明
UTC=input("UTC时间"+"("+"其格式为hhmmss.sss"+"):")
#输入世界时间
Latitudinal=0
LatitudinalHemisphere=input("维度半球"+"("+"N/S"+"):")
#输入纬度半球

Longitude=0
LongitudeHemisphere=input("经度半球"+"("+"W/E"+"):")
#输入精度半球



#其余变量设置为默认值

Positioning_quality=1
#设置定位质量,0=定位无效,1=定位有效

Satellite_number=5
#设置卫星数量,0-12

Horizontal_precision=50

#水平精确度  0.5-99.9

Antenna_height=0

#设置天线离海拔高度 -9999.9-9999.9米

Antenna_height_unit='M'
#设置天线高度单位

GeodeticLevelPlaneHeight=0
#设置大地水准平面高度  -9999.9-9999.97
GeodeticLevelPlaneHeigh_unit='M'

#设置大地水准平面高度单位

GPS_deadline=1
#从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空

base_station=str('0001')




#差分基站标号  0000-1023  其中首位0也会被传输

XOR_check_sum=0

#计算从$开始到*之间所有ascii的抑或校验和



#将以上数据放置到一个列表中
list_1=[InitiatingCharacter,UTC,Latitudinal,LatitudinalHemisphere,Longitude,LongitudeHemisphere,Positioning_quality,]
list_2=[Satellite_number,Horizontal_precision,Antenna_height,Antenna_height_unit,GeodeticLevelPlaneHeight,GeodeticLevelPlaneHeigh_unit]
list_3=[GPS_deadline,base_station,]


list=list_1+list_2+list_3

#合并这三个列表
print("生成所有参数的列表:")
print(list)

#列出所有数据的ascii码,从$到
def ASCII_conversion(a):
    a=str(a)
#将数字,字符,符号都强制转换为字符串
    l=len(a)
#得到字符串的长度
    asc=[]
#新建储存字符串ascii码的列表asc
    for i in range(0,l):
        asc.append(ord(a[i]))
        
        #print( a[i] + " 的ASCII 码为", ord(a[i]))
        
        
    return asc
#定义了一个函数将字符转换为ascii


ASCII_conversion(list[0])

print('测试生成第一个参数的ascii码:')
print(ASCII_conversion(list[0]))
#测试输出第一个参数的ascii码


asci=[]
#定义一个空数组asci,用于储存所有参数的ascii码
for parameter in list:
    para=ASCII_conversion(parameter)
    asci.append(para)
  
print("生成所有数据的ascii码。按照参数进行分组:")    
print(asci)
print("查看第一参数的所有ascii码:")

print(asci[1])


ascii_1=[]
for i in asci:
    print(i)
    for j in range(0,len(i)):
        ascii_1.append(i[j])
    
print("按顺序输出一条gga数据中从$到*之间所有字符的ascii码:")   
print(ascii_1)


#计算$到*之间15个参数的异或值,就是计算ascii_1中所有ascii码的异或储存在XOR_check_sum中
def calulatian(a):
    
    sum=a[0]
    for i in range(1,15):
        
        sum=sum^a[i]
        
    return sum

XOR_check_sum=calulatian(ascii_1)
print("输出所有字符异或之后的校验值:")
print(XOR_check_sum)


#所有数据都准备就绪准备输出

list.append('*')
list.append(XOR_check_sum)
list.append('CR')
list.append('LF')



list_new=list
print("生成完整的参数列表:")
print(list_new)


#数据生成正确,写成规定格式
str_a='$'+list_new[0]+','
str_b='<'+str(list_new[1])+'>'+','

for i in range(2,10):
    str_b=str_b  + '<'+str(list_new[i])+'>'+','
    
#print(str_b)

str_c=str(Antenna_height_unit)+','+'<'+str(GeodeticLevelPlaneHeight)+'>'+','
str_d=str(GeodeticLevelPlaneHeigh_unit)+','+'<'+str(GPS_deadline)+'>'+','
str_e='<'+base_station+'>'+'*'+str(XOR_check_sum)+'<'+'CR'+'>'+'<'+'LF'+'>'
str_new=str_a+str_b+str_c+str_d+str_e
#将数据拼接成正确的格式,储存在字符串str_new中,只是一行gga数据。

print("查看输出的标准gga数据:")
print(str_new)

#输出这行数据,查看效果

filename=("C:\\Users\\syn.van\\Desktop\\一行gga数据.gga")
#生成一个gga格式的文件


with open(filename,'w') as file_object:
    file_object.write(str_new+"\n")
    
    
    
#将这一行数据写入1.gga文件中

将生成的一行数据写入文件  ---一行gga数据.gga

程序运行的结果如下:

在这里可以看到程序各个阶段生成数据的形式,以及到最后拼接成gga数据形式的过程。

runfile('C:/Users/syn.van/Desktop/GGA数据生成/生成一行gga数据.py', wdir='C:/Users/syn.van/Desktop/GGA数据生成')
输出GPGGA数据之前的准备,需要输入一些默认数据

UTC时间(其格式为hhmmss.sss):12

维度半球(N/S):N

经度半球(W/E):W
生成所有参数的列表:
['GPGGA', '12', 0, 'N', 0, 'W', 1, 5, 50, 0, 'M', 0, 'M', 1, '0001']
测试生成第一个参数的ascii码:
[71, 80, 71, 71, 65]
生成所有数据的ascii码。按照参数进行分组:
[[71, 80, 71, 71, 65], [49, 50], [48], [78], [48], [87], [49], [53], [53, 48], [48], [77], [48], [77], [49], [48, 48, 48, 49]]
查看第一参数的所有ascii码:
[49, 50]
[71, 80, 71, 71, 65]
[49, 50]
[48]
[78]
[48]
[87]
[49]
[53]
[53, 48]
[48]
[77]
[48]
[77]
[49]
[48, 48, 48, 49]
按顺序输出一条gga数据中从$到*之间所有字符的ascii码:
[71, 80, 71, 71, 65, 49, 50, 48, 78, 48, 87, 49, 53, 53, 48, 48, 77, 48, 77, 49, 48, 48, 48, 49]
输出所有字符异或之后的校验值:
77
生成完整的参数列表:
['GPGGA', '12', 0, 'N', 0, 'W', 1, 5, 50, 0, 'M', 0, 'M', 1, '0001', '*', 77, 'CR', 'LF']
查看输出的标准gga数据:
$GPGGA,<12>,<0>,<N>,<0>,<W>,<1>,<5>,<50>,<0>,M,<0>,M,<1>,<0001>*77<CR><LF>

然后在桌面找到这个gga文件,选择notepad++打开

N1I_H@[L`$T2V(77IG4}4%5.png 三、在上一步基础上考虑生成两行/多行数据

和上一步生成一行GGA数据的不同点在于,需要改变的量的值不由程序内部定义为确定的数字,而是将要读取的数据,储存在一个预定好的数组中,比如在这些数据中其他的参数均为固定值,而变化的参数只有经度和纬度为变化的量,那么改变这些量的赋值方式,其得到的值由程序中的二维数组储存,这样数组的来源就可以由自己设定,或者是外部生成。而且利用数组之后产生数据也将增多,原理就是将上一步程序中对数据的处理方式遍历数组中的每一项即可。

这里用2*2的数组进行举例说明,当二维数组成功之后,更多维度,更多参数的修改也就更加方便

    
    
# -*- coding: utf-8 -*-
"""
Created on Fri Jul 27 16:52:58 2018

@author: syn.van
"""


#print("输出GPGGA数据之前的准备,需要输入一些默认数据")
#提示用户需要输入的参数
InitiatingCharacter='GPGGA'
#定义起始引导符和语句格式说明
#UTC=input("UTC时间"+"("+"其格式为hhmmss.sss"+"):")
#输入世界时间
UTC=123422.11
Latitudinal=0
#LatitudinalHemisphere=input("维度半球"+"("+"N/S"+"):")
#输入纬度半球
LatitudinalHemisphere='N'
Longitude=0
#LongitudeHemisphere=input("经度半球"+"("+"W/E"+"):")
#输入精度半球
LongitudeHemisphere='E'


#其余变量设置为默认值

Positioning_quality=1
#设置定位质量,0=定位无效,1=定位有效

Satellite_number=5
#设置卫星数量,0-12

Horizontal_precision=50

#水平精确度  0.5-99.9

Antenna_height=0

#设置天线离海拔高度 -9999.9-9999.9米

Antenna_height_unit='M'
#设置天线高度单位

GeodeticLevelPlaneHeight=0
#设置大地水准平面高度  -9999.9-9999.97
GeodeticLevelPlaneHeigh_unit='M'

#设置大地水准平面高度单位

GPS_deadline=1
#从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空

base_station=str('0001')



import numpy as np
n = np.array([[1,2],[2,3]])
#定义了一个经纬度的二维数组

print(n[1])
print(n[1][1])

Lat=[]
for i in range(0,2):
    
    
    
    Lat.append(n[i][0])
Lon=[]   
for i in range(0,2):
    
    
    
    Lon.append(n[i][1])
 
print(Lon)


#将经纬度Latitudinal,和 Longitude从中读取数组中的值。
str_list=[]


for j in range(0,2):
    Latitudinal=Lat[j]
    Longitude=Lon[j]
    
    
    
    list_1=[InitiatingCharacter,UTC,Latitudinal,LatitudinalHemisphere,Longitude,LongitudeHemisphere,Positioning_quality,]
    list_2=[Satellite_number,Horizontal_precision,Antenna_height,Antenna_height_unit,GeodeticLevelPlaneHeight,GeodeticLevelPlaneHeigh_unit]
    list_3=[GPS_deadline,base_station,]


    list=list_1+list_2+list_3

#合并这三个列表
    print(list)

#列出所有数据的ascii码,从$到
    def ASCII_conversion(a):
        a=str(a)
#将数字,字符,符号都强制转换为字符串
        l=len(a)
#得到字符串的长度
        asc=[]
#新建储存字符串ascii码的列表asc
        for i in range(0,l):
            asc.append(ord(a[i]))
        
        #print( a[i] + " 的ASCII 码为", ord(a[i]))
        
        
        return asc
#定义了一个函数将字符转换为ascii


    ASCII_conversion(list[0])
    print(ASCII_conversion(list[0]))
#测试输出第一个参数的ascii码


    asci=[]
#定义一个空数组asci,用于储存所有参数的ascii码
    for parameter in list:
        para=ASCII_conversion(parameter)
        asci.append(para)
  
    
    print(asci)


    print(asci[1])


    ascii_1=[]
    for i in asci:
        print(i)
        for j in range(0,len(i)):
            ascii_1.append(i[j])
    
    
    print(ascii_1)


#计算$到*之间15个参数的异或值,就是计算ascii_1中所有ascii码的异或储存在XOR_check_sum中
    def calulatian(a):
    
        sum=a[0]
        for i in range(1,15):
        
            sum=sum^a[i]
        
        return sum

    XOR_check_sum=calulatian(ascii_1)

    print(XOR_check_sum)


#所有数据都准备就绪准备输出

    list.append('*')
    list.append(XOR_check_sum)
    list.append('CR')
    list.append('LF')



    list_new=list

    print(list_new)

#数据生成正确,写成规定格式
    str_a='$'+list_new[0]+','
    str_b='<'+str(list_new[1])+'>'+','

    for i in range(2,10):
        str_b=str_b  + '<'+str(list_new[i])+'>'+','
    
    print(str_b)

    str_c=str(Antenna_height_unit)+','+'<'+str(GeodeticLevelPlaneHeight)+'>'+','
    str_d=str(GeodeticLevelPlaneHeigh_unit)+','+'<'+str(GPS_deadline)+'>'+','
    str_e='<'+base_station+'>'+'*'+str(XOR_check_sum)+'<'+'CR'+'>'+'<'+'LF'+'>'
    str_new=str_a+str_b+str_c+str_d+str_e
#将数据拼接成正确的格式,储存在字符串str_new中,只是一行gga数据。


    print(str_new)
    
  
    
    
    str_list.append(str_new)
    print(str_list)

#输出这行数据,查看效果

filename=("C:\\Users\\syn.van\\Desktop\\生成两行gga数据.gga")
#生成一个gga格式的文件


with open(filename,'w') as file_object:
    
    for i in range(0,2):
    
        file_object.write(str(str_list[i])+"\n")
        
    
   









四、生成自己设定路线的GGA数据

在上一步成功生成二行GGA数据之后,接下来生成自己想要的路线的GGA数据,

# -*- coding: utf-8 -*-
"""
Created on Fri Jul 27 17:25:15 2018

@author: syn.van
"""

#print("输出GPGGA数据之前的准备,需要输入一些默认数据")
#提示用户需要输入的参数
InitiatingCharacter='GPGGA'
#定义起始引导符和语句格式说明
#UTC=input("UTC时间"+"("+"其格式为hhmmss.sss"+"):")
#输入世界时间
UTC=123422.11
Latitudinal=0
#LatitudinalHemisphere=input("维度半球"+"("+"N/S"+"):")
#输入纬度半球
LatitudinalHemisphere='N'
Longitude=0
#LongitudeHemisphere=input("经度半球"+"("+"W/E"+"):")
#输入精度半球
LongitudeHemisphere='E'


#其余变量设置为默认值

Positioning_quality=1
#设置定位质量,0=定位无效,1=定位有效

Satellite_number=5
#设置卫星数量,0-12

Horizontal_precision=50

#水平精确度  0.5-99.9

Antenna_height=0

#设置天线离海拔高度 -9999.9-9999.9米

Antenna_height_unit='M'
#设置天线高度单位

GeodeticLevelPlaneHeight=0
#设置大地水准平面高度  -9999.9-9999.97
GeodeticLevelPlaneHeigh_unit='M'

#设置大地水准平面高度单位

GPS_deadline=1
#从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空

base_station=str('0001')


import numpy as np


a1 = np.zeros((100,2)) #建立一个100*2的数组,储存100个转弯点
n=100

a1[0]=(0,0)#首先给起点赋值  

print(a1[0][1])
#首先对横坐标进行处理
a=-3
c=[]
for num in range(1,100):
    b=num
    
    #print(num)
        
    if(b%4==0):
        a=a+4
        c.append(a)
        
        print(a)

d=1
for i in c:
    
    a1[i][0]=10*d
    a1[i+1][0]=10*d
    a1[i+2][0]=-10*d

    a1[i+3][0]=-10*d
    d=d+1
print (a1)   
'''
上面对横坐标进行修改
下面对纵坐标进行修改

'''    
e=1
for i in c:
    
    a1[i+1][1]=10*e
    a1[i+2][1]=10*e
    a1[i+3][1]=-10*e
    a1[i+4][1]=-10*e
   
    e=e+1

a1=np.delete(a1,[98,99],axis=0)

print("a1的大小") 
print (a1.shape)



import numpy as np

Lat=[]
for i in range(0,98):
    
    
    
    Lat.append(a1[i][0])
Lon=[]   
for i in range(0,98):
    
    
    
    Lon.append(a1[i][1])
 
print(Lon)


#将经纬度Latitudinal,和 Longitude从中读取数组中的值。
str_list=[]


for j in range(0,98):
    Latitudinal=Lat[j]
    Longitude=Lon[j]
    
    
    
    list_1=[InitiatingCharacter,UTC,Latitudinal,LatitudinalHemisphere,Longitude,LongitudeHemisphere,Positioning_quality,]
    list_2=[Satellite_number,Horizontal_precision,Antenna_height,Antenna_height_unit,GeodeticLevelPlaneHeight,GeodeticLevelPlaneHeigh_unit]
    list_3=[GPS_deadline,base_station,]


    list=list_1+list_2+list_3

#合并这三个列表
    print(list)

#列出所有数据的ascii码,从$到
    def ASCII_conversion(a):
        a=str(a)
#将数字,字符,符号都强制转换为字符串
        l=len(a)
#得到字符串的长度
        asc=[]
#新建储存字符串ascii码的列表asc
        for i in range(0,l):
            asc.append(ord(a[i]))
        
        #print( a[i] + " 的ASCII 码为", ord(a[i]))
        
        
        return asc
#定义了一个函数将字符转换为ascii


    ASCII_conversion(list[0])
    print(ASCII_conversion(list[0]))
#测试输出第一个参数的ascii码


    asci=[]
#定义一个空数组asci,用于储存所有参数的ascii码
    for parameter in list:
        para=ASCII_conversion(parameter)
        asci.append(para)
  
    
    print(asci)


    print(asci[1])


    ascii_1=[]
    for i in asci:
        print(i)
        for j in range(0,len(i)):
            ascii_1.append(i[j])
    
    
    print(ascii_1)


#计算$到*之间15个参数的异或值,就是计算ascii_1中所有ascii码的异或储存在XOR_check_sum中
    def calulatian(a):
    
        sum=a[0]
        for i in range(1,15):
        
            sum=sum^a[i]
        
        return sum

    XOR_check_sum=calulatian(ascii_1)

    print(XOR_check_sum)


#所有数据都准备就绪准备输出

    list.append('*')
    list.append(XOR_check_sum)
    list.append('CR')
    list.append('LF')



    list_new=list

    print(list_new)

#数据生成正确,写成规定格式
    str_a='$'+list_new[0]+','
    str_b='<'+str(list_new[1])+'>'+','

    for i in range(2,10):
        str_b=str_b  + '<'+str(list_new[i])+'>'+','
    
    print(str_b)

    str_c=str(Antenna_height_unit)+','+'<'+str(GeodeticLevelPlaneHeight)+'>'+','
    str_d=str(GeodeticLevelPlaneHeigh_unit)+','+'<'+str(GPS_deadline)+'>'+','
    str_e='<'+base_station+'>'+'*'+str(XOR_check_sum)+'<'+'CR'+'>'+'<'+'LF'+'>'
    str_new=str_a+str_b+str_c+str_d+str_e
#将数据拼接成正确的格式,储存在字符串str_new中,只是一行gga数据。


    print(str_new)
    
  
    
    
    str_list.append(str_new)
    print(str_list)

#输出这行数据,查看效果

filename=("C:\\Users\\syn.van\\Desktop\\特定路线的gga数据.gga")
#生成一个gga格式的文件


with open(filename,'w') as file_object:
    
    for i in range(0,98):
    
        file_object.write(str(str_list[i])+"\n")
        
    
    
    

这时候我们用notepad++打开生成的特定路线的GGA数据这个文件,可以看到生成的效果为

0I3YCI}8]QF697}LGB_A`%O.png

达到了预期的效果,模拟生成了特定路线下GGA数据的生成。

猜你喜欢

转载自blog.csdn.net/qq_33169543/article/details/81279346
今日推荐