1+ def process_position (pos_str ):
2+ """
3+ 处理经纬度字符串:
4+ 输入格式:N031.12.37.142,E121.19.54.741
5+ 输出格式:31.210317:121.331872(冒号分隔,6位小数)
6+
7+ 格式说明:
8+ - N031.12.37.142 表示北纬31度12分37.142秒
9+ - E121.19.54.741 表示东经121度19分54.741秒
10+ """
11+ try :
12+ # 去掉空格
13+ pos_str = pos_str .strip ()
14+
15+ # 分割纬度和经度
16+ if ',' in pos_str :
17+ lat_str , lon_str = pos_str .split (',' , 1 )
18+ elif ',' in pos_str : # 中文逗号
19+ lat_str , lon_str = pos_str .split (',' , 1 )
20+ else :
21+ return None
22+
23+ # 处理纬度
24+ lat_decimal = parse_dot_dms_format (lat_str .strip ())
25+ if lat_decimal is None :
26+ return None
27+
28+ # 处理经度
29+ lon_decimal = parse_dot_dms_format (lon_str .strip ())
30+ if lon_decimal is None :
31+ return None
32+
33+ # 格式化为冒号分隔(保留6位小数)
34+ return f"{ lat_decimal :.6f} :{ lon_decimal :.6f} "
35+
36+ except Exception as e :
37+ print (f"处理位置时出错: { e } " )
38+ return None
39+
40+ def parse_dot_dms_format (dms_str ):
41+ """
42+ 解析点分隔的度分秒格式
43+ 输入格式:N031.12.37.142 或 E121.19.54.741
44+ 返回:小数格式的坐标值
45+ """
46+ try :
47+ # 去掉前缀(N, E, S, W)
48+ dms_str = dms_str .strip ()
49+ if dms_str .startswith ('N' ) or dms_str .startswith ('S' ):
50+ prefix_removed = dms_str [1 :]
51+ elif dms_str .startswith ('E' ) or dms_str .startswith ('W' ):
52+ prefix_removed = dms_str [1 :]
53+ else :
54+ prefix_removed = dms_str # 如果没有前缀,直接使用
55+
56+ # 按点号分割
57+ parts = prefix_removed .split ('.' )
58+
59+ if len (parts ) < 3 :
60+ return None
61+
62+ # 提取度、分、秒
63+ # 注意:度可能有3位数(如031),分和秒是2位数
64+ degrees = int (parts [0 ])
65+
66+ # 分
67+ minutes = int (parts [1 ])
68+
69+ # 秒(可能包含小数部分)
70+ seconds_str = parts [2 ]
71+ if len (parts ) > 3 :
72+ # 如果有第四部分,说明秒有小数
73+ seconds_str = f"{ parts [2 ]} .{ parts [3 ]} "
74+
75+ seconds = float (seconds_str )
76+
77+ # 计算小数格式:度 + 分/60 + 秒/3600
78+ decimal_value = degrees + minutes / 60 + seconds / 3600
79+
80+ return decimal_value
81+
82+ except Exception as e :
83+ print (f"解析点分隔度分秒格式时出错: { e } , 输入: { dms_str } " )
84+ return None
85+
86+ def validate_coordinate_format (coord_str ):
87+ """
88+ 验证坐标字符串格式是否正确
89+ 要求格式:N031.12.37.142,E121.19.54.741
90+ """
91+ try :
92+ # 基本格式检查
93+ if ',' not in coord_str and ',' not in coord_str :
94+ return False
95+
96+ # 分割检查
97+ if ',' in coord_str :
98+ lat_str , lon_str = coord_str .split (',' , 1 )
99+ else :
100+ lat_str , lon_str = coord_str .split (',' , 1 )
101+
102+ # 检查前缀
103+ lat_str = lat_str .strip ()
104+ lon_str = lon_str .strip ()
105+
106+ if not (lat_str .startswith ('N' ) or lat_str .startswith ('S' )):
107+ return False
108+ if not (lon_str .startswith ('E' ) or lon_str .startswith ('W' )):
109+ return False
110+
111+ # 检查点分隔格式
112+ lat_without_prefix = lat_str [1 :]
113+ lon_without_prefix = lon_str [1 :]
114+
115+ # 应该至少有3个点号(度.分.秒)
116+ if lat_without_prefix .count ('.' ) < 2 or lon_without_prefix .count ('.' ) < 2 :
117+ return False
118+
119+ # 尝试解析
120+ lat_decimal = parse_dot_dms_format (lat_str )
121+ lon_decimal = parse_dot_dms_format (lon_str )
122+
123+ return lat_decimal is not None and lon_decimal is not None
124+
125+ except Exception :
126+ return False
127+
128+ def format_coordinate_to_string (lat_decimal , lon_decimal , decimal_places = 6 ):
129+ """
130+ 将小数格式的经纬度格式化为字符串
131+ 格式:纬度:经度
132+ 示例:31.210317:121.331872
133+ """
134+ return f"{ lat_decimal :.{decimal_places }f} :{ lon_decimal :.{decimal_places }f} "
135+
136+ def convert_to_dot_dms_format (decimal_value , prefix = '' ):
137+ """
138+ 将小数格式转换为点分隔的度分秒格式
139+ 输入:31.210317
140+ 输出:N031.12.37.142
141+ """
142+ try :
143+ degrees = int (decimal_value )
144+ minutes_decimal = (decimal_value - degrees ) * 60
145+ minutes = int (minutes_decimal )
146+ seconds = (minutes_decimal - minutes ) * 60
147+
148+ # 格式化:度保持3位,分2位,秒保留3位小数
149+ degrees_str = f"{ degrees :03d} "
150+ minutes_str = f"{ minutes :02d} "
151+ seconds_str = f"{ seconds :.3f} "
152+
153+ # 秒可能需要拆分整数和小数部分
154+ seconds_parts = seconds_str .split ('.' )
155+ if len (seconds_parts ) == 2 :
156+ seconds_int = seconds_parts [0 ].zfill (2 )
157+ seconds_frac = seconds_parts [1 ]
158+ return f"{ prefix } { degrees_str } .{ minutes_str } .{ seconds_int } .{ seconds_frac } "
159+ else :
160+ return f"{ prefix } { degrees_str } .{ minutes_str } .{ seconds_parts [0 ].zfill (2 )} .000"
161+
162+ except Exception as e :
163+ print (f"转换为点分隔度分秒格式时出错: { e } " )
164+ return None
0 commit comments