1. Introduction

1.1 Background

    Over the past two decades, rail-to-trail initiatives have transformed abandoned rail corridors into vibrant public spaces that promote sustainable mobility, recreation, and urban revitalization.

    Prominent examples such as the High Line in New York and the Atlanta BeltLine illustrate how linear corridors can be reimagined as multifunctional public realms that reconnect fragmented neighborhoods and reshape urban landscapes.


1.2 Debates on Rail-to-Trail Initiatives

(1) The “Quality” Gap

    Existing studies measure equity by calculating the distance from a home to a trail. However, a dark, unpaved path with no safe crossings does not provide the same utility as a paved, lit, well-connected linear park, even if both are technically “accessible.”

(2) “Green Gentrification” Paradox

    High-quality linear green infrastructure projects often trigger rapid property value increases, displacing the very residents they were intended to serve. Consequently, evaluating these projects requires a dual analysis of physical quality and socio-economic retention to distinguish between equitable revitalization and exclusionary development.


1.3 Motivations for Metrics and Methods

(1) Trust for Public Land’s ParkScore Index

    ParkScore Index from the Trust for Public Land gives park scores across 100 major U.S. cities. The main park evaluation criteria includes acreage of park size, percentage of residents within 10-minute walk to park, percentage of POC or low-income households within 10-min walk to park, neighborhoods of color/low-income having x park space compared to white neighborhoods, investment spending per resident, and available amenities (i.e. dog parks, playgrounds, recreation and senior centers). Our study takes inspiration from the ParkScore Index and attempts to include some metrics to our own park score and also zoom in spatial resolution of the score to focus on Beltline corridors. (The Trust for Public Land, 2024)

(2) Method for multi-criteria evaluation of urban parks

    The main park evaluation criteria used in the paper’s park evaluation includes park acreage, park-access amenities, park facilities and amenities, aesthetic features, and park and neighborhood quality concerns. The method of synthesizing the multi-criteria evaluation is by normalizing each indicator to 0–100, then combine to single metric using weighted arithmetic mean. Our study takes inspiration from the paper on how to combine multiple criteria into a single score. (Kasyanov & Silin, 2019)

(3) ParkIndex: Validation and application of a pragmatic measure of park

    The paper expands on how ParkIndex by the Trust for Public Land may be validated. One major application is looking at how the ParkIndex score may predict the probability of resident-use of a nearby park for at least once per month. One major external validity test for the ParkIndex is to conduct cross-city validation on ParkIndex’s prediction on park use in 4 major cities - Brooklyn, NY; Seattle, WA; Raleigh, NC; and Greenville County, SC. Our study takes inspiration from the paper on index validation and attempts to conduct separate regression analysis on the different categories of indicators that make up our park score index - environmental quality, access and connectivity, and user comfort - to see their relationship with socio-economic variables in neighboring block groups. (Kaczynski et al., 2020)


1.4 Research Gaps

(1) Spatial variation in Beltline quality overlooked

    While previous studies have examined the Beltline’s economic and social impacts, few have systematically assessed how the quality of its linear green spaces varies spatially, or how such variations intersect with socio-economic disparities.

(2) Inadequate evaluation frameworks in linear spaces

    Current evaluation frameworks are primarily designed for traditional parks, lacking indicators that capture the continuity, connectivity, and experiential diversity unique to linear spaces.


1.5 Research Questions

RQ1.

How can a comprehensive Linear Green Infrastructure Quality Index (LGIQI) be developed to evaluate the spatial and experiential qualities of the Atlanta Beltline corridors?

RQ2.

How does the spatial distribution of linear green infrastructure quality relate to socio-economic disparities, revealing who benefits most from urban green infrastructure?


