I want to calculate the bearing(direction) between 2 locations. This is what the sample looks like:
# A tibble: 10 x 14
vehicle_id trip_id seg_1_lat seg_1_lon seg_2_lat seg_2_lon seg_3_lat seg_3_lon seg_4_lat seg_4_lon seg_5_lat seg_5_lon seg_6_lat seg_6_lon
<chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Zz3yE90z++QmTX2QO5dHI78IK/Q 1 13.7 101. 13.7 101. 13.6 101. 13.7 101. 13.7 101. 13.7 101.
2 Zz3yE90z++QmTX2QO5dHI78IK/Q 2 13.7 101. 13.7 101. 13.7 101. 13.7 101. 13.7 101. 13.7 101.
3 Zz3yE90z++QmTX2QO5dHI78IK/Q 3 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101.
4 Zz3yE90z++QmTX2QO5dHI78IK/Q 4 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101.
5 Zz3yE90z++QmTX2QO5dHI78IK/Q 5 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101.
6 Zz3yE90z++QmTX2QO5dHI78IK/Q 6 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101.
7 Zz3yE90z++QmTX2QO5dHI78IK/Q 7 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101. 13.6 101.
8 /+bx80f3gOoPMoFBsS+3xX6jpi8 44496 101. 13.9 101. 13.9 101. 13.9 101. 13.9 101. 14.0 101. 14.0
9 /+bx80f3gOoPMoFBsS+3xX6jpi8 44497 101. 14.0 101. 14.0 101. 14.0 101. 14.0 101. 14.0 101. 14.0
10 /+bx80f3gOoPMoFBsS+3xX6jpi8 44498 101. 13.8 101. 13.8 101. 13.9 101. 13.9 101. 13.9 101. 13.9
my.df <- structure(list(vehicle_id = c("Zz3yE90z++QmTX2QO5dHI78IK/Q","Zz3yE90z++QmTX2QO5dHI78IK/Q", "Zz3yE90z++QmTX2QO5dHI78IK/Q","Zz3yE90z++QmTX2QO5dHI78IK/Q", "Zz3yE90z++QmTX2QO5dHI78IK/Q","Zz3yE90z++QmTX2QO5dHI78IK/Q", "Zz3yE90z++QmTX2QO5dHI78IK/Q","/+bx80f3gOoPMoFBsS+3xX6jpi8", "/+bx80f3gOoPMoFBsS+3xX6jpi8","/+bx80f3gOoPMoFBsS+3xX6jpi8"), trip_id = c(1L, 2L, 3L, 4L, 5L,6L, 7L, 44496L, 44497L, 44498L), seg_1_lat_lat = c(13.67829,13.66859, 13.63345, 13.60629, 13.56958, 13.60148, 13.60283, 13.93405,14.00297, 13.80508), seg_1_lon_lon = c(100.62387, 100.72032,100.71102, 100.69999, 100.78749, 100.71103, 100.70543, 100.72371,100.6638, 100.71231), seg_2_lat_lat = c(13.65382, 13.66353, 13.63349,13.61857, 13.57759, 13.60519, 13.60118, 13.92169, 13.99238, 13.82186), seg_2_lon_lon = c(100.67562, 100.71894, 100.71096, 100.70363,100.78828, 100.7129, 100.71196, 100.69827, 100.65185, 100.72064), seg_3_lat_lat = c(13.63679, 13.66353, 13.63349, 13.6344, 13.58393,13.61076, 13.60193, 13.92155, 13.98482, 13.85196), seg_3_lon_lon = c(100.71057,100.71894, 100.71096, 100.71093, 100.79077, 100.71317, 100.71915,100.68866, 100.61921, 100.72147), seg_4_lat_lat = c(13.65828,13.66353, 13.63349, 13.6344, 13.58385, 13.62504, 13.60487, 13.92121,13.98708, 13.88833), seg_4_lon_lon = c(100.71631, 100.71894,100.71096, 100.71093, 100.79403, 100.71832, 100.71483, 100.65924,100.61634, 100.72214), seg_5_lat_lat = c(13.65828, 13.65958,13.63349, 13.6344, 13.59328, 13.63082, 13.605, 13.95379, 13.98707,13.92194), seg_5_lon_lon = c(100.71631, 100.71773, 100.71096,100.71093, 100.76465, 100.71459, 100.71402, 100.62163, 100.61612,100.70304), seg_6_lat_lat = c(13.65828, 13.65258, 13.63349, 13.63433,13.59612, 13.63241, 13.60567, 13.95905, 13.98712, 13.90366),seg_6_lon_lon = c(100.71631, 100.71571, 100.71096, 100.71101,100.74922, 100.71297, 100.71292, 100.62037, 100.61631, 100.66788)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
So, It will be calculated between 2 locations. For example, seg_1 with seg_2
and seg_2 with seg_3
and seg_3 with seg_4
and seg_4 with seg_5
and seg_5 with seg_6
. Hence, there will be 5 directions result.
And my expected output should have columns like this;
vehicle_id trip_id bearing_1 bearing_2 bearing_3 bearing_4 bearing_5
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
Using a for loop and package
geosphere
you can do:to add the columns to my.df. Note that there are some rows where consecutive values are identical - the bearing is undefined, but geosphere returns -180. If it's important for your analysis you should check explicitly for these.