我有县级地块级别的 shapefile,我的目标是计算一英里(约 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”和“numtot”向量给了我我想要的东西:一个向量,分别是具有不同所有者和总数的相邻地块的数量。然而,对于我所在的县来说,这个过程非常耗时且占用大量内存,因为这些县的“nobs”要大得多。一些县有 50-75,000 个观测值(因此生成的矩阵 m 有数十亿个元素,可能需要比我更多的内存)。从速度和内存的角度来看,有没有人想过解决这个问题的更好方法?非常感谢您的帮助。