Python 如何使用测地线创建距离表

Python 如何使用测地线创建距离表,python,pandas,dataframe,geopy,Python,Pandas,Dataframe,Geopy,我在用Python计算。假设我有这样一个数据帧,它由一些点的长lat组成 import pandas as pd dfa=pd.DataFrame(([1,2],[1,3],[1,1],[1,4]), columns=['y','x']) 之前,我使用了scipy.spatial中的距离矩阵,并用这段代码创建了另一个数据帧。但它似乎无法精确计算点之间的距离(使用长lat) 你认为可以用测地线改变计算吗?这是我试过的 from geopy.distance import geodesic pd.

我在用Python计算。假设我有这样一个数据帧,它由一些点的长lat组成

import pandas as pd
dfa=pd.DataFrame(([1,2],[1,3],[1,1],[1,4]), columns=['y','x'])
之前,我使用了scipy.spatial中的距离矩阵,并用这段代码创建了另一个数据帧。但它似乎无法精确计算点之间的距离(使用长lat)

你认为可以用测地线改变计算吗?这是我试过的

from geopy.distance import geodesic
pd.DataFrame(geodesic(dfa.values[0], dfa.values[0]).kilometers, index=dfa.index, columns=dfa.index)

# i don't know how to change [0] adjusted to column and index

有什么建议吗?

给定一个或多个类似对象的列表
位置
,您可以这样做

distances = pd.DataFrame([[geodesic(a,b) for a in locations] 
                          for b in locations])
不过,这是多余的,因为它将计算a、b和b、a的距离,即使它们应该相同。根据测地线的成本,您可能会发现以下一些替代方案更快:

distances = pd.DataFrame([[geodesic(a,b)  if a > b else 0 
                           for a in locations] 
                              for b in locations])
distances = distances.add(distances.T) 

您还可以将数据存储为字典,其中键是从
itertools.compositions
输出的。还有一个关于创建对称矩阵类的方法。

geopy
就是这样做的。谢谢,我以前试过,但我希望输出是距离矩阵的数据帧。但是有可能吗?
测地线一次只做两个点。您必须执行两个嵌套循环。
distances = pd.DataFrame([[geodesic(a,b)  if a > b else 0 
                           for a in locations] 
                              for b in locations])
distances = distances.add(distances.T) 
size = len(locations)
distances = pd.DataFrame(columns = range(size), index = range(size))
def get_distance(i,j):
    if distances.loc[j,i]:
        return distances.loc[j,i]
    if i == j:
        return 0
    return geodesic(locations[i], locations[j])
for i in range(size):
    for j in range(size):
        distances.loc[i,j] = get_distance(i,j)