The Bing Maps team at Microsoft recently released a dataset of nearly 125 million building footprints across United States.
These footprints were derived using a two-step process. First, the team used a deep residual neural network to identify likely building pixels. Second, they developed a novel method for grouping the building pixels into sensible polygons.
I plotted the building footprints around Mall in Washington, D.C. over satellite imagery for a quick visual inspection:
Spend a few minutes exploring the map and you’ll see (1) that the Bing Maps team’s results are quite good and (2) there are still anomalies that demonstrate why this is such a hard problem. Notably, the two-step approach struggles with irregular buildings, especially those with curves.
Edge cases aside, these are promising results and boon for projects like Open Street Map. I look forward to seeing if/when the Bing Maps team releases datasets for other countries. Those data would be quite helpful for a number of development and humanitarian problems from poverty estimation to disaster response.
The code to download the Microsoft data and build the map is below. As an aside, I recently made the jump and switched my R spatial workflow over from sp to sf. It’s been great and I honestly haven’t looked back once.
library(tidyverse) library(sf) library(tigris) library(mapview) # download and unzip data from https://github.com/Microsoft/USBuildingFootprints url_dc <- "https://usbuildingdata.blob.core.windows.net/usbuildings/DistrictofColumbia.zip" download.file(url_dc, "DistrictofColumbia.zip") unzip("DistrictofColumbia.zip") # read in building shapes dc_buildings <- st_read("DistrictofColumbia.json") # use the tigris package to get the census tract shapefile options(tigris_class = "sf") # defaults to sp; manually set to sf dc_tracts <- tracts(state = "DC") # filter down to census tracts around the mall mall_tracts <- dc_tracts %>% filter(NAME %in% c(56, 58, 59, 62.02, 65, 66, 82, 101, 102, 105, 107, 108)) # reproject the mall_tracts mall_tracts_t <- st_transform(hirsh_tracts, st_crs(dc_buildings)) # clip buildings file to just mall_tracts boundaries dc_building_select <- st_intersection(mall_tracts_t, dc_buildings) # make a quick interactive map for inspection mapview(dc_building_select, col.regions = "coral", color = "white", map.type = "Esri.WorldImagery")