-
Notifications
You must be signed in to change notification settings - Fork 0
/
buildings.qmd
210 lines (153 loc) · 9.92 KB
/
buildings.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# Buildings {#sec-buildings}
```{r}
# load packages to get data
library(dplyr)
library(sf)
library(osmdata)
library(osmplotr)
source("R/centroid_bbox.R")
```
The enclaves of "old Bombay" are worlds apart from the tumultuous jumble of urban form exemplified by my neighbourhood in Navi Mumbai (@sec-pois). The ornate and eclectic buildings in the tree-lined neighbourhoods of Colaba or Parsi Colony are sagging, crumbling and past their prime but oozing charm and beauty that take your breath away.
::: {layout-ncol=2}
![Parsi colony, Mumbai.](./assets/parsi-colony.jpeg)
![Badhwar Park, Mumbai.](./assets/badhwar-park.jpeg)
:::
## Buildings anchor the city
Like any city in India (and perhaps more so), Mumbai is a city of contradictions and contrast. The razzle dazzle of Bollywood make it the city of dreams but the vast droves of rural migrant workers living in slums also make it the city of inequality.
> India loves to contradict itself on everything and anything. [...] Every stereotype you know of India is completely true. At the same time the stereotypes are being broken all the time... Love is forbidden but romance is blossoming. India is poor, but it is a land of luxury. It has blazing hot summers and snows in the winter. It has the most barren deserts and the lushest jungles...
- _The Chennai Expat Guide (2018)_ @claridgeChennaiExpatGuide2018
Buildings anchor urban form and their spread and style also dictate the aesthetics. This is even more the case for urban areas with a large number of informal dwellings (independent or as part of a slum cluster). Within slums, buildings dictate movement more than street networks via narrow alleys (“gullies” in Mumbai parlance) rather than formally managed and designed streets.
> If you look over the sprawl extending out from Indian cities, you will see that there are a lot of informal developments that are not slums. The more affluent of these settlements differ in terms of their density and the materials from which they are built, and they tend to be made up of single family homes with private space. Yet the form of the settlement, the layout of streets and spaces, and the relationship of homes to each other is not so different from the poorest settlements made out of corrugated sheet and tarpaulin.
- _Climax city (2019)_ @rudlinClimaxCityMasterplanning2019
::: {layout-ncol=2}
![Shivaji Nagar. A large informal development where informal dwellings have been upgraded in areas around built streets.](./assets/shivaji-nagar.jpeg)
![Mankhurd. Another area with extensive informal urbanisation but many dwellings are still quite raw.](./assets/mankhurd.jpeg)
:::
## Getting building data
The R package `osmdata` can be used to query for building polygons in a small area. A helper function is used to simplify the generation of a bounding box around a central point. The quality of OSM in New Zealand is very high since LINZ manages regular uploads through their process of deriving outlines from satellite imagery.
```{r}
#| echo: true
#| cache: true
# load packages to get data
library(dplyr)
library(sf)
library(osmdata)
library(osmplotr)
source("R/centroid_bbox.R")
akl_bbox <- get_centroid_bounding_box(
c("lat" = -36.85494696219434, "lng" = 174.76040843528585),
distance = 1000,
dist.unit = "m") %>%
get_bbox()
akl_bldgs_osm <- opq(akl_bbox) %>%
add_osm_feature("building") %>%
osmdata_sf()
akl_bldgs_osm_poly <- bind_rows(
akl_bldgs_osm$osm_polygons,
akl_bldgs_osm$osm_multipolygons
) %>%
st_make_valid()
```
```{r}
#| echo: true
#| label: fig-bldgs-osm
#| out.width: 100%
#| fig-cap: Map of buildings in Central Auckland from OpenStreetMap (OSSM).
# load plotting library
library(tmap)
tmap_options(check.and.fix = TRUE)
# plot buildings on map
tmap_mode("plot")
tm_shape(akl_bldgs_osm_poly) +
tm_polygons()
```
Querying building data for a large area from OSM is not performant. For larger scale analyses, [LINZ has building outlines](https://data.linz.govt.nz/layer/101290-nz-building-outlines/) available to download for the whole country or for a cropped section.
```{r}
#| echo: true
#| warning: false
#| output: false
# get buildings from LINZ export
# https://data.linz.govt.nz/layer/101290-nz-building-outlines/
akl_bldgs <- st_read("./extdata/nz-building-outlines.shp")
```
```{r}
#| echo: true
#| label: fig-bldgs-linz
#| out-width: 100%
#| fig-cap: Map of buildings around Auckland Harbour from LINZ.
# plot buildings around Auckland Harbour
tmap_mode("plot")
tm_shape(akl_bldgs) +
tm_polygons()
```
Building data quality and availability is an issue for analyses of developing nations - where the lower resources and capacity of local municipalities cannot keep up with the pace of informal development. Building shapes derived from satellite imagery help to address this issue (somewhat). Both [Google Open Buildings](https://sites.research.google/open-buildings/) and [Microsoft Global ML](https://github.com/microsoft/GlobalMLBuildingFootprints) provide global coverage of building footprints. While Global ML has poor resolution and doesn't correctly sub-divide the tightly clustered urban form of slums, the projects are in their nascence and it's likely that they will only get better over time.
![](./assets/global-ml-osm.png)
The highest quality building available currently is the EUCUCCO dataset @milojevic-dupontEUBUCCOV0European2023. This dataset allows for detaileed analysis of urban form as it includes attributes like building type (use), height and date of construction. With such a rich dataset, the evolution and type of urban form can be traced through time. It's especially useful as a comparsion to theories in urban economics.
![Some of the building attributes available in EUBUCCO. Example of Paris reproduced from _Milojevic-Dupont et al._ @milojevic-dupontEUBUCCOV0European2023.](./assets/eubucco.png)
## Figure-ground diagrams {#sec-figure-ground}
Figure-ground diagrams highlight built and unbuilt space. Only buildings are included in the conventional approach resulting in a stark mosaic of black and white that allows for a bird’s eye analysis of urban form and structures. However, the diagram can be adjusted by adding green space, water bodies and streets with a tentative width corresponding to its hierarchy for more insights about the urban tissue.
> By showing buildings in black and removing most other detail, they [the figure-ground] reveal the truth about a place. Like X-rays, they are calibrated to see through the tissue of detail on a map or aerial photo, revealing the underlying structure of an urban area. In doing so, the plans reveal the shattering and decay of many industrial towns and cities as well as the inner beauty and structure of ‘healthy’ urban places. You can look at the figure ground plan of a city and ‘read’ the place: you can generally tell where the centre is and trace the transept to its suburbs, you can follow the line of the most important commercial streets, identify which districts are thriving and which are declining.
- _Climax city (2019)_ @rudlinClimaxCityMasterplanning2019
Figure-ground diagrams capture a square mile section of an urban area [@morphocodeFiguregroundDiagram2019] - a rounded 2km$^2$ in metric terms. However, given the highly heterogeneous urban mosaic of megacities like Mumbai, smaller areas are more meaningful as they represent a consistently designed space. With this rationale, the figure-ground diagrams in @fig-figure-ground have a 500m bounding box around a central coordinate.
The famous rectangular blocks of New York City (NYC) are a stark contrast to the more sinuous blocks of British (local and colonial) urbanism. Secondary or tertiary roads surround all blocks in NYC while blocks in Islington and Dadar Parsi Colony, two residential neighbourhoods of British design, are connected by residential roads with arterial connections much further away.
```{r}
#| include: false
library(osmdata)
library(sf)
library(dplyr)
library(ggplot2)
library(patchwork)
library(osmplotr)
library(ggsn)
source("R/return_poche_map.R")
```
```{r}
#| output: false
#| cache: true
# bounding boxes and extend with spacey function
pc_bbox <- get_centroid_bounding_box(
c("lat" = 19.01879, "lng" = 72.85141),
distance = 500,
dist.unit = "m") %>%
get_bbox()
be_bbox <- get_centroid_bounding_box(
c("lat" = 18.93566, "lng" = 72.8401),
distance = 500,
dist.unit = "m") %>%
get_bbox()
nyc_bbox <- get_centroid_bounding_box(
c("lat" = 40.7921, "lng" = -73.9718),
distance = 500,
dist.unit = "m") %>%
get_bbox()
ldn_bbox <- get_centroid_bounding_box(
c("lat" = 51.53827, "lng" = -0.09772),
distance = 500,
dist.unit = "m") %>%
get_bbox()
```
```{r}
#| output: false
#| cache: true
# return individual plot objects
p1 <- return_poche_map(pc_bbox, "Parsi Colony, Dadar", bldg_colour = "black", map_bg = "white")
p2 <- return_poche_map(be_bbox, "Ballard Estate, Fort", bldg_colour = "black", map_bg = "white")
p3 <- return_poche_map(nyc_bbox, "Upper West Side, NYC", bldg_colour = "black", map_bg = "white")
p4 <- return_poche_map(ldn_bbox, "Islington, London", bldg_colour = "black", map_bg = "white")
```
```{r}
#| out.width: 100%
#| label: fig-figure-ground
#| fig-cap: Modified figure-ground diagrams (with street widths) for neighbourhoods in Mumbai, London and New York City. Decreasing width in order of OSM classification - primary, secondary, tertiary, residential.
# Compose plot
((p1 + theme(plot.margin = unit(c(0,10,10,0), "pt"))) +
(p2 + theme(plot.margin = unit(c(0,10,10,0), "pt")))) /
((p3 + theme(plot.margin = unit(c(0,10,0,0), "pt"))) +
(p4))
```
## Resources
- [Google Open Buildings](https://sites.research.google/open-buildings/)
- [Microsoft GlobalML](https://github.com/microsoft/GlobalMLBuildingFootprints)
- [Getting building footprints from GlobalML](https://shriv.github.io/e-flaneur/posts/global-ml/)
- [History of figure-ground diagrams](https://morphocode.com/figure-ground-diagram/)
- [Building figure-ground diagrams with `osmplotr` in R](https://shriv.github.io/e-flaneur/posts/osmplotr/)