Проекция точки GPS на полилинию, состоящую из других точек GPS - PullRequest
0 голосов
/ 22 апреля 2020

Я хотел бы спросить, есть ли вполне приличный способ "проецировать" точку GPS на ломаную линию, состоящую из других точек GPS. Результатом этой «проекции» должны быть координаты спроецированной точки на полилинии.

Я ищу что-то подобное (мне нужны GPS-координаты точки красного 'X'):

line of gps points

Заранее благодарим за помощь

1 Ответ

2 голосов
/ 22 апреля 2020

Я предлагаю вам построить свое решение на функции 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)

points in Prague

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