#r #coordinates #nearest-neighbor #sf #sp
#r #координаты #ближайший сосед #sf #sp
Вопрос:
Я пытаюсь создать карту, соединив случайные точки на континентах. Мне удалось приблизиться к желаемому результату, но я не хочу, чтобы точки в Северной Америке соединялись с точками в Сибири. Но я не могу сделать это, используя максимальное расстояние, поскольку точки находятся близко, через Северный полюс. Просмотрите прикрепленный график, чтобы понять, что я имею в виду.
Это код, который я использовал для соединения точек. pts
это просто координаты точек
neighbors <- 5
nearest <- st_nn(pts, pts, k = neighbors 1, maxdist = 3500000)
connect <- st_connect(pts, pts, nearest) %>% st_as_sf
Затем я строю карту с помощью
geom_sf(data = connect, color = 'white')
geom_sf(data = pts, color = 'white', shape = 1, size = 3)
Я попытался создать отдельные файлы для Северной Америки, Европы и Азии, но тогда точки не совпадают по расстоянию. Если я не должен использовать другой инструмент для получения точек, возможно, сгенерировать их непосредственно в R? До сих пор я использовал QGIS для генерации случайных точек в полигонах.
Как бы вы решили эту проблему?
Приветствия!
Комментарии:
1. Точки в Сибири и Северной Америке находятся ближе всего друг к другу с точки зрения расстояния, и поскольку
st_connect
между точками вычисляются только прямые линии, они соединяются прямой линией. Не уверен, что я полностью понимаю ваше намерение. Вам нужно только удалить линии между Америкой и Африкой / Европой / Азией? Если это так, то вы можете классифицировать линии в соответствии с источником / назначением и подмножеством в соответствии с условием. Если вы можете, пожалуйста, поделитесь образцами данных и подтвердите, что это то, что вы имели в виду, попытаюсь привести пример.2. Привет, да, это именно то, что я пытаюсь сделать — удалить линии между Северной Америкой и Азией. Я использую файл points2.csv для координат, он находится в моей ссылке на репозиторий, как бы вы классифицировали строки? Спасибо за вашу помощь
Ответ №1:
Возможно, это можно решить, просто удалив те линии, которые находятся выше определенного «расстояния» в градусах? Пожалуйста, смотрите ниже:
library(sf)
library(nngeo)
library(ggplot2)
# Points
pts = read.csv("https://raw.githubusercontent.com/jankomag/delaunay_map/main/points2.csv", sep = ";")
pts = st_as_sf(pts, coords = c("X", "Y"), crs = 4326)
# Lines
neighbors = 5
nearest = st_nn(pts, pts, k = neighbors 1, maxdist = 3500000)
connect = st_connect(pts, pts, nearest) %>% st_as_sf
# Remove very long lines
l = st_length(st_set_crs(connect, NA))
connect = connect[l < 100, ]
# Plot
ggplot()
geom_sf(data = connect)
geom_sf(data = pts, shape = 1, size = 3)