Python 点集之间的(最小)大圆距离
Python (minimal) great-circle distance between sets of points
是否有一个Python包可以有效地计算数组中每个(纬度,经度)点a
到数组中每个(纬度,经度)点的最小大圆距离b
?例如 scipy.spatial.distance.cdist 不幸的是,据我所知,它不支持球面距离。
对于许多数据点(例如 a
和 b
分别有 ~70000 和 ~1200 点),如果使用不同的 a
和 b
数组是必需的。
deg2rad = np.pi/180.0
rho_cos = (np.sin(lat1[:,None]*deg2rad)*np.sin(lat2[None,:]*deg2rad) +
np.cos(lat1[:,None]*deg2rad)*np.cos(lat2[None,:]*deg2rad)*np.cos(np.abs(lon1[:,None] - lon2[None,:])*deg2rad))
rho = np.arccos(rho_cos) / deg2rad
rho_min = np.nanmin(rho,axis=1)
由于大圆的长度与其弦的长度成正比,因此最小大圆距离相当于欧几里德3D中嵌入点的最小距离space.
所以我建议计算对应于每个纬度和经度对的 x、y、z 坐标,并使用提到的 scipy 函数
scipy.spatial.distance.cdist
找到最小的 3D 欧几里得距离,它可以很容易地转换回大圆距离。
是否有一个Python包可以有效地计算数组中每个(纬度,经度)点a
到数组中每个(纬度,经度)点的最小大圆距离b
?例如 scipy.spatial.distance.cdist 不幸的是,据我所知,它不支持球面距离。
对于许多数据点(例如 a
和 b
分别有 ~70000 和 ~1200 点),如果使用不同的 a
和 b
数组是必需的。
deg2rad = np.pi/180.0
rho_cos = (np.sin(lat1[:,None]*deg2rad)*np.sin(lat2[None,:]*deg2rad) +
np.cos(lat1[:,None]*deg2rad)*np.cos(lat2[None,:]*deg2rad)*np.cos(np.abs(lon1[:,None] - lon2[None,:])*deg2rad))
rho = np.arccos(rho_cos) / deg2rad
rho_min = np.nanmin(rho,axis=1)
由于大圆的长度与其弦的长度成正比,因此最小大圆距离相当于欧几里德3D中嵌入点的最小距离space.
所以我建议计算对应于每个纬度和经度对的 x、y、z 坐标,并使用提到的 scipy 函数
scipy.spatial.distance.cdist
找到最小的 3D 欧几里得距离,它可以很容易地转换回大圆距离。