首先,对于这个漫长的介绍感到抱歉,但我认为这有助于更好地理解问题。我正在开展一个项目,我们正在尝试利用巨大的浮动车数据来推断人类的移动模式。我正在使用RStudio这样做。基本上我们有两个文件; trips.csv包含375,000次旅行,其中包含旅行ID,开始/结束位置(经度,纬度)等元数据。第二个文件是waypoints.csv,其中包含完整的GPS航路点数据,按行程列出行程。这包括航路点序列,位置和其他字段。
总共有近1000万个航点(第二档)用于这些375,000次旅行(第一档)。因此,来自第一个文件的每次旅行在第二个文件中具有若干个航点,这些航点共同形成该旅行的轨迹。下表显示了每个文件中的示例,其中只包含我在问题中需要的列:
旅行数据
Tripld,Lon1,Lat1,Lon2,Lat2,distance,
bb983d,11.565,48.19,11.55,48.143,7498,
da5bgg,11.584,48.157,11.639,48.098,1364,
saefeg,11.591,48.142,11. 563,48.18,7377
路点数据
TripId,sequence,Lon,Lat,
bb983d,0,11.565,48.19,
bb983d,1,11.56688,48.18158,
bb983d,2,11.56351,48.18144,
bb983d,3,11.56335,48.1888,
bb983d,4,11.5654,48.17617,
da5bgg,0,11.584,48.157,
da5bgg,1,11.583417,48.155167,
da5bgg,2,11.578472,48.144556,
da5bgg,3,11.57075,48.142139,
5aefeg,0,11.591,48.142,
5aefeg,1,11.58994,4813956
5aefeg,2,11.58797,48.13706
这是我用来制作数据框的代码:
dput(droplevels(head(trips)))structure(list(TripId = structure(1:6, .Label = c("00a7da9f4b503f36fc937f386b11ca58", "00aa3cb70345798d9b1d92bc4685b3ee", "017cb0697a1135c5cd3479c1edc2aa6b", "01cc30aa0e036817cf4bdc468c9fad8a", "01f0a6a90ec964ae8014d2f750231663", "02949197deca3f1d52906cfc147454c5"), class = "factor"), StartLocLat = c(48.178, 48.098, 48.15, 48.176, 48.149, 48.151), startLocLon = c(11.573, 11.501, 11.503, 11.558, 11.503, 11.563), EndLocLat = (48.143, 48.098, 48.18, 48.168, 48.148, 48.127), EndLocLon = c(11.55, 11.639, 11.563, 11.526, 11.616, 11.554)), row.names = c(NA, 6L), class = "data.frame")
dput(droplevels(head(waypoints))) structure(list(TripId = structure(c(1L, 1L, 1L, 1L, 1L, 2L), .Label = c ("00a7da9f4b503f36fc937f386b11ca58", "00aa3cb70345798d9b1d92bc4685b3ee"), class = "factor"), Sequence = c(0L, 1L, 2L, 3L, 4L, 0L), Latitude = c(48.178, 48.18158, 48.18144, 48.1808, 48.17617, 48.098), Longitude = c(11.573, 11.56688, 11.56351, 11.56335, 11.5654, 11.501)), row.names = c(NA, 6L), class = "data.frame")
现在,我想添加一个列偏差区域,它表示从每个行程的起点到终点的虚拟直线之间的区域,以及通过线段连接路径点(序列)所产生的实际路径或轨迹行程。
附上的照片可能有助于了解相应的区域:
我做了一个快速研究,但没有找到我真正需要的东西,特别是我需要为所有旅行做这件事。
任何提示/建议与代码 - 如果可能 - 将非常感谢!
这就是我接近它的方式,这可能是错误的。
要正确计算两个纵向和纬度点之间的距离,您可以正常使用Haversine公式,但这是复杂的数学公式,所以我想这就是提供距离值的原因。
我们可以使用毕达哥拉斯的欧几里德公式来计算两个数据点(x1,y1)和(x2,x2)之间的距离,从未想过我会在离开学校后说出来。它的价值
distance = square_root((x2-x1)^ 2 +(y2-y1)^ 2。
它首先被平方的原因是因为Long和Lat数据可以具有负值。负long和lat值可用于表示方向,即East。绘图上的点x和y也可以具有负值,而不是在您的场景中,但是考虑头脑是一种好习惯。
现在获取上面提供的两个数据文件并将它们放在一个文本文件中,并将其保存在方便的地方。在控制台中,安装包dplyr以运行我的代码。
install.packages("dplyr")
从那里你可以使用这个代码:#读取一个csv格式化数据,列头等于True,并通过as.is等于True保持当前数据#类型。调用包dplyr以在当前会话中使用。 #choose.files()函数也是用户选择他/她需要的文件。 library(dplyr)read.virtual.line < - read.csv(choose.files(),header = T,as.is = T)read.waypoints < - read.csv(choose.files(),header = TRUE)
# Convert files read into to data.frame and assign to a variable name.
df.virtual.line <- data.frame(read.virtual.line)
df.waypoints <- data.frame(read.waypoints)
# This peice of code is execute from the right of the <- first.
# Calculate the Euclidean distance and assign to dist_scale.
# mutate makes a new column called dist_scale with the result of the above
# calculation.
新列dist_scale
Tripld Lon1 Lat1 Lon2 Lat2 distance dist_scale
bb983d 11.565 48.19 11.55 48.143 7498 0.049335586
da5bgg 11.584 48.157 11.639 48.098 13643 0.080659779
saefeg 11.591 48.142 11.563 48.18 7377 0.047201695
查看dist_scale的第一个值。起点为0,结束值为0.049335586。
其余的你必须尝试自己。我看待它的方式是这样的:
我建议使用问题分解来定义代码在编写代码之前的运行方式,即上面的步骤。如果您在编写代码时遇到问题,请至少尝试编写实现解决方案所需的步骤。将它们分成块并在此处发布,Stakeoverflow用户将能够为您提供帮助。不要忘记添加您尝试过的代码。
如果您在编写和运行代码时收到错误消息,请先在网上搜索,然后再将其发布到此处。那里有很多答案,你会发现你对问题的答案并不是唯一的。在任何搜索引擎中,在错误消息前面键入R可能会为您提供所需的帮助:“R错误消息”。
祝你好运,希望这有所帮助。