Creating a figure of map layers in R

By Urban Demographics | Rafael H. M. Pereira Researcher (Ipea)

I like figures of map layers to illustrate the many different types of data sets we combine to do urban and transport modeling. And oftentimes I get obsessed with like making maps that are reproducible with code in R. In this post I’ll be sharing a reproducible example showing how to create a figure of stacked maps like this one below.

Quick background: In 2014, I was trying to find a way to create map layers in R. This was before the sf library was created. Most of us were using the sp library for handling spatial data and Barry Rowlingson was super helpful, as usual. I used Barry’s suggestion to create a reproducible example so I could use it latter, but then sf was created and it completely changed how we do spatial analysis in R. Since then, Lauren O’brien proposed a simple way to tilt and stack sf objects and Stefan Jünger created an elegant function to do this. I’ll be using Stefan’s function in my example below.

ad libraries

library(easypackages)
easypackages::packages("sf",
                       "raster",
                       "stars",
                       "r5r",
                       "geobr",
                       "aopdata",
                       "gtfs2gps",
                       "ggplot2",
                       "osmdata",
                       "h3jsr",
                       "viridisLite",
                       "ggnewscale",
                       "dplyr",
                       "magrittr",
                       prompt = FALSE
                       )

Functions to tilt sf

Original function created by Stefan Jünger.

rotate_data <- function(data, x_add = 0, y_add = 0) {
  
  shear_matrix <- function(){ matrix(c(2, 1.2, 0, 1), 2, 2) }
  
  rotate_matrix <- function(x){ 
    matrix(c(cos(x), sin(x), -sin(x), cos(x)), 2, 2) 
  }
  data %>% 
    dplyr::mutate(
      geometry = .$geometry * shear_matrix() * rotate_matrix(pi/20) + c(x_add, y_add)
    )
}

rotate_data_geom <- function(data, x_add = 0, y_add = 0) {
  shear_matrix <- function(){ matrix(c(2, 1.2, 0, 1), 2, 2) }
  
  rotate_matrix <- function(x) { 
    matrix(c(cos(x), sin(x), -sin(x), cos(x)), 2, 2) 
  }
  data %>% 
    dplyr::mutate(
      geom = .$geom * shear_matrix() * rotate_matrix(pi/20) + c(x_add, y_add)
    )
}


Load data

We’ll be using a few data sets available from the packages used here. The first thing we need to do is to load the data and crop them to make sure they have the same extent.

### get terrain data ----------------

  # read terrain raster and calculate hill Shade
  dem <- stars::read_stars(system.file("extdata/poa/poa_elevation.tif", package = "r5r"))
  dem <- st_as_sf(dem)
  
  # crop
  bbox <- st_bbox(dem)


### get public transport network data ----------------

  gtfs <- gtfs2gps::read_gtfs( system.file("extdata/poa/poa.zip", package = "r5r") )
  gtfs <- gtfs2gps::gtfs_shapes_as_sf(gtfs)
  
  # crop
  gtfs <- gtfs[bbox,]
  gtfs <- st_crop(gtfs, bbox)
  plot(gtfs['shape_id'])


### get OSM data ----------------

  # roads from OSM
  roads <- opq('porto alegre') %>%
           add_osm_feature(key = 'highway',
                           value = c("motorway", "primary","secondary")) %>% osmdata_sf()
  
  roads <- roads$osm_lines
  
  # crop
  roads2 <- roads[bbox,]
  roads2 <- st_crop(roads2, bbox)
  plot(roads2['osm_id'])


### get H3 hexagonal grid ----------------

  # get poa muni and hex ids
  poa <- read_municipality(code_muni = 4314902 )
  hex_ids <- h3jsr::polyfill(poa, res = 7, simple = TRUE)
  
  # pass h3 ids to return the hexagonal grid
  hex_grid <- h3jsr::h3_to_polygon(hex_ids, simple = FALSE)
  plot(hex_grid)
  
  # crop
  hex_grid <- hex_grid[bbox,]
  hex <- st_crop(hex_grid, bbox)
  plot(hex)


