-
Notifications
You must be signed in to change notification settings - Fork 21
/
README.Rmd
425 lines (367 loc) · 13 KB
/
README.Rmd
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
---
title: "osmplotr, an R package for making maps with OpenStreetMap data"
keywords: "open street map, openstreetmap, OSM, map, visualisation, visualization"
output:
rmarkdown::html_vignette:
self_contained: no
md_document:
variant: markdown_github
---
<!-- README.md is generated from README.Rmd. Please edit that file -->
```{r opts, echo = FALSE}
knitr::opts_chunk$set (
collapse = TRUE,
warning = TRUE,
message = TRUE,
width = 120,
comment = "#>",
fig.retina = 2,
fig.path = "README-"
)
```
[![R build
status](https://github.com/ropensci/osmplotr/workflows/R-CMD-check/badge.svg)](https://github.com/ropensci/osmplotr/actions?query=workflow%3AR-CMD-check)
[![codecov](https://codecov.io/gh/ropensci/osmplotr/branch/master/graph/badge.svg)](https://codecov.io/gh/ropensci/osmplotr)
[![Project Status: Active](http://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/)
![](man/figures/map1.png)
[![CRAN Downloads](http://cranlogs.r-pkg.org/badges/grand-total/osmplotr?color=orange)](http://cran.r-project.org/package=osmplotr/)
[![CRAN_Status_Badge](http://www.r-pkg.org/badges/version/osmplotr)](http://cran.r-project.org/package=osmplotr/)
[![](https://badges.ropensci.org/27_status.svg)](https://github.com/ropensci/software-review/issues/27)
R package to produce visually impressive customisable images of OpenStreetMap
(OSM) data downloaded internally from the
[overpass api](http://overpass-api.de/). The above map was produced directly
from `osmplotr` with no further modification. This `README` briefly demonstrates
the following functionality:
[1. Quick Introduction](#1 intro)
[2. Installation](#2 installation)
[3. A Simple Map](#3 simple map)
[4. Highlighting Selected Areas](#4 highlighting areas)
[5. Highlighting Clusters](#5 highlighting clusters)
[6. Highlighting Areas Bounded by Named Highways](#6 highlighting with highways)
[7. Data Surfaces](#7 data surfaces)
[8. Gallery](#8 gallery)
---------------
## <a name="1 intro"></a>1. Quick Introduction
But first the easy steps to map making:
```{r, echo = FALSE, message = FALSE, eval = TRUE}
library (osmplotr)
```
1. Specify the bounding box for the desired region
```{r}
bbox <- get_bbox (c (-0.15, 51.5, -0.10, 51.52))
```
2. Download the desired data---in this case, all building perimeters.
```{r, eval = FALSE}
dat_B <- extract_osm_objects (key = "building", bbox = bbox)
```
3. Initiate an `osm_basemap` with desired background (`bg`) colour
```{r map1, eval = FALSE}
map <- osm_basemap (bbox = bbox, bg = "gray20")
```
4. Overlay objects on plot in the desired colour.
```{r, eval = FALSE}
map <- add_osm_objects (map, dat_B, col = "gray40")
```
5. Print the map to graphics device of choice
```{r, eval = FALSE}
print_osm_map (map)
```
```{r london2, echo = FALSE, eval = FALSE}
library (osmdata)
bbox <- get_bbox (c (-0.15, 51.5, -0.10, 51.52))
q0 <- opq (bbox)
q1 <- add_osm_feature (q0, key = "building")
dat_B <- osmdata_sf (q1, quiet = FALSE)$osm_polygons
q1 <- add_osm_feature (q0, key = "highway")
dat_H <- osmdata_sf (q1, quiet = FALSE)$osm_lines
q1 <- add_osm_feature (q0, key = "leisure", value = "park")
dat_P <- osmdata_sf (q1, quiet = FALSE)$osm_polygons
q1 <- add_osm_feature (q0, key = "landuse", value = "grass")
dat_G <- osmdata_sf (q1, quiet = FALSE)$osm_polygons
london2 <- list (dat_B = dat_B, dat_H = dat_H, dat_P = dat_P, dat_G = dat_G)
save (london2, file = "london2.rda")
```
---------------
## <a name="2 installation"></a>2. Installation
First install the package
```{r, eval = FALSE}
install.packages ("osmplotr")
```
or the development version
```{r, eval = FALSE}
devtools::install_github ("ropensci/osmplotr")
```
And then load it in the usual way
```{r, eval = FALSE}
library (osmplotr)
```
---------------
## <a name="3 simple map"></a>3. A Simple Map
Simple maps can be made by overlaying different kinds of OSM data in different
colours:
```{r, eval = FALSE}
dat_H <- extract_osm_objects (key = "highway", bbox = bbox)
dat_P <- extract_osm_objects (key = "park", bbox = bbox)
dat_G <- extract_osm_objects (key = "landuse", value = "grass", bbox = bbox)
```
```{r, echo = FALSE, eval = FALSE}
load ("london2.rda")
dat_B <- london2$dat_B
dat_H <- london2$dat_H
dat_G <- london2$dat_G
dat_P <- london2$dat_P
```
```{r map2, eval = FALSE}
map <- osm_basemap (bbox = bbox, bg = "gray20")
map <- add_osm_objects (map, dat_B, col = "gray40")
map <- add_osm_objects (map, dat_H, col = "gray80")
map <- add_osm_objects (map, dat_P, col = "darkseagreen")
map <- add_osm_objects (map, dat_G, col = "darkseagreen1")
print_osm_map (map)
```
```{r map2-print, eval = FALSE, echo = FALSE}
print_osm_map (map, file = "map2.png", width = 600, units = "px", dpi = 72)
```
<!--
![](./man/figures/map2.png)
-->
<img src="man/figures/map2.png" width = "80%"/>
---------------
## <a name="4 highlighting areas"></a>4. Highlighting Selected Areas
`osmplotr` is primarily intended as a data visualisation tool, particularly
through enabling selected regions to be highlighted. Regions can be defined
according to simple point boundaries:
```{r}
pts <- sp::SpatialPoints (cbind (
c (-0.115, -0.13, -0.13, -0.115),
c (51.505, 51.505, 51.515, 51.515)
))
```
OSM objects within the defined regions can then be highlighted with different
colour schemes. `cols` defines colours for each group (with only one here),
while `bg` defines the colour of the remaining, background area.
```{r map3, eval = FALSE}
map <- osm_basemap (bbox = bbox, bg = "gray20")
map <- add_osm_groups (map, dat_B, groups = pts, cols = "orange", bg = "gray40")
map <- add_osm_objects (map, london$dat_P, col = "darkseagreen1")
map <- add_osm_groups (
map,
london$dat_P,
groups = pts,
cols = "darkseagreen1",
bg = "darkseagreen",
boundary = 0
)
print_osm_map (map)
```
```{r map3-print, eval = FALSE, echo = FALSE}
print_osm_map (map, filename = "map3.png", width = 600, units = "px", dpi = 72)
```
<!--
![](./man/figures/map3.png)
-->
<img src="man/figures/map3.png" width = "80%"/>
Note the `border = 0` argument on the last call divides the park polygons
precisely along the border. The same map highlighted in dark-on-light:
```{r map4, eval = FALSE}
map <- osm_basemap (bbox = bbox, bg = "gray95")
map <- add_osm_groups (map, dat_B, groups = pts, cols = "gray40", bg = "gray85")
map <- add_osm_groups (map, dat_H, groups = pts, cols = "gray20", bg = "gray70")
print_osm_map (map)
```
```{r map4-print, eval = FALSE, echo = FALSE}
print_osm_map (map, filename = "map4.png", width = 600, units = "px", dpi = 72)
```
<!--
![](./man/figures/map4.png)
-->
<img src="man/figures/map4.png" width = "80%"/>
---------------
## <a name="5 highlighting clusters"></a>5. Highlighting Clusters
`add_osm_groups` also enables plotting an entire region as a group of
spatially distinct clusters of defined colours. Groups can be defined by simple
spatial points denoting their centres:
```{r, echo = TRUE}
set.seed (2)
ngroups <- 12
x <- bbox [1, 1] + runif (ngroups) * diff (bbox [1, ])
y <- bbox [2, 1] + runif (ngroups) * diff (bbox [2, ])
groups <- cbind (x, y)
groups <- apply (groups, 1, function (i) {
sp::SpatialPoints (matrix (i, nrow = 1, ncol = 2))
})
```
Calling `add_osm_groups` with no `bg` argument forces all points lying outside
those defined groups to be allocated to the nearest groups, and thus produces an
inclusive grouping extending across an entire region.
```{r map5, eval = FALSE}
map <- osm_basemap (bbox = bbox, bg = "gray20")
map <- add_osm_groups (
map,
dat_B,
groups = groups,
cols = rainbow (length (groups)),
border_width = 2
)
print_osm_map (map)
```
```{r map5-print, eval = FALSE, echo = FALSE}
print_osm_map (map, filename = "map5.png", width = 600, units = "px", dpi = 72)
```
<!--
![](./man/figures/map5.png)
-->
<img src="man/figures/map5.png" width = "80%"/>
---------------
## <a name="6 highlighting with highways"></a>6. Highlighting Areas Bounded by Named Highways
An alternative way of defining highlighted groups is by naming the highways
encircling desired regions.
```{r, eval = FALSE}
# These highways extend beyond the previous, smaller bbox
bbox_big <- get_bbox (c (-0.15, 51.5, -0.10, 51.52))
highways <- c (
"Davies.St", "Berkeley.Sq", "Berkeley.St", "Piccadilly",
"Regent.St", "Oxford.St"
)
highways1 <- connect_highways (highways = highways, bbox = bbox_big)
highways <- c ("Regent.St", "Oxford.St", "Shaftesbury")
highways2 <- connect_highways (highways = highways, bbox = bbox_big)
highways <- c (
"Piccadilly", "Shaftesbury.Ave", "Charing.Cross.R",
"Saint.Martin", "Trafalgar.Sq", "Cockspur.St",
"Pall.Mall", "St.James"
)
highways3 <- connect_highways (highways = highways, bbox = bbox_big)
highways <- c (
"Charing.Cross", "Duncannon.St", "Strand", "Aldwych",
"Kingsway", "High.Holborn", "Shaftesbury.Ave"
)
highways4 <- connect_highways (highways = highways, bbox = bbox_big)
highways <- c (
"Kingsway", "Holborn", "Farringdon.St", "Strand",
"Fleet.St", "Aldwych"
)
highways5 <- connect_highways (highways = highways, bbox = bbox_big)
groups <- list (highways1, highways2, highways3, highways4, highways5)
```
And then passing these lists of groups returned by `connect_highways` to
`add_osm_groups`, this time with some Wes Anderson flair.
```{r map 6, eval = FALSE}
map <- osm_basemap (bbox = bbox, bg = "gray20")
library (wesanderson)
cols <- wes_palette ("Darjeeling", 5)
map <- add_osm_groups (
map,
dat_B,
groups = groups,
boundary = 1,
cols = cols,
bg = "gray40",
colmat = FALSE
)
map <- add_osm_groups (
map,
dat_H,
groups = groups,
boundary = 0,
cols = cols,
bg = "gray70",
colmat = FALSE
)
print_osm_map (map)
```
```{r map6-print, eval = FALSE, echo = FALSE}
print_osm_map (map, filename = "map6.png", width = 600, units = "px", dpi = 72)
```
<!--
![](./man/figures/map6.png)
-->
<img src="man/figures/map6.png" width = "80%"/>
---------------
## <a name="7 data surfaces"></a>7. Data Surfaces
Finally, `osmplotr` contains a function `add_osm_surface` that spatially
interpolates a given set of spatial data points and colours OSM objects
according to a specified colour gradient. This is illustrated here with the
`volcano` data projected onto the `bbox`.
```{r}
x <- seq (bbox [1, 1], bbox [1, 2], length.out = dim (volcano) [1])
y <- seq (bbox [2, 1], bbox [2, 2], length.out = dim (volcano) [2])
xy <- cbind (rep (x, dim (volcano) [2]), rep (y, each = dim (volcano) [1]))
z <- as.numeric (volcano)
dat <- data.frame (x = xy [, 1], y = xy [, 2], z = z)
```
```{r map7, eval = FALSE}
map <- osm_basemap (bbox = bbox, bg = "gray20")
cols <- gray (0:50 / 50)
map <- add_osm_surface (map, dat_B, dat = dat, cols = cols)
# Darken cols by ~20%
map <- add_osm_surface (
map,
dat_H,
dat = dat,
cols = adjust_colours (cols, -0.2)
)
map <- add_colourbar (map, cols = cols, zlims = range (volcano))
map <- add_axes (map)
print_osm_map (map)
```
```{r map7-print, eval = FALSE, echo = FALSE}
print_osm_map (map, filename = "map7.png", width = 600, units = "px", dpi = 72)
```
```{r map1-print, eval = FALSE, echo = FALSE}
# This is map1 used as the title
# extrafont::loadfonts ()
lab_dat <- data.frame (
x = mean (bbox [1, ]), y = mean (bbox [2, ]),
lab = "osmplotr"
)
aes <- ggplot2::aes (x, y, label = lab)
bbox <- get_bbox (c (-0.15, 51.5, -0.10, 51.52))
map <- osm_basemap (bbox = bbox, bg = "gray20")
cols <- gray (0:50 / 50)
map <- add_osm_surface (map, dat_B, dat = dat, cols = cols)
map <- add_osm_surface (
map,
dat_H,
dat = dat,
cols = adjust_colours (cols, -0.2)
)
# map2 <- map + ggplot2::geom_text (dat = dat, mapping = aes, size = 60,
# colour = "white",
# family = "Lato Light", nudge_y = 0.0015)
map2 <- map + ggplot2::geom_text (
dat = lab_dat, mapping = aes, size = 45,
colour = "black",
family = "Purisa", fontface = 2,
nudge_y = 0.0005, nudge_x = 0.0005
)
map2 <- map2 + ggplot2::geom_text (
dat = lab_dat, mapping = aes, size = 45,
colour = "white", family = "Purisa",
nudge_y = 0.001, fontface = 2
)
print_osm_map (map2,
filename = "map1.png", width = 800, units = "px",
dpi = 72
)
```
<!--
![](./man/figures/map7.png)
-->
<img src="man/figures/map7.png" width = "80%"/>
---------------
## <a name="8 gallery"></a>8. Gallery
Got a nice `osmplotr` map? Please contribute in one of the following ways:
1. Fork repo, add link to `README.md/.Rmd`, and send pull request; or
2. Open issue with details; or
3. Send email to address in
[`DESCRIPTION`](https://github.com/ropensci/osmplotr/blob/master/DESCRIPTION).
---------------
See package vignettes
([basic maps](https://docs.ropensci.org/osmplotr/articles/basic-maps.html) and
[data maps](https://docs.ropensci.org/osmplotr/articles/data-maps.html)) for a
lot more detail and further capabilities of `osmplotr`. Please note that this
project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By
participating in this project you agree to abide by its terms.
--------------
[![ropensci\_footer](https://ropensci.org//public_images/github_footer.png)](https://ropensci.org/)