一、方位角和方位变化率的作用
方位角通常用于导航和地理信息系统(GIS)中,以描述从一个点到另一个点的方向。它通常以度数表示,相对于正北方向顺时针计算。例如,从北方向顺时针旋转的角度可以用来确定某个点到另一个点的方位角。可用于量化不同交通方式的方向变化。例如,汽车和公交车沿着现有街道移动,而步行或骑自行车的人会更频繁地改变方向。
通过计算GPS点之间的方位角和方位变化率,可以分析不同交通方式的运动特征。
二、使用车辆GPS轨迹数据计算方位角、方位变化率的方法
2.1问题描述
上图中显示了三个GPS点(、
、
)的坐标(纬度和经度)以及它们之间的方位角。以下是图中内容的要点:
-
GPS点:
: 第一个GPS点,坐标为(纬度, 经度)。
: 第二个GPS点,坐标为(纬度, 经度)。
: 第三个GPS点,坐标为(纬度, 经度)。
-
方位角(Bearing):
- 方位角是从一个GPS点到下一个GPS点的方向。
- 从
到
的方位角标记为Bearing(
)。
- 从
到
的方位角标记为Bearing(
)。
-
北方向:
- 图中包含一个指向北方的箭头,以表示方位角的基准方向。
2.2计算方法
1. y和x的计算:
2. 方位角的计算:
3. 方位变化率的计算:
2.3 计算步骤总结
-
转换坐标:
- 将GPS点的经纬度坐标从度数转换为弧度(radians)。
-
计算y和x:
- 使用上述公式计算两个GPS点之间的y和x值。
-
计算方位角:
- 使用反正切函数arctan(y,x)计算方位角。
-
计算方位变化率:
- 计算两个连续点的方位角之差的绝对值,得到方位变化率。
三、用Python实现车辆GPS轨迹数据计算方位角、方位变化率的计算
3.1 GPD数据准备
esn | longitude | latitude | trip_id | seconds |
861114045229926 | 102.2212 | 24.408487 | 1 | 1 |
861114045229926 | 102.22124 | 24.408508 | 1 | 6 |
861114045229926 | 102.2214 | 24.408476 | 1 | 6 |
861114045229926 | 102.22162 | 24.408419 | 1 | 6 |
861114045229926 | 102.22169 | 24.408407 | 1 | 6 |
861114045229926 | 102.221664 | 24.408384 | 1 | 12 |
861114045229926 | 102.221664 | 24.40838 | 1 | 12 |
861114045229926 | 102.221664 | 24.408379 | 1 | 12 |
861114045229926 | 102.221725 | 24.408377 | 1 | 12 |
861114045229926 | 102.22191 | 24.40835 | 1 | 12 |
861114045229927 | 102.22208 | 24.408321 | 1 | 6 |
861114045229927 | 102.22228 | 24.408285 | 1 | 6 |
861114045229927 | 102.2224 | 24.408173 | 1 | 6 |
861114045229927 | 102.2224 | 24.408024 | 1 | 6 |
861114045229927 | 102.22241 | 24.407572 | 2 | 6 |
861114045229927 | 102.222404 | 24.40711 | 2 | 6 |
861114045229927 | 102.2224 | 24.406794 | 2 | 6 |
861114045229927 | 102.22266 | 24.40637 | 2 | 6 |
861114045229927 | 102.22318 | 24.406233 | 2 | 6 |
861114045229927 | 102.22363 | 24.406115 | 2 | 6 |
861114045229927 | 102.22398 | 24.40601 | 2 | 6 |
861114045229928 | 102.22431 | 24.405663 | 1 | 6 |
861114045229928 | 102.22462 | 24.405216 | 1 | 6 |
861114045229928 | 102.22476 | 24.404673 | 1 | 6 |
861114045229928 | 102.22485 | 24.404192 | 1 | 6 |
861114045229928 | 102.22491 | 24.403948 | 1 | 6 |
861114045229928 | 102.22495 | 24.403696 | 2 | 6 |
861114045229928 | 102.22504 | 24.403257 | 2 | 6 |
861114045229928 | 102.225075 | 24.403109 | 2 | 6 |
861114045229928 | 102.22549 | 24.402473 | 2 | 6 |
861114045229928 | 102.22581 | 24.402231 | 2 | 6 |
861114045229928 | 102.226204 | 24.402046 | 2 | 6 |
861114045229928 | 102.226494 | 24.40173 | 3 | 6 |
861114045229928 | 102.2264 | 24.401278 | 3 | 6 |
861114045229928 | 102.22609 | 24.400871 | 3 | 6 |
861114045229928 | 102.22584 | 24.400553 | 3 | 6 |
861114045229928 | 102.22597 | 24.40027 | 3 | 6 |
861114045229928 | 102.22607 | 24.400013 | 3 | 6 |
861114045229928 | 102.226234 | 24.39985 | 3 | 6 |
数据中:
esn表示不同车辆的编号;
longitude和latitude表示车辆行驶时产生的经纬度;
trip_id表示车辆行驶过程中的行程次数(如果车辆在行驶过程中发生停车,则重新开始计算行程);
seconds表示前后(或者说上下两行)两对经纬度之间的时间间隔。
3.2使用Python代码进行计算
3.2.1 将数据放入csv文件,并导入
import pandas as pd
# Load the CSV file
file_path = '/mnt/data/data 1.csv'
data = pd.read_csv(file_path)
# Display the first few rows of the dataframe
data.head()
3.2.2 计算方位角、方位变化率
import numpy as np
# Convert degrees to radians
data['longitude_rad'] = np.radians(data['longitude'])
data['latitude_rad'] = np.radians(data['latitude'])
# Shift the longitude and latitude columns to calculate the differences
data['longitude_rad_next'] = data.groupby(['esn', 'trip_id'])['longitude_rad'].shift(-1)
data['latitude_rad_next'] = data.groupby(['esn', 'trip_id'])['latitude_rad'].shift(-1)
# Drop the last row of each trip because it will have NaN in shifted columns
data.dropna(subset=['longitude_rad_next', 'latitude_rad_next'], inplace=True)
# Calculate x and y for bearing calculation
data['delta_long'] = data['longitude_rad_next'] - data['longitude_rad']
data['y'] = np.sin(data['delta_long']) * np.cos(data['latitude_rad_next'])
data['x'] = np.cos(data['latitude_rad']) * np.sin(data['latitude_rad_next']) - \
np.sin(data['latitude_rad']) * np.cos(data['latitude_rad_next']) * np.cos(data['delta_long'])
# Calculate the bearing
data['bearing'] = np.arctan2(data['y'], data['x'])
# Convert bearing from radians to degrees
data['bearing_deg'] = np.degrees(data['bearing'])
# Normalize the bearing to be between 0 and 360 degrees
data['bearing_deg'] = (data['bearing_deg'] + 360) % 360
# Shift the bearing to calculate bearing rate
data['bearing_deg_next'] = data.groupby(['esn', 'trip_id'])['bearing_deg'].shift(-1)
# Drop the last row of each trip again due to NaN in shifted bearing column
data.dropna(subset=['bearing_deg_next'], inplace=True)
# Calculate bearing rate
data['bearing_rate'] = np.abs(data['bearing_deg_next'] - data['bearing_deg'])
import ace_tools as tools; tools.display_dataframe_to_user(name="Bearing and Bearing Rate Data", dataframe=data)
# Display the first few rows of the resulting dataframe
data.head()
3.2.3 代码说明
(1)按照上述计算方法计算了每对连续GPS点之间的方位角和方位变化率
-
数据预处理:
- 将经纬度从度数转换为弧度,这一步是必要的,因为三角函数(如
sin
和cos
)需要弧度输入。
- 将经纬度从度数转换为弧度,这一步是必要的,因为三角函数(如
-
计算y和x:
- 使用以下公式计算了用于计算方位角的中间值。
-
计算方位角:
- 使用的公式如下: Bearing(
) = arctan(y,x)
- 然后将方位角从弧度转换为度数,并规范化为0到360度之间。
- 使用的公式如下: Bearing(
-
计算方位变化率:
- 计算两个连续点的方位角之差的绝对值,得到方位变化率。
(2)在计算过程中,考虑了车辆编号(esn
)和行程编号(trip_id
),确保每辆车和每次行程是单独计算的。具体来说:
-
按车辆编号和行程编号分组:
- 使用
groupby(['esn', 'trip_id'])
对数据进行分组,这样可以确保每辆车的每次行程是独立处理的。
- 使用
-
计算下一点的经纬度:
- 使用
shift(-1)
函数计算每个点的下一点的经纬度,这个操作也是在分组后的数据上进行的,以确保不会跨车辆或跨行程计算。
- 使用
-
删除无效数据:
- 因为最后一个点没有下一点,所以在计算完下一点的经纬度后,会删除这些包含NaN值的行。
3.2.4 计算结果展示
Result
esn longitude latitude trip_id seconds longitude_rad \
0 861114045229926 102.22120 24.408487 1 1 1.784097
1 861114045229926 102.22124 24.408508 1 6 1.784097
2 861114045229926 102.22140 24.408476 1 6 1.784100
3 861114045229926 102.22162 24.408419 1 6 1.784104
4 861114045229926 102.22169 24.408407 1 6 1.784105
latitude_rad longitude_rad_next latitude_rad_next delta_long \
0 0.426008 1.784097 0.426009 6.981317e-07
1 0.426009 1.784100 0.426008 2.792527e-06
2 0.426008 1.784104 0.426007 3.839724e-06
3 0.426007 1.784105 0.426007 1.221730e-06
4 0.426007 1.784105 0.426007 -4.537856e-07
y x bearing bearing_deg bearing_deg_next \
0 6.357343e-07 3.665192e-07 1.047814 60.035306 102.387163
1 2.542938e-06 -5.585039e-07 1.786993 102.387163 105.882098
2 3.496541e-06 -9.948349e-07 1.847991 105.882098 100.661378
3 1.112536e-06 -2.094392e-07 1.756872 100.661378 225.829995
4 -4.132277e-07 -4.014257e-07 -2.341708 225.829995 180.000000
bearing_rate
0 42.351857
1 3.494935
2 5.220720
3 125.168617
4 45.829995
计算了每对连续GPS点之间的方位角(Bearing)和方位变化率(Bearing Rate)。数据框架包含以下列:
esn
: 车辆编号longitude
: 经度latitude
: 纬度trip_id
: 行程编号seconds
: 时间间隔longitude_rad
: 经度(弧度)latitude_rad
: 纬度(弧度)longitude_rad_next
: 下一个点的经度(弧度)latitude_rad_next
: 下一个点的纬度(弧度)delta_long
: 经度差y
和x
: 用于计算方位角的中间值bearing
: 方位角(弧度)bearing_deg
: 方位角(度)bearing_deg_next
: 下一个点的方位角(度)bearing_rate
: 方位变化率