R語言中的空間最鄰近點問題

2021-09-11 22:35:31 字數 1205 閱讀 3985

在空間分析中,nearest point problem是乙個十分基本而重要的問題。對於小樣本量的點集而言,通過計算距離矩陣並進行排序即可暴力解決。而對於上萬甚至幾十萬以上的點集而言,通過計算距離矩陣顯然需要耗費太多的資源,一般採用kd樹等方法進行搜尋。背後的演算法我也不太懂,這裡僅把r語言中面向st_point型別的點集時運用兩種方法的**記錄一下。point_set為st_point型別的點集。

d=st_distance(point_set)       #生成距離矩陣

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)       #生成距離矩陣
需要用到rann這個包,這個包只有乙個函式nn2。功能十分強大,支援很高的維數(文件裡說20維以上可能不太好了,但還是可以試試),返回值包括了k級最鄰近點的序號和k級最鄰近點距離兩個內容,非常實用。由於實際上呼叫的是c++庫,所以速度非常快,我用了30w+點的點集,瞬間完成。

library(rann)

p_co=st_coordinates(point_set) #獲取點座標。由於這個包只返回歐式距離,不是專門針對地理空間開發的,所以在計算前還是先把點座標轉換成投影座標係為宜。

d=nn2(p_co,p_co,k=2) #k=2即為設定k級最鄰近點,因為這個包只支援計算兩個點集之間的最鄰近點關係,所以只能計算包含自身的2級最鄰近點。該函式還有其他引數可以設定搜尋方法、查尋樹的型別、搜尋半徑等。

d_indice=d[[1]][,2] #返回值包括兩個list元素,第乙個元素就是最鄰近點序號矩陣。第二列就是我們要找的最鄰近點序號。

此方法來自於stackoverflow上的乙個問題。

R語言中的空間插值

這個方法可用於類別變數的插值。實際上是利用點生產沃諾尼多邊形,每個點所在的沃諾尼多邊形的值就等於點值,這樣就實現了由點到面的變化,完成了插值。裡的p是乙個由很多點組成的空間物件,boundry即是我們的研究區域。p裡的所有點應該在boundry的範圍之內。在製作柵格 插值的過程中,都是基於p的外廓邊...

R語言中的引號

aa this is an example.1 this is an example.bb this is an example.1 this is an example.identical aa,bb 1 true anne s home 1 anne s home anne s home 1 a...

R語言中的陣列

陣列 不同於矩陣和資料框,維度大於2。r中最簡單的陣列 3維。行,列,面 如下兩行 三列 四面的陣列。dim1 c a1 a2 dim2 c b1 b2 b3 dim3 c c1 c2 c3 c4 dat array 1 24,c 2,3,4 dimnames list dim1,dim2,dim3...