The goal of nngeo
is to provide k-nearest neighbor join capabilities for spatial analysis in R.
CRAN version:
install.packages("nngeo")
GitHub version:
install.packages("remotes")
remotes::install_github("michaeldorman/nngeo")
The complete documentation can be found at https://michaeldorman.github.io/nngeo/.
The following code section finds the 20-nearest towns for each city using function st_nn
.
data(towns)
data(cities)
nn = st_nn(cities, towns, k = 20, progress = FALSE)
#> lon-lat points
nn
#> [[1]]
#> [1] 70 99 60 15 36 56 193 142 90 82 17 93 44 13 32 9 172 34 103
#> [20] 132
#>
#> [[2]]
#> [1] 145 175 57 144 29 55 21 64 138 24 121 146 53 126 160 31 62 187 85
#> [20] 83
#>
#> [[3]]
#> [1] 59 179 137 114 141 134 67 152 41 133 6 140 23 166 66 2 189 73 173
#> [20] 147
By default, the result is a sparse list with the neighbor IDs.
The st_nn
function can also be used as a geometry predicate function when performing spatial join with sf::st_join
.
st_join(cities, towns, join = st_nn, k = 3, progress = FALSE)
#> lon-lat points
#> Simple feature collection with 9 features and 5 fields
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: 34.78177 ymin: 31.76832 xmax: 35.21371 ymax: 32.79405
#> geographic CRS: WGS 84
#> name.x name.y country.etc pop capital
#> 1 Jerusalem Jerusalem Israel 731731 1
#> 1.1 Jerusalem Mevasserat Ziyyon Israel 22470 0
#> 1.2 Jerusalem Har Adar Israel 2101 0
#> 2 Tel-Aviv Ramat Gan Israel 128583 0
#> 2.1 Tel-Aviv Tel Aviv-Yafo Israel 384276 0
#> 2.2 Tel-Aviv Giv'atayim Israel 48882 0
#> 3 Haifa Haifa Israel 266418 0
#> 3.1 Haifa Tirat Karmel Israel 19080 0
#> 3.2 Haifa Qiryat Motzkin Israel 39413 0
#> geometry
#> 1 POINT (35.21371 31.76832)
#> 1.1 POINT (35.21371 31.76832)
#> 1.2 POINT (35.21371 31.76832)
#> 2 POINT (34.78177 32.0853)
#> 2.1 POINT (34.78177 32.0853)
#> 2.2 POINT (34.78177 32.0853)
#> 3 POINT (34.98957 32.79405)
#> 3.1 POINT (34.98957 32.79405)
#> 3.2 POINT (34.98957 32.79405)
A helper function st_connect
can be used to draw lines according to joined feature IDs. This may be useful for visualization or for network analysis.
l = st_connect(cities, towns, ids = nn, progress = FALSE)
plot(l, col = NA) # For setting the extent
plot(st_geometry(towns), col = "darkgrey", add = TRUE)
plot(st_geometry(cities), col = "red", add = TRUE)
plot(l, add = TRUE)