Не лучшее решение, но я смог выполнить необходимые преобразования в sf
:
Сначала я взял ваши координаты основного тона и преобразовал их в плоские координаты (27700) и взял случайную выборку, чтобы представить ваши Данные GPS:
library(dplyr)
library(sf)
pts <- data.frame(lat = c(top_left_lat,bottom_left_lat, bottom_right_lat, top_right_lat),
lng = c(top_left_lon,bottom_left_lon, bottom_right_lon, top_right_lon )) %>%
st_as_sf(coords = c('lng', 'lat'), crs = 4326) %>%
st_transform(27700)
poly <- pts %>%
st_union() %>%
st_convex_hull()
centroid <- st_centroid(poly)
set.seed(2020)
path <- st_sample(poly, 20) %>%
st_union() %>%
st_cast("LINESTRING")
st_transform(poly, 4326) %>%
ggplot() +
geom_sf(fill = NA, col = "black") +
geom_sf(data = st_transform(path,4326), col = 'red')
Затем рассчитали угол наклона и повернули наши данные на этот угол (функция rot
, найденная в sf
виньетка ):
# get angle of pitch
se <- st_coordinates(pts[1,])
ne <- st_coordinates(pts[2,])
dy <- ne[2] - se[2]
dx <- ne[1] - se[1]
angle = atan(dy/dx)
# rotate
rot <- function(a) matrix(c(cos(a), sin(a), -sin(a), cos(a)), 2, 2)
poly2 <- (poly - centroid) * rot(angle) + centroid
path2 <- (path - centroid) * rot(angle)+ centroid
В конце переведите, чтобы получить левое нижнее значение в (0,0):
# translate to 0,0
xmin <- st_bbox(poly2)[1]
ymin <- st_bbox(poly2)[2]
pitch <- poly2 - c(xmin, ymin)
positions <- path2 - c(xmin, ymin)
## fetch the x,y coordinates:
position_xy <- positions %>%
st_coordinates() %>%
as.data.frame()
pitch_xy <- pitch %>%
st_cast("LINESTRING") %>%
st_coordinates %>%
as.data.frame
position_xy %>%
ggplot() +
geom_path(aes(x = X, y= Y), col= 'red') +
geom_path(data = pitch_xy ,aes(x = X, y = Y))