列表中的python距离比较

时间:2013-10-09 02:51:42

标签: python

我有一个位置列表,想要将每个位置与其他位置进行比较以消除关闭位置。在这里,“接近”意味着20公里。如果任何位置之间的距离大于“关闭”,则应将其作为足够远的位置添加到结果列表中。我这样做是为了将每个位置与列表中的其他位置进行比较。但是,我想我错过了一些距离比较。所以,任何帮助都会很棒。

让我举一个例子,说明我想要实现的目标以及我遇到的问题。 例如,location_list=[A,B,C,D,E,F],第一个比较对将是(A,B),它们之间的距离是25公里。因此,它大于阈值,我们可以将A,B添加到结果列表中。 第二个比较是(A,C),它们之间的距离是50km,大于阈值,这里我应该将C与之前添加到结果列表中的A和B进行比较。如果(B,C)之间的距离大于阈值,我应该将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])

1 个答案:

答案 0 :(得分:0)

最直接的方法似乎是用一个检查列表中所有先前点的内部循环替换内循环,并且只有在距离必要的距离时才将新点添加到列表中。

for j in location_list:
    is_distant_location = True

    # Check against all previously accepted points.
    # If it's too close, don't accept it.
    for n in result:
        if haversine(j[0],j[1],n[0],n[1]) <= 20:
            is_distant_location = False
            break

    if is_distant_location:
        result.append(j[0],j[1])

可能有更多高级工具可以为您提供更简洁的代码 - 一旦您习惯使用这些工具 - 可能更容易维护,例如Tim Peters建议的itertools模块。