import re import math #将弧度转换为度分秒 def rad2dms(r): d = r * 180 / math.pi m = (d - int(d)) * 60 d = int(d) s = (m - int(m)) * 60 m = int(m) return d, m, s #将度分秒转换为弧度 def dms2rad(d, m, s): return (d + m / 60 + s / 360) / 180 * math.pi class string: dtype = str def __init__(self): pass def str2val(self, s): return s def val2str(self, v): return v class integer: dtype = int def __init__(self, fmt = "%d"): self.fmt = fmt def str2val(self, s): s = s.strip() if not s: return None try: v = int(s) except: v = int(float(s)) return v def val2str(self, v): return self.fmt % v class decimal: dtype = float def __init__(self, fmt = "%.3f", epsilon = 1e-4): self.fmt = fmt self.epsilon = epsilon def str2val(self, s): s = s.strip() if not s: return None return float(s) def val2str(self, v): if abs(v) < self.epsilon: v = 0.0 return self.fmt % v class kdecimal: dtype = float def __init__(self, fmt = "%07.3f", epsilon = 1e-4): self.fmt = fmt self.epsilon = epsilon def str2val(self, s): s = s.strip() if not s: return None match = re.match(r"[kK](\d+)\+(\d+(?:\.\d+)?)", s) if match is None: raise RuntimeError(f"pattern not matched: {s}") a = match.group(1) b = match.group(2) return float(a + b) def val2str(self, v): a = v // 1000 b = v % 1000 if abs(b - 1000) < self.epsilon: a += 1 b = 0.0 elif abs(b) < self.epsilon: b = 0.0 return f"K%d+{self.fmt}" % (a, b) class angle: dtype = float def __init__(self): pass def str2val(self, s): s = s.strip() if not s: return None match = re.match(r"(\d+)°(\d+)′(\d+(?:\.\d+)?)″", s) if match is None: raise RuntimeError(f"pattern not matched: {s}") d = int(match.group(1)) m = int(match.group(2)) s = float(match.group(3)) return dms2rad(d, m, s) def val2str(self, v): return "%2d°%02d′%05.2f″" % rad2dms(v)