combination_m_n

def combination_2_n(l):
    n, r = len(l), []
    for i in range(0, n, 1):
        s = i + 1
        for ii in range(s, n, 1):
            r.append([l[i], l[ii]])
    return r
# l1, l2 = [23, 123], [24, 124]
def rad(d):
    return d * np.pi / 180.0


def compute_diff(l1, l2):
    lat1, lng1 = l1
    lat2, lng2 = l2
    radLat1, radLat2 = rad(lat1), rad(lat2)
    a = radLat1 - radLat2
    b = rad(lng1) - rad(lng2)
    inner_ = math.sqrt(math.pow(math.sin(a / 2), 2) +
                       math.cos(radLat1) * math.cos(radLat2) * math.pow(math.sin(b / 2), 2))
    s = 2 * math.asin(inner_)
    s = s * 6378.137
    s = math.ceil(s * 10000) / 10000;
    return s


# 0-设置2组经纬度距离阈值(初始值:100米);
# 1-如果只有一组组经纬度,则直接接受;基于经纬度条数的分布数据,认为“在保证距离阈值的情况下,
# 取距离(并列)最近的2点的经纬度的算数平均数”是可行的;
# latlon_l = [[142, 343], [12, 6557], [3, 666], [434, 33], [142, 6557]]

def compute_macwithres_nominal_latlon(latlon_l, point_dis_threshold=500):
    n, r = len(latlon_l), {}
    if n == 1:
        return {0: latlon_l[0]}
    elif n > 1:
        c_pair = combination_2_n(latlon_l)
        for i in c_pair:
            dis = compute_diff(i[0], i[1])
            if dis > point_dis_threshold:
                continue
            if dis not in r:
                r[dis] = []
            r[dis].append(i)
        if r == {}:
            return {}
        else:
            min = sorted(r, reverse=False)[0]
            return {min: r[min][0]}