r: Правильно ли мой способ проецирования координат долготы и широты в шейп-файл на карте?

#r #shapefile #sf

#r #шейп-файл #sf

Вопрос:

У меня есть фрейм данных полигонов, перечисленных с координатами долготы и широты каждой вершины. Рассмотрим следующий фрейм данных:

 shape    longitude latitude
polygon1 -0.15     51
polygon1 -0.148    51.3
polygon1 -0.148    51.3
polygon1 -0.15     51
polygon2 -0.15     51.5
polygon2 -0.148    51.5
polygon2 -0.148    52
polygon2 -0.15     52
  

Я хочу использовать библиотеку sf и преобразовываю координаты в полигоны шейп-файла. Сначала я устанавливаю систему координат на 4326, которая содержит стандартную систему координат для Земли. Затем я преобразую систему координат в 27700, которая является британской национальной сеткой (мои точки находятся в Великобритании). Вот код, который я использую:

 library(sf)
library(dplyr)
library(readr)
data <- data %>%
  st_as_sf(coords = c('longitude', 'latitude')) %>%
  st_set_crs(4326)
data = data %>% st_transform(27700)
data <- data %>%
  group_by(shape) %>%
  summarise(do_union=FALSE) %>%
  st_cast("POLYGON")
  

После проецирования шейп-файла я вычисляю расстояние между полюсами как 22247,47 метра, используя st_distance . Используя формулу haversine, я получаю 22238,99 метра. Нормально ли, что есть какие-то изменения?

Важно, чтобы я правильно отображал свои координаты долготы и широты на Великобританию, чтобы получить правильные расстояния. Является ли мой метод правильным?

Комментарии:

1. выглядит нормально… почему вы сомневаетесь в своих результатах? Проверьте результаты визуально: mapview::mapview(data)

2. Когда я вычисляю расстояние по горизонтали, я получаю 22238,99 метра. Но я полагаю, что это нормально, что между ними есть какая-то разница?

3. Вы можете сделать свой полигон немного проще / быстрее с sfheaders::sf_polygon( obj = data, x = "longitude", y = "latitude", polygon_id = "shape")