我有一个非常简单的问题:我需要使用地理坐标转换文件,例如
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
任何建议都将不胜感激!感谢和抱歉业余问题。
答案 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)
逐行评论
data.T
转换数组,列成为tows,而在Python中,它比列更容易解决行... data[0]+data[1]/60.+data[2]/3600.
是一个矢量化表达式,data
数组的每一行都是一个数组,您可以使用{{1}来计算代数表达式接受矢量表达式作为参数的函数。 numpy
我们有两个引用两个不同表达式的名称,我们希望将它们组合在一个数组中,以便我们可以使用np.vstack((lat,lon)).T
来保存它。
使用np.savetxt()
我们得到一个像
np.vstack()
但我们想保存像
这样的数组[[lt0, lt1, ..., ltN],
[ln0, ln1, ..., lnN]]
所以我们必须转置[[lt0, ln0],
[lt1, ln1],
...
np.vstack()
我们使用np.savetxt(outname, converted)
图书馆提供的方便的便捷功能立即保存整个阵列。请注意,在使用numpy
时,您应该尝试避免显式循环,而是依赖于 vectorize 大多数表达式的能力。这样可以提高代码效率。