У меня есть сглаженная линия (упрощенная абстракция береговой линии), которая равна linestring
, и я хочу измерять длину линии через определенные промежутки времени вдоль нее. Я могу создать сглаженную линию и измерить ее длину:
library(raster)
library(sf)
library(tidyverse)
library(rnaturalearth)
library(smoothr)
# create bounding box for the line
xmin=-80
xmax=-66
ymin=24
ymax=45
bbox <- extent(xmin, xmax, ymin, ymax)
# get coarse outline of the US
usamap <- rnaturalearth::ne_countries(scale = "small", country = "united states of america", returnclass = "sf")[1] %>%
st_cast("MULTILINESTRING")
# crop to extent of the bbox and get rid of a border line that isn't coastal
bbox2 <- st_set_crs(st_as_sf(as(raster::extent(-80, -74, 42, 45.5), "SpatialPolygons")), st_crs(usamap))
cropmap <- usamap %>%
st_crop(bbox) %>%
st_difference(bbox2)
# smooth the line
smoothmap <- cropmap %>%
smoothr::smooth(method="ksmooth", smoothness=8)
# measure the line length
st_length(smoothmap) # I get 1855956m
Я собираюсь «привязать» образцы участков к точкам вдоль этой линии, и мне нужно знать, как далеко они находятся вдоль береговой линии. Однако я не могу понять, как измерить длину линии с интервалами вдоль береговой линии. Размер интервала не очень важен, если он имеет относительно хорошее разрешение, возможно, каждые 1 км или каждые 0,01 градуса.
То, что я хотел бы создать, - это кадр данных со столбцами x, y, содержащими широту / долготу точек вдоль линии, и столбец «length», содержащий расстояние вдоль линии (от начала координат до этой точки). Вот некоторые из вещей, которые я пробовал:
Итерация по ограничивающим прямоугольникам. Я попытался обрезать линию с помощью ограничивающих прямоугольников меньшего и меньшего размера (используя регулярные интервалы в широте / долготе), но поскольку линия изгибается "назад" вокруг -76, 38, некоторые из обрезанных полей не охватывают весь отрезок, который я ожидал. Этот подход работает для верхней правой половины строки, но не для нижней левой половины, которая просто возвращает нулевую длину.
Обрезка экстента перед внедрением сглаживателя, а затем измерение линии. Поскольку функция сглаживания не дает такую же форму, если она измеряет только сегмент исходной линии, на самом деле это не так измерить расстояние по той же линии.
Получение координат linestring
с помощью st_coordinates
, обрезка одной строки (одной точки на линии) и восстановление оставшихся координат в виде linestring
. Этот подход не дает один linestring
, но вместо этого цепочка точек (поскольку st_cast
не знает, как их снова соединить), поэтому его нельзя измерить как обычно.
Было бы идеально "отредактировать" геометрию smoothmap
, чтобы удалить одну строку координат за раз, повторно измерить линию и записать координаты конечной точки и длину линии в кадр данных. Однако я не уверен, возможно ли редактировать координаты sf-объекта, не превращая его в кадр данных.