计算直线和曲线之间的面积

问题描述 投票:1回答:1

首先,对于这个漫长的介绍感到抱歉,但我认为这有助于更好地理解问题。我正在开展一个项目,我们正在尝试利用巨大的浮动车数据来推断人类的移动模式。我正在使用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")

现在,我想添加一个列偏差区域,它表示从每个行程的起点到终点的虚拟直线之间的区域,以及通过线段连接路径点(序列)所产生的实际路径或轨迹行程。

附上的照片可能有助于了解相应的区域:

我做了一个快速研究,但没有找到我真正需要的东西,特别是我需要为所有旅行做这件事。

任何提示/建议与代码 - 如果可能 - 将非常感谢!

r area
1个回答
0
投票

这就是我接近它的方式,这可能是错误的。

要正确计算两个纵向和纬度点之间的距离,您可以正常使用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。

其余的你必须尝试自己。我看待它的方式是这样的:

  • 您现在有一个线段。
  • 获取所有线段,并且您有一个多边形。 一个。如果y2 - y1 = 0,那么您已到达虚拟线。 湾停下来并转到3。
  • 将所有dist_value转换为与距离变量相同的比例。
  • 使用表示一个的new_distance值计算多边形的面积。每个数据点/值的线段。
  • 重复,直到评估完所有值并计算所有区域。

我建议使用问题分解来定义代码在编写代码之前的运行方式,即上面的步骤。如果您在编写代码时遇到问题,请至少尝试编写实现解决方案所需的步骤。将它们分成块并在此处发布,Stakeoverflow用户将能够为您提供帮助。不要忘记添加您尝试过的代码。

如果您在编写和运行代码时收到错误消息,请先在网上搜索,然后再将其发布到此处。那里有很多答案,你会发现你对问题的答案并不是唯一的。在任何搜索引擎中,在错误消息前面键入R可能会为您提供所需的帮助:“R错误消息”。

祝你好运,希望这有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.