[R-sig-Geo] Adding Census polygons to OSM map?

Howard, Tim G (DEC) t|m@how@rd @end|ng |rom dec@ny@gov
Thu Jun 8 14:53:26 CEST 2023


Kevin, 
To get the basemap in plot mode you need to download the tiles using read_osm. This works for me, I 
Simplified a bit:

library(sf)
library(tmap)
library(tigris)
options(tigris_use_cache = TRUE)
library(tmaptools)

## Get an example census map:
rw_tract <- tracts(state = "MD",
                   county = "Baltimore city",
                   year = "2020") 
rw_tract <- rw_tract[rw_tract$NAME == "2711.01",]

# for some reason had to re-jigger the box a bit.
# also note your longitudes were backwards. 
lat_max <- 39.36 
long_min <- -76.63
lat_min <- 39.34 
long_max <- -76.60 

bbox <- bb(c(xmin=long_min, ymin=lat_min, xmax=long_max, ymax=lat_max))

basem <- read_osm(bbox)

tmap_mode("plot")

myMap <- tm_shape(basem) +
  tm_rgb() +
  tm_shape(rw_tract) +
  tm_polygons(alpha = 0.2, col = "green") + 
  tm_scale_bar() +
  tm_layout(title = "Radnor-Winston Neighborhood")

# check it out
myMap
# save it. 
tmap_save(myMap, "c:/temp/myMapOut.jpg")


Hope that helps. 
Tim






