knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/README-", out.width = "100%" )
O objetivo de milton é oferecer ferramentas para facilitar o georreferenciamento de dados no Brasil.
Você pode instalar a versão de desenvolvimento de milton do GitHub com o código abaixo:
# install.packages("devtools") devtools::install_github("tomasbarcellos/milton")
library(milton)
O pacote permite que você georrefenrencie seus dados com:
av <- get_addr("Avenida pequeno príncipe") av # CEP da avenida pequeno principe get_addr("88063-000")
Carregando funções de utilidade para ler e manipular dados.
library(tidyverse)
Também é possível identificar o município e o setor censitário de um endereço. Para tanto precisamos dos endereços que vamos localizar e as geometrias em que eles devem ser identificados.
mun <- readRDS("tests/testthat/mun.rds") %>% sf::st_transform(crs = 4674) %>% rename(geometry = geom)
mun <- geobr::read_municipality(year = 2018) %>% rename(geometry = geom)
A função geopart
permite fazê-lo.
geo_av <- geopart(av, mun) ggplot(mun[geo_av, ]) + geom_sf() + theme_void()
A API do pacote foi construída buscando permitir o uso do pipe (%>%
).
geo_museu <- get_addr("Museu da Língua Portuguesa") %>% geopart(mun) ggplot(mun[geo_museu, ]) + geom_sf() + theme_void()
Para a identificação do setor censitário também é possível usar a mesma função.
Para tanto deve-se usar como segundo argumento os polígonos dos setores
censitários. Uma forma fácil de acessar esses polígonos é usando o pacote
geobr
: geobr::read_census_tract
.
setores <- readRDS("tests/testthat/censo.rds") %>% sf::st_transform(crs = 4674) %>% rename(geometry = geom)
setores <- geobr::read_census_tract(3550308) %>% rename(geometry = geom)
Com estes polígonos em mãos é possível identificar o setor censitário ao qual determinado endereço pertence.
epm <- get_addr("Rua botucatu, 740") geo_epm <- geopart(epm, setores) ggplot(setores[geo_epm, ]) + geom_sf() + theme_void()
Outra funcionalidade do pacote permite relacionar endereços distintos, medindo suas distâncias ou identificando o local mais próximo.
Suponhamos que tenhamos uma tabela com os endereços os pacientes A, B e C:
pacientes <- tibble( paciente = LETTERS[1:3], endereco = c( "Av. Dr. Altino Arantes, 941", "Rua Gandavo, 349, São Paulo", "Rua Bela cruz, 40" ) ) %>% mutate(latlon = get_addr(endereco)) pacientes
E agora é possível calcular a distância entre esses pontos e a Escola Paulista de Medicina.
pacientes %>% mutate(distancia_km = distancia(latlon, epm))
Há um conjunto de funções que permite identificar, por exemplo, o local mais adequado para tratar determinado paciente:
min_dist
retorna a menor distância;nearplace
retorna o local mais próximo.Desse modo, dado um conjunto de hospitais:
hospitais <- c("Hospital São Paulo", "Hospital Dom Alvarenga", "Hospital Paulistano") geo_hospitais <- get_addr(hospitais)
É possível identificar a distância dos hospitais para o paciente C:
paciente_C <- pacientes$latlon[3] distancia(paciente_C, geo_hospitais)
Assim como o hospital de menor distância.
min_dist(paciente_C, geo_hospitais)
E o hospital mais próximo.
prox <- nearplace(paciente_C, geo_hospitais) idx <- which(prox == geo_hospitais) hospitais[idx]
Tomemos um conjunto qualquer de CEPs.
df_ceps <- tibble( ceps = c("01215010", "01508010", "01519000", "01526010", "02180080", "02849170", "03347070", "03380150", "03590080", "03737230", "04011060", "04018000", "04050060", "04108001", "04111000", "04233140", "04421150", "04433180", "04633030", "04813190", "04853185", "05010000", "05409002", "05540020", "05790230", "06000150", "07717170", "07858150", "07865115", "08062320", "08140000", "08142710", "08370220", "08421520", "08700000", "08770130", "08790000", "08793030", "09911550") )
Assumamos que representam o endereço de pacientes cujas condições estão apresentadas na tabela abaixo.
set.seed(123) df_pacientes <- df_ceps %>% mutate( id = seq_along(ceps), condicao = sample(c(0, 1), length(ceps), replace = TRUE) ) df_pacientes
Agora usemos as funções do pacote para complementar nosso bando de dados com:
geo_pacientes <- df_pacientes %>% mutate(endereco = cep(ceps), ponto = get_addr(endereco)) geo_pacientes
setor_paciente <- geo_pacientes %>% mutate(idx = map_int(ponto, geopart, setores), setor = setores$code_tract[idx]) setor_paciente
Ler dados do Índice Paulista de Vulnerabilidade Social (IPVS).
ipvs <- ler_ipvs() %>% select(setor = codigo_do_setor_censitario, idade_media_setor = idade_media_das_pessoas_responsaveis, p_renda_meio_sm_setor = proporcao_de_domicilios_particulares_com_rendimento_nominal_mensal_de_ate_1_2_s_m, p_alfabetizadas_setor = proporcao_de_pessoas_responsaveis_alfabetizadas)
Relacionar com dados dos pacientes
paciente_ipvs <- setor_paciente %>% left_join(ipvs, by = "setor") glimpse(paciente_ipvs)
Dados dois pontos, identificar aquele mais próximo de cada paciente.
ps <- get_addr(c("04017-030", "Hospital Albert Einstein")) nomes_ps <- c("Caism Vila Mariana", "Einstein") paciente_ipvs %>% select(id, condicao, ceps, endereco, ponto) %>% mutate(prox = nearplace(ponto, ps), nome_prox = nomes_ps[which_nearplace(ponto, ps)]) %>% glimpse()
paciente_ipvs %>% select(id, condicao, ceps, endereco, ponto) %>% # Em quilometros mutate(distancias = distancia(ponto, ps)) %>% glimpse()
library(leaflet) lat_ps <- unlist(ps[[1]])[2] lon_ps <- unlist(ps[[1]])[1] paciente_ipvs %>% mutate(lon = map_dbl(ponto, ~unlist(.x)[1]), lat = map_dbl(ponto, ~unlist(.x)[2])) %>% leaflet() %>% addTiles() %>% # Add default OpenStreetMap map tiles addCircleMarkers(~lon, ~lat, label = ~p_renda_meio_sm_setor, color = ~ifelse(condicao == 1, "red", "blue")) %>% addMarkers(lon_ps, lat_ps, label = "Caism Vila Mariana") %>% addLegend(colors = c("red", "blue"), labels = c("Com condição", "Sem condição"))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.