如何计算R中某个阈值以下的2个坐标之间的距离?

沙兹

我有44,000个美国邮政编码,并且在R中是对应的重心纬度/经度。这是从R中的“ zipcode”包中获得的。我需要计算每个邮政编码之间的距离,并保持这些距离小于5英里。问题是要计算邮政编码之间的所有距离,我必须创建一个大小为44,000x44,0000的矢量,由于空间问题我不能这样做。

我检查了R中的帖子,最接近我的要求的是它用纬度/经度吐出两个数据集之间的最小距离

DB1 <- data.frame(location_id=1:7000,LATITUDE=runif(7000,min = -90,max = 90),LONGITUDE=runif(7000,min = -180,max = 180))
DB2 <- data.frame(location_id=7001:12000,LATITUDE=runif(5000,min = -90,max = 90),LONGITUDE=runif(5000,min = -180,max = 180))

DistFun <- function(ID){
  TMP <- DB1[DB1$location_id==ID,]
  TMP1 <- distGeo(TMP[,3:2],DB2[,3:2])
  TMP2 <- data.frame(DB1ID=ID,DB2ID=DB2[which.min(TMP1),1],DistanceBetween=min(TMP1)      ) 
  print(ID)
  return(TMP2)
}

DistanceMatrix <- rbind_all(lapply(DB1$location_id, DistFun))

即使我们可以修改上面的代码以包含所有小于等于5英里的距离(例如),执行起来也非常慢。

是否有一种有效的方法来得出彼此重心小于等于5英里的所有邮政编码组合?

闯入

一次生成整个距离矩阵将非常耗费RAM,并且循环遍历唯一邮政编码的每种组合-非常耗时。让我们找到一些妥协。

我建议将zipcode data.frame(例如)100行分成多块(借助chunkpackage功能bit),然后计算44336与100点之间的距离,根据目标距离阈值进行过滤,然后继续进行下一个数据块。在我的示例中,我将zipcode数据转换data.table可以提高速度并节省RAM。

library(zipcode)
library(data.table)
library(magrittr)
library(geosphere)

data(zipcode)

setDT(zipcode)
zipcode[, dum := NA] # we'll need it for full outer join

仅供参考-这是RAM中每个数据的大概大小。

merge(zipcode, zipcode[1:100], by = "dum", allow.cartesian = T) %>% 
  object.size() %>% print(unit = "Mb")
# 358.2 Mb

代码本身。

lapply(bit::chunk(1, nrow(zipcode), 1e2), function(ridx) {
  merge(zipcode, zipcode[ridx[1]:ridx[2]], by = "dum", allow.cartesian = T)[
    , dist := distGeo(matrix(c(longitude.x, latitude.x), ncol = 2), 
                      matrix(c(longitude.y, latitude.y), ncol = 2))/1609.34 # meters to miles
    ][dist <= 5 # necessary distance treshold
      ][, dum := NULL]
  }) %>% rbindlist -> zip_nearby_dt

zip_nearby_dt # not the whole! for first 10 chunks only

       zip.x          city.x state.x latitude.x longitude.x zip.y     city.y state.y latitude.y longitude.y     dist
    1: 00210      Portsmouth      NH   43.00590   -71.01320 00210 Portsmouth      NH   43.00590   -71.01320 0.000000
    2: 00210      Portsmouth      NH   43.00590   -71.01320 00211 Portsmouth      NH   43.00590   -71.01320 0.000000
    3: 00210      Portsmouth      NH   43.00590   -71.01320 00212 Portsmouth      NH   43.00590   -71.01320 0.000000
    4: 00210      Portsmouth      NH   43.00590   -71.01320 00213 Portsmouth      NH   43.00590   -71.01320 0.000000
    5: 00210      Portsmouth      NH   43.00590   -71.01320 00214 Portsmouth      NH   43.00590   -71.01320 0.000000
---                                                                                                              
15252: 02906      Providence      RI   41.83635   -71.39427 02771    Seekonk      MA   41.84345   -71.32343 3.688747
15253: 02912      Providence      RI   41.82674   -71.39770 02771    Seekonk      MA   41.84345   -71.32343 4.003095
15254: 02914 East Providence      RI   41.81240   -71.36834 02771    Seekonk      MA   41.84345   -71.32343 3.156966
15255: 02916         Rumford      RI   41.84325   -71.35391 02769   Rehoboth      MA   41.83507   -71.26115 4.820599
15256: 02916         Rumford      RI   41.84325   -71.35391 02771    Seekonk      MA   41.84345   -71.32343 1.573050

