0

我有一个位置列表,想将每个位置与其他位置进行比较以消除靠近的位置。这里,“近”的意思是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])
4

1 回答 1

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])

可能有更高级的工具可以为您提供更简洁的代码——一旦你习惯了这些工具——可能更容易维护,就像itertoolsTim Peters 建议的模块一样。

于 2013-10-09T03:11:03.057 回答