1. Introduction

Ikea is looking to expand into Boston, MA but need to know where available locations are. In order to serve the target demographic, the new store will be located in an area with a median income of $25,000 to $50,000, and a household value of $200,000 to $800,000.It also need to be built on a lot of at least 200,000 square feet and not located 2,000 feet from a main road. The household value, median income, and road information comes from US Census Data, and the land use data comes from MassGIS.

2. Preparing the data

Loading the necessary packages

library(tidyverse)
library(sf)
Boston_Census_Tracts <- read_sf("C:/Users/shayn/Downloads/R Scripts/CS_07_spatial_case_study_data/CS_07_spatial_case_study_data/Boston_CensusTracts.shp")

Boston_Land_Use <- read_sf("C:/Users/shayn/Downloads/R Scripts/CS_07_spatial_case_study_data/CS_07_spatial_case_study_data/Boston_LandUse.shp")

Boston_Major_Roads <- read_sf("C:/Users/shayn/Downloads/R Scripts/CS_07_spatial_case_study_data/CS_07_spatial_case_study_data/Boston_MajorRoads.shp")
Boston_Census_Tracts

Boston_Major_Roads

Boston_Land_Use
After looking at the tibbles, Boston_Census_Tracts is multipolygon, Boston_Major_Roads is a linestring, and Boston_Land_Use is multipolygon.

Filtering data

Boston_Census_Tracts_Filtered <- Boston_Census_Tracts %>% 
  filter(Med_Income > 25000 & Med_Income < 80000) %>% 
  filter(Med_HouseV > 200000 & Med_HouseV < 500000)
#filtering median income to $25,000-80,000 and median house value to $200,000-500,000

Boston_Land_Use_Filtered <- Boston_Land_Use %>% 
  filter(LU05_DESC == "Open Land")
#filtering the land use catergory to only open lands

Boston_Major_Roads_Filtered <- st_buffer(Boston_Major_Roads, dist = 2000)
#creating a buffer zone for the major roads in Boston with a distance of 2000 ft

Checking validity of the filtered data

st_is_valid(Boston_Census_Tracts_Filtered)
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
st_is_valid(Boston_Land_Use_Filtered)
##   [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [25]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [37]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [49]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [61]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [73]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [85]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [97]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [109]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [121]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [133]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [145]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [157]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [169]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [181]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [193] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [205]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
st_is_valid(Boston_Major_Roads_Filtered)
##   [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##  [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [316] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [331] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [346] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [361] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [376] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [391] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [406] TRUE TRUE TRUE
There is an invalid value in “land use”, so the geometry must be made valid
Boston_Land_Use_Valid <- st_make_valid(Boston_Land_Use_Filtered)

Finding intersections of the filtered data

tracts_roads_land <- st_intersection(Boston_Census_Tracts_Filtered, Boston_Land_Use_Valid, Boston_Major_Roads_Filtered) %>% 
  st_union() %>% 
  st_cast("POLYGON") %>% 
  st_as_sf()

Calculating area of the unioned polygons

area_tracts_roads_land <- as.numeric(st_area(tracts_roads_land))

possible_locations <- tracts_roads_land %>% 
  mutate(area = as.numeric(st_area(tracts_roads_land))) %>% 
  filter(area > 200000) 
The areas were filtered to greater than 200,000 square feet, where an Ikea store can be built.

Selecting areas where people live

Boston_Census_Tracts <- filter(Boston_Census_Tracts, Med_Income > 1)

3. Map of Available Locations

A map of the final location candidates

#saving plot 
png("C:/Users/shayn/Downloads/R Scripts/CS_07_spatial_case_study_data/CS_07_spatial_case_study_data/possible_locations.png")

#make plot
ggplot() +
  geom_sf(data = Boston_Census_Tracts, aes(fill = Med_Income)) +
  scale_fill_distiller(name = "Median Income") +
  geom_sf(data = possible_locations, fill = "green", aes(color = "green")) + 
  scale_color_manual(values = "green",
                    name = "Possible Ikea Locations",
                    labels = "Available plots") +
  labs(
    title = "Possible Locations for Boston Ikea",
    subtitle = "Data from US Census Bureau and MassGIS",
    xlabs = "Easting",
    ylabs = "Northing") +
  theme_classic()

#closing file
dev.off
## function (which = dev.cur()) 
## {
##     if (which == 1) 
##         stop("cannot shut down device 1 (the null device)")
##     .External(C_devoff, as.integer(which))
##     dev.cur()
## }
## <bytecode: 0x0000000013ccfe90>
## <environment: namespace:grDevices>

4. Conclusion

There are 20 possible locations for the new Ikea store. In western Boston, there are 14 open lots, and there are 6 open lots in central Boston.They are all located in areas with a median income between $50,000 and $100,000. Based on the desire median income, a western location would be better as the median income is closer to their target.