library(rnaturalearth)
library(sf)
There are a lot of data that can be downloaded from Natural Earth with ne_download()
. These data are divided into two main categories: physical and cultural vector data. The df_layers_physical
and df_layers_cultural
data frames included in the rnaturalearth
packages show what layer of data can be downloaded.
data(df_layers_physical)
::kable(
knitr
df_layers_physical,caption = "physical vector data available via ne_download()"
)
layer | scale10 | scale50 | scale110 |
---|---|---|---|
antarctic_ice_shelves_lines | 1 | 1 | 0 |
antarctic_ice_shelves_polys | 1 | 1 | 0 |
coastline | 1 | 1 | 1 |
geographic_lines | 1 | 1 | 1 |
geography_marine_polys | 1 | 1 | 1 |
geography_regions_elevation_points | 1 | 1 | 1 |
geography_regions_points | 1 | 1 | 1 |
geography_regions_polys | 1 | 1 | 1 |
glaciated_areas | 1 | 1 | 1 |
lakes | 1 | 1 | 1 |
lakes_europe | 1 | 0 | 0 |
lakes_historic | 1 | 1 | 0 |
lakes_north_america | 1 | 0 | 0 |
lakes_pluvial | 1 | 0 | 0 |
land | 1 | 1 | 1 |
land_ocean_label_points | 1 | 0 | 0 |
land_ocean_seams | 1 | 0 | 0 |
land_scale_rank | 1 | 0 | 0 |
minor_islands | 1 | 0 | 0 |
minor_islands_coastline | 1 | 0 | 0 |
minor_islands_label_points | 1 | 0 | 0 |
ocean | 1 | 1 | 1 |
ocean_scale_rank | 1 | 0 | 0 |
playas | 1 | 1 | 0 |
reefs | 1 | 0 | 0 |
rivers_europe | 1 | 0 | 0 |
rivers_lake_centerlines | 1 | 1 | 1 |
rivers_lake_centerlines_scale_rank | 1 | 1 | 0 |
rivers_north_america | 1 | 0 | 0 |
Based on the previous table, we know that we can download the ocean
vector at small scale (110). Note that scales are defined as one of 110
, 50
, 10
or small
, medium
, large
.
plot(
ne_download(type = "ocean", category = "physical", scale = "small")["geometry"],
col = "lightblue"
)#> Reading layer `ne_110m_ocean' from data source
#> `/tmp/RtmpapHyoT/ne_110m_ocean.shp' using driver `ESRI Shapefile'
#> Warning in CPL_read_ogr(dsn, layer, query,
#> as.character(options), quiet, : GDAL Message 1:
#> /tmp/RtmpapHyoT/ne_110m_ocean.shp contains polygon(s) with
#> rings with invalid winding order. Autocorrecting them, but
#> that shapefile should be corrected using ogr2ogr for
#> example.
#> Simple feature collection with 2 features and 3 fields
#> Geometry type: POLYGON
#> Dimension: XY
#> Bounding box: xmin: -180 ymin: -85.60904 xmax: 180 ymax: 90
#> Geodetic CRS: WGS 84
data(df_layers_cultural)
::kable(
knitr
df_layers_cultural,caption = "cultural vector data available via ne_download()"
)
layer | scale10 | scale50 | scale110 |
---|---|---|---|
admin_0_antarctic_claim_limit_lines | 1 | 0 | 0 |
admin_0_antarctic_claims | 1 | 0 | 0 |
admin_0_boundary_lines_disputed_areas | 1 | 1 | 0 |
admin_0_boundary_lines_land | 1 | 1 | 1 |
admin_0_boundary_lines_map_units | 1 | 0 | 0 |
admin_0_boundary_lines_maritime_indicator | 1 | 1 | 0 |
admin_0_boundary_map_units | 0 | 1 | 0 |
admin_0_breakaway_disputed_areas | 0 | 1 | 0 |
admin_0_countries | 1 | 1 | 1 |
admin_0_countries_lakes | 1 | 1 | 1 |
admin_0_disputed_areas | 1 | 0 | 0 |
admin_0_disputed_areas_scale_rank_minor_islands | 1 | 0 | 0 |
admin_0_label_points | 1 | 0 | 0 |
admin_0_map_subunits | 1 | 1 | 0 |
admin_0_map_units | 1 | 1 | 1 |
admin_0_pacific_groupings | 1 | 1 | 1 |
admin_0_scale_rank | 1 | 1 | 1 |
admin_0_scale_rank_minor_islands | 1 | 0 | 0 |
admin_0_seams | 1 | 0 | 0 |
admin_0_sovereignty | 1 | 1 | 1 |
admin_0_tiny_countries | 0 | 1 | 1 |
admin_0_tiny_countries_scale_rank | 0 | 1 | 0 |
admin_1_label_points | 1 | 0 | 0 |
admin_1_seams | 1 | 0 | 0 |
admin_1_states_provinces | 1 | 1 | 1 |
admin_1_states_provinces_lakes | 1 | 1 | 1 |
admin_1_states_provinces_lines | 1 | 1 | 1 |
admin_1_states_provinces_scale_rank | 1 | 1 | 1 |
airports | 1 | 1 | 0 |
parks_and_protected_lands_area | 1 | 0 | 0 |
parks_and_protected_lands_line | 1 | 0 | 0 |
parks_and_protected_lands_point | 1 | 0 | 0 |
parks_and_protected_lands_scale_rank | 1 | 0 | 0 |
populated_places | 1 | 1 | 1 |
populated_places_simple | 1 | 1 | 1 |
ports | 1 | 1 | 0 |
railroads | 1 | 0 | 0 |
railroads_north_america | 1 | 0 | 0 |
roads | 1 | 0 | 0 |
roads_north_america | 1 | 0 | 0 |
time_zones | 1 | 0 | 0 |
urban_areas | 1 | 1 | 0 |
urban_areas_landscan | 1 | 0 | 0 |
plot(
ne_download(
type = "airports",
category = "cultural",
scale = 10
"geometry"],
)[pch = 21,
bg = "grey"
)#> Reading layer `ne_10m_airports' from data source
#> `/tmp/RtmpapHyoT/ne_10m_airports.shp' using driver `ESRI Shapefile'
#> Simple feature collection with 893 features and 40 fields
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: -175.1356 ymin: -53.78147 xmax: 179.1954 ymax: 78.24672
#> Geodetic CRS: WGS 84
In this article, we explore how we can search for data available to download within rnaturalearth
. Let’s begin by loading country data using the read_sf()
function from the sf
package. In the following code snippet, we read the Natural Earth dataset, which contains information about the sovereignty of countries.
read_sf("/vsizip/vsicurl/https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_sovereignty.zip")
df <-
head(df)
#> Simple feature collection with 6 features and 168 fields
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: -109.4537 ymin: -55.9185 xmax: 140.9776 ymax: 7.35578
#> Geodetic CRS: WGS 84
#> # A tibble: 6 × 169
#> featurecla scalerank LABELRANK SOVEREIGNT SOV_A3 ADM0_DIF
#> <chr> <int> <int> <chr> <chr> <int>
#> 1 Admin-0 sov… 5 2 Indonesia IDN 0
#> 2 Admin-0 sov… 5 3 Malaysia MYS 0
#> 3 Admin-0 sov… 0 2 Chile CHL 0
#> 4 Admin-0 sov… 0 3 Bolivia BOL 0
#> 5 Admin-0 sov… 0 2 Peru PER 0
#> 6 Admin-0 sov… 0 2 Argentina ARG 0
#> # ℹ 163 more variables: LEVEL <int>, TYPE <chr>, TLC <chr>,
#> # ADMIN <chr>, ADM0_A3 <chr>, GEOU_DIF <int>,
#> # GEOUNIT <chr>, GU_A3 <chr>, SU_DIF <int>, SUBUNIT <chr>,
#> # SU_A3 <chr>, BRK_DIFF <int>, NAME <chr>,
#> # NAME_LONG <chr>, BRK_A3 <chr>, BRK_NAME <chr>,
#> # BRK_GROUP <chr>, ABBREV <chr>, POSTAL <chr>,
#> # FORMAL_EN <chr>, FORMAL_FR <chr>, NAME_CIAWF <chr>, …
One way to search for countries is to search within the ADMIN
vector. Let’s start by plotting some of the first countries.
lapply(df$ADMIN[1:6], \(x) {
plot(ne_countries(country = x)["geometry"], main = x)
})
Suppose that we want to search the polygons for the US, how should we spell it?
ne_countries(country = "USA")
ne_countries(country = "United States")
ne_countries(country = "United States Of America")
ne_countries(country = "United States of America")
One possibility consists to search within the ADMIN
vector using a regular expression to find all occurrences of the word states.
$ADMIN[grepl("states", df$ADMIN, ignore.case = TRUE)]
df#> [1] "United States of America"
#> [2] "Federated States of Micronesia"
We can now get the data.
plot(ne_countries(country = "United States of America")["geometry"])
### Continents
Finally, let’s create plots for each continent using the ne_countries
function with the continent parameter.
unique(df$CONTINENT)
#> [1] "Asia" "South America"
#> [3] "Europe" "Africa"
#> [5] "North America" "Oceania"
#> [7] "Antarctica" "Seven seas (open ocean)"
lapply(unique(df$CONTINENT), \(x) {
plot(
ne_countries(
continent = x,
scale = "medium"
"geometry"],
)[main = x
) })