I. Introduction & Motivation

In its effort to achieve a “greener and greater New York” while accommodating one million new residents, Mayor Michael Bloomberg’s PlaNYC2030 embraced transit-oriented development” – the concentration of new housing in neighborhoods with good access to the city’s subways and buses.

However, in the early days of the plan announcement , there was controversy over whether “transit-oriented” development should occur in New York City, where public transportation is nearly ubiquitous and the transit system is well developed. The project could hardly further increase or diversify the public transportation system and would only promote dense residential development near stations. In addition, the plan encourages off-street parking lots to meet residential demand, raising people’s concerns about the project’s ability to promote greater access to public transit and develope vibrant TOD areas with mixed-use sites.

Therefore, this project aims to provide an overview to observe the changes in indicators of TOD and Non-TOD areas from 2009-2020 since the implementation of PlaNYC2030, and to illustrate the significance of identifying TOD areas.

II. Setup

Load packages and functions

library(tidyverse)
library(tidycensus)
library(sf)
library(kableExtra)

options(scipen=999) # cite scientifically
options(tigris_class = "sf")

source("https://raw.githubusercontent.com/urbanSpatial/Public-Policy-Analytics-Landing/master/functions.r")

qBr <- function(df, variable, rnd) {
  if (missing(rnd)) {
    as.character(quantile(round(df[[variable]],2),
                          c(.01,.2,.4,.6,.8), na.rm=T))
  } else if (rnd == FALSE | rnd == F) {
    as.character(formatC(quantile(df[[variable]]), digits = 3),
                 c(.01,.2,.4,.6,.8), na.rm=T)
  }
}

q5 <- function(variable) {as.factor(ntile(variable, 5))}

palette5 <- c("#f0f9e8","#bae4bc","#7bccc4","#43a2ca","#0868ac")

palette2<- c("#ffffcc","#c2e699","#78c679","#31a354","#006837")

III. Data Manipulation and Visualization

1. Data Wrangling

Three datasets were used in this project:

  • Census Data: demographic variables from the ACS 2009 and 2020 for census tracts in New York, Queens County.

  • Subway Station Data: Queens subway station in geojson format from the subway transit system

  • Subway Line Data: Queens subway line in geojson format from the subway transit system

1.1 Fetch Census Data

Variables we were interested in this projects are:

  • Total population

  • White population percentage

  • Percentage of adults who are Bachelor Degree holders

  • Median household income (adjusted for inflation)

  • Median rent (adjusted for inflation)

  • Total Public transit

acs_variable_list.2009 <- load_variables(2009, #year
                                         "acs5", #five year ACS estimates
                                         cache = TRUE)
acs_variable_list.2020 <- load_variables(2020, #year
                                         "acs5", #five year ACS estimates
                                         cache = TRUE)
tracts20 <-
  get_acs(geography = "tract",
          variables = c("B25026_001E","B02001_002E",
                        "B15001_050E","B15001_009E",
                        "B19013_001E", "B25058_001E",
                        "B06012_002E","B08301_010",
                        "B08301_001","B08128_041"), 
          year=2020, state="New York",
          county="Queens", geometry=TRUE) %>% 
  st_transform(26918) %>%
  dplyr::select( -NAME, -moe) %>%
  spread(variable, estimate) %>%
  rename(TotalPop = B25026_001, 
         Whites = B02001_002,
         FemaleBachelors = B15001_050, 
         MaleBachelors = B15001_009,
         MedHHInc = B19013_001, 
         MedRent = B25058_001,
         TotalPoverty = B06012_002,
         TotalPublictransit = B08301_010,
         TotalTransit =B08301_001,
         TotalWalk =B08128_041,
         )%>%
  mutate(pctWhite = ifelse(TotalPop > 0, Whites * 100 / TotalPop, 0),
         pctBachelors = ifelse(TotalPop > 0, ((FemaleBachelors + MaleBachelors) * 100/ TotalPop), 0),
         pctPoverty = ifelse(TotalPop > 0, TotalPoverty * 100/ TotalPop, 0),
         pctNonveh = ifelse(TotalTransit> 0, (TotalWalk + TotalPublictransit) * 100 / TotalTransit, 0),
         year = "2020") %>%
  dplyr::select(-Whites,-FemaleBachelors,-MaleBachelors,-TotalPoverty)%>%
  replace_na(list(0,0))

