summaryrefslogtreecommitdiff
path: root/gegps
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2011-06-24 02:45:39 -0400
committerEric S. Raymond <esr@thyrsus.com>2011-06-24 02:45:39 -0400
commit3839bfe9a3d3c9015260b9500bff597fbfe5595b (patch)
treecc6a5d45f3909c4b87ecb862dafb5b784cd0843c /gegps
parentba3def7de3c110a7901c40921cca51f8700bc8d3 (diff)
downloadgpsd-3839bfe9a3d3c9015260b9500bff597fbfe5595b.tar.gz
Live-feed support for Google Earth.
Diffstat (limited to 'gegps')
-rw-r--r--gegps101
1 files changed, 101 insertions, 0 deletions
diff --git a/gegps b/gegps
new file mode 100644
index 00000000..725568ef
--- /dev/null
+++ b/gegps
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# usage: gegps [-i] [-d kmldir]
+#
+# Feed location data from a running GPSD to a Google Earth instance.
+# The -d argument is the location of the Google Earth installation
+# directory. If not specified, it defaults to the current directory.
+#
+# If you have the free (non-subscription) version, start by running with
+# the -i option to drop a clue in the Google Earth installation directory,
+# as 'Open_in_Google_Earth_RT_GPS.kml', then open that file in Places
+# (File > Open...),
+#
+# The basic recipe is here:
+# http://tjworld.net/wiki/Linux/Ubuntu/GoogleEarthPlusRealTimeGPS
+#
+# This code originally by Jaroslaw Zachwieja and a guy referring
+# to himself/herself as TJ(http://tjworld.net)
+# Modified by Chen Wei <weichen302@aol.com> for use with gpsd
+# Cleaned up and adapted for the GPSD project by Eric S. Raymond.
+
+import time, os, gps, getopt
+import sys
+
+KML_OPEN_IN_GE = '''\
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/2.2">
+<NetworkLink>
+ <name>Realtime GPS</name>
+ <open>1</open>
+ <Link>
+ <href>Realtime_GPS.kml</href>
+ <refreshMode>onInterval</refreshMode>
+ </Link>
+</NetworkLink>
+</kml>
+'''
+
+def kmlize(tpv):
+ '''http://code.google.com/apis/kml/documentation/kmlreference.html
+ for official kml document'''
+ latitude = tpv['lat']
+ longitude = tpv['lon']
+ speed_in = tpv['speed'] # meter/second
+ speed = speed_in * gps.MPS_TO_KPH # Km/h
+ heading = int(round(tpv['track'], 0))
+ altitude = tpv['alt']
+
+ if speed < 1:
+ heading = 0
+
+ return """<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/2.0">
+<Placemark>
+ <name>%s km/h,heading %s</name>
+ <description>Realtime GPS feeding</description>
+ <LookAt>
+ <longitude>%s</longitude>
+ <latitude>%s</latitude>
+ </LookAt>
+ <Point>
+ <coordinates>%s,%s,%s</coordinates>
+ </Point>
+</Placemark>
+</kml>""" % (speed,heading,longitude,latitude,longitude,latitude,altitude)
+
+
+if __name__ == "__main__":
+ session = gps.gps()
+ # must include gps.WATCH_NEWSTYLE on my system(debian squeeze), otherwise
+ # there is no TPV report
+ session.stream(gps.WATCH_ENABLE|gps.WATCH_NEWSTYLE)
+
+ kmldir = "."
+ initialize = False
+ (options, arguments) = getopt.getopt(sys.argv[1:], "d:i")
+ for (opt, arg) in options:
+ if opt == '-d':
+ kmldir = arg
+ elif opt == '-i':
+ initialize = True
+
+ if initialize:
+ f = open(os.path.join(kmldir, 'Open_in_Google_Earth_RT_GPS.kml'), 'w')
+ f.write(KML_OPEN_IN_GE)
+ f.close()
+ else:
+ try:
+ while True:
+ report = session.next()
+ if report['class'] == 'TPV':
+ f = open(os.path.join(kmldir, 'Realtime_GPS.kml'), 'w')
+ f.write(kmlize(report))
+ f.close()
+ except StopIteration:
+ pass
+ except KeyboardInterrupt:
+ print 'gegpsd stopped '
+
+# end