Как остановить анализ ближайшего соседа от соединения точек над северным полюсом в R

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

введите описание изображения здесь