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

Python | NumPy | Coordinates - An issue with conversion of geographical coordinates

我有一个非常简单的问题:我需要使用像

这样的地理坐标来转换文件
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

如有任何建议,我们将不胜感激!感谢和抱歉业余问题。

这可以用更 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中的每一个坐标,计算出十进制的坐标,赋值给output,如tuples

如果我理解正确你在 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. 的结果
  6. np.savetxt(outname, converted) 我们使用 numpy 库提供的便捷功能之一立即保存整个数组。

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