MCS
MCS

Reputation: 1101

Create a distance matrix for an sf object

I have an sf object, a map divided into districts. I would like to calculate the centroid of each district (using st_point_on_surface) and then the relative distance between each centroid, like a distance matrix on which I can perform calculations (like keep ones that are within a certain radius) and get a db with each district identifiers and a list of those that match the criteria.

Sorry in advance for the lack of reproducible code. What is the easiest way to go about it?

Thanks in advance

enter image description here

Upvotes: 4

Views: 2759

Answers (1)

Nicolás Velasquez
Nicolás Velasquez

Reputation: 5898

If you want to stay within sf, try:

library(sf)

# I got my Irak map from UN's OCHA, see: https://data.humdata.org/dataset/iraq-admin-level-1-boundaries
shp_irak01 <- st_read(dsn = "./irq-administrative-divisions-shapefiles/irq_admbnda_adm1_cso_20190603.shp")

#The centroids:
shp_centroid <- st_point_on_surface(x = shp_irak01)

#The euclidian distance matrix:
mtx_distance <- st_distance(shp_centroid, shp_centroid)
mtx_distance

Units: [m]
          [,1]     [,2]     [,3]     [,4]      [,5]     [,6]      [,7]      [,8]     [,9]    [,10]    [,11]    [,...until18]
 [1,]      0.0 665051.7 484956.1 295870.9 383276.14 449273.4 309551.40 277419.82 338721.4 458264.2 438887.2
 [2,] 665051.7      0.0 206781.0 408086.2 287295.37 624344.0 378896.62 451360.03 494695.5 860740.2 751176.7
 [3,] 484956.1 206781.0      0.0 205871.6 160931.72 570092.5 251440.27 332638.38 410021.2 766396.3 672788.5
 [4,] 295870.9 408086.2 205871.6      0.0 189849.79 526919.9 203679.02 260171.36 360077.9 661294.1 592026.7
 [5,] 383276.1 287295.4 160931.7 189849.8      0.00 410667.4  96030.18 175862.79 249100.0 607665.1 512029.2
 [6,] 449273.4 624344.0 570092.5 526919.9 410667.36      0.0 335212.34 266829.78 168229.3 261881.0 141057.5
 [7,] 309551.4 378896.6 251440.3 203679.0  96030.18 335212.3      0.00  81209.73 167546.7 514984.8 424189.9
 [8,] 277419.8 451360.0 332638.4 260171.4 175862.79 266829.8  81209.73      0.00 100377.7 433844.3 345162.4
 [9,] 338721.4 494695.5 410021.2 360077.9 249100.03 168229.3 167546.72 100377.65      0.0 366935.5 264039.4
[10,] 458264.2 860740.2 766396.3 661294.1 607665.14 261881.0 514984.82 433844.32 366935.5      0.0 120940.2
[11,] 438887.2 751176.7 672788.5 592026.7 512029.23 141057.5 424189.92 345162.43 264039.4 120940.2      0.0
[12,] 236774.0 434018.5 275796.9 160698.5 147862.67 367278.5  78884.14 102143.31 202413.5 509250.3 433156.4
[13,] 339045.0 649972.5 556320.0 469992.6 396524.64 122292.9 305687.02 225374.60 155304.3 212297.2 122084.4
[14,] 552966.6 202333.0 244743.0 370890.8 186402.59 424966.6 243458.18 294501.93 310734.5 669733.2 556160.8
[15,] 325331.4 801693.1 681103.2 551881.7 529148.71 276836.1 433248.41 353886.47 314515.2 135975.2 171322.4
[16,] 264036.5 613728.6 499989.6 396476.1 344132.89 185842.8 249137.50 168288.85 133007.6 269034.3 198147.7
[17,] 504238.7 168077.1 131432.6 277522.5 121527.11 479013.4 210879.43 283915.79 335117.1 701926.8 597103.5
[18,] 404859.5 326577.9 258506.4 284146.2 108878.33 315038.5 100818.86 138534.47 168707.2 535609.5 430059.8

Upvotes: 5

Related Questions