繁体   English   中英

如何计算连续日期时间的 GPS 点之间的距离?

[英]How to calculate distance between GPS points of consecutive Datetime?

我有一些动物运动数据,包括 GPS 点和相应的日期时间(包 lubridate)。 我的目标是计算每个连续日期/时间的 GPS 点之间的距离。 问题是积分是按不同的时间表计算的 - 每小时 14:00 - 04:00,然后在 10:00 取一分。 在某些情况下,计划中的时间缺少数据。 样本数据:

structure(list(DateTime = structure(c(1484020800, 1484042400, 
1484056860, 1484060400, 1484064000, 1484067600, 1484071200, 1484074800, 
1484078400, 1484082000, 1484085600, 1484092800, 1484096400, 1484100000, 
1484103600, 1484107200, 1484128800, 1484143200, 1484146860, 1484150400, 
1484154000, 1484157600, 1484161200, 1484164800, 1484168400, 1484172000, 
1484175600, 1484179200, 1484182800, 1484186400, 1484190000, 1484193600, 
1484215200, 1484229600, 1484233200, 1484236800, 1484240400, 1484244000, 
1484247600, 1484251200, 1484254800, 1484258400, 1484262000, 1484265600, 
1484269200, 1484272800, 1484276400, 1484280000, 1484301600, 1484316000, 
1484319600), tzone = "UTC", class = c("POSIXct", "POSIXt")), 
    Latitude = c(-13.53645, -13.53674, NA, -13.53669, -13.53675, 
    -13.53819, -13.54012, -13.54012, -13.5401, -13.54016, -13.54295, 
    -13.55006, -13.55251, -13.54522, -13.54204, -13.54156, -13.54141, 
    -13.54122, -13.54126, -13.54163, -13.54313, -13.55078, -13.55713, 
    -13.56645, -13.56664, -13.56663, -13.56662, -13.56667, -13.56668, 
    -13.56665, -13.56667, -13.56664, -13.56675, -13.5666, -13.56649, 
    -13.56648, -13.56647, -13.56884, -13.56874, -13.56879, -13.57121, 
    -13.5728, -13.57102, -13.5695, -13.5712, -13.57282, -13.57285, 
    -13.57285, -13.57293, -13.57285, -13.57284), Longitude = c(33.52862, 
    33.52891, NA, 33.52873, 33.52879, 33.53174, 33.53617, 33.53617, 
    33.53618, 33.53614, 33.53795, 33.54501, 33.53646, 33.52747, 
    33.52488, 33.52306, 33.52391, 33.52357, 33.52302, 33.52322, 
    33.52099, 33.51532, 33.50779, 33.50147, 33.4991, 33.49909, 
    33.49906, 33.49911, 33.49909, 33.49904, 33.49897, 33.49908, 
    33.49916, 33.49927, 33.49918, 33.49919, 33.49951, 33.50481, 
    33.50482, 33.50483, 33.50657, 33.51625, 33.5187, 33.51947, 
    33.52346, 33.52623, 33.52623, 33.52622, 33.52629, 33.52636, 
    33.52623), Info = c("3D", "3D", "GPS TimeOut", "3D", "3D", 
    "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", 
    "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", 
    "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", 
    "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", 
    "3D", "3D", "3D", "3D", "3D", "3D")), row.names = c(NA, -51L
), class = c("tbl_df", "tbl", "data.frame"))

我的目标是拥有一个数据框,其中包含连续日期时间段内连续 GPS 点之间的距离,与数据收集的时间安排(即 14:00-04:00 和 10:00)相匹配。 如果数据收集错误导致日期时间丢失(其中信息列是“GPS 超时”或“死亡率”而不是非错误的“3D”),我想停止任何距离计算,直到下一个连续的日期时间系列。 提前致谢!