### get land use data from AOP project ----------------
#' more info at https://www.ipea.gov.br/acessooportunidades/en/

  landuse <- aopdata::read_access(city = 'poa', geometry = T, mode='public_transport')
  
  # crop
  landuse <- landuse[bbox,]
  landuse <- st_crop(landuse, bbox)
  plot(landuse['CMATT30'])
  
  # hospitals
  # generate one point per hospital in corresponding hex cells
  df_temp <- subset(landuse, S004>0)
  hospitals <- st_sample(x = df_temp, df_temp$S004, by_polygon = T)
  hospitals <- st_sf(hospitals)
  hospitals$geometry <- st_geometry(hospitals)
  hospitals$hospitals <- NULL
  hospitals <- st_sf(hospitals)
  plot(hospitals)
  
  # schools
  # generate one point per schools in corresponding hex cells
  df_temp <- subset(landuse, E001>0)
  schools <- st_sample(x = df_temp, df_temp$E001, by_polygon = T)
  schools <- st_sf(schools)
  schools$geometry <- st_geometry(schools)
  schools$schools <- NULL
  schools <- st_sf(schools)
  plot(schools)

Plot

### plot  ----------------

# annotate parameters
x = -141.25
color = 'gray40'

temp1 <- ggplot() +
          
        # terrain
        geom_sf(data = dem %>% rotate_data(), aes(fill=poa_elevation.tif), color=NA, show.legend = FALSE) +
        scale_fill_distiller(palette = "YlOrRd", direction = 1) +
        annotate("text", label='Terrain', x=x, y= -8.0, hjust = 0, color=color) +
        labs(caption = "image by @UrbanDemog")

temp2 <- temp1 +
  
        # pop income
        new_scale_fill() + 
        new_scale_color() +
        geom_sf(data = subset(landuse,P001>0) %>% rotate_data(y_add = .1), aes(fill=R001), color=NA, show.legend = FALSE) +
        scale_fill_viridis_c(option = 'E') +
        annotate("text", label='Population', x=x, y= -7.9, hjust = 0, color=color) +

        # schools
        geom_sf(data = hex %>% rotate_data(y_add = .2), color='gray50', fill=NA, size=.1) +
        geom_sf(data = schools %>% rotate_data(y_add = .2), color='#0f3c53', size=.1, alpha=.8) +
        annotate("text", label='Schools', x=x, y= -7.8, hjust = 0, color=color) +
        
        # hospitals
        geom_sf(data = hex %>% rotate_data(y_add = .3), color='gray50', fill=NA, size=.1) +
        geom_sf(data = hospitals %>% rotate_data(y_add = .3), color='#d5303e', size=.1, alpha=.5) +
        annotate("text", label='Hospitals', x=x, y= -7.7, hjust = 0, color=color) +
  
        # OSM
        geom_sf(data = roads2 %>% rotate_data(y_add = .4), color='#019a98', size=.2) +
        annotate("text", label='Roads', x=x, y= -7.6, hjust = 0, color=color) +
  
        # public transport
        geom_sf(data = gtfs %>% rotate_data(y_add = .5), color='#0f3c53', size=.2) +
        annotate("text", label='Public transport', x=x, y= -7.5, hjust = 0, color=color) +
  
        # accessibility
        new_scale_fill() + 
        new_scale_color() +
        geom_sf(data = subset(landuse, P001>0) %>% rotate_data(y_add = .6), aes(fill=CMATT30), color=NA, show.legend = FALSE) +
        scale_fill_viridis_c(direction = 1, option = 'viridis' ) +
        theme(legend.position = "none") +
        annotate("text", label='Accessibility', x=x, y= -7.4, hjust = 0, color=color) +
        theme_void() +
        scale_x_continuous(limits = c(-141.65, -141.1))

  
# save plot
ggsave(plot = temp2, filename = 'map_layers.png', 
       dpi=200, width = 15, height = 16, units='cm')

Balança comercial de bens – conciliação entre as estatísticas de comércio exterior e de balanço de pagamentos

economiaindicadores

