本文建立在这篇文章的基础上。
我有一个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.spatial.KDTree。为此,我必须将地理坐标转换为三维笛卡尔坐标(ECEF = 以地球为中心,固定于地球):
from math import *
def to_Cartesian(lat, lng):
R = 6367 # radius of the Earth in kilometers
x = R * cos(lat) * cos(lng)
y = R * cos(lat) * sin(lng)
z = R * sin(lat)
return x, y, z
df['x'], df['y'], df['z'] = zip(*map(to_Cartesian, df['lat'], df['lng']))
df
这给我带来了这个结果: 有了这个,我可以创建 KDTree:
coordinates = list(zip(df['x'], df['y'], df['z']))
from scipy import spatial
tree = spatial.KDTree(coordinates)
tree.data
现在我正在用Berlin进行测试。
tree.query(coordinates[0], 2)
从我的列表中正确地给出了柏林(本身)和波茨坦作为离柏林最近的两个城市。
问题:但我想知道如何处理查询结果中的距离?它显示1501,但我如何将其转换为米或千米?柏林和波茨坦之间的实际距离是27公里,而不是1501公里。
备注:我知道我可以获取这两个城市的经度/纬度并计算哈弗辛距离。但是使用KDTree的输出会更好。
(array([ 0. , 1501.59637685]), array([0, 1]))
任何帮助都将不胜感激。