2 个纬度/经度点(坐标)列表之间的地理/地理空间距离

2024-03-18

我有 2 个列表(list1, list2)以及各个地点的纬度/经度。一份清单(list2) 的地点名称list1不具有。

我也想要 list1 中每个点的近似位置。所以我想指出一点list1,尝试寻找最近的点list2并采取该地点。我对其中的每一点都重复一遍list1。它还需要距离(以米为单位)和点的索引(以米为单位)list1)所以我可以围绕它构建一些业务规则 - 本质上这些是应该添加到的 2 个新列list1 (near_dist, indx).

我正在使用gdist函数,但我无法让它与数据框输入一起使用。

输入列表示例:

list1 <- data.frame(longitude = c(80.15998, 72.89125, 77.65032, 77.60599, 
                                  72.88120, 76.65460, 72.88232, 77.49186, 
                                  72.82228, 72.88871), 
                    latitude = c(12.90524, 19.08120, 12.97238, 12.90927, 
                                 19.08225, 12.81447, 19.08241, 13.00984,
                                 18.99347, 19.07990))
list2 <- data.frame(longitude = c(72.89537, 77.65094, 73.95325, 72.96746, 
                                  77.65058, 77.66715, 77.64214, 77.58415,
                                  77.76180, 76.65460), 
                    latitude = c(19.07726, 13.03902, 18.50330, 19.16764, 
                                 12.90871, 13.01693, 13.00954, 12.92079,
                                 13.02212, 12.81447), 
                    locality = c("A", "A", "B", "B", "C", "C", "C", "D", "D", "E"))

要计算具有纬度/经度坐标的两点之间的地理距离,您可以使用多个公式。套餐geospheredistCosine, distHaversine, distVincentySphere and distVincentyEllipsoid用于计算距离。其中,distVincentyEllipsoid被认为是最准确的,但计算量比其他方法更密集。

使用这些函数之一,您可以创建距离矩阵。根据该矩阵,您可以分配locality基于最短距离的名称which.min以及相应的距离min(请参阅答案的最后一部分)如下所示:

library(geosphere)

# create distance matrix
mat <- distm(list1[,c('longitude','latitude')], list2[,c('longitude','latitude')], fun=distVincentyEllipsoid)

# assign the name to the point in list1 based on shortest distance in the matrix
list1$locality <- list2$locality[max.col(-mat)]

这给出:

> list1
   longitude latitude locality
1   80.15998 12.90524        D
2   72.89125 19.08120        A
3   77.65032 12.97238        C
4   77.60599 12.90927        D
5   72.88120 19.08225        A
6   76.65460 12.81447        E
7   72.88232 19.08241        A
8   77.49186 13.00984        D
9   72.82228 18.99347        A
10  72.88871 19.07990        A

另一种可能性是分配locality基于平均经度和纬度值localitys in list2:

library(dplyr)
list2a <- list2 %>% group_by(locality) %>% summarise_each(funs(mean)) %>% ungroup()
mat2 <- distm(list1[,c('longitude','latitude')], list2a[,c('longitude','latitude')], fun=distVincentyEllipsoid)
list1 <- list1 %>% mutate(locality2 = list2a$locality[max.col(-mat2)])

or with data.table:

library(data.table)
list2a <- setDT(list2)[,lapply(.SD, mean), by=locality]
mat2 <- distm(setDT(list1)[,.(longitude,latitude)], list2a[,.(longitude,latitude)], fun=distVincentyEllipsoid)
list1[, locality2 := list2a$locality[max.col(-mat2)] ]

这给出:

> list1
   longitude latitude locality locality2
1   80.15998 12.90524        D         D
2   72.89125 19.08120        A         B
3   77.65032 12.97238        C         C
4   77.60599 12.90927        D         C
5   72.88120 19.08225        A         B
6   76.65460 12.81447        E         E
7   72.88232 19.08241        A         B
8   77.49186 13.00984        D         C
9   72.82228 18.99347        A         B
10  72.88871 19.07990        A         B

正如您所看到的,这在大多数情况下(十分之七)会导致另一个指定的任务locality.


您可以通过以下方式添加距离:

list1$near_dist <- apply(mat2, 1, min)

或另一种方法max.col(这很可能更快):

list1$near_dist <- mat2[matrix(c(1:10, max.col(-mat2)), ncol = 2)]

# or using dplyr
list1 <- list1 %>% mutate(near_dist = mat2[matrix(c(1:10, max.col(-mat2)), ncol = 2)])
# or using data.table (if not already a data.table, convert it with 'setDT(list1)' )
list1[, near_dist := mat2[matrix(c(1:10, max.col(-mat2)), ncol = 2)] ]

结果:

> list1
    longitude latitude locality locality2   near_dist
 1:  80.15998 12.90524        D         D 269966.8970
 2:  72.89125 19.08120        A         B  65820.2047
 3:  77.65032 12.97238        C         C    739.1885
 4:  77.60599 12.90927        D         C   9209.8165
 5:  72.88120 19.08225        A         B  66832.7223
 6:  76.65460 12.81447        E         E      0.0000
 7:  72.88232 19.08241        A         B  66732.3127
 8:  77.49186 13.00984        D         C  17855.3083
 9:  72.82228 18.99347        A         B  69456.3382
