Recetas¶
Fragmentos orientados a tareas. Todos asumen que ya tienes una URL de dataset del Catálogo.
Filtrar a una región¶
Simplificar para la web¶
Lo más útil que puedes hacer con estos datos. Tres reducciones que se componen:
npx mapshaper comunas.geojson \
-simplify percentage=2% keep-shapes \
-filter-fields Comuna,cod_comuna,Region \
-o precision=0.0001 comunas.min.geojson
| Flag | Efecto |
|---|---|
-simplify percentage=2% |
Simplificación Visvalingam conservando el 2% de los vértices |
keep-shapes |
Evita que desaparezcan islas pequeñas |
-filter-fields |
Descarta objectid, st_area_sh, st_length_ y compañía |
precision=0.0001 |
Redondea coordenadas a ~11 m |
Espera aproximadamente 70 MB → 300-800 KB. Revisa siempre el resultado visualmente: una simplificación agresiva crea slivers y puede desconectar costas.
Por qué la precisión sola ayuda tanto
Los archivos de origen guardan coordenadas con unos 14 decimales
(-68.95020116247055) — precisión de nanómetro para límites
administrativos. Seis decimales son unos 11 cm. Todo lo que va más allá es
ruido incompresible ocupando bytes reales.
Convertir a TopoJSON¶
TopoJSON guarda las fronteras compartidas una sola vez en lugar de dos, lo que importa mucho para unidades administrativas que teselan un país.
Leerlo de vuelta en el navegador necesita topojson-client:
import * as topojson from "topojson-client";
const topo = await fetch("comunas.topojson").then((r) => r.json());
const geojson = topojson.feature(topo, topo.objects.comunas);
Unir tus propios datos¶
La razón habitual para querer límites: tienes estadísticas indexadas por un código oficial y quieres ponerlas en un mapa.
import geopandas as gpd
import pandas as pd
comunas = gpd.read_file("comunas.geojson")
stats = pd.read_csv("poblacion.csv") # columnas: cut, poblacion
merged = comunas.merge(stats, left_on="cod_comuna", right_on="cut")
La trampa del cero inicial
cod_comuna está guardado como número, así que Camiña es 1402. El
código oficial INE/SUBDERE es la cadena de cinco caracteres 01402 — todas
las regiones de la 1 a la 9 pierden así su cero inicial.
Si tu CSV tiene cadenas con ceros a la izquierda, el join no encuentra nada y no avisa. Normaliza un lado primero:
comunas["cut"] = comunas["cod_comuna"].astype(str).str.zfill(5)
stats["cut"] = stats["cut"].astype(str).str.zfill(5)
Este es exactamente el tipo de problema que el esquema de propiedades estandarizado existe para eliminar.
Calcular el área correctamente¶
import geopandas as gpd
regiones = gpd.read_file("regiones.geojson")
# MAL — los grados no son una unidad de área.
regiones.area
# BIEN — reproyecta a un CRS proyectado adecuado a la zona de interés.
regiones.to_crs(5361).area / 1e6 # km², SIRGAS-Chile / UTM
La propiedad area_km que ya viene en regiones.geojson está precalculada
aguas arriba y se puede usar directamente. Ojo: st_area_sh en ese mismo
archivo está en metros cuadrados, no en kilómetros cuadrados — las unidades
son inconsistentes entre ambas propiedades y entre los dos archivos.
Unir niveles en un solo archivo¶
npx mapshaper \
-i regiones.geojson comunas.geojson combine-files \
-o format=topojson chile.topojson
Produce un único TopoJSON con ambas capas, compartiendo los arcos de la costa.