模拟生成GGA数据

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 31 09:25:15 2018

@author: ruofei
"""

from __future__ import division
import sys,time
import numpy as np
import datetime
from math import sqrt
#模块导入,其中from __future__ import division一定要放在程序最前面声明

'''
一些参数的声明赋值
'''

InitiatingCharacter='GPGGA'
#定义起始引导符和语句格式说明
#UTC=input("UTC时间"+"("+"其格式为hhmmss.sss"+"):")
#UTC=121212.222
m = '>'
#进度条格式为>

#输入世界时间
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')




#接受用户输入的点坐标信息
print("*********************************************************************************************")
print("************************************GGA数据模拟*************************************")
print("输出GPGGA数据之前的准备,需要输入一些数据")
#提示用户需要输入的参数





Tim=input("请输入行走的时间(以秒为单位):")
Tim=int(Tim)

Frequency=input("请输入每秒定位的次数:")

Frequency=int(Frequency)
#将输入的字符强制转换为数字
num=Tim*Frequency


passing_point_num=input("请输入经过点的个数:")
print("请输入这"+passing_point_num+"点的坐标:")
passing_point_num=int(passing_point_num)
#将这个点数类型从字符型转换为整型

Coordinate_set=np.zeros((passing_point_num,2))
for i in range(0,passing_point_num):
    x=input("请输入第"+str(i+1)+"个点的经度坐标")
    y=input("请输入第"+str(i+1)+"个点的纬度坐标")
    Coordinate_set[i][0]=x
    Coordinate_set[i][1]=y
    
#将用户输入的点储存在Coordinate中  
print("你输入所有点的集合为:")
print(Coordinate_set)





def Computational_distance(x1,x2,y1,y2):
    
    s=sqrt( (x1-x2  )**2+(y1-y2)**2)
    
    return s
#建立函数计算两点之间的距离




temp_l=[]
distance_all=0

#总的路程
for i in range(0,passing_point_num-1):
    length=Computational_distance(Coordinate_set[i][0],Coordinate_set[i+1][0],Coordinate_set[i][1],Coordinate_set[i+1][1])
    temp_l.append(length)
    distance_all=distance_all+length
    
#将计算得到的两个点之间的距离的一些数值储存在temp_l中   
#将总的长度储存在distance_all
#print("每两个点之间的距离:")   
#print(temp_l)
#print("总的路程:")
#print(distance_all)




length_all=[]
#创建一个列表用来储存按每段距离分配的数据数,即两个点之间的距离需要定位几次,产生多少数据

for j in range(0,passing_point_num-1):
    dd=(temp_l[j]/distance_all)*num 
   # print("分配的定位数:"+str(dd))
    #之前设置的定位总次数80
   # print("各段路程所占比重"+str(temp_l[j]/distance_all))
    length_all.append(dd)
    
#print("分配定位数的列表")    
#print(length_all)




def c(x1,y1,x2,y2,number):
    
#print(x1,x2,y1,y2)
    x1=float(x1)
    x2=float(x2)
    y1=float(y1)
    y2=float(y2)
    number=int(number)
    
    #print(k)
    
    #print(b)

#根据起始坐标求出斜率和截距

#创建了直线函数表达式

#判断两点的相对位置


    locationset = np.zeros((number,2))


    if x1<x2 and y1<y2 :
    
        x_distance=x2-x1
        y_distance=y2-y1
    #计算x,y坐标间跨度
    
        x_interval=x_distance/number
        y_interval=y_distance/number
    #计算每次定位之后位置间的距离间隔

   
        for i in range(0,number):
        
        
            locationset[i][0]=x1+(i-1)*x_interval
            locationset[i][1]=y1+(i-1)*y_interval


    if x1<x2 and y1>y2 :
    
        x_distance=x2-x1
        y_distance=y1-y2
    #计算x,y坐标间跨度
    
        x_interval=x_distance/number
        y_interval=y_distance/number
    #计算每次定位之后位置间的距离间隔

    
    
        for i in range(0,number):
        
        
            locationset[i][0]=x1+(i-1)*x_interval
            locationset[i][1]=y1-(i-1)*y_interval
        
        
    if x1>x2 and y1>y2 :
        
    
        x_distance=x1-x2
        y_distance=y1-y2
    #计算x,y坐标间跨度
    
        x_interval=x_distance/number
        y_interval=y_distance/number
    #计算每次定位之后位置间的距离间隔

    
        for i in range(0,number):
            
        
        
            locationset[i][0]=x1-(i-1)*x_interval
            locationset[i][1]=y1-(i-1)*y_interval
        
        
        
    if x1>x2 and y1<y2 :
        
        x_distance=x1-x2
        y_distance=y2-y1
    #计算x,y坐标间跨度
    
        x_interval=x_distance/number
        y_interval=y_distance/number
    #计算每次定位之后位置间的距离间隔

    
    
        for i in range(0,number):
        
        
            locationset[i][0]=x1-(i-1)*x_interval
            locationset[i][1]=y1+(i-1)*y_interval
        
        
        #print(a.shape[1])
    #print("输出x_interval的值"+str(x_interval))
    return locationset


position=[]

#创建一个名为position的列表,用来储存所有位置坐标
for i in range(0,passing_point_num-1):
    n=int(length_all[i])
    temp=c(Coordinate_set[i][0],Coordinate_set[i][1],Coordinate_set[i+1][0],Coordinate_set[i+1][1],n)
    #这里调用c函数计算每两个点之间生成的坐标
    
    position.append(temp)
    
    #将他们复制到一个列表中

'''
之后将他们整理到一个二维数组中保存
'''
temp_1=np.zeros((temp.shape[0],2))

temp_1=position[0]
#print(temp_1)
for i in range(1,len(position)):
    temp_1=np.vstack((temp_1,position[i]))
    
Fold_position_coordinate_set=temp_1   
    
    
#print(Fold_position_coordinate_set)

#最终将生成的矩阵放在Fold_position中



#将输入的字符强制转换为数字

time_list=[]
#创建空数组用于储存时间数据

Freque=float(1.0/Frequency)
#计算定位一次用的时间

#print(Freque)
#输出定位一次用的时间,单位秒

for i in range(0,Tim):
    for j in range(0,Frequency):
        t =datetime.datetime.today()
    #获得系统开始运行的时间
    
    
        second = t.second + t.microsecond * 0.000001
        
        
        minute = t.minute + second / 60
        hour = t.hour + minute / 60
        #获得时分秒的数字
        
        
        minute=int(minute)
        
        minute = '%02d' % minute
        
        
        hour=int(hour)
        
        hour='%02d' % hour
        #print(hour)
        second=round(second,2)
        #对数字进行位数处理,取整,小数位截取
        
        
        
        
        if second<10:
            tim_str=str(hour)+str(minute)+'0'+str(second)
        else:
       
            tim_str=str(hour)+str(minute)+str(second)
    
        
        time_list.append(tim_str)
        
        #将产生的时间添加到列表中
        m += '>'
        #print(tim_str)
        
        #进度条的计算
        sys.stdout.write(str(int(((i+1)/Tim)*100))+'%  ||'+m+'->'+"\n"+"\r")
    #刷新进度条
        sys.stdout.flush()
        #print(tim_str)
    
        time.sleep(Freque)
        
        #时间延迟
        
#print (time_list)




        
        


filename1=("经纬度坐标.txt")



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

filename2=("经纬度坐标标准格式.txt")

c=''
with open(filename2,'w') as file_object:
    
    for i in range(0,Fold_position_coordinate_set.shape[0]):
    
        file_object.write("{"+'"'+"lng"+'"'+":"+str(Fold_position_coordinate_set[i][1])+","+'"'+"lat"+'"'+":"+str( Fold_position_coordinate_set[i][0])+"}"+","+"\n")         
        c=c+"{"+'"'+"lng"+'"'+":"+str(Fold_position_coordinate_set[i][1])+","+'"'+"lat"+'"'+":"+str( Fold_position_coordinate_set[i][0])+"}"+","+"\n"






Lat=[]
for i in range(0,Fold_position_coordinate_set.shape[0]):
    
    
    
    Lat.append(Fold_position_coordinate_set[i][0])
Lon=[]   
for i in range(0,Fold_position_coordinate_set.shape[0]):
    
    
    
    Lon.append(Fold_position_coordinate_set[i][1])
 
#print(Lon)


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





for j in range(0,Fold_position_coordinate_set.shape[0]):
    Latitudinal=Lat[j]
    Longitude=Lon[j]
    UTC=time_list[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("zheli")
    #print(list)
    li=[]
    list_len=len(list)
    for i in range(0,list_len):
        li.append(list[i])
        li.append(',')
        
    del li[-1]
        
    #print (li)
        

      

#列出所有数据的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(li[0])
    #print(ASCII_conversion(li[0]))
#测试输出第一个参数的ascii码


    asci=[]
#定义一个空数组asci,用于储存所有参数的ascii码
    for parameter in li:
        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,len(a)):
        
            sum=sum^a[i]
        
        return sum

    XOR_check_sum=calulatian(ascii_1)
    XOR_check_sum=hex(XOR_check_sum)
    XOR_check_sum=str(XOR_check_sum)
    XOR_check_sum=XOR_check_sum[2]+XOR_check_sum[3]
    
    #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)
    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=("GGA.txt")
#生成一个gga格式的文件


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

f=open("生成html用到的数据.txt",'r')
lines=f.readlines()


lines[58]=c
f = open('坐标展示.html','w')
f.writelines(lines)
f.close()

print("模拟数据生成完毕")
print("*****************************************************")
print("*****************************************************")
print("生成的文件介绍:")
print("GGA.TXT-------------------模拟的GGA数据     ")
print("坐标展示.html------------------在地图中标记模拟的位置")
print("经纬度坐标.txt------------------生成的位置坐标")

猜你喜欢

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