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

#r #dataframe #math #latitude-longitude #haversine

#r #фрейм данных #математика #широта-долгота #haversine

Вопрос:

У меня есть два файла CSV в формате, как показано ниже

Файл1.csv

 Sr      Lat,Long
1       52.361176,4.899779
2       52.34061,4.871195
3       52.374749,4.893847
4       52.356624,4.912281
5       52.374026,4.883685
6       52.369956,4.919778
7       52.370895,4.8703
8       52.390454,4.915024
9       52.378576,4.900253
10      52.378372,4.896219
11      52.380056,4.899697
12      52.383744,4.875805
13      52.369981,4.881528
14      52.375954,4.904786
15      52.344417,4.891211
......1000 columns
  

File2.csv

 neighbourhood   LAT,LONG
Bijlmer-Centrum 52.3135175, 4.9547795
Bijlmer-Oost    52.3179787, 4.9754974
Bos en Lommer   52.3807577, 4.8545966
Buitenveldert - Zuidas  52.3382516, 4.872921499999999
Centrum-Oost    51.208107, 4.4249047
Centrum-West    52.0607927, 4.4832451
De Aker - Nieuw Sloten  52.3447535, 4.811520799999999
De Baarsjes - Oud-West  52.367746, 4.854258
De Pijp - Rivierenbuurt 52.3560276, 4.9021384
........500columns
  

Я хочу вычислить пары кратчайших расстояний между двумя файлами (возможно, расположенные в порядке убывания).Кроме того, каждая пара в File1 должна соответствовать ближайшему местоположению в File2, т. Е. Ни одна запись в File1 не должна быть пропущена. В качестве примера рассмотрим первую пару широта-длина в file1 52.361176,4.899779 , мне нужно расстояние этой пары с каждой другой парой в File2 и аналогично сделать это для всех других записей в File1. Это формула, которую мне нужно использовать (она на python)

 def distance(lat1, lon1, lat2, lon2):
    p = pi/180
    a = 0.5 - cos((lat2-lat1)*p)/2   cos(lat1*p) * cos(lat2*p) * (1-cos((lon2-lon1)*p))/2
    return 12742 * asin(sqrt(a))
  

Я новичок в R и, следовательно, прошу экспертов на этом форуме помочь.

РЕДАКТИРОВАТЬ: File1 и File2 содержат больше записей, чем указано здесь, это всего лишь фрагмент. Исходные файлы содержат более 1000 и 500 столбцов соответственно.

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

1. вы могли бы взглянуть на geosphere::distHaversine

2. я видел подобные вопросы на SO несколько раз за последние пару лет. Вы просмотрели их ответы?

Ответ №1:

вот пространственное соединение с использованием sf data.table::fread() используется для создания образцов данных.

 #make spatial objects
sf1 <- file1 %>% sf::st_as_sf( coords = c("Long", "Lat"), crs = 4326 )
sf2 <- file2 %>% sf::st_as_sf( coords = c("LONG", "LAT"), crs = 4326 )

st_join( sf1, sf2, join = st_nearest_feature )
# 
# Simple feature collection with 15 features and 3 fields
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: 4.8703 ymin: 52.34061 xmax: 4.919778 ymax: 52.39045
# geographic CRS: WGS 84
# First 10 features:
#    Sr         neighbourhood                  geometry
# 1   1  De Pijp - Rivierenbuurt POINT (4.899779 52.36118)
# 2   2  Buitenveldert-Zuidas POINT (4.871195 52.34061)
# 3   3  De Pijp - Rivierenbuurt POINT (4.893847 52.37475)
# 4   4  De Pijp - Rivierenbuurt POINT (4.912281 52.35662)
# 5   5  De Pijp - Rivierenbuurt POINT (4.883685 52.37403)
# 6   6  De Pijp - Rivierenbuurt POINT (4.919778 52.36996)
# 7   7  De Baarsjes - Oud-West   POINT (4.8703 52.37089)
# 8   8  De Pijp - Rivierenbuurt POINT (4.915024 52.39045)
# 9   9  De Pijp - Rivierenbuurt POINT (4.900253 52.37858)
# 10 10  De Pijp - Rivierenbuurt POINT (4.896219 52.37837)
  

пример использованных данных

 library(sf)
library(data.table)
file1 <- data.table::fread("
Sr   Lat Long
1    52.361176 4.899779
2    52.34061 4.871195
3    52.374749 4.893847
4    52.356624 4.912281
5    52.374026 4.883685
6    52.369956 4.919778
7    52.370895 4.8703
8    52.390454 4.915024
9    52.378576 4.900253
10   52.378372 4.896219
11   52.380056 4.899697
12   52.383744 4.875805
13   52.369981 4.881528
14   52.375954 4.904786
15   52.344417 4.891211")

file2 <- data.table::fread('                            neighbourhood   LAT LONG
"Bijlmer-Centrum" 52.3135175 4.9547795
"Bijlmer-Oost"    52.3179787 4.9754974
"Bos en Lommer"   52.3807577 4.8545966
"Buitenveldert-Zuidas"  52.3382516 4.872921499999999
"Centrum-Oost"    51.208107 4.4249047
"Centrum-West"    52.0607927 4.4832451
"De Aker - Nieuw Sloten"  52.3447535 4.811520799999999
"De Baarsjes - Oud-West"  52.367746 4.854258
"De Pijp - Rivierenbuurt" 52.3560276 4.9021384')
  

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

1. Спасибо за помощь, но у меня есть несколько вопросов. 1. Могу ли я вместо отображения 10 лучших функций получить сводку по всем парам? 2. Возможно ли также рассчитать расстояние? 3. Насколько точен этот метод по сравнению с формулой haversine?

2. Вы запустили код и файлы справки используемых функций и пакетов?

3. Да, я сделал, но не могу понять, как отобразить все вместо 10 лучших функций

4. вы должны сохранить результат в объекте… mything <- .....