计算多个位置之间的全局距离
Calculate global distance between several locations
我正在根据坐标计算两个全局位置之间的距离。仅使用两个位置时,我得到结果:
def global_distance(location1, location2):
lat1, lon1 = location1
lat2, lon2 = location2
radius = 6371 # radius of the Earth
dlat = math.radians(lat2-lat1)
dlon = math.radians(lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
* math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = radius * c
return d
lat1 = 55.32; lat2 = 54.276; long1 = -118.8634; long2 = -117.276
print( global_distance((lat1, long1), (lat2, long2)))
如果我想计算几个位置之间的距离怎么办?假设我有一个包含三个位置的 CSV 文件:
Location Lat1 Long1
A 55.322 -117.17
B 57.316 -117.456
C 54.275 -116.567
如何遍历这两列并生成 (A,B)、(A,C) 和 (B,C) 之间的距离?
假设您已将该 CSV 读入某种序列序列(例如,list(csv.reader(f))
),您需要做的就是遍历所有位置组合。而这正是 itertools.combinations
所做的:
>>> locs = [('A', 55.322, -117.17), ('B', 57.316, -117.456), ('C', 54.275, 116.567)]
>>> for (loc1, lat1, lon1), (loc2, lat2, lon2) in itertools.combinations(locs, 2):
... print(loc1, loc2, global_distance((lat1, lon1), (lat2, lon2)))
A B 222.42244003744995
A C 122.66829007875741
B C 342.67144769115316
当您查看上面的链接文档时,请注意 combinations_with_replacement
、permutations
和 product
,它们通常是类似但略有不同的问题的答案。
这应该很容易适应字典序列,或 Location
个实例等的字典。另一方面,如果你有类似 2D numpy 数组或 pandas DataFrame,你可能想做一些不同的事情。 (尽管通过快速搜索,看起来只是将 itertools
与 fromiter
的组合制成一个数组并不比其他任何东西慢很多,即使你想用 space 交换是时候广播你的 global_distance
函数了。)
我会通过 pandas 从您的文件中导入数据:
import pandas as pd
df = pd.read_table(filename, sep='\s+', index_col=0)
此外,您可以导入 itertools:
import itertools as it
有了这个,您可以获得像这样的可迭代对象的所有组合,例如此处数据帧的索引:
for i in it.combinations(df.index, 2): print(i)
('A', 'B')
('A', 'C')
('B', 'C')
这表明您将获得所需的组合。
现在对数据框的数据执行相同的操作:
for i in it.combinations(df.values, 2): print(global_distance(i[0], i[1]))
222.4224400374507
122.66829007875636
342.671447691153
如果你想在输出中包含位置名称,你可以在导入时省略 index_col=0
,这样 A、B 和 C 也是 df.values
的一部分并且你可以写:
for i in it.combinations(df.values, 2): print(i[0][0], '-', i[1][0], global_distance(i[0][1:], i[1][1:]))
A - B 222.4224400374507
A - C 122.66829007875636
B - C 342.671447691153
我正在根据坐标计算两个全局位置之间的距离。仅使用两个位置时,我得到结果:
def global_distance(location1, location2):
lat1, lon1 = location1
lat2, lon2 = location2
radius = 6371 # radius of the Earth
dlat = math.radians(lat2-lat1)
dlon = math.radians(lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
* math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = radius * c
return d
lat1 = 55.32; lat2 = 54.276; long1 = -118.8634; long2 = -117.276
print( global_distance((lat1, long1), (lat2, long2)))
如果我想计算几个位置之间的距离怎么办?假设我有一个包含三个位置的 CSV 文件:
Location Lat1 Long1
A 55.322 -117.17
B 57.316 -117.456
C 54.275 -116.567
如何遍历这两列并生成 (A,B)、(A,C) 和 (B,C) 之间的距离?
假设您已将该 CSV 读入某种序列序列(例如,list(csv.reader(f))
),您需要做的就是遍历所有位置组合。而这正是 itertools.combinations
所做的:
>>> locs = [('A', 55.322, -117.17), ('B', 57.316, -117.456), ('C', 54.275, 116.567)]
>>> for (loc1, lat1, lon1), (loc2, lat2, lon2) in itertools.combinations(locs, 2):
... print(loc1, loc2, global_distance((lat1, lon1), (lat2, lon2)))
A B 222.42244003744995
A C 122.66829007875741
B C 342.67144769115316
当您查看上面的链接文档时,请注意 combinations_with_replacement
、permutations
和 product
,它们通常是类似但略有不同的问题的答案。
这应该很容易适应字典序列,或 Location
个实例等的字典。另一方面,如果你有类似 2D numpy 数组或 pandas DataFrame,你可能想做一些不同的事情。 (尽管通过快速搜索,看起来只是将 itertools
与 fromiter
的组合制成一个数组并不比其他任何东西慢很多,即使你想用 space 交换是时候广播你的 global_distance
函数了。)
我会通过 pandas 从您的文件中导入数据:
import pandas as pd
df = pd.read_table(filename, sep='\s+', index_col=0)
此外,您可以导入 itertools:
import itertools as it
有了这个,您可以获得像这样的可迭代对象的所有组合,例如此处数据帧的索引:
for i in it.combinations(df.index, 2): print(i)
('A', 'B')
('A', 'C')
('B', 'C')
这表明您将获得所需的组合。 现在对数据框的数据执行相同的操作:
for i in it.combinations(df.values, 2): print(global_distance(i[0], i[1]))
222.4224400374507
122.66829007875636
342.671447691153
如果你想在输出中包含位置名称,你可以在导入时省略 index_col=0
,这样 A、B 和 C 也是 df.values
的一部分并且你可以写:
for i in it.combinations(df.values, 2): print(i[0][0], '-', i[1][0], global_distance(i[0][1:], i[1][1:]))
A - B 222.4224400374507
A - C 122.66829007875636
B - C 342.671447691153