我有一个位置列表,想将每个位置与其他位置进行比较以消除靠近的位置。这里,“近”的意思是20公里。如果任何位置之间的距离大于“close”,则应将其添加到结果列表中作为足够远的位置。我这样做是为了将每个位置与列表中的其他位置进行比较。但是,我想我错过了一些距离比较。所以,任何帮助都会很棒。
让我举一个例子,说明我想要实现的目标以及卡住的地方。例如,location_list=[A,B,C,D,E,F]
第一个比较对是(A,B)
并且它们之间的距离是 25km。因此,它大于阈值,我们可以添加A,B
到结果列表中。第二个比较是(A,C)
它们之间的距离是大于阈值的 50 公里,这里我应该将 C 与先前添加到结果列表中的 A 和 B 进行比较。如果之间的距离(B,C)
大于阈值,则 i 应添加C
到结果列表中,否则不应将 C 添加到列表中,因为它靠近先前添加的位置。
我遇到的问题是,我如何比较在上一步中添加到列表中的新(e.g., C)
位置(A,B)
。
from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
km = 6367 * c
return km
result=[]
location_list=[(44.968046,-94.420307),
(44.33328,-89.132008),
(33.755787,-116.359998),
(33.844843,-116.54911),
(44.92057,-93.44786),
(44.240309,-91.493619),
(44.968041,-94.419696),
(44.333304,-89.132027),
(33.755783,-116.360066),
(33.844847,-116.549069),
(44.920474,-93.447851),
(44.240304,-91.493768)]
for j in location_list:
for k in location_list:
if haversine(j[0],j[1],k[0],k[1])>20:
print j,k,haversine(j[0],j[1],k[0],k[1])
result.append(j[0],j[1])
result.append(k[0],k[1])