如何从文本创建变量并转换坐标

How Can I Create Variables From Text and Convert Coordinates

我知道有与我类似的问题,但在几个小时内尝试了无数“答案”之后,我认为我最好的下一步是在此处提交我的难题。我尊重你的时间。

几个小时后,我没有成功理解为什么我的 Python 脚本无法运行,我决定看看是否有人可以帮助我。从本质上讲,目标是使用天文程序“Stellarium”作为“昼夜天空”来练习天体导航 (CelNav) 在 Microsoft Flight Simulator X (FSX) 的模拟世界中导航。该脚本实际上编写了一个“startup.ssc”脚本,用于初始化 Stellarium 的日期、时间和位置。

过程是这样的...

  1. 使用 FSX 并保存一次“飞行”。这将创建一个 *.FLT 文件,它是一个文本文件,可以保存完整的情况,包括时间和位置。
  2. 运行 FSXtoStellarium.py
  3. 在*.FLT 文本中找到日期、时间、纬度、经度和高度的行。
  4. 将数据读入变量。
  5. 将度 (°)、分 (')、秒 (") (DMS) 转换为十进制度 (DD)。
  6. 最后,脚本构建一个“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] 使用切片表示法删除给出字符串 212047.36
    • 的最后一个字符
    • float() 将这些字符串转换为 float
    • 类型的数字
  • latVal 的赋值进行必要的运算,使用存储在 deg, mnt, sec.
  • 中的度、分和秒来计算十进制度数
  • longlongVal 的处理方式与上述 latlatVal 完全类似。

输出:

lat  N21° 20' 47.36"
long  W157° 27' 23.20"

latVal  21.34648888888889
longVal  157.45644444444443