首页 > 解决方案 > 按最小地理空间距离 (R) 匹配两个数据集

问题描述

我有以下两个数据集:

houses <- data.table(house_number = c(1:3),
                     lat_decimal = seq(1.1, 1.3, by = 0.1),
                     lon_decimal = seq(1.4, 1.6, by = 0.1))
stations <- data.table(station_numer = c(1:11),
                       lat_decimal = seq(1, 2, by = 0.1),
                       lon_decimal = seq(2, 3, by = 0.1))

我想合并housesstations在一起,使得结果station_number是最接近相应的house_number.

这个问题非常相似,但我不确定他们是否正在使用纬度和经度,而且我不知道在处理经度和纬度时如何计算距离(这就是为什么我更喜欢简单地使用distmfromgeosphere包裹)。

我从未使用过外部函数。如果上述问题的答案有效,我该如何调整答案以使用distm函数而不是sqrt函数?

标签: rgeosphere

解决方案


使用match_nrst_haversine来自hutilscpp

library(hutilscpp)
houses[, c("station_number", "dist") := match_nrst_haversine(lat_decimal,
                                                             lon_decimal,
                                                             addresses_lat = stations$lat_decimal,
                                                             addresses_lon = stations$lon_decimal,
                                                             Index = stations$station_numer,
                                                             close_enough = 0,
                                                             cartesian_R = 5)]

houses
#>    house_number lat_decimal lon_decimal station_number     dist
#> 1:            1         1.1         1.4              1 67.62617
#> 2:            2         1.2         1.5              1 59.87076
#> 3:            3         1.3         1.6              1 55.59026

如果您的数据很多(即超过一百万个匹配点),close_enough您可能需要进行调整以提高性能。cartesian_R

`cartesian_R`

从要进行地理编码的点开始的任何地址的最大半径。用于加速最小距离的检测。请注意,正如参数名称所暗示的,距离是在笛卡尔坐标中,所以可能是一个小数字。

`close_enough`    

以米为单位的距离,低于该距离将被视为已发生匹配。(被认为“足够近”以匹配的距离。)

例如,close_enough = 10 表示将匹配十米内的第一个位置,即使稍后发生更接近的匹配。

可以作为字符串提供以强调单位,例如 close_enough = "0.25km"。只允许 km 和 m。


推荐阅读