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
эквивалент.