查找具有固定起点的组的 X 和 Y 之间的距离
Find distance between X and Y of groups with fixed start point
import numpy as np
import pandas as pd
这是计算距离的数据
data = pd.read_csv(r'survey_data.csv',
delimiter=',')
start = pd.read_csv(r'start_points.csv',
delimiter=',')
print(data)
print(start)
data['Trans'] = data['Trans'].str.upper()
仅获取起点文件中使用的横断面
unique = data['Trans'].unique()
start = pd.DataFrame(start.loc[start['Trans'].isin(unique)])
选择要使用的列
start['Dist'] = 0.0
cols = ['Y','X', 'Elev']
将Trans设为索引库
a = data.set_index('Trans')[cols]
b = start.set_index('Trans')[cols]
使用勾股定理计算距离。这段代码是我收到错误消息的地方
a['Dist'] = (a.subtract(b, level=0)**2).sum(axis=1)**(1/2)
堆叠起点和计算点并排序
r = pd.concat([a.reset_index(), start]).sort_values(by = ['Trans', 'Dist'])
print(r)
用于数据的文件
Trans Y X Elev
0 TR9 101.5 101.5 5.5
1 TR9 111.0 111.0 8.0
2 TR9 121.0 121.0 6.0
3 TR9 131.0 131.0 7.0
4 TR9 141.0 141.0 4.0
5 TR10 101.0 201.0 2.0
6 TR10 111.0 211.0 6.0
7 TR10 121.0 221.0 5.0
8 TR10 131.0 231.0 7.0
9 TR10 141.0 241.0 8.0
10 GRAND 101.0 301.0 5.0
11 GRAND 111.0 311.0 6.0
12 GRAND 121.0 321.0 7.0
13 GRAND 131.0 331.0 9.0
14 GRAND 141.0 341.0 5.0
15 TR11 101.0 401.0 4.0
16 TR11 111.5 411.5 6.0
17 TR11 121.0 421.0 8.0
18 TR11 131.0 431.0 4.0
19 TR11 141.0 441.0 2.0
用于起点的文件
Trans Y X Elev
0 TR9 99.5 99.5 4.0
1 TR10 99.0 199.5 3.2
2 GRAND 99.0 299.5 6.5
3 TR11 99.0 399.5 8.2
4 TR99 999.0 999.0 999.9
EDIT - 由于您更新了问题并更改了数据、列名和行,这里是最新编辑问题的解决方案。下面详细解释。
start['Dist'] = 0.0 #Adding Dist column to s
#getting X, Y and setting index to "Trans"
cols = ['X','Y', 'Elev']
a = data.set_index('Trans')[cols]
b = start.set_index('Trans')[cols]
b = b.loc[a.index.unique()] #<--- to ensure that same trans elements exist in both
#Calculating broadcasted distance (by index)
#D = √((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)
a['Dist'] = list((a.subtract(b, level=0)**2).sum(axis=1)**(1/2))
#Stacking start points and calculated points and sorting
r = pd.concat([a.reset_index(), start]).sort_values(by = ['Trans', 'Dist'])
print(r)
Trans X Y Elev Dist
2 GRAND 299.5 99.0 6.5 0.000000
10 GRAND 301.0 101.0 5.0 4.887740
11 GRAND 311.0 111.0 6.0 17.466826
12 GRAND 321.0 121.0 7.0 30.761827
13 GRAND 331.0 131.0 9.0 45.098670
14 GRAND 341.0 141.0 5.0 59.369100
1 TR10 199.5 99.0 3.2 0.000000
5 TR10 201.0 101.0 2.0 2.773085
6 TR10 211.0 111.0 6.0 16.854970
7 TR10 221.0 121.0 5.0 30.813796
8 TR10 231.0 131.0 7.0 45.063178
9 TR10 241.0 141.0 8.0 59.239261
3 TR11 399.5 99.0 8.2 0.000000
15 TR11 401.0 101.0 4.0 3.201562
16 TR11 411.5 111.5 6.0 16.748134
17 TR11 421.0 121.0 8.0 30.471298
18 TR11 431.0 131.0 4.0 44.648628
19 TR11 441.0 141.0 2.0 58.689863
0 TR9 99.5 99.5 4.0 0.000000
0 TR9 101.5 101.5 5.5 2.915476
1 TR9 111.0 111.0 8.0 16.628289
2 TR9 121.0 121.0 6.0 30.765240
3 TR9 131.0 131.0 7.0 44.972214
4 TR9 141.0 141.0 4.0 59.063525
4 TR99 999.0 999.0 999.9 0.000000
详情-
- 将
Transect
设置为每个数据帧的索引并仅保留 Northing
、Easting
和 Elev
列
- 在2个数据帧之间使用
df.subtract
并设置level=0
。这样做的目的是它将使用 broadcasting
减去具有相同索引的所有行。因此,index=A
的第一行和第二行的 2 行将通过广播减去以得到 2 行。每个功能的其他功能也类似。
- 获得相减后的数据帧后,只需取
square
,对 axis=1
求和,然后取 square root
得到距离。
D=√((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)
- 最后将这个系列设置为原始数据集的
['dist']
列。
import numpy as np
import pandas as pd
这是计算距离的数据
data = pd.read_csv(r'survey_data.csv',
delimiter=',')
start = pd.read_csv(r'start_points.csv',
delimiter=',')
print(data)
print(start)
data['Trans'] = data['Trans'].str.upper()
仅获取起点文件中使用的横断面
unique = data['Trans'].unique()
start = pd.DataFrame(start.loc[start['Trans'].isin(unique)])
选择要使用的列
start['Dist'] = 0.0
cols = ['Y','X', 'Elev']
将Trans设为索引库
a = data.set_index('Trans')[cols]
b = start.set_index('Trans')[cols]
使用勾股定理计算距离。这段代码是我收到错误消息的地方
a['Dist'] = (a.subtract(b, level=0)**2).sum(axis=1)**(1/2)
堆叠起点和计算点并排序
r = pd.concat([a.reset_index(), start]).sort_values(by = ['Trans', 'Dist'])
print(r)
用于数据的文件
Trans Y X Elev
0 TR9 101.5 101.5 5.5
1 TR9 111.0 111.0 8.0
2 TR9 121.0 121.0 6.0
3 TR9 131.0 131.0 7.0
4 TR9 141.0 141.0 4.0
5 TR10 101.0 201.0 2.0
6 TR10 111.0 211.0 6.0
7 TR10 121.0 221.0 5.0
8 TR10 131.0 231.0 7.0
9 TR10 141.0 241.0 8.0
10 GRAND 101.0 301.0 5.0
11 GRAND 111.0 311.0 6.0
12 GRAND 121.0 321.0 7.0
13 GRAND 131.0 331.0 9.0
14 GRAND 141.0 341.0 5.0
15 TR11 101.0 401.0 4.0
16 TR11 111.5 411.5 6.0
17 TR11 121.0 421.0 8.0
18 TR11 131.0 431.0 4.0
19 TR11 141.0 441.0 2.0
用于起点的文件
Trans Y X Elev
0 TR9 99.5 99.5 4.0
1 TR10 99.0 199.5 3.2
2 GRAND 99.0 299.5 6.5
3 TR11 99.0 399.5 8.2
4 TR99 999.0 999.0 999.9
EDIT - 由于您更新了问题并更改了数据、列名和行,这里是最新编辑问题的解决方案。下面详细解释。
start['Dist'] = 0.0 #Adding Dist column to s
#getting X, Y and setting index to "Trans"
cols = ['X','Y', 'Elev']
a = data.set_index('Trans')[cols]
b = start.set_index('Trans')[cols]
b = b.loc[a.index.unique()] #<--- to ensure that same trans elements exist in both
#Calculating broadcasted distance (by index)
#D = √((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)
a['Dist'] = list((a.subtract(b, level=0)**2).sum(axis=1)**(1/2))
#Stacking start points and calculated points and sorting
r = pd.concat([a.reset_index(), start]).sort_values(by = ['Trans', 'Dist'])
print(r)
Trans X Y Elev Dist
2 GRAND 299.5 99.0 6.5 0.000000
10 GRAND 301.0 101.0 5.0 4.887740
11 GRAND 311.0 111.0 6.0 17.466826
12 GRAND 321.0 121.0 7.0 30.761827
13 GRAND 331.0 131.0 9.0 45.098670
14 GRAND 341.0 141.0 5.0 59.369100
1 TR10 199.5 99.0 3.2 0.000000
5 TR10 201.0 101.0 2.0 2.773085
6 TR10 211.0 111.0 6.0 16.854970
7 TR10 221.0 121.0 5.0 30.813796
8 TR10 231.0 131.0 7.0 45.063178
9 TR10 241.0 141.0 8.0 59.239261
3 TR11 399.5 99.0 8.2 0.000000
15 TR11 401.0 101.0 4.0 3.201562
16 TR11 411.5 111.5 6.0 16.748134
17 TR11 421.0 121.0 8.0 30.471298
18 TR11 431.0 131.0 4.0 44.648628
19 TR11 441.0 141.0 2.0 58.689863
0 TR9 99.5 99.5 4.0 0.000000
0 TR9 101.5 101.5 5.5 2.915476
1 TR9 111.0 111.0 8.0 16.628289
2 TR9 121.0 121.0 6.0 30.765240
3 TR9 131.0 131.0 7.0 44.972214
4 TR9 141.0 141.0 4.0 59.063525
4 TR99 999.0 999.0 999.9 0.000000
详情-
- 将
Transect
设置为每个数据帧的索引并仅保留Northing
、Easting
和Elev
列 - 在2个数据帧之间使用
df.subtract
并设置level=0
。这样做的目的是它将使用broadcasting
减去具有相同索引的所有行。因此,index=A
的第一行和第二行的 2 行将通过广播减去以得到 2 行。每个功能的其他功能也类似。 - 获得相减后的数据帧后,只需取
square
,对axis=1
求和,然后取square root
得到距离。
D=√((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)
- 最后将这个系列设置为原始数据集的
['dist']
列。