0

場所のリストがあり、各場所を他の場所と比較して、近い場所を除外したいと考えています。ここで「近い」とは20kmという意味です。任意の場所間の距離が「近い」よりも大きい場合は、十分に遠い場所として結果リストに追加する必要があります。これを行って、各場所をリスト内の他の場所と比較しました。しかし、私はいくつかの距離の比較が欠けていると思います。だから、どんな助けも素晴らしいでしょう。

私が達成したいことと行き詰まった場所についての例を挙げましょう。たとえばlocation_list=[A,B,C,D,E,F]、最初の比較ペアは で(A,B)、それらの間の距離は 25km です。そのため、しきい値を超えているA,Bため、結果リストに追加できます。2 番目の比較は(A,C)、それらの間の距離が 50 km であり、しきい値を超えています。ここでは、以前に結果リストに追加された A および B と C を比較する必要があります。間の距離(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 に答える