Textoo retirado do Banco Central

O Banco Central divulgou hoje Nota Metodológica relativa ao início de publicação mensal de tabela de conciliação entre as estatísticas de balança comercial publicadas pela Secex e pelo balanço de pagamentos. Referida nota está disponível em Estatísticas do Setor Externo, além de transcrita abaixo e no arquivo anexo.

A tabela de conciliação entre as estatísticas de comércio exterior de mercadorias, compiladas pela Secretaria de Comércio Exterior (Secex) do Ministério da Economia, e de balanço de pagamentos, compiladas pelo Banco Central do Brasil (BCB), passa a ser publicada a partir do mês de agosto de 2021 na Nota para a Imprensa – Estatísticas do Setor Externo (tabela 32) e, na página do BCB, em Estatísticas >> Tabelas Especiais >>  Balança comercial de bens: conciliação entre estatísticas de comércio exterior e de balanço de pagamentos. A tabela de conciliação apresenta séries históricas desde janeiro de 1995 e será atualizada mensalmente.

As estatísticas de comércio exterior, divulgadas pela Secex, seguem a metodologia do International Merchandise Trade Statistics (IMTS 2010) da Organização das Nações Unidas (ONU), enquanto a balança comercial do balanço de pagamentos, divulgada pelo BCB, observa os conceitos da sexta edição do Manual de Balanço de Pagamentos e Posição Internacional de Investimento (BPM6) do Fundo Monetário Internacional (FMI). A principal diferença entre as duas metodologias é que a estatística de comércio exterior de mercadorias considera os bens que aumentam ou reduzem o estoque de recursos materiais de um país ao entrar (importar) ou sair (exportar) de seu território econômico (parágrafo 1.2 do IMTS 2010), enquanto a estatística de balanço de pagamentos registra transações de bens cuja propriedade econômica é transferida entre residente e não residente (parágrafo 10.13 do BPM6), independente de sua movimentação física[1].

A conciliação segue recomendação do BPM6, parágrafo 10.55, segundo o qual produzir e publicar ajustes entre as balanças comerciais aumenta a transparência dessas estatísticas para os usuários, considerando os ajustes mais relevantes para cada economia. A tabela de conciliação parte da estatística de comércio exterior compilada pela Secex e enumera os ajustes metodológicos empregados na compilação do balanço de pagamentos:

Bens para processamento[2]: bens enviados (recebidos) ao (do) exterior para processamento (por exemplo, montagem ou beneficiamento) ou retornando ao (do) exterior após processamento, sem mudança de propriedade. O bem cruza fronteira, gerando registro estatístico na metodologia do IMTS 2010, mas não há mudança de propriedade econômica, o que exclui esse bem da balança comercial do balanço de pagamentos. O valor do serviço agregado ao bem é registrado no balanço de pagamentos como um serviço, na rubrica serviços de manufatura.

Bens mudando de propriedade entre residente e não residente, sem cruzar a fronteira[3]: não há registro estatístico no padrão IMTS 2010, mas a transação deve ser incluída no balanço de pagamentos. A mercadoria pode ser vendida por um residente a um não residente (exportação) ou vendida por um não residente a um residente (importação); as entregas físicas podem ocorrer no Brasil ou no exterior. O maior volume de operações dessa espécie refere-se ao Repetro[4], para as quais a Secex realiza divulgação específica de séries apartadas[5]. Entretanto, há outras operações de características semelhantes e, portanto, incluídas na balança comercial do balanço de pagamentos, na maioria das vezes tendo como fonte de informações os pagamentos e recebimentos observados em contratos de câmbio.

Criptoativos: conforme recomendação metodológica do FMI[6], a transferência de propriedade de criptoativos entre residentes e não residentes é registrada na conta de bens[7] do balanço de pagamentos. Não há registros aduaneiros para criptomoedas, não incluídas na estatística de comércio exterior de mercadorias. Para inclusão na balança comercial do balanço de pagamentos, as transações com criptoativos são estimadas com base em contratos de câmbio.

Bens de pequeno valor transacionados via encomendas internacionais e facilitadoras de pagamentos:  compreendem encomendas internacionais que chegam ou saem do Brasil transportados pelos Correios ou por empresas privadas de transporte expresso internacional porta a porta (courier). Os bens podem ser provenientes de uma compra internacional ou enviados sem custos ao destinatário como amostras, bagagem desacompanhada, sem registro na estatística compilada pela Secex. Encomendas internacionais e aquisições e vendas de bens via empresas facilitadoras de pagamento internacional, ajustes de cobertura, são estimadas para registro no balanço de pagamentos com base em informações de contratos de câmbio.

Exportações de bens sob merchanting[8]: compreende a aquisição, por residente do Brasil, de um bem de residente de outro país (importação) e revenda do mesmo bem para residente de um terceiro país (exportação) sem que o bem transite pelo território brasileiro, não gerando registros nas estatísticas conforme o IMTS 2010. A compra de bem sob merchanting pelo residente do Brasil é registrada como uma exportação negativa e a sua venda subsequente é registrada como uma exportação positiva. A diferença entre as vendas e as compras é registrada na balança comercial do balanço de pagamentos como exportações líquidas de bens sob merchanting.

Energia elétrica sem cobertura cambial[9]: contempla aquisições de energia elétrica por residentes junto a não residentes. Apenas os valores mensais para 1995 e 1996 foram adicionados à balança comercial do balanço de pagamentos. A série compilada pela Secex, com início em 1997, já contempla as importações de energia elétrica.

[1] O critério de mudança de propriedade econômica também é usado para registrar a transferência de produtos de uma unidade econômica para outra nas estatísticas do Sistema de Contas Nacionais (ver parágrafos 2.47 e 2.48 do manual System of National Accounts, SNA 2008, publicado pelas ONU).

2 BPM6, parágrafos 10.62 a 10.71.

3 BPM6, parágrafo 10.17.

4 Regime aduaneiro especial de exportação e de importação de bens destinado às atividades de pesquisa e de lavra das jazidas de petróleo e gás natural originalmente instituído em setembro de 1999.

5 Ver “3. Estatísticas REPETRO contabilizadas em separado” em https://www.gov.br/produtividade-e-comercio-exterior/pt-br/assuntos/comercio-exterior/estatisticas/base-de-dados-bruta.

6 https://www.imf.org/external/pubs/ft/bop/2019/pdf/Clarification0422.pdf.

7 Criptoativos são definidos como ativos não financeiros, porque não têm contraparte devedora, condição necessária para classificar um ativo como financeiro.

8 BPM6, parágrafos 10.41 a 10.49.

9 Importações de energia elétrica são incluídas na balança comercial do balanço de pagamentos conforme o parágrafo 10.17 (b) do BPM6.


[1] O critério de mudança de propriedade econômica também é usado para registrar a transferência de produtos de uma unidade econômica para outra nas estatísticas do Sistema de Contas Nacionais (ver parágrafos 2.47 e 2.48 do manual System of National Accounts, SNA 2008, publicado pelas ONU).

[2] BPM6, parágrafos 10.62 a 10.71.

[3] BPM6, parágrafo 10.17.

[4] Regime aduaneiro especial de exportação e de importação de bens destinado às atividades de pesquisa e de lavra das jazidas de petróleo e gás natural originalmente instituído em setembro de 1999.

[5] Ver “3. Estatísticas REPETRO contabilizadas em separado” em https://www.gov.br/produtividade-e-comercio-exterior/pt-br/assuntos/comercio-exterior/estatisticas/base-de-dados-bruta.

[6] https://www.imf.org/external/pubs/ft/bop/2019/pdf/Clarification0422.pdf.

[7] Criptoativos são definidos como ativos não financeiros, porque não têm contraparte devedora, condição necessária para classificar um ativo como financeiro.

[8] BPM6, parágrafos 10.41 a 10.49.

[9] Importações de energia elétrica são incluídas na balança comercial do balanço de pagamentos conforme o parágrafo 10.17 (b) do BPM6.

plugins premium WordPress