创建大型数据集的邻居列表/紧固

时间:2018-01-02 11:40:20

标签: r parallel-processing bigdata gis geospatial

我想根据距离创建一个权重矩阵。我目前的代码如下所示,并且用于较小的数据样本。但是,对于大型数据集(在24077个位置中有569424个人),它并没有通过。问题出现在nb2blocknb功能上。所以我的问题是:如何针对大型数据集优化我的代码?

# load all survey data
DHS <- read.csv("Daten/final.csv")
attach(DHS)

# define coordinates matrix
coormat <- cbind(DHS$location, DHS$lon_s, DHS$lat_s)
coorm <- cbind(DHS$lon_s, DHS$lat_s)
colnames(coormat) <- c("location", "lon_s", "lat_s")
coo <- cbind(unique(coormat))
c <-  as.data.frame(coo)
coor <- cbind(c$lon_s, c$lat_s)

# get a list with beneighbored locations thath are inbetween 50 km distance
neighbor <- dnearneigh(coor, d1 = 0, d2 = 50, row.names=c$location,  longlat=TRUE, bound=c("GE", "LE"))

# get neighborhood list on individual level
nb <- nb2blocknb(neighbor, as.character(DHS$location)))

# weight matrix in list format
nbweights.lw <- nb2listw(nb, style="B", zero.policy=TRUE)

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您正在尝试进行1.3 e10距离计算。结果将在GB。

我认为你想要限制你想要的最大距离或最近邻居的数量。从nn2包中试用RANN library('RANN') nearest_neighbours_w_distance<-nn2(coordinatesA, coordinatesB,10)

请注意,此操作不对称(切换坐标A和坐标B会产生不同的结果)。

此外,您首先必须将gps坐标转换为可以计算欧氏距离的坐标参考系统,例如UTM(代码未测试):

   library("sp")
   gps2utm<-function(gps_coordinates_matrix,utmzone){
      spdf<-SpatialPointsDataFrame(gps_coordinates_matrix[,1],gps_coordinates_matrix[,2])     
      proj4string(spdf) <- CRS("+proj=longlat +datum=WGS84")  
      return(spTransform(spdf, CRS(paste0("+proj=utm +zone=",utmzone," ellps=WGS84"))))
    }