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