R фильтрует набор данных GPS по вектору с полями или ограничивающей рамкой под углом - PullRequest
1 голос
/ 09 июля 2020

У меня есть большой набор данных, который включает значения долготы и широты, которые я анализирую в 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 Итак, прямоугольник ограничивающей рамки должен быть под этим углом.

Я пробовал другой подход, создав вектор долготы и широты, который представляет собой прямую линию. Линия рассчитывается по двум точкам GPS с использованием gcIntermediate из пакета geosphere. Я планировал затем отфильтровать большой набор данных по этой прямой, но мне нужно добавить маржу к прямой. Таким образом, вместо того, чтобы фильтр ограничивался точным соответствием каждому значению в векторе, он фильтрует по значению в векторе плюс и минус бит. Плюс или минус немного - это расстояние (например, 1 м) вокруг каждой из координат GPS в моем векторе долготы и широты. Может, что-то вроде нечеткого фильтра? Или, может быть, как-нибудь расширить вектор прямой линии?

Я открыт для любых идей, так что если у кого-то есть лучший способ сделать то, что я пытаюсь сделать, это тоже нормально. например, создать ограничивающую рамку, которая представляет собой прямоугольник под углом (направление моей прямой линии), и отфильтровать мой большой набор данных с помощью ограничивающей рамки.

Сообщите мне, если мне нужно добавить больше деталей вопрос.

1 Ответ

0 голосов
/ 10 июля 2020

Исходя из вашего вопроса, я предполагаю, что ваша проблема заключается в создании поля, в котором вы хотите фильтровать свой большой набор данных ...

Итак, этот ответ фокусируется на создании этого bbox ... Он не делает фактического фильтрация ... дайте мне знать, если у вас не получится сделать это самостоятельно.

вот и мы go ..

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

введите описание изображения здесь

мне симпатично solid; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...