title: “Fitten_mini_1”
output: html_document
date: “2025-09-19”
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)
GOOGLE_API_KEY <- readLines(‘key.txt’) ACS <- readLines(‘senses.txt’)
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()
west <- rmore_bb[1]
east <- rmore_bb[3]
south <- rmore_bb[2]
north <- rmore_bb[4]
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) }
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