1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
-
|
|
!
-
!
-
!
-
|
|
|
|
!
| from gps3 import gps3
import math
class pico_wiki_bot:
gps_time="n/a_"
gps_lat="n/a_"
gps_lon="n/a_"
gps_alt="n/a_"
gps_speed="n/a_"
def __init__(self):
self.gps_thread=threading.Thread(target=self.start_gps)
print('new thread, start gps_thread')
print('self.gps_thread.start()')
self.gps_thread.start()
print('script_started.')
def start_gps(self):
print('start_gps')
try:
gps_socket = gps3.GPSDSocket()
data_stream = gps3.DataStream()
gps_socket.connect()
gps_socket.watch()
for new_data in gps_socket:
if new_data:
data_stream.unpack(new_data)
self.gps_time=data_stream.TPV['time']
self.gps_lat=data_stream.TPV['lat']
self.gps_lon=data_stream.TPV['lon']
self.gps_alt=data_stream.TPV['alt']
self.gps_speed=data_stream.TPV['speed']
except Exception as e:
import traceback
traceback.print_exc()
print(e)
print('error')
return
def geo_distance(self,lat_1,lon_1, lat_2, lon_2): if type(lat_1) is str:
return "n/a"
if type(lon_1) is str:
return "n/a"
if type(lat_2) is str:
return "n/a"
if type(lon_2) is str:
return "n/a"
pole_radius = 6356752.314245 equator_radius = 6378137.0
da1r=lat_1*3.1415926535/180.0
do1r=lon_1*3.1415926535/180.0
da2r=lat_2*3.1415926535/180.0
do2r=lon_2*3.1415926535/180.0
lat_difference = da1r - da2r lon_difference = do1r - do2r lat_average = (da1r + da2r) / 2.0
e2 = (pow(equator_radius, 2) - pow(pole_radius, 2)) / pow(equator_radius, 2)
w = math.sqrt(1- e2 * pow(math.sin(lat_average), 2))
m = equator_radius * (1 - e2) / pow(w, 3)
n = equator_radius / w
distance = math.sqrt(pow(m * lat_difference, 2) + pow(n * lon_difference * math.cos(lat_average), 2)) print('distance={:f}'.format(distance))
return distance
|