Python | NumPy |坐标 - 转换地理坐标的问题

时间:2016-06-01 07:29:55

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

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

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)除以36和60秒(50和40),然后加上这些数字,我们将获得剩余的学位(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

任何建议都将不胜感激!感谢和抱歉业余问题。

2 个答案:

答案 0 :(得分:2)

这可以通过以下更加Pythonic的方式完成。

Dim callingForm = Application.OpenForms.Item(form_Name)

输出:

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加载 tuple:对于Line 5中的每个坐标计算十进制系统中的坐标,并将其分配给coords output s

答案 1 :(得分:2)

如果我正确理解了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转换数组,列成为tows,而在Python中,它比列更容易解决行...
  2. data[0]+data[1]/60.+data[2]/3600.是一个矢量化表达式,data数组的每一行都是一个数组,您可以使用{{1}来计算代数表达式接受矢量表达式作为参数的函数。
  3. 如上所述......
  4. numpy我们有两个引用两个不同表达式的名称,我们希望将它们组合在一个数组中,以便我们可以使用np.vstack((lat,lon)).T来保存它。 使用np.savetxt()我们得到一个像

    这样的数组
    np.vstack()

    但我们想保存像

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

    所以我们必须转置[[lt0, ln0], [lt1, ln1], ...

  5. 的结果
  6. np.vstack()我们使用np.savetxt(outname, converted)图书馆提供的方便的便捷功能立即保存整个阵列。
  7. 请注意,在使用numpy时,您应该尝试避免显式循环,而是依赖于 vectorize 大多数表达式的能力。这样可以提高代码效率。