如何从文本创建变量并转换坐标
How Can I Create Variables From Text and Convert Coordinates
我知道有与我类似的问题,但在几个小时内尝试了无数“答案”之后,我认为我最好的下一步是在此处提交我的难题。我尊重你的时间。
几个小时后,我没有成功理解为什么我的 Python 脚本无法运行,我决定看看是否有人可以帮助我。从本质上讲,目标是使用天文程序“Stellarium”作为“昼夜天空”来练习天体导航 (CelNav) 在 Microsoft Flight Simulator X (FSX) 的模拟世界中导航。该脚本实际上编写了一个“startup.ssc”脚本,用于初始化 Stellarium 的日期、时间和位置。
过程是这样的...
- 使用 FSX 并保存一次“飞行”。这将创建一个 *.FLT 文件,它是一个文本文件,可以保存完整的情况,包括时间和位置。
- 运行 FSXtoStellarium.py
- 在*.FLT 文本中找到日期、时间、纬度、经度和高度的行。
- 将数据读入变量。
- 将度 (°)、分 (')、秒 (") (DMS) 转换为十进制度 (DD)。
- 最后,脚本构建一个“startup.ssc”并在记录的时间和地点打开 Stellarium。
问题:
我无法将 DMS 正确读入变量,也无法将 DMS 格式化为十进制 (DD)。根据我在 IDE (PyScripter) 中设置的“watches”,脚本正在读取一个我无法破译的“int”值,而不是 DMS 的文本字符串(示例:W157° 27' 23.20 ").
以下是文件和脚本的一些摘录。
HMS Bounty.FLT
Various lines of data above...
[SimVars.0]
Latitude=N21° 20' 47.36"
Longitude=W157° 27' 23.20"
Altitude=+000004.93
Various lines of data below...
EOF
FSXtoStellarium.py
Various lines of script above...
# find lat & Lon in the file
start = content.find("SimVars.0")
latstart = content.find("Latitude=")
latend = content.find("Latitude=",latstart+1)
longstart = content.find("Longitude=",start)
longend = content.find(",",longstart)
# convert to dec deg
latitude = float(content[longend+1:latend])/120000
longitude = float(content[longstart+10:longend])/120000
Various lines of script below...
那么,我错过了什么?
仅供参考 - 我是一个很困惑的老人。我的职业生涯是 COBOL/DB2/CICS,但您可以认为我是 Python 新手(这表明,对吧?)。 :)
非常感谢您的帮助,我很乐意提供任何其他信息。
卡尔文
这是一种从文本文件(具有多个输入行)一直到 python 2.7 中的十进制度数的方法:
from __future__ import print_function
content='''
[SimVars.0]
Latitude=N21° 20' 47.36"
Longitude=W157° 27' 23.20"
'''
latKey = "Latitude="
longKey = "Longitude="
latstart = content.index(latKey) + len(latKey)
latend = content.find('"', latstart) + 1
longstart = content.find(longKey, latend) + len(longKey)
longend = content.find('"', longstart) + 1
lat = content[latstart:latend]
long = content[longstart:longend]
print()
print('lat ', lat)
print('long ', long)
deg, mnt, sec = [float(x[:-1]) for x in lat[1:].split()]
latVal = deg + mnt / 60 + sec / 3600
deg, mnt, sec = [float(x[:-1]) for x in long[1:].split()]
longVal = deg + mnt / 60 + sec / 3600
print()
print('latVal ', latVal)
print('longVal ', longVal)
解释:
- 我们从 multi-line 字符串开始,
content
- 第一个
index()
调用在 content
中找到子字符串 "Latitude="
的起始位置,我们向其添加 "Latitude="
的长度,因为我们关心的是=
字符 之后的字符
- 第二个
index()
调用搜索 'seconds' 字符 "
(标记 Latitude
子字符串的结尾),我们向其添加一个(用于"
) 的长度
- 第三个
index()
调用为 Longitude=
做的事情类似于我们为纬度做的事情,除了它从位置 latend
开始,因为我们希望 Longitude=
跟随Latitude=
之后的纬度字符串
- 第四个
index()
调用寻找经度子字符串的结尾,完全类似于上面的第二个 index()
纬度 调用
- 对
lat
的赋值使用列表 content
的方括号切片符号来提取从 Latitude=
末尾到后续 "
字符的子字符串
- 对
long
的赋值类似于上一步
- 对
deg, mnt, sec
的第一个赋值是使用列表理解为这些变量分配 3 个值的 tuple
:
- 将
lat[1:]
拆分为 21°
、20'
和 space-delimited 标记 lat[1:]
,即移除了主要方向字符 N
的纬度=40=]
- 对于每个标记,
x[:-1]
使用切片表示法删除给出字符串 21
、20
和 47.36
的最后一个字符
float()
将这些字符串转换为 float
类型的数字
- 对
latVal
的赋值进行必要的运算,使用存储在 deg, mnt, sec
. 中的度、分和秒来计算十进制度数
- 从
long
到 longVal
的处理方式与上述 lat
和 latVal
完全类似。
输出:
lat N21° 20' 47.36"
long W157° 27' 23.20"
latVal 21.34648888888889
longVal 157.45644444444443
我知道有与我类似的问题,但在几个小时内尝试了无数“答案”之后,我认为我最好的下一步是在此处提交我的难题。我尊重你的时间。
几个小时后,我没有成功理解为什么我的 Python 脚本无法运行,我决定看看是否有人可以帮助我。从本质上讲,目标是使用天文程序“Stellarium”作为“昼夜天空”来练习天体导航 (CelNav) 在 Microsoft Flight Simulator X (FSX) 的模拟世界中导航。该脚本实际上编写了一个“startup.ssc”脚本,用于初始化 Stellarium 的日期、时间和位置。
过程是这样的...
- 使用 FSX 并保存一次“飞行”。这将创建一个 *.FLT 文件,它是一个文本文件,可以保存完整的情况,包括时间和位置。
- 运行 FSXtoStellarium.py
- 在*.FLT 文本中找到日期、时间、纬度、经度和高度的行。
- 将数据读入变量。
- 将度 (°)、分 (')、秒 (") (DMS) 转换为十进制度 (DD)。
- 最后,脚本构建一个“startup.ssc”并在记录的时间和地点打开 Stellarium。
问题: 我无法将 DMS 正确读入变量,也无法将 DMS 格式化为十进制 (DD)。根据我在 IDE (PyScripter) 中设置的“watches”,脚本正在读取一个我无法破译的“int”值,而不是 DMS 的文本字符串(示例:W157° 27' 23.20 ").
以下是文件和脚本的一些摘录。
HMS Bounty.FLT
Various lines of data above...
[SimVars.0]
Latitude=N21° 20' 47.36"
Longitude=W157° 27' 23.20"
Altitude=+000004.93
Various lines of data below...
EOF
FSXtoStellarium.py
Various lines of script above...
# find lat & Lon in the file
start = content.find("SimVars.0")
latstart = content.find("Latitude=")
latend = content.find("Latitude=",latstart+1)
longstart = content.find("Longitude=",start)
longend = content.find(",",longstart)
# convert to dec deg
latitude = float(content[longend+1:latend])/120000
longitude = float(content[longstart+10:longend])/120000
Various lines of script below...
那么,我错过了什么?
仅供参考 - 我是一个很困惑的老人。我的职业生涯是 COBOL/DB2/CICS,但您可以认为我是 Python 新手(这表明,对吧?)。 :)
非常感谢您的帮助,我很乐意提供任何其他信息。
卡尔文
这是一种从文本文件(具有多个输入行)一直到 python 2.7 中的十进制度数的方法:
from __future__ import print_function
content='''
[SimVars.0]
Latitude=N21° 20' 47.36"
Longitude=W157° 27' 23.20"
'''
latKey = "Latitude="
longKey = "Longitude="
latstart = content.index(latKey) + len(latKey)
latend = content.find('"', latstart) + 1
longstart = content.find(longKey, latend) + len(longKey)
longend = content.find('"', longstart) + 1
lat = content[latstart:latend]
long = content[longstart:longend]
print()
print('lat ', lat)
print('long ', long)
deg, mnt, sec = [float(x[:-1]) for x in lat[1:].split()]
latVal = deg + mnt / 60 + sec / 3600
deg, mnt, sec = [float(x[:-1]) for x in long[1:].split()]
longVal = deg + mnt / 60 + sec / 3600
print()
print('latVal ', latVal)
print('longVal ', longVal)
解释:
- 我们从 multi-line 字符串开始,
content
- 第一个
index()
调用在content
中找到子字符串"Latitude="
的起始位置,我们向其添加"Latitude="
的长度,因为我们关心的是=
字符 之后的字符
- 第二个
index()
调用搜索 'seconds' 字符"
(标记Latitude
子字符串的结尾),我们向其添加一个(用于"
) 的长度
- 第三个
index()
调用为Longitude=
做的事情类似于我们为纬度做的事情,除了它从位置latend
开始,因为我们希望Longitude=
跟随Latitude=
之后的纬度字符串
- 第四个
index()
调用寻找经度子字符串的结尾,完全类似于上面的第二个index()
纬度 调用
- 对
lat
的赋值使用列表content
的方括号切片符号来提取从Latitude=
末尾到后续"
字符的子字符串 - 对
long
的赋值类似于上一步 - 对
deg, mnt, sec
的第一个赋值是使用列表理解为这些变量分配 3 个值的tuple
:- 将
lat[1:]
拆分为21°
、20'
和 space-delimited 标记lat[1:]
,即移除了主要方向字符N
的纬度=40=] - 对于每个标记,
x[:-1]
使用切片表示法删除给出字符串21
、20
和47.36
的最后一个字符
float()
将这些字符串转换为float
类型的数字
- 将
- 对
latVal
的赋值进行必要的运算,使用存储在deg, mnt, sec
. 中的度、分和秒来计算十进制度数
- 从
long
到longVal
的处理方式与上述lat
和latVal
完全类似。
输出:
lat N21° 20' 47.36"
long W157° 27' 23.20"
latVal 21.34648888888889
longVal 157.45644444444443