在我的机器上,处理10个块花了1.7分钟,因此整个处理过程可能需要70-80分钟,虽然不算很快,但可能令人满意。我们可以将块大小增加到200或300行,具体取决于可用的RAM容量,这将分别缩短2或3倍的处理时间。

该解决方案的缺点是,结果data.table包含“重复的”行-我的意思是,从点A到点B以及从点B到A都存在距离。这可能需要一些额外的过滤。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

2个坐标之间的距离

来自分类Dev

Distm函数,用于计算R中坐标之间的距离

来自分类Dev

如何计算带有正负坐标的R中的点之间的距离

来自分类Dev

在R中,如何求和各行之间的距离(每一个都是GPS坐标)?

来自分类Dev

在.NET Core中查找2个坐标之间的距离

来自分类Dev

如何用R在两组点(坐标)之间的欧式距离计算房屋距离

来自分类Dev

计算SQL中以下记录之间的距离

来自分类Dev

计算SQL中以下记录之间的距离

来自分类Dev

如何在Julia中计算两条线之间的距离(2个坐标点的序列)

来自分类Dev

计算2个整数坐标点之间的距离的最有效方法?

来自分类Dev

如何计算R中两个矩阵之间的欧式距离

来自分类Dev

如何计算矩阵中两个元素之间的最大欧几里得距离-R?

来自分类Dev

我们如何计算两个坐标之间的距离。ArangoDB

来自分类Dev

计算Java中两个地理坐标之间的距离

来自分类Dev

计算多组坐标之间的距离

来自分类Dev

计算C#中2个点之间的距离

来自分类常见问题

计算两个坐标之间的距离的功能

来自分类Dev

计算两个GPRS坐标之间的距离

来自分类Dev

以R中两个坐标之间的间隔计算点

来自分类Dev

如何在任意坐标处计算2个经度之间的距离?我们可以假设地球是一个球体吗?

来自分类Dev

如何计算椭球体与R中的点之间的最小距离

来自分类Dev

给定两组坐标,如何计算它们之间的距离?

来自分类Dev

如何遍历坐标列表并计算它们之间的距离?

来自分类Dev

计算宽数据框中每对坐标之间的距离

来自分类Dev

计算不同数据框中坐标之间的距离

来自分类Dev

如何沿地图上2个坐标之间的直线计算N个等距点的坐标?

来自分类Dev

C#中2个坐标与Google地图之间的距离差异

来自分类Dev

计算r中的点对之间的距离

来自分类Dev

JavaScript中两个画布坐标之间的距离

Related 相关文章

  1. 1

    2个坐标之间的距离

  2. 2

    Distm函数,用于计算R中坐标之间的距离

  3. 3

    如何计算带有正负坐标的R中的点之间的距离

  4. 4

    在R中,如何求和各行之间的距离(每一个都是GPS坐标)?

  5. 5

    在.NET Core中查找2个坐标之间的距离

  6. 6

    如何用R在两组点(坐标)之间的欧式距离计算房屋距离

  7. 7

    计算SQL中以下记录之间的距离

  8. 8

    计算SQL中以下记录之间的距离

  9. 9

    如何在Julia中计算两条线之间的距离(2个坐标点的序列)

  10. 10

    计算2个整数坐标点之间的距离的最有效方法?

  11. 11

    如何计算R中两个矩阵之间的欧式距离

  12. 12

    如何计算矩阵中两个元素之间的最大欧几里得距离-R?

  13. 13

    我们如何计算两个坐标之间的距离。ArangoDB

  14. 14

    计算Java中两个地理坐标之间的距离

  15. 15

    计算多组坐标之间的距离

  16. 16

    计算C#中2个点之间的距离

  17. 17

    计算两个坐标之间的距离的功能

  18. 18

    计算两个GPRS坐标之间的距离

  19. 19

    以R中两个坐标之间的间隔计算点

  20. 20

    如何在任意坐标处计算2个经度之间的距离?我们可以假设地球是一个球体吗?

  21. 21

    如何计算椭球体与R中的点之间的最小距离

  22. 22

    给定两组坐标,如何计算它们之间的距离?

  23. 23

    如何遍历坐标列表并计算它们之间的距离?

  24. 24

    计算宽数据框中每对坐标之间的距离

  25. 25

    计算不同数据框中坐标之间的距离

  26. 26

    如何沿地图上2个坐标之间的直线计算N个等距点的坐标?

  27. 27

    C#中2个坐标与Google地图之间的距离差异

  28. 28

    计算r中的点对之间的距离

  29. 29

    JavaScript中两个画布坐标之间的距离

热门标签

归档