#!/usr/bin/python # # Copyright (c) 2019 Clementine Computing LLC. # # This file is part of PopuFare. # # PopuFare is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # PopuFare is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with PopuFare. If not, see . # # Convert from/to different formats of GPS representations # # DD - decimal degree # DMS - degree/minut/second format # DMM - degree/decimal minute format # # 42.445512 -76.50726 # 42.444988 -76.506852 # 42.4444 -76.506444 # DD example: 42.445512 # DMS example: 42 3 3 # DMM example: 42 3.1 import sys def print_usage(fp): fp.write("\nusage:\n\n") fp.write(" convert-gps [dd|dms|dmm|dmmc][-(dd|dms|dmm|dmmc)] \n\n") infmt = "" outfmt = "dmmc" coord = "" def is_float(x): f = False try: float(x) f = True except ValueError: f = False return f def guess_dd_dmmc(coord): if not is_float(coord): return "" tok = coord.split(".") if len(tok) > 2 or len(tok)==0: return "" tok_i = tok[0].split("-") #print ">>", len(tok_i), tok_i[-1], len(tok_i[-1]) if len(tok_i[-1]) >= 3: return "dmmc" return "dd" if (len(sys.argv) < 2): print_usage(sys.stderr) sys.exit(-1) start_idx = 1 if not is_float(sys.argv[1]): tok=sys.argv[1].split("-") if len(tok)==1: outfmt = tok[0] else: infmt = tok[0] outfmt = tok[1] start_idx = 2 if ((outfmt != "dd") and (outfmt != "DD") and (outfmt != "dms") and (outfmt != "DMS") and (outfmt != "dmm") and (outfmt != "DMM") and (outfmt != "dmmc") and (outfmt != "DMMC")): sys.stderr.write("output format must be one of dd, dms, dmm, dmmc\n") print_usage(sys.stderr) sys.exit(-1) coord = [] for val in sys.argv[start_idx:]: coord.append(val) if len(coord) == 1: if len(infmt) == 0: infmt = guess_dd_dmmc(coord[0]) elif len(coord) == 2: if is_float(coord[0]) and is_float(coord[1]): infmt = "dmm" elif len(coord) == 3: if is_float(coord[0]) and is_float(coord[1]) and is_float(coord[2]): infmt = "dms" if ((infmt != "dd") and (infmt != "DD") and (infmt != "dms") and (infmt != "DMS") and (infmt != "dmm") and (infmt != "DMM") and (infmt != "dmmc") and (infmt != "DMMC")): sys.stderr.write("input format must be one of dd, dms, dmm, dmmc\n") print_usage(sys.stderr) sys.exit(-1) out_coord_dd = 0.0 if infmt == "dd": out_coord_dd = float(coord[0]) elif infmt == "dmm": out_coord_dd = float(coord[0]) + (float(coord[1])/60.0) elif infmt == "dms": out_coord_dd = float(coord[0]) + (float(coord[1])/60.0) + (float(coord[2])/(60.0*60.0)) elif infmt == "dmmc": x = coord[0] is_neg = False if x[0] == '-': is_neg = True x = x[1:] tok = x.split(".") min_int_part = 0.0 if len(tok[0][-2:])> 0: min_int_part = float(tok[0][-2:]) min_rem_part = 0.0 if (len(tok)>1): min_rem_part = float("0." + tok[1]) ipart = 0.0 if (len(tok[0][-4:-2])>0): ipart = float(tok[0][-4:-2]) out_coord_dd = ipart + ((min_int_part + min_rem_part)/60.0) if is_neg: out_coord_dd *= -1.0 out_coord = [] if outfmt == "dd": out_coord = [str(out_coord_dd)] elif outfmt == "dms": x0 = float(int(out_coord_dd)) x1 = float(int((out_coord_dd-x0)*60.0)) x2 = float(int( ((out_coord_dd-x0)*60.0) - ((x1-60.0)/60.0) )) out_coord.append(str(x0)) out_coord.append(str(x1)) out_coord.append(str(x2)) elif outfmt == "dmm": x0 = float(int(out_coord_dd)) x1 = float(int((out_coord_dd-x0)*60.0)) out_coord.append(str(x0)) out_coord.append(str(x1)) elif outfmt == "dmmc": x0 = float(int(out_coord_dd)) x1 = abs(float((out_coord_dd-x0)*60.0)) out_coord.append(str(int(x0)) + str(x1)) #print infmt, outfmt, coord, "-->", out_coord_dd, " ".join(out_coord) print " ".join(out_coord)