# -*- 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------------------生成的位置坐标")
模拟生成GGA数据
猜你喜欢
转载自blog.csdn.net/qq_33169543/article/details/81302013
今日推荐
周排行