answering Q1:
eqdc = '+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'
info included:
- proj=eqdc -> map projection: equidistant
- lat_0=40 -> latitude of false origin:
- lon_0=-96 -> longitude: -96
- lat_1=20 -> latitude of first standard parallel: 20
- lat_2=60 -> latitude of second standard parallel: 60
- x_0=0 -> false origin easting: 0
- y_0=0 -> false origin northing: 0
- datum=NAD83 -> datum: NAD83
- units=m -> unit: meter
conus = USAboundaries::us_states(resolution = "low") %>%
filter(!name %in% c("Alaska", "Hawaii", "Puerto Rico")) %>%
st_transform(eqdc)
countries = countries110 %>%
st_as_sf() %>%
filter(admin %in% c("Canada", "United States of America", "Mexico")) %>%
st_transform(eqdc)
cities = read_csv("../data/uscities.csv") %>%
st_as_sf(coords = c("lng", "lat"), crs = 4326) %>%
st_transform(eqdc) %>%
filter(!state_name %in% c("Alaska", "Hawaii", "Puerto Rico"))
Answering Q2:
2.1 - Distance to USA Border (coastline or national) (km)
country_border = st_union(conus) %>%
st_cast("MULTILINESTRING")
city_boundry = cities %>%
mutate(dist_to_border = st_distance(cities, country_border), dist_to_border = set_units(dist_to_border, "km"), dist_to_border = drop_units(dist_to_border))
max5_dist_to_border = city_boundry %>%
select(city, state_name, dist_to_border) %>%
slice_max(dist_to_border, n = 5) %>%
st_drop_geometry()
kable(max5_dist_to_border, caption = "Five Cities Farthest from the US Border", col.names = c("City", "State", "Distance (km)"), format.args = list(big.mark = ",")) %>%
kableExtra::kable_styling("striped", full_width = TRUE, font_size = 11)
Five Cities Farthest from the US Border
City
|
State
|
Distance (km)
|
Dresden
|
Kansas
|
1,012.317
|
Herndon
|
Kansas
|
1,007.750
|
Hill City
|
Kansas
|
1,005.147
|
Atwood
|
Kansas
|
1,004.734
|
Jennings
|
Kansas
|
1,003.646
|
2.2 - Distance to States (km)
state_border = st_combine(conus) %>%
st_cast("MULTILINESTRING")
city_boundry_to_state = cities %>%
mutate(dist_to_border = st_distance(cities, state_border), dist_to_border = set_units(dist_to_border, "km"), dist_to_border = drop_units(dist_to_border))
max5_dist_to_state_border = city_boundry_to_state %>%
select(city, state_name, dist_to_border) %>%
slice_max(dist_to_border, n = 5) %>%
st_drop_geometry()
kable(max5_dist_to_border, caption = "Five Cities Farthest from the State Border", col.names = c("City", "State", "Distance (km)"), format.args = list(big.mark = ",")) %>%
kableExtra::kable_styling("striped", full_width = TRUE, font_size = 11)
Five Cities Farthest from the State Border
City
|
State
|
Distance (km)
|
Dresden
|
Kansas
|
1,012.317
|
Herndon
|
Kansas
|
1,007.750
|
Hill City
|
Kansas
|
1,005.147
|
Atwood
|
Kansas
|
1,004.734
|
Jennings
|
Kansas
|
1,003.646
|
2.3 - Distance to Mexico (km)
mexico_border = countries %>%
filter(admin == "Mexico") %>%
st_union() %>%
st_cast("MULTILINESTRING")
city_boundary_mexico <- cities %>%
mutate(dist_to_mexico = st_distance(cities, mexico_border), dist_to_mexico = set_units(dist_to_mexico, "km"), dist_to_mexico = drop_units(dist_to_mexico))
max5_to_mexico = city_boundary_mexico %>%
select(city, state_name, dist_to_mexico) %>%
slice_max(dist_to_mexico, n = 5) %>%
st_drop_geometry()
kable(max5_to_mexico, caption = "Five Cities Farthest from Mexican Border", col.names = c("City", "State", "Distance (km)"), format.args = list(big.mark = ",")) %>%
kableExtra::kable_styling("striped", full_width = TRUE, font_size = 11)
Five Cities Farthest from Mexican Border
City
|
State
|
Distance (km)
|
Caribou
|
Maine
|
3,250.334
|
Presque Isle
|
Maine
|
3,234.570
|
Calais
|
Maine
|
3,134.348
|
Eastport
|
Maine
|
3,125.624
|
Old Town
|
Maine
|
3,048.366
|
2.4 - Distance to Canada (km)
canada_border = countries %>%
filter(admin == "Canada") %>%
st_union() %>%
st_cast("MULTILINESTRING")
city_boundary_canada <- cities %>%
mutate(dist_to_canada =st_distance(cities, canada_border), dist_to_canada = set_units(dist_to_canada, "km"), dist_to_canada = drop_units(dist_to_canada))
max5_to_canada = city_boundary_canada %>%
select(city, state_name, dist_to_canada) %>%
slice_max(dist_to_canada, n = 5) %>%
st_drop_geometry()
kable(max5_to_canada, caption = "Five Cities Farthest from Canadian Border", col.names = c("City", "State", "Distance (km)"), format.args = list(big.mark = ",")) %>%
kableExtra::kable_styling("striped", full_width = TRUE, font_size = 11)
Five Cities Farthest from Canadian Border
City
|
State
|
Distance (km)
|
Guadalupe Guerra
|
Texas
|
2,206.455
|
Sandoval
|
Texas
|
2,205.641
|
Fronton
|
Texas
|
2,204.784
|
Fronton Ranchettes
|
Texas
|
2,202.118
|
Evergreen
|
Texas
|
2,202.020
|
Answering Q3:
3.1 Data
big_cities = cities %>%
slice_max(population, n = 10)
ggplot(big_cities) +
geom_sf(data = countries) +
geom_sf(data = conus, color = '#fcba03', lty = 1, size = .5) +
geom_sf(data = big_cities, size = 2) +
ggthemes::theme_clean() +
geom_label_repel(data = big_cities, aes(label = city, geometry = geometry), stat = 'sf_coordinates', size = 2) +
labs(title = "10 Most Populated Cities in the United States", x = "Longitude", y = "Latitude")
3.2 City Distance from the Border
far_us_border = city_boundry %>%
slice_max(dist_to_border, n = 5)
ggplot() +
geom_sf(data = conus) +
geom_sf(data = city_boundry, aes(col = dist_to_border), size = 0.25) +
geom_sf(data = far_us_border) +
scale_color_gradient(low = "#e6d29c", high = "red") +
theme_clean() +
geom_label_repel(data = far_us_border, aes(label = city, geometry = geometry), stat = "sf_coordinates", size = 2) +
labs(col = "Distance to Border (km)", title = "US Cities and their Distance to US Border", subtitle = "5 Farthest Cities by Distance to US Border Labeled", x = "Longitude", y = "Latitude")
3.3 City Distance from Nearest State
nearest_border = city_boundry_to_state %>%
slice_max(dist_to_border, n = 5)
ggplot() +
geom_sf(data = conus) +
geom_sf(data = city_boundry_to_state, aes(col = dist_to_border), size = .25) +
geom_sf(data = nearest_border) +
scale_color_gradient(low = "#e6d29c", high = "red") +
theme_clean() +
geom_label_repel(data = far_us_border, aes(label = city, geometry = geometry), stat = "sf_coordinates", size = 2) +
labs(col = "Distance to Border (km)", title = "US Cities and their Distance to State Border", subtitle = "5 Farthest Cities from Nearest State Border Labeled", x = "Longitude", y = "Latitude")
3.4 Equidistance boundary from Mexico and Canada
equi_boundary = cities %>%
mutate(dist_to_canada = {st_distance(cities, canada_border) %>% set_units('km') %>% drop_units()}, dist_to_mexico = {st_distance(cities, mexico_border) %>% set_units('km') %>% drop_units()}, equidistance = {abs(dist_to_canada - dist_to_mexico)}) %>%
filter(equidistance <= 100)
equi_pop = equi_boundary %>%
slice_max(population, n = 5)
ggplot() +
geom_sf(data = conus) +
geom_sf(data = equi_boundary, size = .5, color = "#e0c655", alpha = 1) +
geom_sf(data = equi_pop) +
theme_clean() +
geom_label_repel(data = equi_pop, aes(label = city, geometry = geometry), stat = "sf_coordinates", size = 4) +
labs(col = "Distance to Border (km)", title = "US Cities Equidistant to Canada and Mexico Border ± 100 km", subtitle = "Top 5 Most Populated Labeled", x = "Longitude", y = "Latitude")
Answering Q4:
4.1 Quantifing Border Zone
zone_100 = city_boundry %>%
filter(dist_to_border <= 160)
number_zone = nrow(zone_100)
pop_zone_100 = sum(zone_100 $ population)
prop_zone_100 = 100*(pop_zone_100 / sum(city_boundry $ population))
description = c("Number of cities in 100-mile zone", "Population in 100-mile zone", "Proportion of population in 100-mile zone")
value = c("number_zone", "pop_zone_100", "prop_zone_100")
table = data.frame(description, value)
kable(table, caption = "100-Mile Zone Facts", col.names = c("Facts","Value"), align = "l", format.args = list(big.mark = ",")) %>%
kableExtra::kable_styling("striped", full_width = TRUE, font_size = 11)
100-Mile Zone Facts
Facts
|
Value
|
Number of cities in 100-mile zone
|
number_zone
|
Population in 100-mile zone
|
pop_zone_100
|
Proportion of population in 100-mile zone
|
prop_zone_100
|
4.2 Mapping Border Zone
top10_per_state = zone_100 %>%
group_by(state_name) %>%
slice_max(population, n = 1)
ggplot() +
geom_sf(data = conus) +
geom_sf(data = city_boundry, aes(col = dist_to_border), size = .1) +
geom_sf(data = nearest_border) +
geom_sf(data = top10_per_state) +
scale_color_gradient(low = "orange", high = "darkred") +
gghighlight(dist_to_border < 160) +
theme_clean() +
geom_label_repel(data = nearest_border, aes(label = city, geometry = geometry), stat = "sf_coordinates", size = 3) +
labs(col = "Distance to Border (km)", title = "US Cities within 100-miles to US Border", subtitle = "Cities with Distance under 100-miles to US Border Labeled", x = "Longitude", y = "Latitude")