Warning: package 'here' was built under R version 4.4.3
here() starts at C:/Users/Zacha/github/CSU/ESS_330/csu_ess_330
# Visualizationlibrary(gghighlight)
Warning: package 'gghighlight' was built under R version 4.4.3
library(ggrepel)
Warning: package 'ggrepel' was built under R version 4.4.3
library(ggplot2)library(knitr)
Warning: package 'knitr' was built under R version 4.4.3
# 1.1 Define eqdc projectioneqdc <-'+proj=eqdc +lat_0=40 +lon_0=-96 +lat_1=20 +lat_2=60 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs'# 1.2 - Get USA state boundariesif (!requireNamespace("AOI", quietly =TRUE)) { remotes::install_github("mikejohnson51/AOI")}states <-aoi_get(state ='conus') %>%st_transform(eqdc)# 1.3 - Get country boundaries for Mexico, the United States of America, and Canadamx_us_can <-aoi_get(country =c("MX", "CA", "USA")) %>%st_transform(eqdc)# 1.4 - Get city locations from the CSV fileuscities <-read_csv(here("data", "lab_data", "simplemaps_uscities_basic", "uscities.csv"))
Rows: 31254 Columns: 17
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (9): city, city_ascii, state_id, state_name, county_fips, county_name, s...
dbl (6): lat, lng, population, density, ranking, id
lgl (2): military, incorporated
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Convert cities to sf objectcities_sf <- uscities %>%st_as_sf(coords =c("lng", "lat"), crs =4326, remove =FALSE) %>%st_transform(5070)# Get US state boundaries and cast to MULTILINESTRINGstates_all <-us_states()state_boundaries <-st_cast(states_all, "MULTILINESTRING") %>%st_transform(5070)# Filter cities (remove AK, HI, PR)cities_sf <- cities_sf %>%filter(!state_id %in%c("AK", "HI", "PR"))# GCS - create sf object in EPSG:4269 from uscitiesdf_sf_gcs <- uscities %>%st_as_sf(coords =c("lng", "lat"), crs =4269, remove =FALSE)
# Question 2# 2.1 - Distance to USA Border (coastline or national) (km)# Convert USA state boundaries to a single MULTILINESTRING with resolved bordersproj_crs <-2163usa_border <- states %>%st_union() %>%st_cast("MULTILINESTRING")cities_sf <-st_transform(cities_sf, 5070)usa_border <-st_transform(usa_border, 5070)state_boundaries_lines <-st_cast(state_boundaries, "MULTILINESTRING")distance_matrix <-st_distance(cities_sf, state_boundaries_lines)min_distances <-apply(distance_matrix, 1, min)cities_distance <- cities_sf %>%mutate(dist_to_border_m =as.numeric(st_distance(geometry, usa_border, by_element =FALSE)),dist_to_border_km =round(dist_to_border_m /1000, 1) )farthest_cities_border <- cities_distance %>%arrange(desc(dist_to_border_km)) %>%slice_head(n =5) %>%select(city, state_name = state_id, distance_km = dist_to_border_km)farthest_cities_border %>%flextable() %>%set_header_labels(city ="City",state_name ="State",distance_km ="Distance to USA Border (km)" ) %>%autofit()
Warning in CPL_crs_from_input(x): GDAL Message 1: CRS EPSG:2163 is deprecated.
Its non-deprecated replacement EPSG:9311 will be used instead. To use the
original CRS, set the OSR_USE_NON_DEPRECATED configuration option to NO.
mexico_proj <-st_transform(mexico_border, proj_crs)canada_proj <-st_transform(canada_border, proj_crs)usa_border_proj <- cities_sf %>%filter(!state_id %in%c("AK", "HI"))dist_mexico_km <-apply(st_distance(cities_proj, mexico_proj), 1, min) /1000dist_canada_km <-apply(st_distance(cities_proj, canada_proj), 1, min) /1000cities_with_dist <- cities_proj %>%mutate(dist_to_mexico = dist_mexico_km,dist_to_canada = dist_canada_km,dist_diff =abs(dist_to_mexico - dist_to_canada) )middle_band <- cities_with_dist %>%filter(dist_diff <=100)middle_top5 <- middle_band %>%arrange(desc(population)) %>%slice_head(n =5)ggplot(data = cities_with_dist) +# Changed from cities_distance to cities_with_distgeom_sf(data = continents, fill ="lightgrey", color ="black", lty ="solid", size =0.2) +geom_sf(data = conus_outline, fill =NA, color ="black", lty ="dashed", size =0.5) +geom_sf(data = cities_with_dist, aes(color = dist_diff), fill =NA) +geom_sf(aes(color = dist_diff), size =1) +gghighlight(dist_diff <=100, use_direct_label =FALSE) +geom_sf(data = middle_top5, size =2, shape =21, fill ="red") +geom_label_repel(data = middle_top5,aes(label = city, geometry = geometry),stat ="sf_coordinates",size =3,box.padding =0.3,point.padding =0.2 ) +coord_sf(xlim =c(-130, -60), ylim =c(20, 60), expand =FALSE) +theme_void() +scale_color_viridis_c(name ="Equidistant Distance\n(Mexico vs Canada)") +labs(title ="Cities Approximately Equidistant (±100 km) from Mexico and Canada",subtitle ="Top 5 most populous cities in this zone labeled",caption ="Data source: Natural Earth, USAboundaries, uscities.csv" )
Warning: Could not calculate the predicate for layer 1, layer 2; ignored
st_point_on_surface may not give correct results for longitude/latitude data
# Question 4# 4.1 Quantifying Border Zonedist_matrix_usa <-st_distance(cities_sf, usa_border)min_distances <-apply(dist_matrix_usa, 1, min)threshold_km <-160cities_distance <- cities_sf %>%mutate(dist_to_national_border_m =as.numeric(min_distances),dist_to_national_border_km =round(dist_to_national_border_m /1000, 1))border_zone <- cities_distance %>%filter(dist_to_national_border_km <= threshold_km)num_cities_in_zone <-nrow(border_zone)pop_in_zone <-sum(border_zone$population, na.rm =TRUE)total_pop <-sum(cities_distance$population, na.rm =TRUE)percentage_in_zone <-round((pop_in_zone / total_pop) *100, 2)summary_df <- tibble::tibble(Metric =c("Number of cities within 160 km of national border","Population living within 160 km of border","Percentage of U.S. population in this zone","ACLU Estimate (approx. 2/3 of U.S. population)" ),Value =c(format(num_cities_in_zone, big.mark =","),format(pop_in_zone, big.mark =","),paste0(percentage_in_zone, "%"),"≈ 66%" ))flextable(summary_df) %>%autofit()
Metric
Value
Number of cities within 160 km of national border
10,632
Population living within 160 km of border
228,864,968
Percentage of U.S. population in this zone
57.76%
ACLU Estimate (approx. 2/3 of U.S. population)
≈ 66%
# 4.2 Mapping Border Zoneconus_cities <- cities_sf %>%filter(!state_id %in%c("AK", "HI"))distance_matrix <-st_distance(conus_cities, usa_border)min_distances <-apply(distance_matrix, 1, min)conus_cities <- conus_cities %>%mutate(dist_to_national_border_m =as.numeric(min_distances),dist_to_national_border_km =round(dist_to_national_border_m /1000, 1) )danger_zone <- conus_cities %>%filter(dist_to_national_border_km <= threshold_km)top10_danger <- danger_zone %>%arrange(desc(population)) %>%slice_head(n =10)ggplot(data = conus_cities) +geom_sf(aes(color = dist_to_national_border_km), size =1) +scale_color_gradient(low ="orange", high ="darkred", name ="Distance to National Border (km)") +gghighlight(dist_to_national_border_km <= threshold_km, use_direct_label =FALSE) +geom_label_repel(data = top10_danger,aes(label = city, geometry = geometry),stat ="sf_coordinates",size =3,box.padding =0.3,point.padding =0.2 ) +theme_minimal() +labs(title ="Cities Within 100-Mile Danger Zone of U.S. National Border",subtitle ="Top 10 most populous cities within the Danger Zone",caption ="Data source: uscities.csv, USAboundaries, Natural Earth" )