c语言地理坐标存储 转发,纬度/经度坐标的2个列表之间的地理距离

要计算具有经度/纬度坐标的两点之间的地理距离,可以使用几个公式。 包地geosphere包含用于计算距离的distCosine , distHaversine , distVincentySphere和distVincentyEllipsoid 。 其中, distVincentyEllipsoid被认为是最准确的,但在计算上比其他的更密集。

有了这些function之一,你可以做一个距离matrix。 基于这个matrix,你可以根据最短的距离,使用which.min和相应的距离min (参见答案的最后一部分)来分配locality名称,如下所示:

library(geosphere) # create distance matrix 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

另一种可能性是根据列表2中的locality的平均经度和纬度值来分配locality :

library(dplyr) list2a % group_by(locality) %>% summarise_each(funs(mean)) %>% ungroup() mat2 % mutate(locality2 = list2a$locality[max.col(-mat2)])

或用data.table :

library(data.table) list2a

这给了:

> list1 longitude latitude locality locality2 1 80.15998 12.90524 DD 2 72.89125 19.08120 AB 3 77.65032 12.97238 CC 4 77.60599 12.90927 DC 5 72.88120 19.08225 AB 6 76.65460 12.81447 EE 7 72.88232 19.08241 AB 8 77.49186 13.00984 DC 9 72.82228 18.99347 AB 10 72.88871 19.07990 AB

正如你所看到的,这导致大部分(十分之七)的场合到另一个指定的locality 。

您可以添加距离:

list1$near_dist

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

list1$near_dist % 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 DD 269966.8970 2: 72.89125 19.08120 AB 65820.2047 3: 77.65032 12.97238 CC 739.1885 4: 77.60599 12.90927 DC 9209.8165 5: 72.88120 19.08225 AB 66832.7223 6: 76.65460 12.81447 EE 0.0000 7: 72.88232 19.08241 AB 66732.3127 8: 77.49186 13.00984 DC 17855.3083 9: 72.82228 18.99347 AB 69456.3382 10: 72.88871 19.07990 AB 66004.9900

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值