Skip to content

Commit 30b6cdf

Browse files
committed
更新了 main.py 以导入 adf/model.py 中的新函数 "process_position"和"validate_coordinate_format"
1 parent a729d3c commit 30b6cdf

1 file changed

Lines changed: 164 additions & 0 deletions

File tree

adf/model.py

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
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

Comments
 (0)