123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #!@PYSHEBANG@
- # -*- coding: utf-8 -*-
- # @GENERATED@
- # 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!
- """Feed location data from a running GPSD to a Google Earth instance.
- 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.
- """
- from __future__ import absolute_import, print_function, division
- import argparse
- 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):
- """Kmlize.
- 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__":
- description = 'Feed location data from GPSD to Google Earth.'
- usage = '%(prog)s [OPTIONS] [host[:port[:device]]]'
- epilog = ('BSD terms apply: see the file COPYING in the distribution root'
- ' for details.')
- parser = argparse.ArgumentParser(
- description=description,
- epilog=epilog,
- formatter_class=argparse.RawDescriptionHelpFormatter,
- usage=usage)
- parser.add_argument(
- '-?',
- action="help",
- help='show this help message and exit'
- )
- parser.add_argument(
- '-d', '--kmldir',
- default='.',
- dest='kmldir',
- help='Google Earth kml directory. [Default %(default)s]',
- )
- parser.add_argument(
- '-D',
- '--debug',
- default=0,
- dest='debug',
- help='Set level of debug. Must be integer. [Default %(default)s]',
- type=int,
- )
- parser.add_argument(
- '--device',
- default='',
- dest='device',
- help='The device to connect. [Default %(default)s]',
- )
- parser.add_argument(
- '--host',
- default='localhost',
- dest='host',
- help='The host to connect. [Default %(default)s]',
- )
- parser.add_argument(
- '-i', '--initialize',
- action='store_true',
- default=False,
- dest='initialize',
- help='Google Earth kml directory. [Default %(default)s]',
- )
- parser.add_argument(
- '--port',
- default=gps.GPSD_PORT,
- dest='port',
- help='The port to connect. [Default %(default)s]',
- )
- parser.add_argument(
- '-V', '--version',
- action='version',
- help='Output version to stderr, then exit',
- version="%(prog)s: Version " + gps_version + "\n",
- )
- parser.add_argument(
- 'target',
- help='[host[:port[:device]]]',
- nargs='?',
- )
- options = parser.parse_args()
- # the options host, port, device are set by the defaults
- if options.target:
- # override host, port and device with target
- arg = options.target.split(':')
- len_arg = len(arg)
- if len_arg == 1:
- (options.host,) = arg
- elif len_arg == 2:
- (options.host, options.port) = arg
- elif len_arg == 3:
- (options.host, options.port, options.device) = arg
- else:
- parser.print_help()
- sys.exit(0)
- try:
- session = gps.gps(host=options.host, port=options.port,
- verbose=options.debug)
- except socket.error:
- sys.stderr.write("gegps: Could not connect to gpsd daemon\n")
- sys.exit(1)
- session.stream(gps.WATCH_ENABLE)
- if options.initialize:
- f = open(os.path.join(options.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(options.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
|