Análise de dados espaciais vetoriais

Guilherme Ferreira

2024-12-27

Introdução

Este é o terceiro artigo da série sobre os registros de transações imobiliárias, obtidos a partir dos dados disponibilizados pela Prefeitura Municipal de Juiz de Fora.

No primeiro, aprendemos a calcular indicadores imobiliários básicos. No segundo, aprendemos a mapear e agrupar dados geoespaciais.

Objetivo

Neste artigo, vamos aprender a criar um mapa coroplético.

Um mapa coroplético é uma técnica de visualização cartográfica que utiliza diferentes cores para representar os valores de uma variável específica em diferentes regiões geográficas. Essa variável pode ser contínua (como renda média ou temperatura) ou categórica (como tipos de uso do solo).

Disclaimer

Os dados são utilizados para fins educacionais; contudo, embora sejam abertos ao público, respeitamos os princípios de confidencialidade e privacidade, de modo que as matrículas foram omitidas ou anonimizadas, para evitar a identificação dos imóveis ou proprietários.

Bibliotecas

Carregamos as seguintes bibilotecas do R:

  • tidyverse - coleção de ferramentas para manipulação de dados;
  • prettydoc - temas adicionais para documentos Rmarkdown;
  • leaflet - biblioteca javascript para desenvolvimento de mapas interativos;
  • leaflet.extras - fornece funcionalidades adicionais ao pacote leaflet;
  • osmdata - permite o acesso aos dados do OpenStreetMap(OSM);
  • sf - ferramenta para codificação de dados vetoriais espaciais;
  • RColorBrewer - para implementar mapa de cores amigável;
  • htmltools - facilita a personalização de projetos em rmarkdown.

Definições iniciais

Coordenadas geográficas

As coordenadas geográficas representam pontos específicos na superfície terrestre por meio de valores de latitude e longitude, geralmente expressos em graus decimais.

São utilizadas para a localização de determinado ponto no espaço, podem ser adicionadas a um data frame como simples variáveis e formam a base para análises geoespaciais, como a realizada no último artigo aqui publicado.

Dados espaciais vetoriais

Os dados vetoriais representam objetos geográficos de forma discreta.

As principais entidades geométricas, utilizadas para representar localizações, conexões ou áreas delimitadas, respectivamente, são: ponto, linhas e polígonos. Por exemplo, um ponto vetorial contém a coordenada e um polígono vetorial inclui o contorno.

Principais funcionalidades do pacote sf

O pacote sf (Simple Features) é amplamente utilizado para manipulação, análise e visualização de dados espaciais vetoriais, no R. Segue o padrão simple features definido pelo Open Geospatial Consortium (OGC), que é uma especificação para o armazenamento e manipulação de dados geoespaciais vetoriais.

Para leitura e escrita de arquivos espaciais, suporta diversos formatos vetoriais, como Shapefiles (.shp), GeoJSON, KML, GPKG, entre outros, utilizando a biblioteca GDAL em segundo plano.

Para representação de geometrias, suporta pontos (POINT), linhas (LINESTRING), polígonos (POLYGON), e suas versões heterogêneas (MULTIPOINT, MULTILINESTRING, MULTIPOLYGON).

As geometrias são armazenadas em colunas especiais de data frames chamados objetos sf, que permitem trabalhar com dados espaciais e atributos tabulares de forma integrada.

O pacote sf facilita a manipulação de sistemas de coordenadas e projeções, suporta operações espaciais como interseções, buffers, diferenciais, uniões e sobreposições; integra-se com pacotes como ggplot2, tmap e leaflet para visualização interativa ou estática de dados espaciais.

Principais funcionalidades do pacote osmdata

O pacote osmdata permite a extração de dados espaciais vetoriais diretamente da base de dados do OpenStreetMap (OSM), utilizando a linguagem de consultas Overpass API.

Com a função opq() (Overpass Query), você pode definir uma área de interesse (bounding box) e os tipos de objetos que deseja obter.

