Reads GPS position from gpds on Linux systems. This program is used in the PE1RXF Reticulum Portable Server from Mees Electronics.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
2.4 KiB

5 days ago
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Python APRS Module Geo Utility Function Definitions."""
import decimaldegrees
__author__ = 'Greg Albrecht W2GMD <oss@undef.net>' # NOQA pylint: disable=R0801
__copyright__ = 'Copyright 2017 Greg Albrecht and Contributors' # NOQA pylint: disable=R0801
__license__ = 'Apache License, Version 2.0' # NOQA pylint: disable=R0801
def dec2dm_lat(dec: float) -> str:
"""
Converts DecDeg to APRS Coord format.
See: http://ember2ash.com/lat.htm
Source: http://stackoverflow.com/questions/2056750
Example:
>>> test_lat = 37.7418096
>>> aprs_lat = dec2dm_lat(test_lat)
>>> aprs_lat
'3744.51N'
>>> test_lat = -8.01
>>> aprs_lat = dec2dm_lat(test_lat)
>>> aprs_lat
'0800.60S'
"""
dec_min = decimaldegrees.decimal2dm(dec)
deg = dec_min[0]
abs_deg = abs(deg)
if not deg == abs_deg:
suffix = 'S'
else:
suffix = 'N'
return "%02d%05.2f%s" % (abs_deg, dec_min[1], suffix)
def dec2dm_lng(dec: float) -> str:
"""
Converts DecDeg to APRS Coord format.
See: http://ember2ash.com/lat.htm
Example:
>>> test_lng = 122.38833
>>> aprs_lng = dec2dm_lng(test_lng)
>>> aprs_lng
'12223.30E'
>>> test_lng = -99.01
>>> aprs_lng = dec2dm_lng(test_lng)
>>> aprs_lng
'09900.60W'
"""
dec_min = decimaldegrees.decimal2dm(dec)
deg = dec_min[0]
abs_deg = abs(deg)
if not deg == abs_deg:
suffix = 'W'
else:
suffix = 'E'
return "%03d%05.2f%s" % (abs_deg, dec_min[1], suffix)
def ambiguate(pos: float, ambiguity: int) -> str:
"""
Adjust ambiguity of position.
Derived from @asdil12's `process_ambiguity()`.
>>> pos = '12345.67N'
>>> ambiguate(pos, 0)
'12345.67N'
>>> ambiguate(pos, 1)
'12345.6 N'
>>> ambiguate(pos, 2)
'12345. N'
>>> ambiguate(pos, 3)
'1234 . N'
"""
num = bytearray(pos, 'UTF-8')
for i in range(0, ambiguity):
if i > 1:
# skip the dot
i += 1
# skip the direction
i += 2
num[-i] = ord(' ')
return num.decode()
def run_doctest(): # pragma: no cover
"""Runs doctests for this module."""
import doctest
return doctest.testmod()
if __name__ == '__main__':
run_doctest() # pragma: no cover