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
中的坐标为tuple
s
Line 5
:对coords
中的每一个坐标,计算出十进制的坐标,赋值给output
,如tuple
s
如果我理解正确你在 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
转置数组,列变成拖曳,在 Python 中,处理行比处理列更容易...
data[0]+data[1]/60.+data[2]/3600.
是一个矢量化表达式,data
数组的每一行都是一个数组,你可以评估代数表达式,可能还使用 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
库提供的便捷功能之一立即保存整个数组。
请注意,在使用 numpy
时,您应该尽量避免显式循环,而是依赖其对大多数表达式进行 向量化 的能力。这会产生更高效的代码。
我有一个非常简单的问题:我需要使用像
这样的地理坐标来转换文件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
中的坐标为tuple
s
Line 5
:对coords
中的每一个坐标,计算出十进制的坐标,赋值给output
,如tuple
s
如果我理解正确你在 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
转置数组,列变成拖曳,在 Python 中,处理行比处理列更容易...data[0]+data[1]/60.+data[2]/3600.
是一个矢量化表达式,data
数组的每一行都是一个数组,你可以评估代数表达式,可能还使用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
库提供的便捷功能之一立即保存整个数组。
请注意,在使用 numpy
时,您应该尽量避免显式循环,而是依赖其对大多数表达式进行 向量化 的能力。这会产生更高效的代码。