Permite filtrar elementos por tags do OSM, como highway (ruas, avenidas, rodovias), building (edificações), dentre outras.

Os dados extraídos podem ser convertidos para objetos do pacote sf (simple features), facilitando análises espaciais e visualização.

Extração da área de interesse

Extraimos as coordenadas da área de interesse (building box), também chamada caixa delimitadora, através da função getbb():

bbox_jf <- getbb("Juiz de Fora")

Para extrair as características espaciais do município de Juiz de Fora, definido pela área de interesse, submetemos uma consulta overpass criada através da função opq() do pacote osmdata:

jf_data <- bbox_jf %>% opq() %>%
  add_osm_feature(key = 'name', value = 'Juiz de Fora') %>%
  osmdata_sf()

Extraímos o polígono:

jf_poly <- jf_data$osm_multipolygons

Características do objeto

Ao executarmos a função head(), extraímos alguns atributos do objeto:

head(jf_poly)
## Simple feature collection with 1 feature and 13 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -43.68593 ymin: -21.99934 xmax: -43.14665 ymax: -21.52054
## Geodetic CRS:  WGS 84
##        osm_id         name IBGE:GEOCODIGO admin_level       boundary
## 314769 314769 Juiz de Fora        3136702           8 administrative
##               place population population:date source       source:population
## 314769 municipality     540756      2023-08-31   IBGE IBGE, DOU de 31/08/2023
##            type wikidata       wikipedia                       geometry
## 314769 boundary  Q193019 pt:Juiz de Fora MULTIPOLYGON (((-43.46089 -...

Foram exibidas as principais características do objeto:

O tipo de geometria é definido como MULTIPOLYGON, isto é, um conjunto de polígonos; a dimensão é definida como bidimensional (XY); a área de interesse é definida pelas coordenadas do bounding box; o CRS é definido como WGS 84.

Sistema de Referência de Coordenadas - CRS

O Sistema de Referência de Coordenadas (CRS) define como as coordenadas geográficas ou projetadas são mapeados em relação à superfície da Terra.

Modelos matemáticos que simulam a esfericidde da Terra são denominados datum, dos quais o mais utilizado é o denominado WGS84 (World Geodesic System 1984), que é o padrão global para o GPS.

Sub-área de interesse

Repetimos o processo para extraírmos o polígono correspondente aos bairros de Juiz de Fora.

# Consultar os limites dos bairros de Juiz de Fora
jf_bairros <- bbox_jf %>% opq() %>%
  add_osm_feature(key = 'boundary', value = 'administrative') %>%
  add_osm_feature(key = 'admin_level', value = '10') %>% # Admin_level 10 geralmente é nível de bairros
  osmdata_sf()


# Obter o polígono
jf_bairros_poly <- jf_bairros$osm_multipolygons

head(jf_bairros_poly)
## Simple feature collection with 6 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -43.43937 ymin: -21.80453 xmax: -43.28577 ymax: -21.63849
## Geodetic CRS:  WGS 84
##          osm_id                name admin_level alt_name       boundary  place
## 5546995 5546995           Aeroporto          10          administrative suburb
## 5546996 5546996     Alto dos Passos          10          administrative suburb
## 5546997 5546997               Bairu          10          administrative suburb
## 5546998 5546998        Barbosa Lage          10          administrative suburb
## 5546999 5546999 Barreira do Triunfo          10          administrative suburb
## 5547000 5547000     Barão do Retiro          10          administrative suburb
##         source     type wikidata                       geometry
## 5546995   IBGE boundary          MULTIPOLYGON (((-43.38617 -...
## 5546996   IBGE boundary          MULTIPOLYGON (((-43.34498 -...
## 5546997   IBGE boundary          MULTIPOLYGON (((-43.34646 -...
## 5546998   IBGE boundary          MULTIPOLYGON (((-43.4151 -2...
## 5546999   IBGE boundary          MULTIPOLYGON (((-43.43574 -...
## 5547000   IBGE boundary          MULTIPOLYGON (((-43.30683 -...

