我正在尝试从点数据集中删除空间相关点。我需要从原始数据集中删除点,以便输出中的所有点都不会接近'x'米。我不喜欢如何选择这些点。
我找到了各种计算点之间距离的方法,但我不确定如何使用它们来实现最终目标。
问题1:此功能是否存在于众多空间分析包中?我一直找不到任何东西,但我可能错过了正确的搜索条件。
如果没有,
问题2:使用以下程序是否可行(最多可选择500k点)?
此时我不一定要求代码帮助(虽然我肯定需要它),而是试图衡量可用的内容和/或实现目标的实用方法。
答案 0 :(得分:0)
我最终编写了自己的小程序来实现这一目标,主要是因为我不太了解Josh推荐的代码,但我完全相信它是可能的。
我知道这绝对不是最有效,最干净或可能推荐的解决问题的方法,但它似乎对我有用。
示例:从数据框开始' aa'有两个数据列' a'和' b',坐标'东方'和'北方'和分组变量' Z'
ProxFiltered在Z
的每个级别内保持点之间的距离大于1aa <- data.frame(a=rnorm(100),b=rnorm(100),easting=rnorm(100),northing=rnorm(100),Z=rep(1:4, each=25))
aa <- aa[sample(nrow(aa)),]
split.aa<-split(aa, aa$Z)
ProxFiltered<-aa[0,]
for (j in 1:4){
out<- split.aa[[j]][1,]
for(i in 2:nrow(split.aa[[j]])){
pts<- as.matrix(out[,3:4])
pt<- as.numeric(split.aa[[j]][i,3:4])
dists<- spDistsN1(pts, pt, longlat = FALSE)
exceed<- any(dists<1)
if (exceed==FALSE){
out<-rbind(out, split.aa[[j]][i,])
}
}
ProxFiltered<-rbind(out, ProxFiltered)}
对于list&#39; split.aa&#39;的每个元素,选择第一行(点)。
选择下一个点并计算到第一个点的距离。
如果距离大于阈值(在本例中为1),则该点将添加到过滤后的数据中。
该过程一次迭代一次,测量从每个新点到已过滤数据中所有新点的距离,如果这些距离都不小于阈值,则仅将其添加到过滤后的数据中。
这可以通过检查Z
的一个级别的所有点之间的距离来验证dist(subset(ProxFiltered,Z==1))
与原始数据相反
dist(subset(aa,Z==1))