#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")