pavi  0.0
Map Path Viewer
track_loader.bas
Go to the documentation of this file.
1 
9 
10 DECLARE FUNCTION atanh CDECL ALIAS"atanh"(BYVAL AS DOUBLE) AS DOUBLE
11 DECLARE FUNCTION tanh CDECL ALIAS"tanh"(BYVAL AS DOUBLE) AS DOUBLE
12 CONST AS LONG _
13  TILESIZE = 256 _
14 , TILESIZEd2 = 128
15 
16 #INCLUDE ONCE "parser_gpx.bi"
17 #INCLUDE ONCE "parser_nmea.bi"
18 #INCLUDE ONCE "datetime.bi"
19 
20 
21 
29 #DEFINE EXTREM(_V_) _
30  IF _V_ > Mx##_V_ THEN Mx##_V_ = _V_ ELSE IF _V_ < Mn##_V_ THEN Mn##_V_ = _V_
31 
32 
33 
43 FUNCTION lat2pixel(BYVAL V AS float, BYVAL Z AS LONG) AS LONG
44  VAR y = atanh(SIN(V)) * TILESIZE * (1 SHL Z) / PIx2
45  RETURN -INT(y) + ((1 SHL Z) * TILESIZEd2)
46 END FUNCTION
47 
48 
49 
59 FUNCTION lon2pixel(BYVAL V AS float, BYVAL Z AS LONG) AS LONG
60  VAR x = V * TILESIZE * (1 SHL Z) / PIx2
61  RETURN INT(x) + ((1 SHL Z) * TILESIZEd2)
62 END FUNCTION
63 
64 
65 
75 FUNCTION pixel2lon(BYVAL Z AS long, BYVAL X AS LONG) AS float
76  RETURN ((X - (EXP(LN2 * Z) * TILESIZEd2)) * PIx2) _
77  / (TILESIZE * EXP(LN2 * Z))
78 END FUNCTION
79 
80 
81 
91 FUNCTION pixel2lat(BYVAL Z AS long, BYVAL Y AS LONG) AS float
92  VAR lat_m = ((EXP(LN2 * Z) * TILESIZEd2 - Y) * PIx2) _
93  / (TILESIZE * EXP(LN2 * Z))
94  RETURN ASIN(tanh(lat_m))
95 END FUNCTION
96 
97 
98 #DEFINE LOG2(_X_) LOG(_X_) / LN2
99 
100 #DEFINE MIN(V1, V2) IIF(V1 > V2, V2, V1)
101 
102 
103 
117 FUNCTION latlon2zoom CDECL( _
118  BYVAL W AS LONG _
119 , BYVAL H AS LONG _
120 , BYVAL La0 AS float _
121 , BYVAL La1 AS float _
122 , BYVAL Lo0 AS float _
123 , BYVAL Lo1 AS float) AS LONG
124  DIM AS DOUBLE dlon = Lo1 - Lo0
125  dlon = IIF(dlon, LOG2(ABS(W * PIx2 / TILESIZE / dlon)), 20.)
126  DIM AS DOUBLE dlat = atanh(SIN(La1)) - atanh(SIN(La0))
127  dlat = IIF(dlat, LOG2(ABS(H * PIx2 / TILESIZE / dlat)), 20.)
128  RETURN MIN(INT(dlon), INT(dlat))
129 END FUNCTION
130 
131 
132 
145 CONSTRUCTOR TrackLoader(BYVAL Fnam AS CONST ZSTRING PTR)
146  STATIC AS UINTEGER dile = CAST(UINTEGER, -1) SHR 1
147  IF 0 = Fnam ORELSE Fnam[0] = 0 THEN Errr = @"no file name" : EXIT CONSTRUCTOR
148  VAR fnr = FREEFILE
149  IF OPEN(*Fnam FOR INPUT AS fnr) THEN Errr = @"open failed" : EXIT CONSTRUCTOR
150 
151  VAR want = LOF(fnr) : IF 0 = want THEN CLOSE #fnr : Errr = @"no contents" : EXIT CONSTRUCTOR
152  IF want = dile THEN CLOSE #fnr : Errr = @"directory" : EXIT CONSTRUCTOR
153  Buff = ALLOCATE(want+1) : IF 0 = Buff THEN CLOSE #fnr : Errr = @"out of memory" : EXIT CONSTRUCTOR
154  GET #fnr, ,*Buff, want, Byt
155  CLOSE #fnr
156  Buff[Byt + 1] = 0 ' terminate
157 
158  IF UCASE(RIGHT(*Fnam, 4)) = ".GPX" THEN
159  WITH TYPE<GPX>(@THIS)
160  Desc = _
161  Byt & " bytes: " _
162  & .Trk & " track[s] (" & .Seg & " segments[s]), " _
163  & .Pnt & " point[s] (" & .Ext & !" extension[s])\n\n" _
164  & .TiX + .LoX + .LaX + .ElX + .SpX + .AnX & " err/miss: " _
165  & .TiX & " <time>, " _
166  & .LoX & " <lon>, " _
167  & .LaX & " <lat>, " _
168  & .ElX & " <ele>, " _
169  & .SpX & " <g_spd>, " _
170  & .AnX & " <dir>"
171  END WITH
172  ELSE
173  WITH TYPE<NMEA>(@THIS)
174  Desc = _
175  " bytes (file/mem): " & Byt & "/" & Siz & ": " _
176  & .Lin & " lines, " & (Siz \ SIZEOF(TrP)) & " points (" _
177  & .Enr & " error[s])"
178  END WITH
179  END IF
180  IF Siz <= 0 THEN Errr = @"no track points" : EXIT CONSTRUCTOR
181  VAR x = REALLOCATE(Buff, Siz) : IF x THEN Buff = x
182 
183  Az = Siz \ SIZEOF(TrP) - 1
184  V = CAST(TrP PTR, Buff)
185 
186  Mn = V[0]
187  Mx = V[0] : Mx.Tim = V[Az].Tim
188  FOR i AS INTEGER = 1 TO Az
189  WITH V[i]
190  EXTREM(.Lat)
191  EXTREM(.Lon)
192  EXTREM(.Ele)
193  EXTREM(.Spd)
194  EXTREM(.Ang)
195  END WITH
196  NEXT
197 END CONSTRUCTOR
198 
199 DESTRUCTOR TrackLoader()
200  DEALLOCATE(Buff)
201 END DESTRUCTOR
202 
203 
204 
214 FUNCTION TrackLoader.Pixel(BYVAL X AS LONG, BYVAL Y AS LONG, BYVAL Z AS LONG)AS BYTE
215  IF 0 = Az THEN RETURN 1
216  IF Z = CoZo THEN ' simple integer movement
217  IF Co_X = X ANDALSO Co_Y = Y THEN RETURN 0
218  VAR dx = Co_X - X, dy = Co_Y - Y
219  FOR i AS INTEGER = 0 TO Az
220  V[i].Xpix += dx
221  V[i].Ypix += dy
222  NEXT
223  ELSE ' complex transformation for new zoom
224  CoZo = Z
225  FOR i AS INTEGER = 0 TO Az
226  V[i].Xpix = lon2pixel(V[i].Lon, Z) - X
227  V[i].Ypix = lat2pixel(V[i].Lat, Z) - Y
228  NEXT
229  END IF
230  Co_X = X
231  Co_Y = Y
232  RETURN 0
233 END FUNCTION
234 
235 
236 
246 FUNCTION TrackLoader.SkipOut(BYVAL Typ AS LONG, BYVAL Di AS float) AS LONG
247  VAR st = -1L, e = 0L
248  SELECT CASE AS CONST Typ
249  CASE -2 : Di *= 5
250  CASE -1
251  CASE 1 : st = 1 : e = Az
252  CASE 2 : Di *= 5 : st = 1 : e = Az
253  CASE ELSE : RETURN Cur
254  END SELECT
255  FOR i AS LONG = Cur + st TO e STEP st
256  IF Dist(Cur, i) > Di THEN RETURN i
257  NEXT
258  RETURN e
259 END FUNCTION
260 
261 
262 
270 PROPERTY TrackLoader.ASpd() AS float
271  VAR a = CAST(DOUBLE, V[0].Spd)
272  FOR i AS INTEGER = 1 TO Az
273  a += V[i].Spd
274  NEXT : RETURN a / Az
275 END PROPERTY
276 
277 
278 
288 PROPERTY TrackLoader.LTrk() AS float
289  IF Az < 1 THEN RETURN NaN
290  VAR l = Dist(0, 1)
291  FOR i AS INTEGER = 2 TO Az
292  l += Dist(i, i-1)
293  NEXT : RETURN l
294 END PROPERTY
295 
296 
297 
307 FUNCTION TrackLoader.Dist(BYVAL P0 AS ULONG, BYVAL P1 AS ULONG) AS DOUBLE
308  IF P0 > Az ORELSE P1 > Az THEN RETURN NaN
309  VAR r0 = V[P0].Ele + ERA , r1 = V[P1].Ele + ERA _
310  , a0 = COS(V[P0].Lat) * r0, a1 = COS(V[P1].Lat) * r1 _
311  , dx = COS(V[P0].Lon) * a0 - COS(V[P1].Lon) * a1 _
312  , dy = SIN(V[P0].Lon) * a0 - SIN(V[P1].Lon) * a1 _
313  , dz = SIN(V[P0].Lat) * r0 - SIN(V[P1].Lat) * r1
314  RETURN SQR(dx*dx + dy*dy + dz*dz)
315 END FUNCTION
316 
317 
318 
329 FUNCTION TrackLoader.Nearest(BYVAL Lon AS float, BYVAL Lat AS float)AS float
330  VAR a = V[0].Lat - Lat, o = V[0].Lon - Lon, d = SQR(a*a + o*o)
331  Tmp = 0
332  FOR i AS LONG = 1 TO Az
333  a = V[i].Lat - Lat : o = V[i].Lon - Lon : VAR x = SQR(a*a + o*o)
334  IF x < d THEN d = x : Tmp = i
335  NEXT : RETURN d
336 END FUNCTION
337 
338 
339 
349 SUB TrackLoader.MapCenter(BYVAL W AS LONG, BYVAL H AS LONG)
350  UsLo = .5 * (Mx.Lon + Mn.Lon)
351  UsLa = .5 * (Mx.Lat + Mn.Lat)
352  UsZo = latlon2zoom(W, H, Mn.Lat, Mx.Lat, Mn.Lon, Mx.Lon)
353  UsLo *= Rad2Deg
354  UsLa *= Rad2Deg
355 END SUB
356 
TrackLoader::TrackLoader
TrackLoader(BYVAL_AS_CONST_ZSTRING_PTR)
CTOR loading track data.
Definition: track_loader.bas:144
TrackLoader::SkipOut
FUNCTION_AS_LONG SkipOut(BYVAL_AS_LONG Typ, BYVAL_AS_float Di)
Compute exit of cloud.
Definition: track_loader.bas:245
TrackLoader::Pixel
FUNCTION_AS_BYTE Pixel(BYVAL_AS_LONG, BYVAL_AS_LONG, BYVAL_AS_LONG)
Compute pixel values for given center and zoom.
Definition: track_loader.bas:213
parser_gpx.bi
Header code for GPX parser.
latlon2zoom
FUNCTION_CDECL_AS_LONG latlon2zoom(BYVAL_AS_LONG W, BYVAL_AS_LONG H, BYVAL_AS_float La0, BYVAL_AS_float La1, BYVAL_AS_float Lo0, BYVAL_AS_float Lo1)
Evaluate the matching zoom level for BBox.
Definition: track_loader.bas:116
lon2pixel
FUNCTION_AS_LONG lon2pixel(BYVAL_AS_float V, BYVAL_AS_LONG Z)
Transform world longitude to map X-pixel.
Definition: track_loader.bas:58
TILESIZE
const LONG TILESIZE
size of tile used in osm_gps_map
Definition: track_loader.bas:13
pixel2lon
FUNCTION_AS_float pixel2lon(BYVAL_AS_long Z, BYVAL_AS_LONG X)
Transform map X-pixel to world longitude.
Definition: track_loader.bas:74
parser_nmea.bi
Header code for NMEA parser.
TrackLoader::Nearest
FUNCTION_AS_float Nearest(BYVAL_AS_float, BYVAL_AS_float)
Find point nearest to the given [radians] position.
Definition: track_loader.bas:328
atanh
FUNCTION_CDECL_ALIAS_AS_DOUBLE atanh(BYVAL_AS_DOUBLE)
TrackLoader::MapCenter
SUB MapCenter(BYVAL_AS_LONG W, BYVAL_AS_LONG H)
Compute center and zoom to plot complete track.
Definition: track_loader.bas:348
TrackLoader::Dist
FUNCTION_AS_DOUBLE Dist(BYVAL_AS_ULONG, BYVAL_AS_ULONG)
Compute distance between two points.
Definition: track_loader.bas:306
tanh
FUNCTION_CDECL_ALIAS_AS_DOUBLE tanh(BYVAL_AS_DOUBLE)
TILESIZEd2
const LONG TILESIZEd2
half size
Definition: track_loader.bas:14
TrackLoader::~TrackLoader
~TrackLoader()
Definition: track_loader.bas:198
TrackLoader::ASpd
PROPERTY_AS_float ASpd()
Compute the speed avarage.
Definition: track_loader.bas:269
TrackLoader::LTrk
PROPERTY_AS_float LTrk()
Compute track length.
Definition: track_loader.bas:287
pixel2lat
FUNCTION_AS_float pixel2lat(BYVAL_AS_long Z, BYVAL_AS_LONG Y)
Transform map Y-pixel to world latitude.
Definition: track_loader.bas:90
lat2pixel
FUNCTION_AS_LONG lat2pixel(BYVAL_AS_float V, BYVAL_AS_LONG Z)
Transform world latitude to map Y-pixel.
Definition: track_loader.bas:42