summaryrefslogtreecommitdiff
path: root/ipl/gpacks/tiger/tgrtrack.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/gpacks/tiger/tgrtrack.icn')
-rw-r--r--ipl/gpacks/tiger/tgrtrack.icn168
1 files changed, 168 insertions, 0 deletions
diff --git a/ipl/gpacks/tiger/tgrtrack.icn b/ipl/gpacks/tiger/tgrtrack.icn
new file mode 100644
index 0000000..07a25f2
--- /dev/null
+++ b/ipl/gpacks/tiger/tgrtrack.icn
@@ -0,0 +1,168 @@
+############################################################################
+#
+# File: tgrtrack.icn
+#
+# Subject: Program to translate "track log" files into TIGER chains
+#
+# Author: William S. Evans and Gregg M. Townsend
+#
+# Date: June 9, 2000
+#
+############################################################################
+#
+# tgrtrack reads a fixed field length file containing track data from
+# a GPS receiver and outputs a "line chain" (.lch) format file (see
+# tgrprep) that can then be viewed using tgrmap.
+#
+# Usage: tgrtrack file
+#
+# Input is a text file of coordinates such as those from a GPS
+# receiver. Lines ending with two decimal values are interpreted
+# as specifying latitude and longitude in that order.
+# Lines without data indicate breaks between paths.
+#
+# Output is a line chain file
+#
+############################################################################
+#
+# Links: numbers, strings
+#
+############################################################################
+
+link numbers
+link strings
+
+global deltas
+global curlon, curlat
+global maxlon, minlon, maxlat, minlat
+
+procedure main(args)
+ local n, trackfile
+
+ *args = 1 | stop("usage: ", &progname, " GPStrackfile")
+ trackfile := open(args[1]) | stop("can't open ", args[1])
+ n := llrange(trackfile)
+ write(" ", rz(convertLon(minlon)), rz(convertLat(maxlat)))
+ write(" ", rz(convertLon(maxlon)), rz(convertLat(minlat)))
+ writeLCH(trackfile)
+ return
+end
+
+procedure convertLat(n)
+# convert latitude from decimal degrees to fraction of semicircle
+# south of North Pole, as 0000000 to 9999999.
+ static m
+ initial m := 9999999 / 180.0
+ return round(m * (90.0 - n))
+end
+
+procedure convertLon(n)
+# convert longitude to fraction of circle east of Greenwich,
+# as 0000000 to 9999999.
+ static m
+ initial m := 9999999 / 360.0
+
+ n := real(n)
+ if n < 0 then
+ n +:= 360.0
+ return round(m * n)
+end
+
+
+procedure writeLCH(trackfile)
+ local x, y, line, n, trackPts, dim, startlon, startlat, lon, lat, w
+
+ n := 1
+ trackPts := 0
+ deltas := ""
+
+ seek(trackfile, 1) | fail
+ repeat {
+ line := read(trackfile) | "stop"
+ every put(w := [], words(line))
+ if (lat := real(w[-2])) & (lon := real(w[-1])) &
+ (-90. <= lat <= 90.) & (-180. <= lon <= 180.) then {
+ y := convertLat(lat)
+ x := convertLon(lon)
+ if (trackPts = 0) then { # starting a new track
+ deltas := ""
+ startlon := minlon := maxlon := curlon := x
+ startlat := minlat := maxlat := curlat := y
+ }
+ else {
+ drawto(x, y)
+ }
+ trackPts +:= 1
+ }
+ else {
+ if trackPts >= 2 then {
+ dim := startlon - minlon
+ dim <:= maxlon - startlon
+ dim <:= startlat - minlat
+ dim <:= maxlat - startlat
+ dim >:= 9999
+ write("T000|GPS Track ", n, "|", right(dim, 4),
+ rz(startlon), rz(startlat), deltas)
+ n +:= 1
+ }
+ trackPts := 0
+ }
+ if w[1] == "stop" then break
+ }
+ return
+end
+
+procedure drawto(lon, lat)
+ local dlon, dlat
+
+ dlon := lon - curlon
+ dlat := lat - curlat
+
+ if abs(dlon | dlat) >= 5000 then {
+ drawto(curlon + dlon / 2, curlat + dlat / 2)
+ drawto(lon, lat)
+ }
+ else {
+ deltas ||:= rz(dlon + 5000, 4)
+ deltas ||:= rz(dlat + 5000, 4)
+ curlon := lon
+ curlat := lat
+ minlon >:= lon
+ maxlon <:= lon
+ minlat >:= lat
+ maxlat <:= lat
+ }
+ return
+end
+
+
+procedure rz(v, n)
+# right-justify value in n digits with zero fill
+ /n := 7
+ return right(v, n, "0")
+end
+
+
+procedure llrange(f)
+# scan f to set min/max lon/lat, returning record count
+ local line, n, lon, lat, w
+
+ minlon := +180.0
+ maxlon := -180.0
+ minlat := +90.0
+ maxlat := -90.0
+ n := 0
+
+ seek(f, 1)
+ while line := read(f) do line ? {
+ every put(w := [], words(line))
+ if (lat := real(w[-2])) & (lon := real(w[-1])) &
+ (-90. <= lat <= 90.) & (-180. <= lon <= 180.) then {
+ minlon >:= lon
+ maxlon <:= lon
+ minlat >:= lat
+ maxlat <:= lat
+ }
+ }
+ return n
+end