连续点(x,y元组)间的迭代欧几里得距离计算,这些点属于一系列线路。

5

我有一个数据框,其中包含线条、点ID、X和Y坐标;每条线都包含一组具有X,Y坐标的点:

LINE    Point ID    X coordinate    Y Coordinate
 A         1             1               2
 A         2             2               2
 A         3             3               2
 B         1             11              3
 B         2             12              3
 B         3             13              3

尝试计算一条线段中相邻点之间的欧几里得距离,以获得以下结果:

LINE    Point ID    X coordinate    Y Coordinate    Euclidean Dist.
  A         1             1              2    
  A         2             2              2                1 (dist between Point ID's 1 and 2 for line A)
  A         3             3              2                1 (dist between Point ID's 2 and 3 for line A)
  B         1            11              3  
  B         2            12              3                1 (dist between Point ID's 1 and 2 for line B)
  B         3            13              3                1 (dist between Point ID's 2 and 3 for line B)

我的尝试是创建一个 DataFrame,使用 groupby 来分组 'LINE' 行,然后通过使用 scipy 计算一条线内相邻点之间的欧几里得距离:

predist = df.groupby(['LINE']).apply(lambda x: x)

dist = pdist(predist[['X', 'Y']], 'euclidean')

我一定做错了什么,因为我得到的结果是在一条线的第一个点和该线中每个连续点之间累积的距离,而不是连续点创建的每个单独线段之间的距离(坐标元组)。

1个回答

6
你可以使用shift()函数查找LINE中每个点的上一个点的XY坐标。然后计算这个点与上一个点之间的距离:
import pandas as pd
import numpy as np

data = """
LINE    PointID          X               Y
 A         1             1               2
 A         2             2               2
 A         3             3               2
 B         1             11              3
 B         2             12              3
 B         3             13              3"""
df = pd.read_csv(StringIO(data),sep="\s+")

dx = (df['X'] - df.groupby('LINE')['X'].shift())
dy = (df['Y'] - df.groupby('LINE')['Y'].shift())
df['dist'] = np.sqrt(dx**2 + dy**2)

这将产生预期的距离:
  LINE  PointID   X  Y  dist
0    A        1   1  2   NaN
1    A        2   2  2   1.0
2    A        3   3  2   1.0
3    B        1  11  3   NaN
4    B        2  12  3   1.0
5    B        3  13  3   1.0

NaN值可以根据您的用例进行填充。


请注意,实际上您可以跳过为“X”和“Y”创建唯一变量的步骤,而只需使用以下代码:diff = (df[['y', 'x']] - df.groupby('TRACKID')[['y', 'x']].shift(1))np.sqrt((diff**2).sum())。这样可以在几行代码中完成,并允许任意数量的维度。 - emigre459

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接