title: “Fitten_mini_1”

output: html_document

date: “2025-09-19”

installing necessary packages

install.packages(‘httr’)

install.packages(‘jsonlite’)

install.packages(‘tidyverse’)

install.packages(‘sf’)

install.packages(‘tigris’)

install.packages(‘tidycensus’)

install.packages(‘tmap’)

library(tidyverse)

library(tidycensus)

library(sf) library(tigris)

library(jsonlite)

library(httr)

library(tmap)

I use school computers and can’t do an environment setting so they read .txt files

GOOGLE_API_KEY <- readLines(‘key.txt’) ACS <- readLines(‘senses.txt’)

set up

VA_set <- get_acs(geography = “block group”, state = ‘NC’, county = “Chatham”, variables = c(age = ‘B01002_001E’), year = 2023, survey = ‘acs5’, geometry = TRUE, output = ‘wide’)

#filtering for pittsboro the city

rmore <- tigris::places(‘NC’) %>% filter(NAME == “Pittsboro”)

bg_rmore <- VA_set[rmore, ]

bg_rmore <- bg_rmore %>% select(GEOID, age)

#creating a map to view it

tmap_mode(‘view’)

tm_shape(bg_rmore) + tm_borders(lwd = 2) + tm_shape(rmore) + tm_polygons(col =‘green’, alpha = .4)

#location restriction

gcs_id <- 4326

pcs_id <- 26985

#bounding box

rmore_bb <- rmore %>% st_transform(pcs_id) %>% st_bbox()

Find coordinates for the four sides of the bbox

west <- rmore_bb[1]

east <- rmore_bb[3]

south <- rmore_bb[2]

north <- rmore_bb[4]

Creating centroids because fishnets ended up being too big or too

small ####

getXYRadius <- function(polygon, gcs_id, pcs_id){ if (st_crs(polygon) != st_crs(pcs_id)){ polygon <- polygon %>% st_transform(pcs_id) } bb <- st_bbox(polygon) bb_corner <- st_point(c(bb[1], bb[2])) %>% st_sfc(crs = pcs_id) bb_center <- bb %>% st_as_sfc() %>% st_centroid() r <- as.numeric(st_distance(bb_corner, bb_center)) bb_center <- bb_center %>% st_transform(gcs_id) xy <- bb_center %>% st_coordinates() %>% as.vector()

lon_lat_radius <- data.frame(x = xy[1], y = xy[2], r = r)

return(lon_lat_radius) }

gcs_id <- 4326 pcs_id<- 32616

bg_rmore_xyr <- data.frame(x = numeric(nrow(bg_rmore)), y = NA, r = NA) for (i in 1:nrow(bg_rmore)){ bg_rmore_xyr[i,] <- bg_rmore[i, ] %>% getXYRadius(gcs_id = gcs_id, pcs_id = pcs_id) }

tmap_mode(‘view’)

bg_rmore_xyr %>% st_as_sf(coords = c(“x”, “y”), crs = st_crs(bg_rmore)) %>% st_buffer(dist = .$r) %>% tm_shape(.) + tm_polygons(alpha = 0.3, col =‘red’) + tm_shape(bg_rmore) + tm_borders(col= ‘blue’)

####Collectiing POI Data Test####

lat <- 37.537511 long <- -77.472355 radius <- 1609.34 endpoint <- paste0(‘<https://places.googleapis.com/v1/places:searchNearby?key=’,GOOGLE_API_KEY)

rmorepoi <- list( includedTypes = list(‘park’,‘coffee_shop’), locationRestriction = list( circle = list( center = list( latitude = lat, longitude = long), radius = radius ))) resp <- POST( endpoint, add_headers(“Content-Type” = ‘application/json’, ‘key’ = GOOGLE_API_KEY, “X-Goog-FieldMask” = ‘places.displayName,places.formattedAddress,places.types’), body = rmorepoi, encode = ‘json’) print(resp)

data <- content(resp, as=“text”) data <- jsonlite::fromJSON(data, flatten = T) %>% as.data.frame()

nearbySearch <- function(lat, lon, radius, types_vec, fieldmask_vec,GOOGLE_API_KEY){ endpoint <-paste0(“<https://places.googleapis.com/v1/places:searchNearby?key=”,GOOGLE_API_KEY) body <- list( includedTypes = as.list(types_vec), locationRestriction = list( circle = list( center = list(latitude = lat, longitude = lon), radius = radius)), rankPreference = “DISTANCE”)

resp <- POST( endpoint, add_headers( “Content-Type” = “application/json”, “X-Goog-Api-Key” = GOOGLE_API_KEY, “X-Goog-FieldMask” = paste(fieldmask_vec, collapse = “,”)), body = body, encode = “json”)

data <- content(resp, as=“text”) %>% jsonlite::fromJSON(flatten = T) %>% as.data.frame()

if (nrow(data) == 20){ print(“WARNING: The response has 20 rows! Consider using a smaller spatial unit.”) }

return(data)

} data_list <- vector(‘list’, nrow(bg_rmore_xyr))

####building the for loop####

for (i in seq_len(nrow(bg_rmore_xyr))) { data_list[[i]] <- nearbySearch( lat = bg_rmore_xyr\(y[i], lon = bg_rmore_xyr\)x[i], radius = bg_rmore_xyr$r[i], types_vec = c(‘park’,‘coffee_shop’), fieldmask_vec = c(‘places.id’,‘places.displayName’,‘places.formattedAddress’,‘places.location’,‘places.types’,‘places.priceLevel’,‘places.rating’,‘places.userRatingCount’), GOOGLE_API_KEY = GOOGLE_API_KEY ) Sys.sleep(1) }

Separate DF and Mapping

data_all <- dplyr::bind_rows(data_list) saveRDS(data_all, (“google_poi_data.rds”))

data_all_sf <- data_all %>% rename(x = places.location.longitude, y = places.location.latitude) %>% filter(!is.na(x) & !is.na(y)) %>% st_as_sf(coords = c(“x”, “y”), crs = 4326)

tm_shape(data_all_sf) + tm_dots(col = “places.rating”, size = “places.userRatingCount”, palette = “magma”, popup.vars = c(“Name” = “places.displayName.text”, “Rating” = “places.rating”, “Rating Count” = “places.userRatingCount”)) + tm_shape(rmore) + tm_borders()

####extra - tidying it up####

install.packages(‘purrr’) library(purrr) data_all_sf <- data_all_sf%>% mutate(type = map_chr(places.types,~.x[1]))

map2 <- tm_shape(data_all_sf) + tm_dots(col = “type”, size = 1, palette = ‘magma’) + tm_shape(rmore) + tm_polygons(col = ‘green’, alpha = .07) tm_borders(lwd =2) map2