123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #!@PYSHEBANG@
- # -*- coding: utf-8 -*-
- # @GENERATED@
- '''
- 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.
- '''
- # This file is Copyright 2010 by the GPSD project
- # SPDX-License-Identifier: BSD-2-clause
- # 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 = '@VERSION@'
- 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 = '''\
- <?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']
- # 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 """<?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__":
- 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
- # vim: set expandtab shiftwidth=4
|