Как рассчитать расстояния в дорожной сети между контрольной линией (или точкой) и кадром длинных / широтных точек с R? - PullRequest
0 голосов
/ 05 декабря 2018

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

   Latitude Longitude
1  40.66858 22.88713
2  40.66858 22.88713
3  40.66858 22.88713
4  40.66858 22.88713
5  40.66858 22.88714
6  40.66857 22.88715
7  40.66858 22.88716
8  40.66858 22.88717
9  40.66859 22.88718
10 40.66861 22.88719 

и следующая контрольная линия с начальными / конечными координатами:

22.88600 40.66885
22.88609 40.66880 

(Если мы хотим одну контрольную точку в середине линии(вместо всей линии) его координаты: 22.88602844465866,40.66883357487465) Вот скриншот из Google Планета Земля после нанесения точек и линии: enter image description here

Я попытался вычислитьрасстояния каждой точки с контрольной линией следующим образом:

dist2Line(points, line, distfun=distHaversine) #from geosphere package

Расчетное расстояние (например, для первой точки) - это расстояние с желтой линией на следующем снимке экрана.Желаемым является тот, который обозначен красной линией (расстояние до сети дорог).Как я могу решить это?Я хочу рассчитать расстояния дорожной сети для всех точек!Заранее спасибо!enter image description here

1 Ответ

0 голосов
/ 05 декабря 2018
library(sp)
library(rgeos)
library(geosphere)

Давайте соединим среднюю точку вашей линии с другой линией:

pt1 <- matrix(c(22.88600, 40.66885), ncol=2)
pt2 <- matrix(c(22.88609, 40.66880), ncol=2)

midpt <- as.data.frame(midPoint(pt1, pt2))

ПРИМЕЧАНИЕ. Первые 4 точки линии совпадают в предоставленных вами данных

read.csv(text="lat,lon
40.66858,22.88713
40.66858,22.88713
40.66858,22.88713
40.66858,22.88713
40.66858,22.88714
40.66857,22.88715
40.66858,22.88716
40.66858,22.88717
40.66859,22.88718
40.66861,22.88719", stringsAsFactors = FALSE) -> l

l <- rbind.data.frame(midpt, l)

Использование средней точки на линии не идеально, поэтому вы также можете использовать операции пространственного пересечения, чтобы найти правильную точку пересечения.

Теперь, сделайте это пространственным объектом и сделайте скучную проекцию longlat "".

l <- SpatialLines(list(Lines(Line(l[,2:1]), "1")), proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))

Преобразование указанной" проекции "во что-то значимое (я выбрал EPSG: 3265 , но выбирайте все, что хотите, чтобы получить реальное расстояние):

l <- spTransform(l, CRS("+init=epsg:3265"))

Получите точки от линии:

pts <- as(l, "SpatialPoints")

Следуйте Как рассчитать географическое расстояние между двумя точками вдоль линии в R? , чтобы получить расстояние между точками, которое вы можетесделайте остальное оттуда:

diff(sort(gProject(l, pts, normalized = FALSE)))
##  [1] 372.553928   0.000000   0.000000   0.000000   3.360954   4.581859
##  [7]   4.581860   3.360956   4.581862   7.077129

Было бы ??, если бы кто-то, кто знает, как сделать это с sf, мог бы сделать это также, так как я не смог найти gProject эквивалент.

...