library(data.table)
library(geosphere)
setDT(mydata)
# create groups, start new group is where Infor is not 3D
mydata[, group := rleid(cumsum(!mydata$Info == "3D"))]
# get previous lat_lon
mydata[!Info == "GPS TimeOut", lon2 := shift(Longitude, type = "lag"), by = .(group)]
mydata[!Info == "GPS TimeOut", lat2 := shift(Latitude, type = "lag"), by = .(group)]
# calculate distances
mydata[!is.na(lon2), dist := distHaversine(matrix(c(Longitude, Latitude), ncol = 2),
                                    matrix(c(lon2, lat2), ncol = 2))]
# cumulative distance by group *handle NA's
mydata[, cumdist := cumsum(ifelse(is.na(dist), 0, dist)), by = .(group)]


               DateTime  Latitude Longitude        Info group     lon2      lat2        dist      cumdist
 1: 2017-01-10 04:00:00 -13.53645  33.52862          3D     1       NA        NA          NA     0.000000
 2: 2017-01-10 10:00:00 -13.53674  33.52891          3D     1 33.52862 -13.53645   45.024903    45.024903
 3: 2017-01-10 14:01:00        NA        NA GPS TimeOut     2       NA        NA          NA     0.000000
 4: 2017-01-10 15:00:00 -13.53669  33.52873          3D     2       NA        NA          NA     0.000000
 5: 2017-01-10 16:00:00 -13.53675  33.52879          3D     2 33.52873 -13.53669    9.315495     9.315495
 6: 2017-01-10 17:00:00 -13.53819  33.53174          3D     2 33.52879 -13.53675  357.251547   366.567042
 7: 2017-01-10 18:00:00 -13.54012  33.53617          3D     2 33.53174 -13.53819  525.378587   891.945628
 8: 2017-01-10 19:00:00 -13.54012  33.53617          3D     2 33.53617 -13.54012    0.000000   891.945628
 9: 2017-01-10 20:00:00 -13.54010  33.53618          3D     2 33.53617 -13.54012    2.475497   894.421126
