使用车辆GPS轨迹数据计算方位角、方位变化率——Python代码

一、方位角和方位变化率的作用

方位角通常用于导航和地理信息系统(GIS)中,以描述从一个点到另一个点的方向。它通常以度数表示,相对于正北方向顺时针计算。例如,从北方向顺时针旋转的角度可以用来确定某个点到另一个点的方位角。可用于量化不同交通方式的方向变化。例如,汽车和公交车沿着现有街道移动,而步行或骑自行车的人会更频繁地改变方向。

通过计算GPS点之间的方位角和方位变化率,可以分析不同交通方式的运动特征。

二、使用车辆GPS轨迹数据计算方位角、方位变化率的方法

2.1问题描述

上图中显示了三个GPS点(P_1P_2P_3)的坐标(纬度和经度)以及它们之间的方位角。以下是图中内容的要点:

  1. GPS点

    • P_1​: 第一个GPS点,坐标为(纬度, 经度)。
    • P_2​: 第二个GPS点,坐标为(纬度, 经度)。
    • P_3​: 第三个GPS点,坐标为(纬度, 经度)。
  2. 方位角(Bearing)

    • 方位角是从一个GPS点到下一个GPS点的方向。
    • P_1P_2​的方位角标记为Bearing(P_1)。
    • P_2​到P_3​的方位角标记为Bearing(P_2)。
  3. 北方向

    • 图中包含一个指向北方的箭头,以表示方位角的基准方向。

2.2计算方法

      1. y和x的计算:

      2. 方位角的计算:

      3. 方位变化率的计算:

      2.3 计算步骤总结

  • 转换坐标

    • 将GPS点的经纬度坐标从度数转换为弧度(radians)。
  • 计算y和x

    • 使用上述公式计算两个GPS点之间的y和x值。
  • 计算方位角

    • 使用反正切函数arctan⁡(y,x)计算方位角。
  • 计算方位变化率

    • 计算两个连续点的方位角之差的绝对值,得到方位变化率。

三、用Python实现车辆GPS轨迹数据计算方位角、方位变化率的计算

3.1 GPD数据准备

esnlongitudelatitudetrip_idseconds
861114045229926102.221224.40848711
861114045229926102.2212424.40850816
861114045229926102.221424.40847616
861114045229926102.2216224.40841916
861114045229926102.2216924.40840716
861114045229926102.22166424.408384112
861114045229926102.22166424.40838112
861114045229926102.22166424.408379112
861114045229926102.22172524.408377112
861114045229926102.2219124.40835112
861114045229927102.2220824.40832116
861114045229927102.2222824.40828516
861114045229927102.222424.40817316
861114045229927102.222424.40802416
861114045229927102.2224124.40757226
861114045229927102.22240424.4071126
861114045229927102.222424.40679426
861114045229927102.2226624.4063726
861114045229927102.2231824.40623326
861114045229927102.2236324.40611526
861114045229927102.2239824.4060126
861114045229928102.2243124.40566316
861114045229928102.2246224.40521616
861114045229928102.2247624.40467316
861114045229928102.2248524.40419216
861114045229928102.2249124.40394816
861114045229928102.2249524.40369626
861114045229928102.2250424.40325726
861114045229928102.22507524.40310926
861114045229928102.2254924.40247326
861114045229928102.2258124.40223126
861114045229928102.22620424.40204626
861114045229928102.22649424.4017336
861114045229928102.226424.40127836
861114045229928102.2260924.40087136
861114045229928102.2258424.40055336
861114045229928102.2259724.4002736
861114045229928102.2260724.40001336
861114045229928102.22623424.3998536

数据中:

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点之间的方位角和方位变化率

  • 数据预处理

    • 将经纬度从度数转换为弧度,这一步是必要的,因为三角函数(如sincos)需要弧度输入。
  • 计算y和x

    • 使用以下公式计算了用于计算方位角的中间值。

  • 计算方位角

    • 使用的公式如下: Bearing(P_1) = arctan⁡(y,x)
    • 然后将方位角从弧度转换为度数,并规范化为0到360度之间。
  • 计算方位变化率

    • 计算两个连续点的方位角之差的绝对值,得到方位变化率。

(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: 经度差
  • yx: 用于计算方位角的中间值
  • bearing: 方位角(弧度)
  • bearing_deg: 方位角(度)
  • bearing_deg_next: 下一个点的方位角(度)
  • bearing_rate: 方位变化率
  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值