Рассчитайте самое большое расстояние между двумя линиями - PullRequest
2 голосов
/ 28 января 2020

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

Прилагаются некоторые примеры данных.

pts1<- data.frame(
  x= c(-103.485342, -103.482808),
  y = c(31.348758, 31.376947))
) %>% 
  sf::st_as_sf(coords = c("x","y"))

st_crs(pts1)<- "+init=epsg:2257"

pts2<- data.frame(
  x= c(-103.492822, -103.484231),
  y = c(31.348181, 31.377191))
) %>% 
  sf::st_as_sf(coords = c("x","y"))

st_crs(pts2)<- "+init=epsg:2257"

a <- pts1 %>% st_coordinates() %>% st_linestring()
b<- pts2 %>% st_coordinates() %>% st_linestring()

min_dist<-st_distance(a,b,by_element = T)

См. Второй пример ниже. Из изображения я вычисляю ~ 300 метров от перпендикулярной линии, которая максимально пересекает обе линии.

enter image description here

pts1 <- data.frame(x = c(-103.485342, -103.482808),
                   y = c(31.348758, 31.376947)) %>% 
  sf::st_as_sf(coords = c("x","y"))

st_crs(pts1) <- "+proj=longlat +datum=WGS84"

pts1<- st_transform(pts1,"+init=epsg:2257")


pts2 <- data.frame(x = c(-103.492812, -103.484231),
                   y = c(31.318181, 31.377991)) %>% 
  sf::st_as_sf(coords = c("x","y"))


st_crs(pts2) <- "+proj=longlat +datum=WGS84"

pts2<- st_transform(pts2,"+init=epsg:2257")

a <- pts1 %>% st_coordinates() %>% st_linestring()
b <- pts2 %>% st_coordinates() %>% st_linestring()

st_distance(pts1, pts2, by_element = T)

1 Ответ

1 голос
/ 08 февраля 2020

Я дам вам понимание, возможно, это не полный ответ, который вы могли бы себе представить.

Поскольку линии состоят из точек, если вы просто сделаете два небольших изменения, вы можете иметь не только минимальное расстояние , но также и максимальное расстояние, делая то же самое, что вы сделали с линиями, но с точками, из которых состоят линии.

library(sf)
#> Linking to GEOS 3.8.0, GDAL 2.4.2, PROJ 6.2.1

pts1 <- data.frame(x = c(-103.485342, -103.482808),
                  y = c(31.348758, 31.376947)) %>% 
  sf::st_as_sf(coords = c("x","y"))

st_crs(pts1) <- "+init=epsg:2257"

pts2 <- data.frame(x = c(-103.492822, -103.484231),
                   y = c(31.348181, 31.377191)) %>% 
  sf::st_as_sf(coords = c("x","y"))

st_crs(pts2)<- "+init=epsg:2257"

a <- pts1 %>% st_coordinates() %>% st_linestring()
b <- pts2 %>% st_coordinates() %>% st_linestring()

st_distance(pts1, pts2, by_element = T)
#> Units: [US_survey_foot]
#> [1] 0.007502222 0.001443768

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

ca <- st_centroid(a)
cb <- st_centroid(b)

st_distance(ca, cb, by_element = T)
#> [1] 0.004454613

РЕДАКТИРОВАТЬ: моя последняя попытка на основе комментария

Я думаю, что вы можете получить то, что пытаетесь получить, если найдете самую длинную линию (b в вашем примере), чем обработать и найти самое длинное расстояние между точками более короткой линии и самой длинной линией:

(я также внес некоторые изменения в ваш исходный код, чтобы он работал)

library(sf)

pts1 <- data.frame(x = c(-103.485342, -103.482808),
                   y = c(31.348758, 31.376947)) %>% 
  st_as_sf(coords = c("x","y")) %>% 
  st_set_crs(4326) %>% 
  st_transform(2257)

pts2 <- data.frame(x = c(-103.492812, -103.484231),
                   y = c(31.318181, 31.377991)) %>% 
  st_as_sf(coords = c("x","y")) %>% 
  st_set_crs(4326) %>% 
  st_transform(2257)

a <- pts1 %>% 
  st_union(.) %>% 
  st_cast(to = "LINESTRING")

b <- pts2 %>% 
  st_union(.) %>% 
  st_cast(to = "LINESTRING")

longest <- ifelse(test = st_length(a) > st_length(b),
                  yes = quote(a),
                  no = quote(b))

max(st_distance(pts1, eval(longest)))
#> 955.7374 [US_survey_foot]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...