【问题标题】:Mapping address to nearest metropolitan area将地址映射到最近的大都市区
【发布时间】:2019-02-24 20:13:21
【问题描述】:

我有一个数据集,我正在尝试将一组位置获取到其最近的大都市。我有数据集 1 (df1),其中包含经度和纬度的地址位置。我想将这些地址映射到半径 50 英里内的所有最近的大都市(在数据框 df2 中)。

g_lat <- c(45.52306, 40.26719, 34.05223, 37.38605, 37.77493)
g_lon <- c(-122.67648,-86.13490, -118.24368, -122.08385, -122.41942)
address <- c(1,2,3,4,5)
df1 <- data.frame(g_lat, g_lon, address)

g_lat <- c(+37.7737185, +45.5222208,+37.77493)
g_lon <- c(-122.2744317,-098.7041549,-122.41942)
msa <- c(1,2,3)
df2 <- data.frame(g_lat, g_lon, msa)

我希望输出如下显示与此地址关联的所有 msa:

 address g_lat    g_lon         msa 
  5     37.77493  -122.41942     1
  5     37.77493  -122.41942     3

请告诉我如何实现这一点。我尝试了以下方法:

 library(geosphere)
 # create distance matrix
 mat <- distm(df1[,c('g_lon','g_lat')], df2[,c('g_lon','g_lat')], fun=distVincentyEllipsoid)


  error: 
  Error in .pointsToMatrix(y) : longitude < -360

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

【问题讨论】:

  • 我检查了您的解决方案。我收到错误“.pointsToMatrix(y) 中的错误:经度
  • 能否在问题中包含您尝试过的代码?
  • @Jaap 我已经更新了代码
  • 我没有收到该错误消息,但这个问题的解决方法应该与我上面链接的解决方案有所不同(如果我正确理解您的问题)。请参阅下面的答案。

标签: r dplyr data.table sp geosphere


【解决方案1】:

一个可能的解决方案:

library(geosphere)

mat <- distm(df1[,c('g_lon','g_lat')], df2[,c('g_lon','g_lat')], fun=distVincentyEllipsoid)

ri <- row(mat)[mat < 80000]
ci <- col(mat)[mat < 80000]

df3 <- df1[ri,]
df3$msa <- df2[ci, "msa"]

给出:

> df3
       g_lat     g_lon address msa
4   37.38605 -122.0838       4   1
5   37.77493 -122.4194       5   1
4.1 37.38605 -122.0838       4   3
5.1 37.77493 -122.4194       5   3

使用 或:

library(data.table)
setDT(df1)[ri][, msa := df2[ci, "msa"]][]

library(dplyr)
df1 %>% 
  slice(ri) %>% 
  mutate(msa = df2[ci, "msa"])

您可以添加距离:

df3$dist <- mat[cbind(ri, ci)]

给出:

> df3
       g_lat     g_lon address msa     dist
4   37.38605 -122.0838       4   1 46202.74
5   37.77493 -122.4194       5   1 12774.31
4.1 37.38605 -122.0838       4   3 52359.08
5.1 37.77493 -122.4194       5   3     0.00

【讨论】:

  • 非常感谢,有没有可能得到到最近的msa的距离?
  • 非常感谢,ri 和 ci 是什么,是这些行名和列名。如果我要获得最小而不是 50 英里半径,我使用 df3$near_dist
  • @user3570187 ri 和 ci 分别是行和列索引;你也可以使用max.col(-mat) 而不是apply(mat, 1, min),这样更高效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
相关资源
最近更新 更多