tracts09 <-
  get_acs(geography = "tract",
          variables = c("B25026_001E","B02001_002E",
                        "B15001_050E","B15001_009E",
                        "B19013_001E", "B25058_001E",
                        "B06012_002E","B08301_010",
                    "B08301_019",
                        "B08301_001"), 
          year=2009, state="New York",
          county="Queens", geometry=TRUE) %>% 
  st_transform(26918) %>%
  dplyr::select( -NAME, -moe) %>%
  spread(variable, estimate) %>%
  rename(TotalPop = B25026_001, 
         Whites = B02001_002,
         FemaleBachelors = B15001_050, 
         MaleBachelors = B15001_009,
         MedHHInc = B19013_001, 
         MedRent = B25058_001,
         TotalPoverty = B06012_002,
         TotalPublictransit = B08301_010,
         TotalWalk =B08301_019,
         TotalTransit = B08301_001,
         )%>%
  mutate(pctWhite = ifelse(TotalPop > 0, Whites * 100 / TotalPop, 0),
         pctBachelors = ifelse(TotalPop > 0, ((FemaleBachelors + MaleBachelors)* 100  / TotalPop), 0),
         pctPoverty = ifelse(TotalPop > 0, TotalPoverty * 100  / TotalPop, 0),
        pctNonveh = ifelse(TotalTransit> 0, (TotalWalk + TotalPublictransit) * 100 / TotalTransit, 0),
         year = "2009") %>%
  dplyr::select(-Whites,-FemaleBachelors,-MaleBachelors,-TotalPoverty)

# --- Combining 09 and 20 data ----

allTracts <- rbind(tracts09,tracts20)

1.2 Load New York Transit Data

Showed in Figure 1.1, DART has 83 stations, spreading from Downtown to multiple directions updated to 2018.

septaStops <- 
  st_read("~/Github/MUSA508_HW/DATA/Subway_Stations.geojson") %>% 
  st_transform(st_crs(tracts20)) %>%
  st_intersection(st_union(tracts20)) %>%
  select(name, line)

septaLines <- 
  st_read("~/Github/MUSA508_HW/DATA/Subway_Lines.geojson") %>% 
  st_transform(st_crs(tracts20)) %>%
  st_intersection(st_union(tracts20)) %>%
  select(name, rt_symbol)

ggplot() + 
  geom_sf(data=st_union(tracts20),fill = "grey90", color = "grey") +
  geom_sf(data=septaStops, aes(colour = line), show.legend = "point", size= 2) +
  geom_sf(data=septaLines, alpha=0.2)+
  labs(title="Septa Stops", subtitle="Newyork, Queens",caption = 'Figure 1.1') +
  mapTheme() +
  theme(plot.title = element_text(color = "darkred", size=15, face="bold")) 

1.3 Identifying TOD Tracts

With census data and transit data ready, let’s jump into TOD analysis! Compared to the textbook, I created a 0.25 mile buffer around the transit stops. This is because the subway stations are very dense throughout the area and I want to distinguish different regions. I tried the three different approaches for selecting tracts. (Figure 1.2) - intersection or clip - relate tracts and the buffer using the latter to cookie cutter the former - Spatial Selection - select all tracts that intersect or touch the buffer - Select by Centroids- select all the tract centroids that intersect the buffer

I select TOD tracts basedon select by Centroids because it both captures a concise set of tracts without altering geometries and the tracts it selected are more characteristic and focused.

D_Buffers <- 
  rbind(
    st_buffer(septaStops, 1320) %>%
      mutate(Legend = "Buffer") %>%
      dplyr::select(Legend),
    st_union(st_buffer(septaStops, 1320)) %>%
      st_sf() %>%
      mutate(Legend = "Unioned Buffer"))
buffer <- filter(D_Buffers, Legend=="Unioned Buffer")

clip <- 
  st_intersection(buffer, tracts09) %>%
    dplyr::select(TotalPop) %>%
    mutate(Selection_Type = "Clip")

selection <- 
  tracts09[buffer,] %>%
    dplyr::select(TotalPop) %>%
    mutate(Selection_Type = "Spatial Selection")


selectCentroids <-
  st_centroid(tracts09)[buffer,] %>%
  st_drop_geometry() %>%
  left_join(dplyr::select(tracts09, GEOID)) %>%
  st_sf() %>%
  dplyr::select(TotalPop) %>%
  mutate(Selection_Type = "Select by Centroids")

