Add higher uWave bands and 10 char locators support (#32)

This commit is contained in:
Dawid 2025-06-09 23:21:27 +02:00 committed by GitHub
parent 4bdaf8d335
commit 1a79467db1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 54 additions and 7 deletions

View file

@ -182,7 +182,7 @@ def freq_to_band(freq):
elif ((freq >= 1200000) and (freq <= 1300000)): elif ((freq >= 1200000) and (freq <= 1300000)):
band = 0.23 #23cm band = 0.23 #23cm
mode = None mode = None
elif ((freq >= 2390000) and (freq <= 2450000)): elif ((freq >= 2300000) and (freq <= 2450000)):
band = 0.13 #13cm band = 0.13 #13cm
mode = None mode = None
elif ((freq >= 3300000) and (freq <= 3500000)): elif ((freq >= 3300000) and (freq <= 3500000)):
@ -200,7 +200,19 @@ def freq_to_band(freq):
elif ((freq >= 47000000) and (freq <= 47200000)): elif ((freq >= 47000000) and (freq <= 47200000)):
band = 0.0063 #6,3mm band = 0.0063 #6,3mm
mode = None mode = None
elif ((freq >= 75500000) and (freq <= 81500000)):
band = 0.004 #4mm
mode = None
elif ((freq >= 122250000) and (freq <= 123000000)):
band = 0.0025 #2.5mm
mode = None
elif ((freq >= 134000000) and (freq <= 141000000)):
band = 0.002 #2mm
mode = None
elif ((freq >= 241000000) and (freq <= 250000000)):
band = 0.001 #1mm
mode = None
else: else:
raise KeyError raise KeyError
return {"band": band, "mode": mode} return {"band": band, "mode": mode}

View file

@ -9,7 +9,7 @@ def latlong_to_locator (latitude, longitude, precision=6):
Args: Args:
latitude (float): Latitude latitude (float): Latitude
longitude (float): Longitude longitude (float): Longitude
precision (int): 4,6,8 chars (default 6) precision (int): 4,6,8,10 chars (default 6)
Returns: Returns:
string: Maidenhead locator string: Maidenhead locator
@ -33,7 +33,7 @@ def latlong_to_locator (latitude, longitude, precision=6):
""" """
if precision < 4 or precision ==5 or precision == 7 or precision > 8: if precision < 4 or precision == 5 or precision == 7 or precision == 9 or precision > 10:
return ValueError return ValueError
if longitude >= 180 or longitude <= -180: if longitude >= 180 or longitude <= -180:
@ -99,7 +99,7 @@ def locator_to_latlong (locator, center=True):
locator = locator.upper() locator = locator.upper()
if len(locator) < 4 or len(locator) == 5 or len(locator) == 7: if len(locator) < 4 or len(locator) == 5 or len(locator) == 7 or len(locator) == 9:
raise ValueError raise ValueError
if ord(locator[0]) > ord('R') or ord(locator[0]) < ord('A'): if ord(locator[0]) > ord('R') or ord(locator[0]) < ord('A'):
@ -126,6 +126,12 @@ def locator_to_latlong (locator, center=True):
if ord (locator[7]) > ord('9') or ord(locator[7]) < ord('0'): if ord (locator[7]) > ord('9') or ord(locator[7]) < ord('0'):
raise ValueError raise ValueError
if len(locator) == 10:
if ord(locator[8]) > ord('X') or ord(locator[8]) < ord('A'):
raise ValueError
if ord (locator[9]) > ord('X') or ord(locator[9]) < ord('A'):
raise ValueError
longitude = (ord(locator[0]) - ord('A')) * 20 - 180 longitude = (ord(locator[0]) - ord('A')) * 20 - 180
latitude = (ord(locator[1]) - ord('A')) * 10 - 90 latitude = (ord(locator[1]) - ord('A')) * 10 - 90
longitude += (ord(locator[2]) - ord('0')) * 2 longitude += (ord(locator[2]) - ord('0')) * 2
@ -156,6 +162,20 @@ def locator_to_latlong (locator, center=True):
longitude += 5.0 / 600 / 2 longitude += 5.0 / 600 / 2
latitude += 2.5 / 600 / 2 latitude += 2.5 / 600 / 2
elif len(locator) == 10:
longitude += (ord(locator[4]) - ord('A')) * 5.0 / 60
latitude += (ord(locator[5]) - ord('A')) * 2.5 / 60
longitude += int(locator[6]) * 5.0 / 600
latitude += int(locator[7]) * 2.5 / 600
longitude += (ord(locator[8]) - ord('A')) * 1.0 / 2880
latitude += (ord(locator[9]) - ord('A')) * 1.0 / 5760
if center:
longitude += 1.0 / 2880 / 2
latitude += 1.0 / 5760 / 2
else: else:
raise ValueError raise ValueError

View file

@ -23,6 +23,10 @@ class Test_latlong_to_locator():
assert latlong_to_locator(48.51760, 9.40345, precision=8) == "JN48QM84" assert latlong_to_locator(48.51760, 9.40345, precision=8) == "JN48QM84"
assert latlong_to_locator(39.222916, -86.45416, 8) == "EM69SF53" assert latlong_to_locator(39.222916, -86.45416, 8) == "EM69SF53"
def test_latlong_to_locator_10chars_precision(self):
assert latlong_to_locator(45.835677, 68.525173, precision=10) == "MN45GU30AN"
assert latlong_to_locator(51.124913, 16.941840, 10) == "JO81LC39AX"
def test_latlong_to_locator_invalid_characters(self): def test_latlong_to_locator_invalid_characters(self):
# throws ValueError in Python2 and TypeError in Python3 # throws ValueError in Python2 and TypeError in Python3

View file

@ -30,8 +30,7 @@ class Test_locator_to_latlong():
assert abs(latitude - 48.52083) < 0.00001 assert abs(latitude - 48.52083) < 0.00001
assert abs(longitude - 9.37500) < 0.00001 assert abs(longitude - 9.37500) < 0.00001
def test_locator_to_latlong_8chars(self): def test_locator_to_latlong_8chars_precision(self):
latitude, longitude = locator_to_latlong("JN48QM84") latitude, longitude = locator_to_latlong("JN48QM84")
assert abs(latitude - 48.51875) < 0.00001 assert abs(latitude - 48.51875) < 0.00001
assert abs(longitude - 9.40416) < 0.00001 assert abs(longitude - 9.40416) < 0.00001
@ -40,6 +39,15 @@ class Test_locator_to_latlong():
assert abs(latitude - 39.222916) < 0.00001 assert abs(latitude - 39.222916) < 0.00001
assert abs(longitude + 86.45416) < 0.00001 assert abs(longitude + 86.45416) < 0.00001
def test_locator_to_latlong_10chars_precision(self):
latitude, longitude = locator_to_latlong("JO81LC39AX")
assert abs(latitude - 51.124913) < 0.000001
assert abs(longitude - 16.941840) < 0.000001
latitude, longitude = locator_to_latlong("MN45GU30AN")
assert abs(latitude - 45.835677) < 0.000001
assert abs(longitude - 68.525173) < 0.000001
def test_locator_to_latlong_consistency_checks_6chars_lower_left_corner(self): def test_locator_to_latlong_consistency_checks_6chars_lower_left_corner(self):
latitude_4, longitude_4 = locator_to_latlong("JN48", center=False) latitude_4, longitude_4 = locator_to_latlong("JN48", center=False)
@ -97,6 +105,9 @@ class Test_locator_to_latlong():
with pytest.raises(ValueError): with pytest.raises(ValueError):
latitude, longitude = locator_to_latlong("JN8QM1") latitude, longitude = locator_to_latlong("JN8QM1")
with pytest.raises(ValueError):
latitude, longitude = locator_to_latlong("JN8QM1AA")
def test_locator_to_latlong_invalid_characters(self): def test_locator_to_latlong_invalid_characters(self):
with pytest.raises(ValueError): with pytest.raises(ValueError):