> -----Original Message-----
> From: Kevin Zembower <kevin using zembower.org>
> Sent: Wednesday, June 7, 2023 5:59 PM
> To: Howard, Tim G (DEC) <tim.howard using dec.ny.gov>; r-sig-geo using r-
> project.org
> Subject: Re: Adding Census polygons to OSM map?
> 
> ATTENTION: This email came from an external source. Do not open
> attachments or click on links from unknown senders or unexpected emails.
> 
> 
> Tim, thank you very much. Yes, tmap seems to be moving in the right
> direction for me. This is what I can do with it so far:
> =====================================
> ## Trying with tmap:
> library(tidyverse)
> library(sf)
> library(tmap)
> library(terra)
> library(spData)
> library(spDataLarge)
> library(tigris)
> options(tigris_use_cache = TRUE)
> library(OpenStreetMap)
> 
> ## Get an Open Street Map:
> rw_map <- openmap(nw, se,
>                    type = "osm",
>                    mergeTiles = TRUE) %>%
>      openproj(projection = "+proj=longlat +ellps=WGS84 +datum=WGS84
> +no_defs")
> 
> ## Get an example census map:
> rw_tract <- tracts(state = "MD",
>                     county = "Baltimore city",
>                     year = "2020") %>%
>      filter(NAME == "2711.01")
> 
> ttm()
> 
> ## Quick Tmap; also works:
> qtm(rw_tract)
> 
> ## Also works. _polygons combines _fill and _borders:
> tm_shape(rw_tract) +
>      tm_polygons()
> 
> ## Works:
> tm_shape(rw_tract) +
>      tm_polygons(alpha = 0.2, col = "green") +
>      tm_scale_bar() +
>      tm_layout(title = "Radnor-Winston Neighborhood") +
>      tm_basemap(server = "OpenStreetMap")
> 
> =======================================
> 
> So, in that last example, I can plot the basemap from Open Street Maps with
> the Census tract on top of it. However, from what I've learned so far (just
> about 4 hours of study), tm_basemap() only works with interactive maps
> that are 'viewed' (in a browser as HTML) rather than plotted (printed). I don't
> understand why I can't just get the appearance I want without all the
> unwanted interactivity features.
> 
> To take it a step further, I don't understand why I can't just plot both the
> basemap and the census tract with something like plot() (from
> ggplot) and sf.
> 
> Thanks, again, Tim, for your suggestion. I think it's moving me in the right
> direction.
> 
> -Kevin
> 
> On 6/7/23 10:57, Howard, Tim G (DEC) wrote:
> > Kevin,
> > the tmap​ package might be what you are looking for.
> >
> > https://gcc02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcran
> > .r-project.org%2Fweb%2Fpackages%2Ftmap%2Fvignettes%2Ftmap-
> getstarted.h
> >
> tml&data=05%7C01%7Ctim.howard%40dec.ny.gov%7C4d3f99e6eeff4493a3a
> 108db6
> >
> 7a26858%7Cf46cb8ea79004d108ceb80e8c1c81ee7%7C0%7C0%7C63821771946
> 393381
> >
> 9%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzI
> iLCJBTiI6
> >
> Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=MY4b3C%2Bqm7w
> ycxiX%2F3ww5
> > zMLltw59fmCgQTAeSxGu60%3D&reserved=0
> >
> > https://gcc02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcran
> > .r-
> project.org%2Fweb%2Fpackages%2Ftmap%2Findex.html&data=05%7C01%7
> Ctim
> >
> .howard%40dec.ny.gov%7C4d3f99e6eeff4493a3a108db67a26858%7Cf46cb8e
> a7900
> >
> 4d108ceb80e8c1c81ee7%7C0%7C0%7C638217719463933819%7CUnknown%7
> CTWFpbGZs
> >
> b3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn
> 0%3D
> >
> %7C3000%7C%7C%7C&sdata=R61uJO4g0WW1GLh47uXGCB%2FX6%2B9grO4
> WYue3XxkfdQ0
> > %3D&reserved=0
> >
> >
> > Cheers,
> > Tim
> >
> > From: R-sig-Geo <r-sig-geo-bounces using r-project.org> on behalf of Kevin
> > Zembower via R-sig-Geo <r-sig-geo using r-project.org>
> > Sent: Monday, June 5, 2023 11:21 AM
> > To: r-sig-geo using r-project.org <r-sig-geo using r-project.org>
> > Subject: [R-sig-Geo] Adding Census polygons to OSM map?
> >
> > ATTENTION: This email came from an external source. Do not open
> attachments or click on links from unknown senders or unexpected emails.
> >
> >
> > Hello, again,
> >
> > I've given up my work with leaflet, trying to map my neighborhood with
> > US Census boundaries. Even though it was quick and easy to add the
> > Census boundaries to the map, I couldn't create the labels I wanted
> > (see
> > https://gcc02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat
> > .ethz.ch%2Fpipermail%2Fr-sig-geo%2F2023-
> June%2F029284.html&data=05%7C01%7Ctim.howard%40dec.ny.gov%7C4d3f
> 99e6eeff4493a3a108db67a26858%7Cf46cb8ea79004d108ceb80e8c1c81ee7%7
> C0%7C0%7C638217719464245369%7CUnknown%7CTWFpbGZsb3d8eyJWIjoi
> MC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C300
> 0%7C%7C%7C&sdata=pQUYMZs%2FRsLeotKUB0XduKCkpq6Ir0Vq3VPsAZ8eT
> Yk%3D&reserved=0). Also, it seems like leaflet added a lot of overhead that I
> didn't need, such as interactive maps. I just need a color printed 2D map for
> my use.
> >
> > I'm now trying to work with tigris and OpenStreetMap, but I can't draw
> > the US Census boundaries on the OSM map. Here's what I have so far:
> >
> > ==================================================
> > ## Experiment, using sf:
> > library(tidyverse)
> > library(tigris)
> > options(tigris_use_cache = TRUE)
> > library(sf)
> > library(OpenStreetMap)
> > ## library(sp)
> > ## library(ggplot2)
> >
> > lat_max <- 39.3525 #Distance from 39.35 to 39.34 = 0.691mi long_max <-
> > -76.617 #Distance from -76.61 to -76.62 = 0.5343 mi lat_min <- 39.3455
> > long_min <- -76.6095 nw <- c(lat_max, long_max) se <- c(lat_min,
> > long_min)
> >
> > rw_map <- openmap(nw, se,
> >                     type = "osm",
> >                     mergeTiles = TRUE) %>%
> >       openproj() %>%
> >       OpenStreetMap::autoplot.OpenStreetMap() +
> >       xlab("long") + ylab("lat")
> >
> > rw_map
> >
> > rw_tract <- tracts(state = "MD",
> >                       county = "Baltimore city",
> >                       year = "2020") %>%
> >       filter(NAME == "2711.01")
> >       ## openproj()
> >       ## st_transform('+proj=longlat +datum=WGS84')
> >       ## spTransform('osm')
> >
> > OpenStreetMap::autoplot.OpenStreetMap(rw_tract, add = TRUE)
> > ==================================================
> >
> > The commented out sections show some of the things I've tried so far.
> > I'd like to be able to draw the rw_tract geometry data on the rw_map
> > image. What I'd like is a 'addPolygon()' function in OpenStreetMap,
> > like I found in leaflet.
> >
> > Can anyone offer me any suggestions or advice for accomplishing my task?
> > Thanks so much.
> >
> > -Kevin
> >
> > _______________________________________________
> > R-sig-Geo mailing list
> > R-sig-Geo using r-project.org
> > https://gcc02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat
> > .ethz.ch%2Fmailman%2Flistinfo%2Fr-sig-
> geo&data=05%7C01%7Ctim.howard%40
> >
> dec.ny.gov%7C4d3f99e6eeff4493a3a108db67a26858%7Cf46cb8ea79004d108c
> eb80
> >
> e8c1c81ee7%7C0%7C0%7C638217719464245369%7CUnknown%7CTWFpbGZs
> b3d8eyJWIj
> >
> oiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3
> 000%7C
> >
> %7C%7C&sdata=RVBbcRMpZINzm0yoMZuwfisK575l3hiQzYSAUiG9U4E%3D&r
> eserved=0



More information about the R-sig-Geo mailing list