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

时间:2018-09-01 14:55:57

标签: r area

首先,对这个冗长的介绍感到抱歉,但是我认为这将有助于更好地理解问题。我正在做一个项目,我们正在尝试利用巨大的浮动汽车数据来推断人类的出行方式。我正在使用RStudio这样做。基本上,我们有两个文件; trips.csv ,其中包含375,000次行程,其中包含行程ID,起点/终点位置(经度,纬度)和其他字段等元数据。第二个文件是 waypoints.csv ,其中包含完整的GPS航点数据,并按行程列出。这包括航点顺序,位置和其他字段。

这37.5万次旅行(第一个文件)总共有近一千万个航点(第二个文件)。因此,从第一个文件开始的每个行程在第二个文件中都有多个航点,共同构成了该行程的轨迹。下表显示了每个文件中的示例,其中仅包含我在问题中所需的列:

旅行数据

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")

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

随附的照片可能有助于了解相应的区域: the desired area to be calculated

我进行了快速研究,但没有找到我真正需要的东西,尤其是在所有旅行中都需要这样做。

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

1 个答案:

答案 0 :(得分:0)

  

这就是我的处理方式,这可能是错误的。

要正确计算两个纵向点和纬度点之间的距离,通常可以使用Haversine公式,但这是一个复杂的数学方程式,因此我要说的就是为什么要提供距离值。

我们可以使用毕达哥拉斯的欧几里得公式计算两个数据点(x1,y1)和(x2,x2)之间的距离,没想到我放学后这么说。值了

  

距离= square_root((x2-x1)^ 2 +(y2-y1)^ 2。

首先求平方的原因是因为经度和纬度数据可能具有负值。负的经度和纬度值可用于表示方向,即东。情节中的点x和y也可以具有负值,而不是在您的情况下,但是考虑到头脑是一个好习惯。

现在获取上面提供的两个数据文件,并将它们放在文本文件中,并保存在方便的地方。在控制台中,安装软件包dplyr以运行我的代码。

install.packages("dplyr")

您可以在此处使用以下代码:     #读取列标题等于True的csv格式数据,并保持当前数据     通过as.is的#类型等于True。调用软件包dplyr以在当前会话中使用。     #choice.files()函数还可以让用户选择他/她需要的文件。     图书馆(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。

其余的您将不得不尝试自己。我的浏览方式如下:

    1. 您现在有一个线段。
    1. 获取所有线段,您将获得一个多边形。
      • a。如果y2-y1 = 0,那么您已经到达虚拟线。
      • b。停止并转到3。
    1. 将所有 dist_value 转换为与 distance 变量相同的比例。
    1. 使用表示一个的 new_distance 值计算多边形的面积。 每个数据点/值的线段。
    1. 重复直到所有值都已评估并计算出所有面积为止。

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

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

祝您好运,希望对您有所帮助。