diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4e5f6c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ \ No newline at end of file diff --git a/maidehhead.py b/maidehhead.py deleted file mode 100644 index eda8aaf..0000000 --- a/maidehhead.py +++ /dev/null @@ -1,78 +0,0 @@ -# From ttps://github.com/scivision/maidenhead - -"""## mlocs - Maidenhead -toMaiden([lat, lon], level) returns a char (len = lvl*2) -toLoc(mloc) takes any string and returns topleft [lat,lon] within mloc - -Beyond 8 characters is not defined for Maidenhead. -""" - -def toLoc(maiden): - """ - input: maidenhead locator of length 2 to 8 - output: [lat,lon] - """ - assert isinstance(maiden, str), 'Maidenhead is a string' - maiden = maiden.strip().upper() - - N = len(maiden) - assert 8>=N>=2 and N%2==0,'Maidenhead locator requires 2-8 characters, even number of characters' - - O = ord('A') - lon = -180 - lat = -90 -#%% first pair - lon += (ord(maiden[0])-O)*20 - lat += (ord(maiden[1])-O)*10 -#%% second pair - if N>=4: - lon += int(maiden[2])*2 - lat += int(maiden[3])*1 - if N==4: - lon += 1 - lat += 0.5 -#%% - if N>=6: - lon += (ord(maiden[4])-O) * 5./60 - lat += (ord(maiden[5])-O) * 2.5/60 - if N==6: - lon += 2.5/60 - lat += 1.25/60 -#%% - if N>=8: - lon += int(maiden[6]) * 5./600 + 2.5/600 - lat += int(maiden[7]) * 2.5/600 + 1.25/600 - - return lat,lon - -def toMaiden(position, precision=3): - """Returns a maidenloc for specified lat-lon tuple at specified level. - """ - assert len(position)==2,'lat lon required' - lat = float(position[0]) - lon = float(position[1]) - - A = ord('A') - a = divmod(lon+180, 20) - b = divmod(lat+90, 10) - astring = chr(A+int(a[0])) + chr(A+int(b[0])) - lon = a[1] / 2. - lat = b[1] - i = 1 - while i < precision: - i += 1 - a = divmod(lon,1) - b = divmod(lat,1) - if not (i%2): - astring += str(int(a[0])) + str(int(b[0])) - lon = 24 * a[1] - lat = 24 * b[1] - else: - astring += chr(A+int(a[0])) + chr(A+int(b[0])) - lon = 10 * a[1] - lat = 10 * b[1] - - if len(astring)>=6: - astring = astring[:4] + astring[4:6].lower() + astring[6:] - - return astring diff --git a/maidenhead.py b/maidenhead.py index e69de29..eda8aaf 100644 --- a/maidenhead.py +++ b/maidenhead.py @@ -0,0 +1,78 @@ +# From ttps://github.com/scivision/maidenhead + +"""## mlocs - Maidenhead +toMaiden([lat, lon], level) returns a char (len = lvl*2) +toLoc(mloc) takes any string and returns topleft [lat,lon] within mloc + +Beyond 8 characters is not defined for Maidenhead. +""" + +def toLoc(maiden): + """ + input: maidenhead locator of length 2 to 8 + output: [lat,lon] + """ + assert isinstance(maiden, str), 'Maidenhead is a string' + maiden = maiden.strip().upper() + + N = len(maiden) + assert 8>=N>=2 and N%2==0,'Maidenhead locator requires 2-8 characters, even number of characters' + + O = ord('A') + lon = -180 + lat = -90 +#%% first pair + lon += (ord(maiden[0])-O)*20 + lat += (ord(maiden[1])-O)*10 +#%% second pair + if N>=4: + lon += int(maiden[2])*2 + lat += int(maiden[3])*1 + if N==4: + lon += 1 + lat += 0.5 +#%% + if N>=6: + lon += (ord(maiden[4])-O) * 5./60 + lat += (ord(maiden[5])-O) * 2.5/60 + if N==6: + lon += 2.5/60 + lat += 1.25/60 +#%% + if N>=8: + lon += int(maiden[6]) * 5./600 + 2.5/600 + lat += int(maiden[7]) * 2.5/600 + 1.25/600 + + return lat,lon + +def toMaiden(position, precision=3): + """Returns a maidenloc for specified lat-lon tuple at specified level. + """ + assert len(position)==2,'lat lon required' + lat = float(position[0]) + lon = float(position[1]) + + A = ord('A') + a = divmod(lon+180, 20) + b = divmod(lat+90, 10) + astring = chr(A+int(a[0])) + chr(A+int(b[0])) + lon = a[1] / 2. + lat = b[1] + i = 1 + while i < precision: + i += 1 + a = divmod(lon,1) + b = divmod(lat,1) + if not (i%2): + astring += str(int(a[0])) + str(int(b[0])) + lon = 24 * a[1] + lat = 24 * b[1] + else: + astring += chr(A+int(a[0])) + chr(A+int(b[0])) + lon = 10 * a[1] + lat = 10 * b[1] + + if len(astring)>=6: + astring = astring[:4] + astring[4:6].lower() + astring[6:] + + return astring