#!/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 for use with gpsd Cleaned up and adapted for the GPSD project by Eric S. Raymond. ''' # This code runs compatibly under Python 2 and 3.x for x >= 2. # Preserve this property! from __future__ import absolute_import, print_function, division import getopt import os import socket # for socket.error import sys # pylint wants local modules last try: import gps except ImportError as e: sys.stderr.write( "gegps: can't load Python gps libraries -- check PYTHONPATH.\n") sys.stderr.write("%s\n" % e) sys.exit(1) gps_version = '3.19-dev' if gps.__version__ != gps_version: sys.stderr.write("gegps: ERROR: need gps module version %s, got %s\n" % (gps_version, gps.__version__)) sys.exit(1) KML_OPEN_IN_GE = '''\ Realtime GPS 1 Realtime_GPS.kml onInterval ''' def kmlize(tpv): '''http://code.google.com/apis/kml/documentation/kmlreference.html for official kml document''' latitude = tpv['lat'] longitude = tpv['lon'] # not all TPV includes speed, like when acquiring fix if 'speed' in tpv: speed_in = tpv['speed'] # meter/second speed = speed_in * gps.MPS_TO_KPH # Km/h else: speed = 0 # not all TPV includes heading, like when acquiring fix if speed >= 1 and 'track' in tpv: heading = int(round(tpv['track'], 0)) else: heading = 0 # not all TPV includes altitude # like ublox8 in fixed position (time) mode if 'alt' in tpv: altitude = tpv['alt'] else: altitude = 0 return """ %s km/h,heading %s Realtime GPS feeding %s %s %s,%s,%s """ % (speed, heading, longitude, latitude, longitude, latitude, altitude) if __name__ == "__main__": def usage(): "Print usage and exit" sys.stderr.write("usage: gegps: [-d] [-h] [-i] [-V]\n\n" " -d directory Location of Google Earth\n" " -h Print this help and exit\n" " -i\n" " -V Print version and exit\n") sys.exit(0) kmldir = "." initialize = False (options, arguments) = getopt.getopt(sys.argv[1:], "d:hiV") for (opt, arg) in options: if opt == '-d': kmldir = arg elif opt == '-h': usage() elif opt == '-i': initialize = True elif opt == '-V': sys.stderr.write("gegps: Version %s\n" % gps_version) sys.exit(0) try: session = gps.gps() except socket.error: sys.stderr.write("gegps: Could not connect to gpsd daemon\n") sys.exit(1) session.stream(gps.WATCH_ENABLE) 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('gegps stopped ') # end