我有县包裹级的shapefiles,我的目标是计算总共一英里(约1610米)的包裹数,以及同一所有者。我已经通过解决方案进行了工作,以下是我的示例代码,但这相当低效率且内存密集。我无法公开发布数据,但这是一些虚构代码的问题:
library(rgdal)
library(rgeos)
library(geosphere)
nobs<-1000 # number of observations
nowners<-50 # number of different owners
crs<-"+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
long<-runif(nobs,min=-94.70073, max=-94.24141) #roughly adair county in iowa
lat<-runif(nobs,min=41.15712,max=41.50415) #roughly adair county in iowa
coords<-cbind(long,lat)
owner<-sample(1:nowners,nobs, replace=T) # give id's to owners
df<-as.data.frame(owner)
centroids<-SpatialPointsDataFrame(coords,df,proj4string = CRS(crs)) # make spatial dataframe
d<-distm(centroids) # distance from centroids to other centroid
numdif<-matrix(0,length(owner)) #vectors of 0s to be replaced in loop
numtot<-matrix(0,length(owner))
for (i in 1:length(owner)) {
same_id<-df$owner[i]==owner ## identify locations with same owner ID
numdif[i]<-as.numeric(sum(d[i,]<1609.34 & same_id==F)) #different parcel owners
numtot[i]<-as.numeric(sum(d[i,]<1609.34)) #total parcels
}
由此产生的" numdif"one_answers" numtot"向量给了我我想要的东西:分别具有不同所有者和总数的相邻包裹的向量。但是,对于我的县的" NOBS"要大得多的县,这个过程非常耗时和记忆力密集。一些县有50-75,000个观察结果(因此,由此产生的矩阵M具有数十亿个要素,并且可能需要比我更多的记忆)。从速度和记忆的角度来看,有人对解决这个问题的更好方法有想法吗?非常感谢帮助。
您可以在应用中完成计数
d <- d < 1609.34
nt <- apply(d, 1, sum)
nd <- apply(d, 1, function(i) length(unique(owner[i]))) - 1
我认为您对numDif的计算不正确,因为如果有多个包裹,它将多次包含其他所有者。
考虑到大量观察,我会考虑以下路线:
d <- lapply(1:nrow(coords), function(i) which(distGeo(coords[i, ,drop=FALSE], coords) < 1609.34))
ntot <- sapply(d, length)
ndif <- sapply(d, function(i) length(unique(owner[i]))) - 1
那很慢,但是不会产生疯狂的大型矩阵
我还应该补充说,您的方法假设包裹相对于所考虑的距离相对较小,因此使用质心是可以的。如果不是这种情况,则可以以rgeos::gWithinDistance
进行计算,以增加计算成本进行计算。