selectCompare <- rbind(clip, selection, selectCentroids)
  
ggplot() +
  geom_sf(data=selectCompare, aes(fill = q5(TotalPop)), color = "transparent") +
  scale_fill_manual(values = palette5,labels = qBr(selectCompare, "TotalPop")) +
  labs(title = "Total population within 1/4 mile of subway stations", 
       subtitle = "3 Spatial selection techniques\n",
       caption = 'Figure 1.2')+
  facet_wrap(~Selection_Type) + 
  mapTheme() +
  theme(plot.title = element_text(color = "darkred", size=15, face="bold")) 

Indicated in Figure 1.3.1, in the past 10 years, the overall Tod area did not change too much, which means there is no major transportation construction in the area. But there are still some changes due to the refinements and changes in population zoning.

# Census Data in Group by TODs
allTracts.group <- 
  rbind(
    st_centroid(allTracts)[buffer,] %>%
      st_drop_geometry() %>%
      left_join(allTracts) %>%
      st_sf() %>%
      mutate(TOD = "TOD"),
    st_centroid(allTracts)[buffer, op = st_disjoint] %>%
      st_drop_geometry() %>%
      left_join(allTracts) %>%
      st_sf() %>%
      mutate(TOD = "Non-TOD")) %>%
  mutate(MedRent.inf = ifelse(year == "2009", MedRent * 1.14, MedRent))
         

# TOD and Non-TOD between 2009 and 2020
ggplot()+
  geom_sf(data = allTracts.group, aes(fill = TOD),color ="white", size =.3) +
  scale_fill_manual(values = c('#5f829e','#fab18e'))+
  labs(title = "Time/Space Groups",
       subtitle = '',
       caption = 'Figure 1.3') +
  facet_wrap(~year)+
  mapTheme() + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold")) 

In the past 10 years, the overall median rent has increased very significantly. The trend of rent increasing is also corresponding to the subway lines and stops distribution seen earlier in Figure 1.1.(Rents are higher and rising faster in areas close to stations)

# TOD and Non-TOD median rent between 2009 and 2020
ggplot(allTracts.group)+
  geom_sf(data = st_union(tracts09),fill = "grey90", color = "grey")+
  geom_sf(data = filter(allTracts.group, TOD == "TOD"),aes(fill = q5(MedRent)), color="transparent")+
  scale_fill_manual(values = palette5,
                    labels = qBr(allTracts.group, "MedRent"), 
                    na.value = "transparent") +
  labs(title = "Median rent, 2009-2020",
       subtitle = '',
       caption = 'Figure 1.4') +
  facet_wrap(~year)+
  mapTheme() + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold")) 

2. Changes in Census Variables Over Time and Space

In Section 2, we examined the effects of time (years) and space (TOD vs non-TOD) on our four key Census variables:

  • Median rents
  • Bachelor degree holders
  • Median household income
  • Percentage of White group

Overall, from 2009 to 2020, the Median rents and Median household income increased largely but on Percentage of White group and Bachelor degree holders between two time are not very obvious.

2.1 Median Rent Comparison between 2009 and 2020

It can be seen that in 2009, the TOD area did not have a very high median income but in 2020, the median income of the area increases significantly, which means that the increasing rate of TOD tracts was higher compared to non-TOD tracts.

ggplot(allTracts.group)+
  geom_sf(data = st_union(tracts09), fill = "grey90", color = "grey")+
  geom_sf(aes(fill = q5(MedRent.inf)), color = "transparent") +
  scale_fill_manual(values = c(palette5),
                    labels = qBr(allTracts.group, "MedRent.inf"),
                    name = "Rent\n(Quintile Breaks)",
                    na.value = "transparent") +
  labs(title = "Median Rent (w/inflation) 2009-2020", 
       subtitle = "Real dollars \n",
       caption = 'Figure 2.1') +
 facet_wrap(c(~year,~TOD),ncol=4)+
  mapTheme() + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold"),legend.position = "bottom")

2.2 Percentage of White Group between 2009 and 2020

There was a decline between these two points in time, probably due to a larger population base and a larger foreign population, but it is still evident that whites were mostly concentrated in TOD areas, especially near transit stations.

