Optimizando la visualización de datos geográficos complejos con {pmtiles}

3/8/2026

mapas videos

Aquí vemos 29.256 polígonos con las localidades de Chile, que en total suman más de 12 millones de vértices, pero que se visualizan sin problema! El paquete de R {pmtiles} optimiza datos geográficos complejos para visualizarlos con mucha mejor velocidad 🚀🗺️

La gracia de PMTiles es que procesa datos geográficos para que al visualizarlos se carguen solamente los polígonos necesarios, y a un nivel de detalle optimizado! Si tu mapa es demasiado complejo y colapsa tu computador o no sirve para desplegarlo en producción, {pmtiles} te sirve!

Pero lo mejor es que esto es demasiado simple con R:

Optimización y servidor de mapas con {pmtiles}

Se necesitan menos de 40 líneas para cargar las geometrías y datos en Parquet, luego optimizarlos con {pmtiles} y lanzar el servidor de mapas.

# crear pmtiles desde datos geográficos
library(arrow)
library(dplyr)
library(sf)
library(pmtiles)
library(mapgl)

# cargar mapa local en parquet
loc_aisladas <- read_parquet("datos/parquet/LOC_AIS_17.parquet") |>
  select(-geometry_bbox) |>
  st_as_sf() |>
  st_set_crs(5360)

# crear archivo PMTiles con geometrías optimizadas
pm_create(
  loc_aisladas,
  "datos/localidades.pmtiles",
  layer_name = "localidades",
  min_zoom = 2,
  max_zoom = 12,
  detect_shared_borders = TRUE,
  extend_zooms_if_still_dropping = TRUE,
  coalesce_densest_as_needed = TRUE,
  coalesce_smallest_as_needed = TRUE,
  coalesce_fraction_as_needed = TRUE,
  # drop_fraction_as_needed = TRUE,
  # drop_smallest_as_needed = TRUE,
  guess_maxzoom = TRUE,
  simplification = 7
)

# levantar servidor de mapas local
pm_stop_server()
pm_serve("datos/localidades.pmtiles", port = 8080)

Visor de mapas con {mapgl}

  • Menos de 40 líneas para hacer un [visor de mapas interactivo con {mapgl}}(https://walker-data.com/mapgl/) que se alimenta del servidor de mapas para visualizar datos geográficos complejos (en los comentarios dejo ejemplos del código)
# mapa interactivo mapgl usando pmtiles
# escala de color basada en variable desde los datos

library(arrow)
library(pmtiles)
library(mapgl)

# cargar datos
loc_aisladas <- read_parquet(
  "datos/parquet/LOC_AIS_17.parquet",
  col_select = "HABITANTES"
)

pm_serve("datos/localidades.pmtiles", port = 8080)

escala <- interpolate_palette(
  data = loc_aisladas,
  column = "HABITANTES",
  method = "quantile",
  n = 6,
  colors = c("#fde0dd", "#fa9fb5", "#c51b8a"),
  na_color = "gray"
)

maplibre(center = c(-70.9, -33.5), minZoom = 4, maxZoom = 11) |>
  add_pmtiles_source(
    "localidades",
    url = "http://localhost:8080/localidades.pmtiles"
  ) |>
  add_fill_layer(
    id = "localidades-fill",
    source = "localidades",
    source_layer = "localidades",
    fill_color = escala$expression,
    fill_opacity = 0.7,
    # tooltips
    tooltip = concat(
      "<strong>",
      get_column("NOMBRE"),
      "</strong><br>",
      get_column("COM_NOM"),
      "<br>",
      "Habitantes: ",
      get_column("HABITANTES")
    ),
    tooltip_style = tooltip_style(
      background_color = "#FFFFFF",
      background_opacity = .6,
      border_radius = 8
    )
  ) |>
  add_continuous_legend(
    legend_title = "Habitantes",
    values = escala$breaks,
    colors = escala$colors,
    position = "bottom-left",
    style = legend_style(
      background_color = "#FFFFFF",
      background_opacity = .6,
      border_radius = 8,
      padding = 8,
      text_size = 9
    )
  )

Tanto {pmtiles} para servidores de mapas optimizados por teselas (tiles), como {mapgl} para visores de mapas interactivos, fueron desarrollados por el gran Kyle Walker!

Fecha de publicación:
August 3, 2026
Extensión:
3 minute read, 480 words
Tags:
mapas videos
Ver también:
Probando visores de mapas interactivos en R con `{mapgl}`
Taller: Crea tu propia página web con Quarto y R
Mapas bivariados de adultos mayores en relación a viviendas propias en las comunas de Chile