10:  72.88871 19.07990        A         B  66004.9900
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2 个纬度/经度点(坐标)列表之间的地理/地理空间距离 的相关文章

  • 将 HTML 表格转换为 R 数据框

    table cellspacing 1 cellpadding 7 border 1 thead tr td align left valign middle nbsp td td align left 1a My peers make a
  • 创建超过 2 组的高图表密度

    我尝试用两个以上的组创建高图表密度 我找到了一种手动将它们逐一添加的方法 但必须有更好的方法来处理组 示例 我想创建一个类似于下面的ggplot图表的highchart 而不需要将它们一一添加 有什么办法可以做到吗 d f lt data
  • 如何使用aaply并保留数组中的维度顺序?

    我有一个 3 维数组 我想将函数应用于第三维并返回一个数组 我很高兴 plyr aaply 几乎能满足我的要求 但是它会交换我的数组的尺寸 文档告诉我它是幂等的 这 在我查找之后 让我认为结构应该保持不变 这是一个带有恒等函数的可重现示例
  • R:为绘图标题、轴标签或图例创建拉丁语/希腊语表达向量

    我想合并拉丁文和希腊文文本的向量以生成绘图标题 轴标签 图例条目等 我在下面提供了一个简单的示例 我不知道如何以原始形式呈现希腊字母 我尝试过各种组合expression parse and apply to the paste命令 但我无
  • 将选择标准添加到 read.table

    让我们采用以下我导入的数据集的简化版本read table a lt as data frame c M M F F F b lt as data frame c 25 22 33 17 18 df lt cbind a b colname
  • 是否可以在 R 中为 data.frame 命名别名

    使用某些数据标准时 使用多种方法来查看 data frame 的列会更简单 作为一个具体示例 在使用 SDTM 数据进行临床试验时 每种数据类型 如实验室或生命体征 都有一列时间点 实验室名称为 LBPT 生命体征名称为 VSTPT 理想情
  • as.data.frame 将嵌套列表展平为单行,而不是为每个记录创建行[重复]

    这个问题在这里已经有答案了 我有一个嵌套列表 如下所示 mylist lt vector list 2 mylist 1 name lt The Tucson IOT Meetup Group mylist 1 state lt AZ my
  • R 数据框到嵌套列表

    我想将这种格式的数据帧 tbl 转换为以下嵌套列表 tbllst library tidyr tbl lt tribble Col1 Col2 Col3 Var1 Var1 1 Var1 1 1 Var1 Var1 1 Var1 1 2 V
  • 更改列名称的字母大小写

    我有大量数据集 每个数据集都包含一长串列名 在某些文件中 列名称全部大写 而在某些文件中 仅列名称的第一个字母大写 我需要附加数据集 并认为匹配数据集中的列名称的最简单方法是将全大写名称转换为仅第一个字母大写的名称 我希望找到一个通用的解决
  • 带频率图的 R 热图类型图

    I am trying to create a plot like the following 我已经使用 ggplot2 中的 geom tile 粗略地得到了左侧图 但我无法弄清楚如何生成右侧图以及如何将两个图放在一起 Example
  • 使用 R 中绘制的标准误差创建条形图

    我试图找到在 R 中创建条形图并显示标准错误的最佳方法 我看过其他文章 但我无法弄清楚与我自己的数据一起使用的代码 之前没有使用过 ggplot 这似乎是最常用的方法 而 barplot 不与数据框合作 我需要在两种情况下使用它 我为此创建
  • 列表列中的设置操作

    我正在尝试做集合运算在存储在列表列中的向量之间 例如this https stackoverflow com questions 38712196 text file to dataframe with a list column DT l
  • 如何找到每个分类变量的连续变量的平均值

    我想在 y 轴上绘制连续的 BMI 在 x 轴上绘制家庭收入的分类变量 并且我希望该图绘制每个类别的平均 BMI 然而 我不知道如何找到家庭收入每个因素的平均体重指数 Dataset nh 5994 total IDs with Obser
  • 在r包中重新导出数据集

    In R包 有可能重新导出函数 这使得很容易回收相同的函数 而不必在不同的包之间重复代码 例如 devtools session info函数是重新导出sessioninfo session info export importFrom s
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • 添加有关白天/黄昏/夜晚/黎明的信息以在 R 中跟踪数据

    我有一个数据集 其中包含几个月的日期时间 纬度和经度变量的跟踪数据 如下所示 gt start lt as POSIXct 2018 08 01 00 00 00 format Y m d H M S tz UTC gt datetime
  • 使用 R 迭代读取、操作多个 Excel 文件并将它们附加到一个数据帧中

    在一个目录下 我有多个具有相似格式的excel文件 您可以从以下位置下载示例文件 here https www dropbox com s ho3visres55kpoy test zip dl 0 我需要 循环文件和read excel
  • 从 foreach 循环赋值

    我想并行化一个循环 例如 td lt data frame cbind c rep 1 4 2 rep 1 5 rep 1 10 2 names td lt c val id res lt rep NA NROW td for i in l
  • R:如何添加具有从矩阵的每一行中随机选择的值的列?

    我会先说我是一个 R 菜鸟 我认为这可能有一个简单的解决方案 但我正在努力寻找它 我有一个 2 列 1 000 行的矩阵 保持行固定 我想创建一个新变量 从两列中随机选择一个元素 例如制作一个简单的矩阵 matrix c 1 1 4 6 1
  • 更改列的顺序

    我正在处理一个包含 gt 40 列的大型数据框 我希望能够移动列 而不必指定所有列名称 例如 a lt c 1 5 b lt c 4 3 2 1 1 Percent lt c 40 30 20 10 10 Labels lt c Cat D

随机推荐