ggplot(allTracts.group)+
  geom_sf(data = st_union(tracts09), fill = "grey90", color = "grey") +
  geom_sf(aes(fill = q5(pctWhite)), color = "transparent") +
  scale_fill_manual(values = palette5,
                    labels = qBr(allTracts.group, "pctWhite"),
                    name = "Percentage of White Group\n(Quintile Breaks)",
                    na.value = "transparent") +
  labs(title = "Percentage of White Group 2009-2020",
       subtitle = '',
       caption = 'Figure 2.2') +
  facet_wrap(c(~year,~TOD),ncol=4)+
  mapTheme() + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold"),legend.position = "bottom")

2.3 Bachelor Degree Comparison between 2009 and 2020

There was no major change in the overall rate, but people with a bachelor’s degree seemed to cluster near transit stations.

ggplot(allTracts.group)+
  geom_sf(data = st_union(tracts09), fill = "grey90", color = "grey")+
  geom_sf(aes(fill = q5(pctBachelors)), color = "transparent") +
  scale_fill_manual(values = palette5,
                    labels = qBr(allTracts.group, "pctBachelors"),
                    name = "Percentage of Bachelar Degree (%)\n(Quintile Breaks)",
                    na.value = "transparent") +
  labs(title = "Bachelor Degree Comparison between 2009-2020",
       subtitle = '',
       caption = 'Figure 2.3') +
  facet_wrap(c(~year,~TOD),ncol=4)+
  mapTheme() + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold"),legend.position = "bottom")

2.4 Median Household Income Comparison between 2009 and 2020

Similar to Median Rent, the median household income increased largely and the increasing rate of TOD tracts was higher compared to non-TOD tracts.

ggplot(allTracts.group)+
  geom_sf(data = st_union(tracts09), fill = "grey90", color = "grey")+
  geom_sf(aes(fill = q5(MedHHInc)), color = "transparent") +
  scale_fill_manual(values = palette5,
                    labels = qBr(allTracts.group, "MedHHInc"),
                    name = "Median Household Income\n(Quintile Breaks)",
                    na.value = "transparent") +
  labs(title = "Median Household Income 2009-2020",
       subtitle = 'Real dollars \n',
       caption = 'Figure 2.4') +
 facet_wrap(c(~year,~TOD),ncol=4)+
  mapTheme() + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold"),legend.position = "bottom")

3. Bar Plot Comparisons

Grouped bar plots would provide a more precise and direct approach of examining the four variables over time. Some highlights are provided as follows:

  • Percentage of people with a Bachelor’s degree significantly increased for TOD tracts but decreased for those non-TOD tracts.
  • Median household income of TOD tracts and non-TOD tracts both increased but interestingly, income of non-TOD tracts was higher than TOD-tracts all the way. Similar trend can also be found in terms of median rent! Interesting!
  • Population of both non-TOD tracts and TOD tracts decreased and the variance in TOD tracts was greater!
  • Percentage of white group decreased in both non-TOD tracts and TOD tracts. Besides, the white proportion in Tod tracts was much greater than that in non-TOD tracts all the way.
allTracts.Summary <- 
  st_drop_geometry(allTracts.group) %>%
  group_by(year, TOD) %>%
  summarize(Rent = mean(MedRent, na.rm = T),
            Population = mean(TotalPop, na.rm = T),
            `White Proprotion` = mean(pctWhite, na.rm = T),
            `Bachelor Degree` = mean(pctBachelors, na.rm = T),
            Income = mean(MedHHInc, na.rm = T))

allTracts.Summary %>%
  gather(Variable, Value, -year, -TOD) %>%
  ggplot(aes(year, Value, fill = TOD)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~Variable, scales = "free", ncol = 3) +
  scale_fill_manual(values = c("#bae4bc","#0868ac")) +
  labs(title = "Indicator differences across time and space \n",
       caption = 'Figure 3.1') +
  plotTheme() + 
  theme(legend.position="bottom") +
  theme(plot.title = element_text(color = "darkred", size=15, face="bold")) 

4. Table Comparisons

Despite being indirect in terms of visualization, the comparison table still serves as a good approach of extracting the exact values. Some highlights indicated in Table 4.1:

  • Although median rent of TOD tracts was lower compared to non-TOD tracts all the way, the increasing rate of TOD tracts was higher, and it is worth noting that by 2020 the median rent in non-TOD tracts and TOD tracts was almost the same.
  • Percentage of Bachelor Degree holders increased 33% in TOD tracts, while decreased 31.5% in non-TOD tracts.
  • Median income increased 38% in TOD tracts, while increased 21% in non-TOD tracts.
