在空间分析中,Nearest Point Problem是一个十分基本而重要的问题。对于小样本量的点集而言,通过计算距离矩阵并进行排序即可暴力解决。而对于上万甚至几十万以上的点集而言,通过计算距离矩阵显然需要耗费太多的资源,一般采用KD树等方法进行搜寻。背后的算法我也不太懂,这里仅把R语言中面向st_point类型的点集时运用两种方法的代码记录一下。point_set
为st_point类型的点集。
距离矩阵法—小规模点集
d=st_distance(point_set) #生成距离矩阵
order_matirx=apply(d,1,order) %>% t #按行生成距离顺序,由于每行顺序生成后以列向量形式存储,故 需转置矩阵。
cols=order_matirx[,2] #提取距离每个点最近的点序号
rowcols=cbind(1:nrow(sf_points),as.vector(cols)) #生成最邻近点在原距离矩阵中对应的行列号
d_real=sum(d[rowcols]) #d[rowcols]即为各点距其最邻近点的距离
indice_matrix <- d *0
indice_matrix[rowcols]=1 #此两步可生成最邻近点矩阵
如果无需生成最近邻点矩阵,而只为了求点的最邻近点距离(在计算ANN等指数时使用),则更为简单一些.
d=st_distance(point_set) #生成距离矩阵
distance_matrix=apply(d,1,sort) %>% t #按行生成距离顺序,由于每行顺序生成后以列向量形式存储,故需转置矩阵。