1.6 Study Area

    The Atlanta Beltline stands as one of the most ambitious rail-to-trail projects in the United States. Envisioned to connect more than 45 neighborhoods through a continuous network of trails, parks, and transit, it represents a new model of linear green infrastructure that merges environmental design with economic redevelopment.

    As the Beltline has evolved from a greenway concept into a powerful redevelopment engine, questions of who truly benefits have become increasingly urgent. Rising property values, shifting demographics, and uneven investment patterns have raised concerns about whether the project’s environmental and recreational benefits are equitably distributed among Atlanta’s diverse communities.


2. Methods & Results of RQ1: Assessing the park quality of Atlanta Beltline

RQ1: Creation of the Linear Green Infrastructure Quality Index (LGIQI)

    A total of 7 criteria that are used in the creation of LGIQI are separated to three major categories - environmental quality, access and connectivity, and user comfort.

2.1 Environmental Quality Category Indicators - Park acreage, Tree canopy cover %

Indicator Measurement Data Source
Park Acreage Measure acreage; standardize range to a 0-100 score City of Atlanta GIS Open Data
Tree canopy cover % Take mean of tree canopy cover % raster cells; standardize range to a 0-100 score NLCD

2.2 Access & Connectivity Category Indicators - Accessibility to MARTA, Average bike trail length

Indicator Measurement Data Source
Accessibility to multi-modal transportation - MARTA Count of MARTA train and bus stops within 1-mile buffer; standardize range to a 0-100 score City of Atlanta GIS Open Data
Average bike trail length Calculate average length of bike trail within 0.5 mile from park; standardize range to a 0-100 score OSM

2.3 User Comfort Category Indicators - Walkability index (WI), Greenness continuity index (GCI), Landmark visibility frequency (LVF)

Data source: Google Street View Images

Walkability index (WI)

\[ WI_t = \frac{1}{N_{img,t}} \sum_{i=1}^{N_{img,t}} \frac{N_{walk,i,t}}{N_{total,i,t}} \]

where \(N_{walk,i,t}\) = pixels labeled as sidewalk or road in image \(i\) of segment \(t\),
and \(N_{total,i,t}\) = total pixels in image \(i\) of segment \(t\).

ADE20K categories used: "sidewalk", "road"

Greenness continuity index (GCI)

    In linear green infrastructure, users experience the environment sequentially — so not only the amount of greenery matters, but also how continuously it appears along the route. \[ GCI_t = 1 - \frac{\sigma_{GVI,t}}{\overline{GVI_t}} \]

where \(\sigma_{GVI,t}\) = standard deviation of green view index (GVI) across images in segment \(t\), and \(\overline{GVI_t}\) = mean GVI value of segment \(t\).

ADE20K categories used: "tree", "grass", "plant", "field", "hill", "palm"

Landmark visibility frequency (LVF)

    Follows a similar approach to WI, but focusing on proportion of pixels belonging to landmark-related categories (e.g., skyscraper, bridge, church, fountain, monument, etc.) within each trail segment.

\[ LVF_t = \frac{1}{N_{img,t}} \sum_{i=1}^{N_{img,t}} \frac{N_{landmark,i,t}}{N_{total,i,t}} \] Note: codes on cleaning and downloading GSV images and OSM data are under Appendix


2.4 Compilation to Linear Green Infrastructure Quality Index (LGIQI)

    Each metric is standardized to a 0-100 score, then the mean is taken across each metric to create a LGIQI index. The mean is also taken for each category so future regression analysis allows analysis with the comprehensive LGIQI index and with each categories that make up the index.


2.5 Results: Three Categories of Linear Green Infrastructure Quality Index (LGIQI)

    

    

    For environmental quality category, we see highest scores on the Southwest Beltline corridors followed by the Eastern and Northeast Beltline corridors. We see lower scores on Northwest Beltline corridors and the lower segments of the Eastern Beltline corridors.

    For access & connectivity, we see highest scores on the southwestern, Eastern, and Northwest Beltline corridors. We see the lowest score at the Northern Beltline corridors.

    For user comfort, we see highest scores at Southwest and Eastern Beltline corridors. We see the lower score at the Northwest Beltline corridors and a segment within the Southwest and Northern Beltline corridors.