Os objetos jf_poly e bairros_jf_poly possuem as mesmas características, quanto ao tipo de geometria e crs.

Operações geométricas

Os objetos geométricos primitivos podem ser transformados ou combinados em novos objetos. Transformações binárias são funções que operam sobre um par de objetos.

Por exemplo, com o uso da função st_intersection(), que retorna a geometria que representa a interseção entre dois objetos geométricos, filtramos os bairros que estão dentro dos limites de Juiz de Fora.

bairros_in_juiz_de_fora <- jf_bairros_poly %>%
  st_intersection(jf_poly)
## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries

Valor médio das transações de compra e venda

Os dados das transações de imóveis para calcular a média de valores de compra e venda dentro de cada área do polígono, foram obtidos anteriormente, de acordo com os procedimentos descritos nos dois artigos já citados.

Lemos o arquivo csv:

vcv <- read.csv('search.csv')

Validação e seleção de variáveis

vcv_geo <- vcv %>% filter(lat != 'NA') %>% select(bairro, valor, lat, long)

Transformamos pontos em objeto sf

vcv_sf <- vcv_geo %>%
  st_as_sf(coords = c("long", "lat"), crs = 4326)

Filtramos os pontos dentro do polígono

vcv_in <- vcv_sf %>%
  filter(st_within(., jf_poly, sparse = FALSE))
## Warning: Using one column matrices in `filter()` was deprecated in dplyr 1.1.0.
## ℹ Please use one dimensional logical vectors instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Calculamos o valor médio de compra e venda por bairro

vcv_average <- st_join(bairros_in_juiz_de_fora, vcv_in) %>%
  group_by(bairro) %>%
  summarise(valor_medio = mean(valor, na.rm = TRUE), .groups = 'drop') %>%
  select(bairro, valor_medio)

Paleta de cores

Definimos a paleta de cores utilizada para a representação visual dos valores.

vcvBins <- c(0, 350000.00, 500000.00, 1000000.00, 2000000.00, 5000000.00)
vcvPal <- colorBin(
  palette = "YlGnBu",
  domain = vcv_average$valor_medio,
  bins = vcvBins,
  na.color = "transparent"
)

Mapa coroplético

Definimos os parâmetros para a criação do mapa, contendo a representação visual da média dos valores de compra e venda das transações realizadas no biênio 2022/2023, em Juiz de Fora.

leaflet(vcv_average) %>%
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons( data = bairros_in_juiz_de_fora, 
               color = "yellow", 
               fillOpacity = 0.01) %>%
  addPolygons(
    fillColor = ~vcvPal(valor_medio),
    fillOpacity = 0.7,
    stroke = TRUE,
    color = "#ABABAB",
    weight = 1,
    label = ~lapply(bairro, htmltools::htmlEscape),
    popup = ~paste0("Média: R$ ", 
                    formatC(valor_medio, 
                            format = "f", 
                            big.mark = ".", 
                            decimal.mark = ",", 
                            digits = 2))
  ) %>%
  addLegend(
    pal = vcvPal,
    values = vcv_average$valor_medio,
    title = "Valor Médio (R$)",
    opacity = 0.7,
    position = "bottomleft"
  ) %>%
  addFullscreenControl(position = "bottomright")

Referências:

Haringa, M. (2024). Choropleth maps in R. Acessado em 18/12/2024: https://mharinga.github.io/choroplet.html/

Johnson, H. (2018). Interactive maps in R (with leaflet). Acessado em 24/04/2024: https://hansenjohnson.org/post/interactive-maps-in-r/

Lovelace, R., Nowosad, J., Muenchow, J. (2021). Geocomputation with R. Acessado em 24/04/2024: https://bookdown.org/robinlovelace/geocompr/

Pebesma, E., & Bivand, R. (2023). Spatial Data Science: With Applications in R (1st ed.). Chapman and Hall/CR. Acessado em 18/12/2024: https://r-spatial.org/book/