[問題] 如何使用np.array的經緯度計算兩兩的距離

作者: piacere (Beol)   2023-01-10 11:33:34
各位先進們好
我是一名基礎不太好的python新手QQ
現有一批大量的經緯度座標要做KNN
但我想添加一個距離限制(例如小於1000m才會被cluster)
參考網路上的做法,我目前是這樣寫的:
假設我有十組經緯度資料,陣列為:
data_point=[[120.228986 22.92753 ]
[120.222007 22.9854525]
[120.21645 22.99625 ]
[120.221625 22.99833 ]
[120.1566975 22.987169 ]
[120.281875 23.106358 ]
[120.314682 23.319719 ]
[120.219985 22.998485 ]
[120.215055 22.99942 ]
[120.20783 22.999415 ]]
def np_getDistance(data, data_point, i, j):
ra = 6378140
rb = 6356755
flatten = 0.003353
midLatA=data_point[i,1]
midLonA=data_point[i,0]
midLatB=data_point[j,1]
midLonB=data_point[j,0]
radLatA = np.radians(midLatA)
radLonA = np.radians(midLonA)
radLatB = np.radians(midLatB)
radLonB = np.radians(midLonB)
pA = np.arctan(rb / ra * np.tan(radLatA))
pB = np.arctan(rb / ra * np.tan(radLatB))
x = np.arccos( np.multiply(np.sin(pA),np.sin(pB)) +
np.multiply(np.multiply(np.cos(pA),np.cos(pB)),np.cos(radLonA - radLonB)))
c1 = np.multiply((np.sin(x) - x) , np.power((np.sin(pA) + np.sin(pB)),2))
/ np.power(np.cos(x / 2),2)
c2 = np.multiply((np.sin(x) + x) , np.power((np.sin(pA) - np.sin(pB)),2))
/ np.power(np.sin(x / 2),2)
dr = flatten / 8 * (c1 - c2)
distance = 0.001 * ra * (x + dr)
return distance
for i in range(dataLen)):
knn = KNN(i, K, data_point, tree) #計算KNN
for j in knn:
if l[i] != l[j]:
if clusterSim(c[l[i]], c[l[j]], data, alpha) <= 1:
if np_getDistance(data, data_point,l[i], l[j]) <= 1000:
merge(c, l[i], l[j], l)
但是輸出的數值會直接不見=口=
請問我是計算上哪裡有問題,還是code寫錯了,還是array取錯了呢?
若不加np_getDistance的話code跑起來是沒問題
或者還有什麼有效率的方法可以從np.array兩兩計算經緯度的距離呢?
謝謝大家的指教QQ
作者: DavisX   2023-01-10 14:07:00
你func的 def 'data'和'data_mid_point' 和裡面的名稱不同你code不完整 建議你data大概留3點 每個有新算東西就print你這算球面多點距離 太遠二點誤差太大又要踢掉
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2023-01-10 16:36:00
你距離是怎麼抓的?話說你要的那個功能通常叫做 Mask
作者: DavisX   2023-01-10 17:03:00
你pop()裡怎還有引數啊, 那pop不就沒效?
作者: lycantrope (阿寬)   2023-01-10 17:07:00
沒有完整code只能算命,dict用pop但沒有key的error
作者: chang1248w (彩棠)   2023-01-10 21:12:00
我記得sklearn裡面有現成的可以用
作者: lycantrope (阿寬)   2023-01-10 21:31:00
通常是sklearn 把metrics換成經緯度距離

Links booklink

Contact Us: admin [ a t ] ucptt.com