2.6 Results: Linear Green Infrastructure Quality Index (LGIQI)

    We see high LGIQI scores along the long corridors on the Eastern Beltine; we also see high LGIQI at the segments of corridors on the Southwest Beltline. For moderate to low LGIQI, we see them at the corridors on the Southern, Northern, and Northwest Beltline. In overall on the general spatial disparities of LGIQI, we see that the Eastern Beltline corridors have higher LGIQI than Western Beltline corridors do.


3. Methods & Results of RQ2: Assessing the socio-economic disparities

RQ2: Regression Analysis

    For our regression analysis, we selected block groups intersecting with the 0.5 mile buffer of the Atlanta Beltline corridors. We performed separate multivariate regression for each category of LGIQI and the comprehensive LGIQI with the 3 ACS socioeconomic housing variables - median gross rent, % renter households, and renter cost-burden >50%.


3.1 Results of Regression

    

Dependent variable:
LGIQI Environmental
Quality
Access and
Connectivity
User Comfort
(1) (2) (3) (4)
Median Gross Rent -0.002 -0.008** -0.001 0.003
(0.003) (0.003) (0.003) (0.003)
% Renter Households 11.412* 9.373 7.224 17.638**
(6.002) (7.150) (6.374) (7.641)
Renter Cost-burden >50% -0.039** -0.046** -0.038** -0.032
(0.017) (0.020) (0.018) (0.021)
Constant 39.079*** 49.129*** 39.165*** 28.943***
(5.873) (6.996) (6.237) (7.477)
Observations 109 109 109 109
R2 0.068 0.107 0.044 0.054
Adjusted R2 0.041 0.081 0.017 0.027
Residual Std. Error (df = 105) 14.321 17.058 15.207 18.231
F Statistic (df = 3; 105) 2.554* 4.177*** 1.614 2.001
Note: p<0.1; p<0.05; p<0.01

    

    From the regression analysis result, median gross rent generally has a negative relationship across all dependent variables except the user comfort category. We see a statistically significant but very small negative relationship between median gross rent and the environmental quality category of LGIQI. Percentage of renter households has a positive relationship across all dependent variables; we see a statistically significant positive relationship between percent renter households and the comprehensive LGIQI and user comfort category. Number of renter households who spend more than half of their income on housing costs has a negative relationship across all dependent variables; we see a statistically significant negative relationship between renter cost-burden >50% and the comprehensive LGIQI and environmental quality and access & connectivity categories.

    We see a R-squared value of 0.068, with rental conditions explaining 4% of variation in the overall LGIQI score, 2% in Access & Connectivity, and 8% in Environmental Quality.

    Neighborhoods where renters are severely cost-burdened have worse livability, worse environmental quality, and worse connectivity; this highlights toddlers law and investment issues. Neighborhoods with a higher share of renters tend to be more livable and more comfortable, likely due to density and walkability. Higher rents are very weakly associated with worse environmental quality, suggesting that more urbanized areas, such as segments along the Eastside Beltline corridors, exhibit both higher housing costs and reduced environmental quality.


4. Summary & Conclusion on Findings

4.1 Findings:

(1) A statistically positive relationship indicates that neighborhoods with more renters have higher overall LGIQI scores, with higher score over user comfort category.

    Neighborhoods with more renters often have better comfort features along the Beltline corridors, such as better walkability, greater greenness continuity for shades, and higher landmark visibility for orientability, all contributing to more comfortable walking and park environments.

(2) A statistically significant negative relationship indicates that neighborhoods with more renters paying over half their income on rent have lower overall LGIQI scores, with simultaneously lower scores over environmental quality and access & connectivity categories.

    People living under financial stress may also live around Beltline corridors with smaller park acreage, lower tree canopy cover, fewer MARTA stops in proximity, and shorter bike lanes.


4.2 Summary