10: 2017-01-10 21:00:00 -13.54016  33.53614          3D     2 33.53618 -13.54010    7.959379   902.380505
11: 2017-01-10 22:00:00 -13.54295  33.53795          3D     2 33.53614 -13.54016  367.195452  1269.575957
12: 2017-01-11 00:00:00 -13.55006  33.54501          3D     2 33.53795 -13.54295 1100.099008  2369.674965
13: 2017-01-11 01:00:00 -13.55251  33.53646          3D     2 33.54501 -13.55006  964.642282  3334.317247
14: 2017-01-11 02:00:00 -13.54522  33.52747          3D     2 33.53646 -13.55251 1266.933297  4601.250544
15: 2017-01-11 03:00:00 -13.54204  33.52488          3D     2 33.52747 -13.54522  451.532053  5052.782597
16: 2017-01-11 04:00:00 -13.54156  33.52306          3D     2 33.52488 -13.54204  204.088017  5256.870615
17: 2017-01-11 10:00:00 -13.54141  33.52391          3D     2 33.52306 -13.54156   93.494342  5350.364957
18: 2017-01-11 14:00:00 -13.54122  33.52357          3D     2 33.52391 -13.54141   42.442121  5392.807077
19: 2017-01-11 15:01:00 -13.54126  33.52302          3D     2 33.52357 -13.54122   59.690062  5452.497139
20: 2017-01-11 16:00:00 -13.54163  33.52322          3D     2 33.52302 -13.54126   46.529280  5499.026419
21: 2017-01-11 17:00:00 -13.54313  33.52099          3D     2 33.52322 -13.54163  293.474596  5792.501015
22: 2017-01-11 18:00:00 -13.55078  33.51532          3D     2 33.52099 -13.54313 1049.639556  6842.140572
23: 2017-01-11 19:00:00 -13.55713  33.50779          3D     2 33.51532 -13.55078 1078.760538  7920.901109
24: 2017-01-11 20:00:00 -13.56645  33.50147          3D     2 33.50779 -13.55713 1242.639048  9163.540158
25: 2017-01-11 21:00:00 -13.56664  33.49910          3D     2 33.50147 -13.56645  257.336592  9420.876749
26: 2017-01-11 22:00:00 -13.56663  33.49909          3D     2 33.49910 -13.56664    1.552488  9422.429237
27: 2017-01-11 23:00:00 -13.56662  33.49906          3D     2 33.49909 -13.56663    3.431958  9425.861195
28: 2017-01-12 00:00:00 -13.56667  33.49911          3D     2 33.49906 -13.56662    7.762437  9433.623632
29: 2017-01-12 01:00:00 -13.56668  33.49909          3D     2 33.49911 -13.56667    2.433775  9436.057407
30: 2017-01-12 02:00:00 -13.56665  33.49904          3D     2 33.49909 -13.56668    6.358316  9442.415723
31: 2017-01-12 03:00:00 -13.56667  33.49897          3D     2 33.49904 -13.56665    7.895348  9450.311071
32: 2017-01-12 04:00:00 -13.56664  33.49908          3D     2 33.49897 -13.56667   12.363073  9462.674144
33: 2017-01-12 10:00:00 -13.56675  33.49916          3D     2 33.49908 -13.56664   14.996281  9477.670425
34: 2017-01-12 14:00:00 -13.56660  33.49927          3D     2 33.49916 -13.56675   20.506423  9498.176848
35: 2017-01-12 15:00:00 -13.56649  33.49918          3D     2 33.49927 -13.56660   15.645952  9513.822799
36: 2017-01-12 16:00:00 -13.56648  33.49919          3D     2 33.49918 -13.56649    1.552488  9515.375287
37: 2017-01-12 17:00:00 -13.56647  33.49951          3D     2 33.49919 -13.56648   34.646209  9550.021496
38: 2017-01-12 18:00:00 -13.56884  33.50481          3D     2 33.49951 -13.56647  631.300217 10181.321714
39: 2017-01-12 19:00:00 -13.56874  33.50482          3D     2 33.50481 -13.56884   11.184421 10192.506135
40: 2017-01-12 20:00:00 -13.56879  33.50483          3D     2 33.50482 -13.56874    5.670191 10198.176326
41: 2017-01-12 21:00:00 -13.57121  33.50657          3D     2 33.50483 -13.56879  328.672043 10526.848369
42: 2017-01-12 22:00:00 -13.57280  33.51625          3D     2 33.50657 -13.57121 1062.331133 11589.179503
43: 2017-01-12 23:00:00 -13.57102  33.51870          3D     2 33.51625 -13.57280  330.983282 11920.162784
44: 2017-01-13 00:00:00 -13.56950  33.51947          3D     2 33.51870 -13.57102  188.608795 12108.771579
45: 2017-01-13 01:00:00 -13.57120  33.52346          3D     2 33.51947 -13.56950  471.416828 12580.188407
46: 2017-01-13 02:00:00 -13.57282  33.52623          3D     2 33.52346 -13.57120  349.811881 12930.000288
47: 2017-01-13 03:00:00 -13.57285  33.52623          3D     2 33.52623 -13.57282    3.339585 12933.339873
48: 2017-01-13 04:00:00 -13.57285  33.52622          3D     2 33.52623 -13.57285    1.082106 12934.421979
49: 2017-01-13 10:00:00 -13.57293  33.52629          3D     2 33.52622 -13.57285   11.691265 12946.113244
50: 2017-01-13 14:00:00 -13.57285  33.52636          3D     2 33.52629 -13.57293   11.691265 12957.804509
51: 2017-01-13 15:00:00 -13.57284  33.52623          3D     2 33.52636 -13.57285   14.111354 12971.915863
               DateTime  Latitude Longitude        Info group     lon2      lat2        dist      cumdist

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM