我想创建一个世界上每个国家的质心之间的距离矩阵(以米为单位)。国家/地区名称或国家/地区ID应包含在矩阵中。
矩阵基于此处下载的世界的shapefile:http://gadm.org/version2
以下是我正在使用的shapefile的一些粗略信息(我使用shapefile @ data $ UN作为我的ID):
> str(shapefile@data)
'data.frame': 174 obs. of 11 variables:
$ FIPS : Factor w/ 243 levels "AA","AC","AE",..: 5 6 7 8 10 12 13
$ ISO2 : Factor w/ 246 levels "AD","AE","AF",..: 61 17 6 7 9 11 14
$ ISO3 : Factor w/ 246 levels "ABW","AFG","AGO",..: 64 18 6 11 3 10
$ UN : int 12 31 8 51 24 32 36 48 50 84 ...
$ NAME : Factor w/ 246 levels "Afghanistan",..: 3 15 2 11 6 10 13
$ AREA : int 238174 8260 2740 2820 124670 273669 768230 71 13017
$ POP2005 : int 32854159 8352021 3153731 3017661 16095214 38747148
$ REGION : int 2 142 150 142 2 19 9 142 142 19 ...
$ SUBREGION: int 15 145 39 145 17 5 53 145 34 13 ...
$ LON : num 2.63 47.4 20.07 44.56 17.54 ...
$ LAT : num 28.2 40.4 41.1 40.5 -12.3 ...
我试过了:
library(rgeos)
shapefile <- readOGR("./Map/Shapefiles/World/World Map", layer = "TM_WORLD_BORDERS-0.3") # Read in world shapefile
row.names(shapefile) <- as.character(shapefile@data$UN)
centroids <- gCentroid(shapefile, byid = TRUE, id = as.character(shapefile@data$UN)) # create centroids
dist_matrix <- as.data.frame(geosphere::distm(centroids))
结果如下所示:
V1 V2 V3 V4
1 0.0 4296620.6 2145659.7 4077948.2
2 4296620.6 0.0 2309537.4 219442.4
3 2145659.7 2309537.4 0.0 2094277.3
4 4077948.2 219442.4 2094277.3 0.0
1)我希望有国家ID(shapefile @ data $ UN)或名称(shapefile @ data),而不是第一列(1,2,3,4)和行(V1,V2,V3,V4) @名称)。这有什么作用?
2)我不确定返回的值。是米,公里等?
3)geosphere :: distm是否优于geosphere:在这种情况下是distGeo?
答案 0 :(得分:1)
这应该可以将列名和行名添加到矩阵中。就像在将行名称添加到shapefile
crnames<-as.character(shapefile@data$UN)
colnames(dist_matrix)<- crnames
rownames(dist_matrix)<- crnames
distm
中的默认距离函数为distHaversine
,它以m为半径(地球)变量。所以我假设输出是m。
查看distGeo
和distHaversine
的文档,并确定结果中所需的准确度。要查看R中的文档,只需输入?distGeo
。
编辑:对q1的回答可能是错误的,因为可以聚合矩阵数据,查看备选方案