Green, well-resourced, well-connected, and comfortable Beltline corridors with high LGIQI scores are more around renter-dense neighborhoods, but the LGIQI park score drops in neighborhoods where renters face more severe housing cost burden, indicating uneven distribution of park and neighborhood amenities.


5. Research Impact on Future Planning

(1) Provides replicable methodology for measuring park quality

    The LGIQI index combines a range of indicators within the three categories - environmental quality, access & connectivity, and user comfort - to assess park qualities comprehensively. The index can not only be applied to the Atlanta Beltline corridors but also other corridors or parks in other U.S. cities, allowing a standardized comparison and progress-tracking over time.

(2) Highlights distributional inequities in park quality

    Our project reveals that high quality Beltline corridors that are well-resourced and comfortable tend to cluster in renter-dense areas, but environmental quality and accessibility sharply decline in neighborhoods where renters are under severe housing cost burdens. Our analysis helps planners identify spatial inequities and specifically pinpoint locations where equitable developments should be prioritized.

(3) Informs policies for equitable Beltline corridor development

    Following our findings on the distributional inequities in park quality, stating that while renter-dense neighborhoods benefit from the qualities that make the corridors achieve high LGIQI scores, affordability remains a significant problem that needs to be tackled by planners. Our project’s summary of findings helps planners design policies on Atlanta Beltline management and development without reinforcing the existing disparities. Our project also supports the integration of housing and environmental planning.

(4) Future Analysis: time series reflecting patterns & implications of public and private investments

    One possible extension of the project is to perform a time series analysis to observe the change in LGIQI park scores over time for the Atlanta Beltline corridors, enabling deeper analysis on where public and private investments have been invested at and how are implications of investment distribution manifested in the patterns of LGIQI score change temperarily and spatially.

    

Thanks for Reading!

    


Citations

Kaczynski, A. T., Hughey, S. M., Stowe, E. W., Wende, M. E., Hipp, J. A., Oliphant, E. L., & Schipperijn, J. (2020). ParkIndex: Validation and application of a pragmatic measure of park access and use. Preventive Medicine Reports, 20, 101218. https://doi.org/10.1016/j.pmedr.2020.10121

Kasyanov, V. F., & Silin, R. V. (2019). Method for multi-criteria evaluation of urban parks. IOP Conference Series: Materials Science and Engineering, 687(5), 055040. https://doi.org/10.1088/1757-899X/687/5/055040

The Trust for Public Land. (2024). ParkScore® Index 2024.


Appendix

Google Street View image Processing for WI, GCI, LVF calculation

Step 1. Choose the Beltline Area

beltline <- st_read("./Yuhan_class_project/beltline file.json")

# check the data structure
head(beltline,2)
# check CRS
st_crs(beltline)

# visualize with ggplot
ggplot() +
  geom_sf(data = beltline, aes(color = projectstatus), size = 1) +
  theme_minimal() +
  labs(title = "Atlanta Beltline Segments",
       color = "Project Status") +
  theme(plot.title = element_text(size = 14, face = "bold"),
        legend.position = "bottom")

# create buffer in EPSG:3521 (1 mile = 5280 feet)
beltline_buffer <- st_buffer(beltline, dist = 100)

# transform both to EPSG:4326
beltline_wgs84 <- st_transform(beltline, 4326)
beltline_buffer_merged <- st_union(beltline_buffer)
beltline_buffer_wgs84 <- st_transform(beltline_buffer_merged, 4326)

# plot
plot(st_geometry(beltline_buffer_wgs84), col = "lightblue", main = "1-Mile Buffer (WGS84)")
plot(st_geometry(beltline_wgs84), add = TRUE, col = "red")

Step 2. Get OSM data and clean it.

2-1. Download OSM.

Download OSM data, convert it to an sfnetwork object, and clean it.

# bounding box for Atlanta
my_bb <- tigris::places(state = "GA") %>% 
  filter(NAME == "Atlanta") %>%
  st_bbox()

