library(sf) library(terra) library(dplyr) library(spData) library(spDataLarge)
E1. Generate and plot simplified versions of the nz
dataset.
Experiment with different values of keep
(ranging from 0.5 to 0.00005) for ms_simplify()
and dTolerance
(from 100 to 100,000) st_simplify()
.
st_simplify()
compared with the geometry type of ms_simplify()
? What problems does this create and how can this be resolved?plot(rmapshaper::ms_simplify(st_geometry(nz), keep = 0.5)) plot(rmapshaper::ms_simplify(st_geometry(nz), keep = 0.05)) # Starts to breakdown here at 0.5% of the points: plot(rmapshaper::ms_simplify(st_geometry(nz), keep = 0.005)) # At this point no further simplification changes the result plot(rmapshaper::ms_simplify(st_geometry(nz), keep = 0.0005)) plot(rmapshaper::ms_simplify(st_geometry(nz), keep = 0.00005)) plot(st_simplify(st_geometry(nz), dTolerance = 100)) plot(st_simplify(st_geometry(nz), dTolerance = 1000)) # Starts to breakdown at 10 km: plot(st_simplify(st_geometry(nz), dTolerance = 10000)) plot(st_simplify(st_geometry(nz), dTolerance = 100000)) plot(st_simplify(st_geometry(nz), dTolerance = 100000, preserveTopology = TRUE)) # Problem: st_simplify returns POLYGON and MULTIPOLYGON results, affecting plotting # Cast into a single geometry type to resolve this nz_simple_poly = st_simplify(st_geometry(nz), dTolerance = 10000) |> st_sfc() |> st_cast("POLYGON") nz_simple_multipoly = st_simplify(st_geometry(nz), dTolerance = 10000) |> st_sfc() |> st_cast("MULTIPOLYGON") plot(nz_simple_poly) length(nz_simple_poly) nrow(nz)
E2. In the first exercise in Chapter Spatial Data Operations it was established that Canterbury region had 70 of the 101 highest points in New Zealand.
Using st_buffer()
, how many points in nz_height
are within 100 km of Canterbury?
canterbury = nz[nz$Name == "Canterbury", ] cant_buff = st_buffer(canterbury, 100000) nz_height_near_cant = nz_height[cant_buff, ] nrow(nz_height_near_cant) # 75 - 5 more
E3. Find the geographic centroid of New Zealand. How far is it from the geographic centroid of Canterbury?
cant_cent = st_centroid(canterbury) nz_centre = st_centroid(st_union(nz)) st_distance(cant_cent, nz_centre) # 234 km
E4. Most world maps have a north-up orientation.
A world map with a south-up orientation could be created by a reflection (one of the affine transformations not mentioned in this chapter) of the world
object's geometry.
Write code to do so.
Hint: you can to use the rotation()
function from this chapter for this transformation.
Bonus: create an upside-down map of your country.
rotation = function(a){ r = a * pi / 180 #degrees to radians matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2) } world_sfc = st_geometry(world) world_sfc_mirror = world_sfc * rotation(180) plot(world_sfc) plot(world_sfc_mirror) us_states_sfc = st_geometry(us_states) us_states_sfc_mirror = us_states_sfc * rotation(180) plot(us_states_sfc) plot(us_states_sfc_mirror)
E5. Run the code in Section 5.2.6. With reference to the objects created in that section, subset the point in p
that is contained within x
and y
.
st_intersection()
\index{vector!intersection}.b = st_sfc(st_point(c(0, 1)), st_point(c(1, 1))) # create 2 points b = st_buffer(b, dist = 1) # convert points to circles x = b[1] y = b[2] bb = st_bbox(st_union(x, y)) box = st_as_sfc(bb) set.seed(2017) p = st_sample(x = box, size = 10)
p_in_y = p[y] p_in_xy = p_in_y[x] x_and_y = st_intersection(x, y) p[x_and_y]
E6. Calculate the length of the boundary lines of US states in meters.
Which state has the longest border and which has the shortest?
Hint: The st_length
function computes the length of a LINESTRING
or MULTILINESTRING
geometry.
us_states9311 = st_transform(us_states, "EPSG:9311") us_states_bor = st_cast(us_states9311, "MULTILINESTRING") us_states_bor$borders = st_length(us_states_bor) arrange(us_states_bor, borders) arrange(us_states_bor, -borders)
E7. Read the srtm.tif file into R (srtm = rast(system.file("raster/srtm.tif", package = "spDataLarge"))
).
This raster has a resolution of 0.00083 * 0.00083 degrees.
Change its resolution to 0.01 * 0.01 degrees using all of the methods available in the terra package.
Visualize the results.
Can you notice any differences between the results of these resampling methods?
srtm = rast(system.file("raster/srtm.tif", package = "spDataLarge")) rast_template = rast(ext(srtm), res = 0.01) srtm_resampl1 = resample(srtm, y = rast_template, method = "bilinear") srtm_resampl2 = resample(srtm, y = rast_template, method = "near") srtm_resampl3 = resample(srtm, y = rast_template, method = "cubic") srtm_resampl4 = resample(srtm, y = rast_template, method = "cubicspline") srtm_resampl5 = resample(srtm, y = rast_template, method = "lanczos") srtm_resampl_all = c(srtm_resampl1, srtm_resampl2, srtm_resampl3, srtm_resampl4, srtm_resampl5) plot(srtm_resampl_all) # differences plot(srtm_resampl_all - srtm_resampl1, range = c(-300, 300)) plot(srtm_resampl_all - srtm_resampl2, range = c(-300, 300)) plot(srtm_resampl_all - srtm_resampl3, range = c(-300, 300)) plot(srtm_resampl_all - srtm_resampl4, range = c(-300, 300)) plot(srtm_resampl_all - srtm_resampl5, range = c(-300, 300))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.