Я предлагаю вам построить свое решение на функции sf::st_nearest_points()
- она возвращает кратчайший путь между двумя геометрическими объектами в виде линейной линии.
Он будет принимать точку и линию в качестве аргументов. Функция требует, чтобы ее аргументы были спроецированы (поэтому не широта / долгота - но результат легко перепроецировать обратно в WGS84).
Поскольку функция возвращает линейную строку, необходимо sf::st_cast()
указать ее геометрию введите, чтобы получить начало и конец строки.
Поскольку ваш пример не является легко воспроизводимым, я демонстрирую подход на несколько запутанном примере с геокодированным адресом в Праге и ближайшей точке на реке Влтаве. Река как линия и функция геокодирования взяты из пакета RCzechia и совершенно не связаны с вашей проблемой.
Требуется линия и точка, как в проецируемой системе координат.
library(sf)
library(dplyr)
library(RCzechia) # Czech spatial objects to have some data to work with...
# an address in Prague
free_point <- RCzechia::geocode("pplk. Sochora 4, Praha 7") %>%
filter(typ == "AdresniMisto") %>%
st_transform(5514) #↨a local projected CRS
# a piece of river (to have a linestring)
vltava <- RCzechia::reky() %>%
filter(NAZEV == "Vltava") %>%
st_transform(5514) %>% #↨a local projected CRS
st_intersection(sf::st_buffer(free_point, 2500)) %>% # a buffer of 2500 meters around point
st_geometry() %>%
st_union() %>%
st_line_merge()
# the interesting part starts here!!!
# a line from address to the closest point on the river
closest_line <- st_nearest_points(st_geometry(vltava),
st_geometry(free_point))
# start of the line - this is what I seek :)
closest_point <- st_cast(closest_line, to = "POINT")[1]
# report results
plot(st_geometry(vltava))
plot(free_point, pch = 4, col = "red", add = T)
plot(closest_point, pch = 4, col = "blue", add = T)