# get OSM data
osm_road <- opq(bbox = my_bb) %>%
  add_osm_feature(key = "highway", 
                  value = c("motorway","trunk","primary","secondary","tertiary",
                            "unclassified","residential","service","living_street",
                            "path","footway","cycleway","bridleway","track",
                            "pedestrian","steps", "foot","hiking","bicycle","mtb"
                            )) %>%
  osmdata_sf() %>% 
  osm_poly2line()

# convert the OSM lines to sfnetwork and clean it.
net <- osm_road$osm_lines %>% 
  select(osm_id, highway) %>% 
  sfnetworks::as_sfnetwork(directed = FALSE) %>% 
  activate("edges") %>%
  filter(!edge_is_multiple()) %>% # remove duplicated edges
  filter(!edge_is_loop()) %>% # remove loops
  convert(., sfnetworks::to_spatial_subdivision) %>% # subdivide edges
  convert(., sfnetworks::to_spatial_smooth, summarise_attributes = "first") # delete pseudo nodes

2-2. Extract edges.

Extract “edges” from the cleaned road network, add a length column, remove short segments (less than 300 feet or 91 meters), and assign a unique ID to each edge.

buf <- st_make_valid(beltline_buffer_wgs84)

# extract "edges" from the cleaned road network
edges <- net %>%
  st_as_sf("edges") %>%
  st_transform(st_crs(buf)) %>%
  select(osm_id, highway) %>%
  ungroup() %>% 
  mutate(edge_id = seq(1,nrow(.)))

# clip the edges using the buffer zone of beltline
edges_bbox <- st_crop(edges, st_bbox(buf))
edges_clip <- st_intersection(st_make_valid(edges_bbox), buf)

edges_clip_line <- edges_clip %>%
  st_cast("LINESTRING", warn = FALSE)

tm_shape(edges_clip_line) +
  tm_lines(col = "highway", lwd = 1.5) +
  tm_layout(legend.outside = TRUE)

# calculate the length of each edge
edges_clip_m <- st_transform(edges_clip_line, 3857) %>%
  mutate(length_m = as.numeric(st_length(geometry)))

# remove short segments
edges_clean <- edges_clip_m %>%
  filter(length_m >= 91) %>%
  group_by(highway) %>%
  ungroup() %>%
  mutate(edge_id = seq_len(n()))

edges_clean_wgs84 <- st_transform(edges_clean, 4326)

# check the cleaned edges
table(edges_clean_wgs84$highway)
tm_shape(edges_clean_wgs84) +
  tm_lines(col = "highway", lwd = 1.5) +
  tm_layout(legend.outside = TRUE)

Step 3. Define getAzimuth() function.

3-1. Define a function.

getAzimuth <- function(line){
  # end point 1 ----------------------------------------------
  start_p <- line %>% 
  st_coordinates() %>% 
  .[1:2,1:2]

  start_azi <- atan2(start_p[2,"X"] - start_p[1, "X"],
                     start_p[2,"Y"] - start_p[1, "Y"])*180/pi
  
  # end point 2 ----------------------------------------------
  end_p <- line %>% 
    st_coordinates() %>% 
    .[(nrow(.)-1):nrow(.),1:2]
  
  end_azi <- atan2(end_p[2,"X"] - end_p[1, "X"],
                   end_p[2,"Y"] - end_p[1, "Y"])*180/pi
  
  end_azi <- if (end_azi < 180) {end_azi + 180} else {end_azi - 180}
  
  # mid point 1 ---------------------------------------------
  mid_p3 <- line %>% 
    st_line_sample(sample = c(0.48, 0.5, 0.52)) %>% 
    st_cast("POINT") %>% 
    st_coordinates()
  
  mid_p <- mid_p3[2,]
  
  mid_azi_1 <- atan2(mid_p3[1,"X"] - mid_p3[2, "X"],
                     mid_p3[1,"Y"] - mid_p3[2, "Y"])*180/pi
  
  mid_azi_2 <- atan2(mid_p3[3,"X"] - mid_p3[2, "X"],
                     mid_p3[3,"Y"] - mid_p3[2, "Y"])*180/pi
  
  # return in data frame ------------------------------------
  return(tribble(
    ~type,     ~X,             ~Y,             ~azi,
    "start",   start_p[1,"X"], start_p[1,"Y"], start_azi,
    "mid1",    mid_p["X"],     mid_p["Y"],     mid_azi_1,
    "mid2",    mid_p["X"],     mid_p["Y"],     mid_azi_2,
    "end",     end_p[2,"X"],   end_p[2,"Y"],   end_azi))
}

