如何在 R 中的 sf 包中查找区域级几何
How to find region-level geometry in sf package in R
我想使用 sf
和 plotly
包绘制地理空间地图。但是,我没有国家级数据,只有地区级数据(亚洲、欧洲、拉丁美洲等)。这是我将要处理的数据集的模型,我正在寻找一种方法来查找经度、纬度和几何形状。我打算先把Excel里面的数据全部收集起来,然后再搬到R
里面分析
我找了几个 packages/datasets,例如 rnaturalearth
、maps::map
等,但找不到正确的 latitude/longitude/coordinates 或地区。我在哪里可以找到它们?提前致谢
这里你对你的问题有一些想法:
- 由于不确定您需要如何定义每个区域(国家的区域分类有多种可能性),也许您应该首先将世界上的每个国家映射到您认为它所属的区域。之后就可以加入到各个国家对应的地区了。
- 将几何存储在 excel 中不是一个好的选择(场的长度、正在使用的 crs 等)。存储空间对象的更好选择是
.gpkg
格式。
请在此处找到如何生成您提到的数据集。
我会在这里使用 geographic regions classification of the UN。这在 countrycode
包中可用,所以基本上我将每个 ISO-3 国家代码映射到相应的区域。之后,我按地区对国家/地区进行分组,这样我就可以按地区拥有一个单一的几何图形。最后,我提取边界框并将它们附加到数据集:
library(giscoR)
library(countrycode)
library(sf)
world <- gisco_get_countries()
# Add the subregion
world$region <- countrycode(world$ISO3_CODE,
origin = "iso3c",
destination = "un.regionsub.name")
#> Warning in countrycode_convert(sourcevar = sourcevar, origin = origin, destination = dest, : Some values were not matched unambiguously: ATA, CPT, XA, XB, XC, XD, XE, XF, XG, XH, XI, XL, XM, XN, XO, XU, XV
unique(world$region)
#> [1] "Latin America and the Caribbean" "Polynesia"
#> [3] "Western Europe" NA
#> [5] "Southern Europe" "Western Asia"
#> [7] "Southern Asia" "Sub-Saharan Africa"
#> [9] "Australia and New Zealand" "Eastern Europe"
#> [11] "Northern America" "South-eastern Asia"
#> [13] "Eastern Asia" "Micronesia"
#> [15] "Northern Europe" "Melanesia"
#> [17] "Central Asia" "Northern Africa"
# Group regions
library(dplyr)
library(ggplot2)
subworld <- world %>%
group_by(region) %>%
# Mock the data field
summarise(data=n())
ggplot(subworld) +
geom_sf(aes(fill=region))
# Create final table
bbox <- lapply(st_geometry(subworld), st_bbox) %>%
bind_rows() %>%
mutate(across(where(is.numeric), as.double))
# Final dataset
end <- subworld %>% bind_cols(bbox) %>%
select(region, data, xmin, xmax, ymin, ymax)
head(end)
#> Simple feature collection with 6 features and 6 fields
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: -180 ymin: -59.51912 xmax: 180 ymax: 81.85799
#> Geodetic CRS: WGS 84
#> # A tibble: 6 x 7
#> region data xmin xmax ymin ymax geometry
#> <chr> <int> <dbl> <dbl> <dbl> <dbl> <MULTIPOLYGON [°]>
#> 1 Australia and New ~ 6 -178. 179. -53.2 -9.21 (((143.5617 -13.77157, 1~
#> 2 Central Asia 5 46.6 87.3 35.2 55.4 (((50.3399 45.05235, 50.~
#> 3 Eastern Asia 7 73.6 146. 18.2 53.5 (((120.8954 22.336, 120.~
#> 4 Eastern Europe 10 -180 180. 41.2 81.9 (((68.7333 76.49168, 68.~
#> 5 Latin America and ~ 48 -118. 3.43 -59.5 32.7 (((-64.01772 -54.74885, ~
#> 6 Melanesia 5 -180 180. -22.7 -0.826 (((178.2331 -17.34448, 1~
由 reprex package (v2.0.1)
创建于 2022-03-23
我想使用 sf
和 plotly
包绘制地理空间地图。但是,我没有国家级数据,只有地区级数据(亚洲、欧洲、拉丁美洲等)。这是我将要处理的数据集的模型,我正在寻找一种方法来查找经度、纬度和几何形状。我打算先把Excel里面的数据全部收集起来,然后再搬到R
里面分析
我找了几个 packages/datasets,例如 rnaturalearth
、maps::map
等,但找不到正确的 latitude/longitude/coordinates 或地区。我在哪里可以找到它们?提前致谢
这里你对你的问题有一些想法:
- 由于不确定您需要如何定义每个区域(国家的区域分类有多种可能性),也许您应该首先将世界上的每个国家映射到您认为它所属的区域。之后就可以加入到各个国家对应的地区了。
- 将几何存储在 excel 中不是一个好的选择(场的长度、正在使用的 crs 等)。存储空间对象的更好选择是
.gpkg
格式。
请在此处找到如何生成您提到的数据集。
我会在这里使用 geographic regions classification of the UN。这在 countrycode
包中可用,所以基本上我将每个 ISO-3 国家代码映射到相应的区域。之后,我按地区对国家/地区进行分组,这样我就可以按地区拥有一个单一的几何图形。最后,我提取边界框并将它们附加到数据集:
library(giscoR)
library(countrycode)
library(sf)
world <- gisco_get_countries()
# Add the subregion
world$region <- countrycode(world$ISO3_CODE,
origin = "iso3c",
destination = "un.regionsub.name")
#> Warning in countrycode_convert(sourcevar = sourcevar, origin = origin, destination = dest, : Some values were not matched unambiguously: ATA, CPT, XA, XB, XC, XD, XE, XF, XG, XH, XI, XL, XM, XN, XO, XU, XV
unique(world$region)
#> [1] "Latin America and the Caribbean" "Polynesia"
#> [3] "Western Europe" NA
#> [5] "Southern Europe" "Western Asia"
#> [7] "Southern Asia" "Sub-Saharan Africa"
#> [9] "Australia and New Zealand" "Eastern Europe"
#> [11] "Northern America" "South-eastern Asia"
#> [13] "Eastern Asia" "Micronesia"
#> [15] "Northern Europe" "Melanesia"
#> [17] "Central Asia" "Northern Africa"
# Group regions
library(dplyr)
library(ggplot2)
subworld <- world %>%
group_by(region) %>%
# Mock the data field
summarise(data=n())
ggplot(subworld) +
geom_sf(aes(fill=region))
# Create final table
bbox <- lapply(st_geometry(subworld), st_bbox) %>%
bind_rows() %>%
mutate(across(where(is.numeric), as.double))
# Final dataset
end <- subworld %>% bind_cols(bbox) %>%
select(region, data, xmin, xmax, ymin, ymax)
head(end)
#> Simple feature collection with 6 features and 6 fields
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: -180 ymin: -59.51912 xmax: 180 ymax: 81.85799
#> Geodetic CRS: WGS 84
#> # A tibble: 6 x 7
#> region data xmin xmax ymin ymax geometry
#> <chr> <int> <dbl> <dbl> <dbl> <dbl> <MULTIPOLYGON [°]>
#> 1 Australia and New ~ 6 -178. 179. -53.2 -9.21 (((143.5617 -13.77157, 1~
#> 2 Central Asia 5 46.6 87.3 35.2 55.4 (((50.3399 45.05235, 50.~
#> 3 Eastern Asia 7 73.6 146. 18.2 53.5 (((120.8954 22.336, 120.~
#> 4 Eastern Europe 10 -180 180. 41.2 81.9 (((68.7333 76.49168, 68.~
#> 5 Latin America and ~ 48 -118. 3.43 -59.5 32.7 (((-64.01772 -54.74885, ~
#> 6 Melanesia 5 -180 180. -22.7 -0.826 (((178.2331 -17.34448, 1~
由 reprex package (v2.0.1)
创建于 2022-03-23