R通过带边距的矢量或一定角度的边界框过滤GPS数据集

R filter GPS dataset by vector with margins, or a bounding box at an angle

我有一个大型数据集,其中包括我在 R 中分析的经度和纬度值。 例如

structure(list(S = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "L", class = "factor"), 
No = 7:12, X.. = c(175L, 200L, 225L, 250L, 275L, 300L), X. = c(200L, 
225L, 250L, 275L, 300L, 325L), Time = c(112836.789, 112837.291, 
112837.793, 112838.295, 112838.797, 112839.299), Latidude = c(51.28769291, 
51.28768926, 51.28768518, 51.28768096, 51.28767662, 51.28767237
), Longitude = c(0.868181943, 0.868182069, 0.868181418, 0.868179761, 
0.868177937, 0.868176734), Altitude = c(61.177, 61.145, 61.104, 
61.06, 61.05, 61.03), Bearing = c(201.3103, 201.3103, 201.3103, 
201.3103, 201.3103, 201.3103), Tree = structure(c(1L, 1L, 
1L, 1L, 1L, 1L), .Label = "Tree", class = "factor"), XSArea = c(1.4204362, 
0.4883868, 0.5491678, 0.6008296, 0.5633923, 0.5917539), AveWidth = c(1.1840309, 
0.5247761, 0.7371026, 1.2021244, 0.7507043, 0.3796109), AreaDensity = c(0.1989031, 
3.6698774, 3.7629885, 2.8899686, 2.5806617, 1.5068812)), row.names = c(NA,6L), class = "data.frame") 

我正在尝试将此数据集过滤到一个小区域,该区域是一个有一定角度的矩形。我有一个起点和一个终点,加上方位角和矩形宽度。我不知道如何以一定角度创建边界框,或者如何通过该边界框过滤大型数据集。 边界框的一个例子是:

bb<-cbind(c(0.86777,51.28743),c(0.86744,51.28690))
require(ggmaps)
bounding_box<-make_bbox(bb[1,],bb[2,])

但这只是一个从北到南的矩形 运行,我需要它成一个角度

require(geosphere)
bearingRhumb(bb[,1], bb[,2])

200.5686 So the bounding box rectangle should be at that angle

我尝试了一种不同的方法,即创建一个代表直线的经度和纬度矢量。

vect_line<-gcIntermediate(bb[,1], bb[,2], n = 1000, addStartEnd = TRUE)

这条直线是使用 geosphere 包中的 'gcIntermediate' 从两个 GPS 点计算得出的。我计划然后通过这条直线过滤大型数据集,但我需要在直线上添加边距。因此,过滤器不再局限于完全匹配向量中的每个值,而是按向量中的值加上和减去一点进行过滤。加号或减号是我的 lon 和 lat 向量中每个 GPS 坐标周围的距离(例如 1 m)。 也许像模糊过滤器之类的东西?或者以某种方式扩展直线向量?

我真的对任何想法都持开放态度,所以如果有人有更好的方法来做我正在尝试做的事情,那也很好。例如创建一个边界框,它是一个有角度的矩形(我的直线的方位角),并使用边界框过滤我的大数据集。

如果我需要为我的问题添加更多详细信息,请告诉我。

从你的问题来看,我认为你的问题在于创建要在其上过滤大型数据集的框...

所以这个答案的重点是创建这个 bbox...它不做实际的过滤..如果你不能自己完成这个,请告诉我。

我们开始了..

library( geosphere )
library( sf )
#boundary box sample coordinates
bb1 <- c( 0.86777, 51.28743 )
bb2 <- c( 0.86744, 51.28690 )
#set total width (in meters) of the boundary-box
bb.width = 50
#calculate course from 1st >> 2nd bb point
bb.bearing <- ( geosphere::bearing( bb1, bb2 ) + 360 ) %% 360
#perpendicular angles
bb.bearing.perp1 <- (bb.bearing + 360 + 90) %% 360
bb.bearing.perp2 <- (bb.bearing + 360 - 90) %% 360
#calculate the four corner-coordinates of the boundary-box
# leave form the start- and end point of a line, and travel
# half the desired width of the box in a perpendicular direction
bb.c1 <- geosphere::destPoint( p = bb1, bb.bearing.perp1, 0.5 * bb.width )
bb.c2 <- geosphere::destPoint( p = bb1, bb.bearing.perp2, 0.5 * bb.width )
bb.c3 <- geosphere::destPoint( p = bb2, bb.bearing.perp1, 0.5 * bb.width )
bb.c4 <- geosphere::destPoint( p = bb2, bb.bearing.perp2, 0.5 * bb.width )
#make spatial object out of the four points, ans make it a real 'box'
bb.sf <- rbind( bb.c1, bb.c2, bb.c3, bb.c4 ) %>%
  as.data.frame() %>%
  sf::st_as_sf( coords = c("lon", "lat"), crs = 4326 ) %>%
  sf::st_union() %>% 
  sf::st_convex_hull()

现在,目视检查我们所做的事情

#view original bb.points bb1 and bb2, for viewing on the map
bb.points.sf <- rbind( bb1, bb2 ) %>% 
  as.data.frame() %>% 
  st_as_sf( coords = c("V1", "V2"), crs = 4326 )

mapview::mapview( list( bb.points.sf, bb.sf ) )

我觉得很结实 ;-)