3-2. Apply the function to edges.

Apply the function to all street segments.

edges_azi <- edges_clean_wgs84 %>% 
  st_geometry() %>% 
  map_df(getAzimuth, .progress = T)

edges_azi %<>% 
  bind_cols(edges_clean_wgs84 %>% 
              st_drop_geometry() %>%
              slice(rep(1:nrow(edges_clean_wgs84),each=4))) %>% 
  st_as_sf(coords = c("X", "Y"), crs = 4326, remove=FALSE) %>% 
  mutate(node_id = seq(1, nrow(.)))

# plot the points
edges_azi_sf <- st_as_sf(edges_azi, coords = c("X", "Y"), crs = 4326)

tm_shape(edges_azi_sf) +
  tm_dots(col = "type", size = 0.08) +
  tm_layout(legend.outside = TRUE)

# save the points
# edges_azi %>% st_write("edges_azi_atlanta_beltline.geojson")

Step 4. Get GSV images.

4-1. Define a function.

getImage <- function(iterrow){
  type = iterrow$type
  location <- paste0(iterrow$Y %>% round(5), ",", iterrow$X %>% round(5))
  heading <- iterrow$azi %>% round(1)
  edge_id <- iterrow$edge_id
  node_id <- iterrow$node_id
  highway <- iterrow$highway
  key <- Sys.getenv("GOOGLE_API_KEY") # your Google API key
  
  endpoint <- "https://maps.googleapis.com/maps/api/streetview"
  
  request <- glue::glue("{endpoint}?size=640x640&location={location}&heading={heading}&fov=90&pitch=0&key={key}")
  fname <- glue::glue("GSV-nid_{node_id}-eid_{edge_id}-type_{type}-Location_{location}-heading_{heading}-highway_{highway}.jpg")
  fpath <- "GSVI" # Set your own directory for the downloaded images
  download.file(request, destfile = file.path(fpath, fname), mode = 'wb')
  
  Sys.sleep(1)
}

4-2. Download the images.

# Create a progress bar to monitor progress
pb <- txtProgressBar(min = 0, max = nrow(edges_azi), style = 3)

# Loop through each segment to download images
for (i in seq(1,nrow(edges_azi))){
  getImage(edges_azi[i,])
  setTxtProgressBar(pb, i)
}

Step 5. Apply computer vision.

    Here, we use pre-trained model smp-hub/segformer-b5-640x640-ade-160k for semantic segmentation in Colab. We select ADE20K dataset because it provides a much broader and more diverse range of semantic categories than Cityscapes, which is primarily focused on urban street scenes. ADE20K includes 150 object classes that cover both built environment features and natural elements, as well as landmark and architectural objects. Therefore, this comprehensive coverage allows for a more detailed understanding of trail-level visual environments.

Step 6. Merge the data processed from Colab back to R

# load the sampled points
edges_azi <- st_read("./Yuhan_class_project/edges_azi_atlanta_beltline.geojson")

# download the output from the computer vision models
seg_output <- read.csv("./Yuhan_class_project/beltline_seg_output.csv")

# join them back to the `edges_azi` object that was used to download images
edges_seg_output <- edges_azi %>% 
  inner_join(seg_output, by=c("node_id"="img_id"))

# export 
st_write(edges_seg_output, "./Yuhan_class_project/output/edges_seg_output.shp")

# check out the first few rows
head(edges_seg_output, 2)