【问题标题】:Python | NumPy | Coordinates - An issue with conversion of geographical coordinates蟒蛇 |数字货币 |坐标 - 地理坐标转换的问题
【发布时间】:2016-06-01 07:29:54
【问题描述】:

我有一个非常简单的问题:我需要用地理坐标转换文件,比如

Lat         Long
50 0 50     35 1 40
50 2 50     35 10 20
50 3 1      35 13 22
50 2 38     35 14 40
49 59 6     35 13 22
49 57 14    35 13 21
49 57 10    35 13 0
49 57 0     35 6 20

Lat      Long
50.01389,35.02778
50.04722,35.17222
etc.

数学很简单:我们必须将分钟(在本例中为 0 和 1)除以 60,秒(50 和 40)除​​以 3600,然后将这些数字相加,我们将得到度数的余数(50 和 35)。

这是我的 numpy 脚本。我想,这样一个简单的转换看起来很大,但是我不知道如何更简单地做到这一点。另外我不知道如何结束这个脚本,所以它可以做它应该做的。现在它以添加分钟和秒结束。

import sys
import numpy as np


filename = input('Please enter the file\'s name: ')
with open(filename, "r") as f:
    sys.stdout = open('%s (converted).txt' % f.name, 'a')

    data = np.loadtxt(f)
    degree_lat, degree_long = data[:, 0], data[:, 3]
    min_lat, sec_lat, min_long, sec_long = \
        (data[:, 1] / 60), (data[:, 2] / 3600), (data[:, 4] / 60), (data[:, 5] / 3600)

    remainder_lat, remainder_long = min_lat + sec_lat, min_long + sec_long

    degree_result_lat = degree_lat + remainder_lat
    degree_result_long = degree_long + remainder_long

任何建议将不胜感激!感谢并为业余问题感到抱歉。

【问题讨论】:

  • 你能贴几行你的输入文件吗?还有你想用sys.stdout = open...实现什么?
  • 这是一个关于如何优化/最小化代码的问题吗?那么你可能想查看codereview
  • @NilsWerner 我刚刚更新了这个主题。您可以在其顶部找到输入文件的示例。
  • @OliverW。谢谢你的链接,我会的)
  • 那个脚本和你提供的数据没有运行,它失败了ValueError: could not convert string to float: Lat

标签: python numpy coordinates coordinate-systems coordinate-transformation


【解决方案1】:

如果我正确理解您在 data 数组中的内容,

data = data.T # not strictly necessary, but simplifies following indexing

lat = data[0]+data[1]/60.+data[2]/3600.
lon = data[3]+data[4]/60.+data[5]/3600.

converted = np.vstack((lat,lon)).T

np.savetxt(outname, converted)

逐行注释

  1. data.T 转置数组,列变成拖链,在 Python 中,处理行比处理列更容易...
  2. data[0]+data[1]/60.+data[2]/3600. 是一个矢量化 表达式,data 数组的每一行本身就是一个数组,您可以计算代数表达式,也可能使用numpy 的函数接受,如参数,向量表达式。
  3. 如上...
  4. np.vstack((lat,lon)).T 我们有两个名称引用了两个不同的表达式,我们想将它们组合在一个数组中,这样我们就可以使用np.savetxt() 来保存它。 使用np.vstack(),我们得到一个类似

    的数组
    [[lt0, lt1, ..., ltN],
     [ln0, ln1, ..., lnN]]
    

    但我们想保存一个数组

    [[lt0, ln0],
     [lt1, ln1],
     ...
    

    所以我们必须转置np.vstack()的结果

  5. np.savetxt(outname, converted) 我们使用numpy 库提供的便捷功能之一立即保存整个数组。

请注意,在使用numpy 时,您应该尽量避免显式循环,而是依靠它矢量化大多数表达式的能力。这会产生更高效的代码。

【讨论】:

  • 谢谢,这也可以)我不知道“.T”,它似乎是一个非常有用的选项。
  • 它工作得更好,因为 1. 您避免了与在解释语言中执行显式循环相关的过载和 2. 输出文件的格式正确,并且可以通过 np.loadtxt() 加载。
  • 哇,非常感谢非常详细的答案,矢量化和其他。我将尝试以更 Pythonic 的方式完成我的工作并摆脱循环。现在,这看起来更简单)
  • 我认为这是多余的,但无论如何我想强调它只是 numpy 并且使用它的数组可以让你避免显式循环......它不起作用使用普通的 Python 列表。
【解决方案2】:

这可以通过更 Pythonic 的方式完成,如下所示。

import numpy as np
f = open('data.txt','r')
data = np.loadtxt(f)
coords = [(el[:3],el[3:]) for el in data]
print coords
output = [(c[0][0]+c[0][1]/60.+c[0][2]/3600.,c[1][0]+c[1][1]/60.+c[1][2]/3600.) for c in coords]
print output    

输出:

[(50.013888888888886, 35.027777777777779),
 (50.047222222222217, 35.172222222222217),
 (50.050277777777772, 35.222777777777779),
 (50.043888888888887, 35.244444444444447),
 (49.984999999999999, 35.222777777777779),
 (49.953888888888891, 35.222500000000004),
 (49.952777777777783, 35.216666666666669),
 (49.950000000000003, 35.105555555555554)]  

说明

Line 4:将coords中的坐标加载为tuples
Line 5:对于coords中的每个坐标,计算十进制坐标并将它们分配给@ 987654328@ 为tuples

【讨论】:

  • Abdul,太好了,感谢您提供更多 Pythonic 的结果和解释)
  • 顺便问一下,我怎样才能摆脱输出文件中的元组?我尝试使用 for-loop 和 .join 但它没有帮助。有什么简单的选择吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多