allTracts.Summary %>%
  unite(year.TOD, year, TOD, sep = ": ", remove = T) %>%
  gather(Variable, Value, -year.TOD) %>%
  mutate(Value = round(Value, 2)) %>%
  spread(year.TOD, Value) %>%
  kable() %>%
  kable_styling() %>%
  footnote(general_title = "\n",
           general = "Table 4.1")
Variable 2009: Non-TOD 2009: TOD 2020: Non-TOD 2020: TOD
Bachelor Degree 1.16 1.12 0.98 1.31
Income 67745.26 53426.22 81906.39 73761.39
Population 2979.68 3641.67 2758.27 3335.79
Rent 1101.83 1056.31 1557.53 1556.75
White Proprotion 35.80 48.05 25.74 39.92

Table 4.1

5. Graduated Symbol Maps

From the previous analysis, we can see analysis based on the changes in median and sum from the table summary are very different from that based on the map plots. The table helps us to generalize the trend, but by map plotting we can clearly see that even within the TOD area, there are extreme differences between different tracts.

In this Chapter, I plotted the graduated population and rent within 0.25 miles of each transit station to clearly see the differences between different stations in the TOD tracts.

5.1 Population within 0.25 mile of each transit station

In terms of population, We can see that the total population close to the site is roughly similar, but we can still find transit stations with multiple lines intersecting had a larger population, indicated in Figure 5.1.

popByStation <-
  join_data %>% 
  group_by(name) %>%
  summarize(`Total Population` = sum(TotalPop)) %>%
  dplyr::select(name, `Total Population`) %>%
  st_drop_geometry() %>%
  left_join(septaStops)

popByStation_sf <- popByStation %>%
  st_sf()

ggplot() + 
  geom_sf(data = allTracts.group, fill = "grey90", color = "transparent") +
  geom_sf(data = popByStation_sf, aes(size = `Total Population`), color = '#43a2ca' ,alpha=0.5) +
  geom_sf(data=septaLines, alpha=0.2,color = "darkred")+
  labs(title = "Graduated Symbol Map I: \nPopulation within 0.25 Mile of Each Transit Station" ,
       subtitle = '',
       caption = "Figure 5.1", 
       fill = 'Total Population') +
  mapTheme() + 
  theme(legend.position="right") + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold")) 

5.2 Median rent within 0.25 mile of each transit station

We can also find transit stations with multiple lines intersecting with a higher rent, indicated in Figure 5.2. Accordingly, there is no direct relationship between population and rent between different stations. However, the density of stations might be an influence factor since we noticed there was inconsistency in indicators between TOD tracts in the previous plots.

rentByStation <-
  join_data %>%
  group_by(name) %>%
  summarize(`Median Rent` = median(na.omit(MedRent))) %>%
  dplyr::select(name, `Median Rent`)  %>% 
  st_drop_geometry() %>%
  left_join(septaStops)

rentByStation_sf <- rentByStation %>%
  st_sf()

ggplot() + 
  geom_sf(data = septaLines) +
  geom_sf(data = allTracts.group, fill = "grey90", color = "transparent") +
  geom_sf(data = rentByStation_sf, aes(size = `Median Rent`), color = '#0868ac',alpha=0.5)  +  
  geom_sf(data=septaLines, alpha=0.2,color = "darkred")+
  labs(title = "Graduated Symbol Map II: \nMedian Rent within 0.25 Mile of Each Transit Station",
       subtitle = '',
       caption = "Figure 5.2") +
  mapTheme() + 
  theme(legend.position="right") + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold"))

6. Mean Rent as a function of distance to subway stations

ggplot() +
  geom_sf(data = st_union(tracts09), fill = "grey90",color = "grey90", alpha = 0.8)+
  geom_sf(data = multipleRingBuffer(st_union(septaStops), 10560, 1320),fill = "transparent", color = '#5f829e',size=0.5)+
  geom_sf(data=septaStops,  show.legend = "point",  color = 'darkred', size= 1,alpha = 0.7)+
  labs(title = "0.25 Mile Buffers of Transit Station",
       subtitle = '',
       caption = "Figure 6.1") +
  mapTheme() +
  theme(plot.title = element_text(color = "darkred", size=15, face="bold")) 

