Scipy:如何将KDTree距离从查询转换为公里(Python/Pandas)

2024-04-26 20:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

本文以this one为基础。在

我得到了一个Pandas数据框,其中包含城市的地理坐标(大地坐标)作为经度和纬度。在

import pandas as pd

df = pd.DataFrame([{'city':"Berlin", 'lat':52.5243700, 'lng':13.4105300},
                   {'city':"Potsdam", 'lat':52.3988600, 'lng':13.0656600},
                   {'city':"Hamburg", 'lat':53.5753200, 'lng':10.0153400}]);

对于每一个城市,我都在寻找另外两个离我最近的城市。所以我尝试了scipy.space.KDTree. 为此,我必须将大地坐标转换为三维的卡特尔坐标(ECEF=以地球为中心,地球固定):

^{pr2}$

给我这个:

python output

这样我就可以创建KDTree:

coordinates = list(zip(df['x'], df['y'], df['z']))

from scipy import spatial
tree = spatial.KDTree(coordinates)
tree.data

现在我在和柏林一起测试

tree.query(coordinates[0], 2)

从我的名单中,柏林和波茨坦是离柏林最近的两个城市。在

问题:但我想知道如何处理与该查询的距离?上面写着1501,但是我怎么能把它转换成米或者公里呢?柏林和波茨坦之间的实际距离是27公里,而不是1501公里。在

备注:我知道我可以得到这两个城市的经纬度,并计算出哈弗斯线距离。但是使用KDTree的输出会很酷。在

(array([ 0. , 1501.59637685]), array([0, 1]))

感谢任何帮助。在


Tags: importtree距离地球citydfscipyarray
1条回答
网友
1楼 · 发布于 2024-04-26 20:26:36

KDTree计算两点(城市)之间的欧几里德距离。这两座城市和地球的中心形成了一个isosceles triangle。在

德语的wikipedia条目包含了一个很好的关于geometric properties的概述,而英语词条则没有。你可以用这个来计算距离。在

import numpy as np

def deg2rad(degree):
    rad = degree * 2*np.pi / 360
    return(rad)

def distToKM(x):
    R = 6367 # earth radius
    gamma = 2*np.arcsin(deg2rad(x/(2*R))) # compute the angle of the isosceles triangle
    dist = 2*R*sin(gamma/2) # compute the side of the triangle
    return(dist)

distToKM(1501.59637685)
# 26.207800812050056

更新

在对获得相反结果的评论之后,我重新阅读了这个问题,并意识到虽然似乎可以使用上面提出的函数,但真正的问题在其他地方。在

函数cossin在函数to_Cartesian中,期望输入在radiansdocumentation)中,而你要给它们以度数表示的角度。您可以使用上面定义的函数deg2rad将纬度和经度转换为弧度。这将给您直接到KDTree的距离(以km为单位)。在

相关问题 更多 >