The table code list at 'UN/LOCODE Code List by Country and Territory' has a column named coordinate. This column contains the geographical coordinates (latitude/longitude) in a format that is not suitable for use in GIS software. The reason is explained on this page by UN.
So, basically it say in order to avoid unnecessary use of non-standard characters and space, the following standard presentation is used: 0000lat 00000long
(lat - Latitude: N or S ; long – Longitude: W or E, only one digit, capital letter)
Where the last two rightmost digits refer to minutes and the first two or three digits refer to the degrees for latitude and longitude respectively. In addition, you must specify N or S for latitude and W or E for longitude, as appropriate.
This means we will convert coordinate that looks like this '0507N 00722E' to decimal degrees or degree minute and seconds.
unlocode_coord = '0507S 00722E'
unlat, unlong = unlocode_coord.split(' ')
# Handling Latitide...
# --------------------------
# Remove the last characted which will always be either: N or S...
unlat = unlat.replace('N', '').replace('S', '') # .rstrip('N').rstrip('S')
lat_deg = unlat[:2]
lat_min = unlat[-2:]
# Result in DMS... Degrees Minutes
print(f"The result in Degree Munite is: {lat_deg}°{lat_min}'")
# Result in DD.... Decimal Degrees - Since 1° = 60' and 1' = 60"
lat_min_dd = round(float(lat_min)/60, 2)
# Get the fractional and integer parts, we can use: modulo (%) operator or math.modf
lat_sec_dd = int(lat_min_dd) + round(lat_min_dd % 1, 2)/60
# Add the D+M+S...
lat_dd = round(float(lat_deg) + lat_min_dd + lat_sec_dd, 3)
print(f"The result in Decimal Degree is: {lat_dd}°")
# Handling Longitude...
# --------------------------
# Remove the last characted which will always be either: N or S...
unlong = unlong.rstrip('E').rstrip('W')
long_deg = unlong[:3]
long_min = unlong[-2:]
print()
# Result in DMS... Degrees Minutes Seconds
print(f"The result in Degree Munite is: {long_deg}°{long_min}'")
# Result in DD.... Decimal Degrees - Since 1° = 60' and 1' = 60"
long_min_dd = round(float(long_min)/60, 2)
# Get the fractional and integer parts, we can use: modulo (%) operator or math.modf
long_sec_dd = int(long_min_dd) + round(long_min_dd % 1, 2)/60
# Add the D+M+S...
long_dd = round(float(long_deg) + long_min_dd + long_sec_dd, 3)
print(f"The result in Decimal Degree is: {long_dd}°")
You may use the tool on this website to learn more as seen below.
The reverse - from decimal degrees to UN/LOCODE coordinates
# ------------------- For Latitude ---------------------------------
lat = 13.893937
if lat >= 0: # Northern Hermisphere
# Degree...
lat_degree = int(lat)
# Minute
lat_minute = int((lat - lat_degree) * 60)
lat_result = str(lat_degree) + str(lat_minute) + 'N'
print(f'Latitude in UN/LOCODE is: {lat_result}')
else: # Southern Hermisphere
lat = abs(lat)
# Degree...
lat_degree = int(lat)
# Minute
lat_minute = int((lat - lat_degree) * 60)
lat_result = str(lat_degree) + str(lat_minute) + 'S'
print(f'Latitude in UN/LOCODE is: {lat_result}')
# ------------------- For Longitude ---------------------------------
long = -123.893937
if long >= 0: # Northern Hermisphere
# Degree...
long_degree = int(long)
long_degree1 = str(int(long))
if len(long_degree1) == 1:
long_degree1 = '00' + long_degree1
elif len(long_degree1) == 2:
long_degree1 = '0' + long_degree1
elif len(long_degree1) == 3:
long_degree1 = long_degree1
# Minute
long_minute = int((long - long_degree) * 60)
long_result = str(long_degree1) + str(long_minute) + 'E'
print(f'Longitude in UN/LOCODE is: {long_result}')
else: # Southern Hermisphere
long = abs(long)
# Degree...
long_degree = int(long)
# Minute
long_minute = int((long - long_degree) * 60)
long_result = str(long_degree) + str(long_minute) + 'W'
print(f'Longitude in UN/LOCODE is: {long_result}')
That is it!