The distance to transit station was another factor to examine the effects of TOD on rent level. Generally speaking, rent level of 2020 was higher than 2009 all the time, but the fluctuations of rent level with distance displayed a consistent pattern between 2009 and 2020. In each respective year, rent level was lowest when station was around 0.5 miles away from houses, while the highest rent level occurred when station was around 1.5 miles away from houses. Such a pattern might indicate that residents would not like to live so close to transit stations.

allTracts.rings <-
  st_join(st_centroid(dplyr::select(allTracts, GEOID, year)), 
          multipleRingBuffer(st_union(septaStops), 10560, 1320)
          ,join = st_intersects) %>%
  st_drop_geometry() %>%
  left_join(dplyr::select(allTracts, GEOID, MedRent, year), 
            by=c("GEOID"="GEOID", "year"="year")) %>%
  st_sf() %>%
  mutate(distance = distance / 5280) 

mean_RENT <- st_drop_geometry(allTracts.rings) %>%
  group_by(year, distance) %>%
  summarize(mean_RENT = mean(MedRent, na.rm = T)) 

ggplot(data = mean_RENT) +
  geom_line(aes(x = distance, y = mean_RENT, col = year), size = 2) + 
  geom_point(aes(x = distance, y = mean_RENT, col = year) , size = 4) + 
  labs(title = " Rent as a function of distance to subway stations",  subtitle = '',   caption = 'Figure 6.2') +
  scale_color_manual(values = c('#5f829e','#fab18e'),
                     name = 'Year') +
  theme(legend.position = "right") +
  xlab("Distance to Stations, Miles") + 
  ylab("Average Rents") +
  plotTheme() +
  theme(plot.title = element_text(color = "darkred", size=15, face="bold")) 

7. Public Transit Use within TOD area

There was a finding in previous studies that “people increasingly tend to live in walkable, dense, mixed-use neighborhoods with access to public transportation - which is exactly what TOD provides.” In this chapter, we will explore data on public transportation. The main indicator we use is the percentage of people using public transportation modes.

ggplot(allTracts.group)+
  geom_sf(data = st_union(tracts09), fill = "grey90", color = "grey")+
  geom_sf(aes(fill = q5(pctNonveh)), color = "transparent") +
  scale_fill_manual(values = palette5,
                    labels = qBr(allTracts.group, "pctNonveh"),
                    name = "Nonvehichle Trainsit for Work\n(Quintile Breaks)") +
  labs(title = "Nonvehichle Trainsit for Work 2009-2020",
       caption = 'Figure 7.1') +
 facet_wrap(c(~year,~TOD),ncol=4)+
  mapTheme() + 
  theme(plot.title = element_text(color = "darkred", size=15, face="bold"),legend.position = "bottom")

IV. Conclusion and Recommandation

In the analysis we can see that Transit Oriented Development could be an effective tool to revitalize the outer urban and suburban areas even if there is no major construction or improvement of the transportation system. In 2009, the resources in Queens were not particularly concentrated around transit stations, but after 10 years of development, we can see that median income, per of bachelor degree are obviously more concentrated and increased faster in the TOD area. Through chapter 7 analysis, we can see that even with the construction of parking lots, people still tend to walk due to space constraints and the increase in population density. Also, as the economy grows, areas that are rich in facilities and walkable were more attractive to knowledge workers.

Despite a plausible plan, the construction of TOD areas still needs to take up some challenges and address existing problems. For instance, Queens is the second most populous of the five New York City boroughs. Approximately 47 percent of the residents of Queens are foreign-born. It is necessary that planners and policy makers pay attention to the opportunity equity for different group of people. Meanwhile, the government should control the rapid increase of rent compared to the increase of household income, otherwise, despite being willing to live in TOD areas, residents cannot afford the crazy rent. It’s also worth paying attention to the spatial biases could have on the result of this project since the areas of high rent could be clustering for reasons completely unrelated to transit development but to other policy-driven reasons.

In the future, with the development of technology and the prevalence of the share economy, planners and city builders need to consider urban forms and policy orientations that adapt to the development of the technology economy. Also, future transiy-oriented development may not be limited to rail transit stations, it might take the form of a more integrated transportation node, and we need more spatial research and future imagination based on this.

Ⅴ. Reference: