paulofelipe / D3plusR

A package for D3plus in R
Other
25 stars 1 forks source link

Integração com pacote geobr #6

Closed smolski closed 1 year ago

smolski commented 1 year ago

Olá!

Para criação de mapas no R, é possível integração com as malhas das microrregiões do Brasil que traz o pacote geobr?

paulofelipe commented 1 year ago

Oi, @smolski

Provavelmente não é a melhor solução. Alguém que tenha mais experiência com esses dados geográficos pode te ajudar nisso, mas segue uma solução:

library(geobr)
library(geojsonio)
library(sf)
library(jsonlite)
library(dplyr)
library(D3plusR)

# Prepara o mapa ---------------------------------------------------------------
mapa <- read_micro_region(year = 2020, simplified = TRUE)

mapa <- mapa %>%
  st_transform(4326) %>% # the one and only CRS that geojson standard allows
  transmute(id = code_micro, name_micro) %>%
  topojson_json(
    object_name = "BRMI",
    geometry = "polygon",
    type = "GeometryCollection",
    # use quantization para diminuir o tamanho do arquivo do mapa
    # quantization = 1e3,
    crs = 4326
  ) %>%
  fromJSON(., simplifyVector = TRUE)

mapa$objects$BRMI$geometries$id <-
  mapa$objects$BRMI$geometries$properties$id

# Salva o mapa para uso posterior sem necessidade de ficar carregando o
# geobr
mapa <- write_json(mapa, "./br_micro.json")

# GeoMap -----------------------------------------------------------------------
mapa <- read_json("./br_micro.json", simplifyVector = TRUE)

# Dados aleatórios para o exemplo
data <- mapa$objects$BRMI$geometries$properties %>%
  mutate(x = rnorm(n()))

d3plus(
  data = data,
  type = "geo_map",
  id = "id",
  width = "100%",
  height = 500
) %>%
  d3plusCoords(mapa, projection = "equirectangular") %>%
  d3plusColor(value = "x") %>%
  d3plusTooltip(value = c("name_micro", "x")) %>%
  d3plusText(value = "name_micro")

Parte da solução veio desse post: https://stackoverflow.com/questions/76264739/converting-sf-object-to-topojson

smolski commented 1 year ago

Olá! Agora entendi como funciona, muito obrigado!