¿Qué es un Shapefile?
El Shapefile es el formato estándar de facto para datos vectoriales geoespaciales — características geográficas representadas como puntos, líneas y polígonos con datos de atributos asociados. Desarrollado por Esri (Environmental Systems Research Institute) a principios de los años 90 para su software ArcView GIS, el formato Shapefile ha sobrevivido a múltiples generaciones de software GIS y sigue siendo uno de los formatos de datos geoespaciales más utilizados del mundo, a pesar de su antigüedad y limitaciones.
Un shapefile almacena características geográficas como:
- Puntos: ubicaciones de ciudades, estaciones meteorológicas, waypoints GPS, epicentros de terremotos
- Polilíneas: carreteras, ríos, senderos, líneas eléctricas, rutas de vuelo
- Polígonos: fronteras de países, huellas de edificios, zonas de uso del suelo, lagos, áreas forestales
El Shapefile no es un único archivo
A pesar del nombre singular, un shapefile es una colección de al menos tres archivos obligatorios que comparten un nombre base común:
| Extensión | Contenido | ¿Requerido? |
|---|---|---|
.shp |
Geometría — las formas geométricas reales | Requerido |
.dbf |
Tabla de atributos — en formato dBASE III+ | Requerido |
.shx |
Índice de formas — desplazamientos en el .shp | Requerido |
.prj |
Proyección — sistema de referencia de coordenadas (WKT) | Muy recomendado |
.cpg |
Página de código — codificación de caracteres del .dbf | Recomendado (UTF-8) |
Este diseño de múltiples archivos es el mayor problema práctico de los shapefiles. Al compartir datos, todos los archivos deben incluirse. La convención es distribuir shapefiles como archivos ZIP con todos los archivos complementarios.
Trabajar con Shapefiles en Python
GeoPandas (Recomendado)
# pip install geopandas fiona pyproj shapely
import geopandas as gpd
import matplotlib.pyplot as plt
# Leer un shapefile
gdf = gpd.read_file('paises.shp')
print(gdf.head())
print(f"CRS: {gdf.crs}") # ej. EPSG:4326
print(f"Tipo de geometría: {gdf.geom_type.unique()}")
print(f"Bounding box: {gdf.total_bounds}") # xmin, ymin, xmax, ymax
# Operaciones de atributos (como pandas)
europa = gdf[gdf['CONTINENTE'] == 'Europa']
print(f"Países europeos: {len(europa)}")
# Operaciones espaciales
centroide = gdf.centroid # punto en el centro de cada entidad
buffer = gdf.buffer(0.1) # buffer de 0,1 grados
disuelto = gdf.dissolve(by='CONTINENTE') # combinar por atributo
# Reproyectar a un CRS diferente
gdf_mercator = gdf.to_crs(epsg=3857)
# Unión espacial — encontrar en qué país está cada ciudad
ciudades = gpd.read_file('ciudades.shp')
ciudades_con_pais = gpd.sjoin(ciudades, gdf, how='left', predicate='within')
# Visualizar
fig, ax = plt.subplots(figsize=(15, 10))
gdf.plot(column='POBLACION', cmap='YlOrRd', legend=True, ax=ax)
plt.title('Población mundial por país')
plt.savefig('poblacion_mundial.png', dpi=150, bbox_inches='tight')
# Escribir un nuevo shapefile
europa.to_file('europa.shp')
# Escribir en GeoJSON
europa.to_file('europa.geojson', driver='GeoJSON')
# Escribir en GeoPackage (sustituto moderno del shapefile)
europa.to_file('europa.gpkg', driver='GPKG')
Línea de comandos con GDAL/OGR
# ogrinfo — inspeccionar un shapefile
ogrinfo -al -so paises.shp
# ogr2ogr — convertir entre formatos geoespaciales
# Shapefile → GeoJSON
ogr2ogr -f GeoJSON paises.geojson paises.shp
# Shapefile → GeoPackage
ogr2ogr -f GPKG paises.gpkg paises.shp
# Filtrar entidades durante la conversión
ogr2ogr -f GeoJSON europa.geojson paises.shp \
-where "CONTINENTE = 'Europa'"
# Reproyectar durante la conversión
ogr2ogr -f GeoJSON -t_srs EPSG:3857 paises_merc.geojson paises.shp
Limitaciones del Shapefile (y por qué GeoPackage es mejor)
| Limitación | Detalles |
|---|---|
| Múltiples archivos | 3-7+ archivos, propenso a errores al compartir |
| Longitud de nombre de columna | Máximo 10 caracteres (de dBASE III) |
| Tipos de atributos | Limitados: cadena (máx. 254 caracteres), entero, float, fecha |
| Límite de tamaño de archivo | 2 GB por .shp y .dbf |
| Tipo de geometría único | Solo puntos O líneas O polígonos — no mezclados |
| Sin topología | Sin soporte para bordes compartidos |
| Codificación de caracteres | Por defecto ASCII; UTF-8 requiere archivo .cpg explícito |
GeoPackage (.gpkg) es el estándar OGC moderno que aborda todas estas limitaciones — es un único archivo de base de datos SQLite, soporta tipos de geometría mixtos, no tiene límite de longitud de nombre de columna, soporta UTF-8 de forma nativa y no tiene límite de tamaño de 2 GB. QGIS, ArcGIS, GDAL y GeoPandas soportan GeoPackage completamente.
Fuentes principales de datos Shapefile
- Natural Earth (naturalearthdata.com): datos vectoriales mundiales gratuitos a escalas 1:10M, 1:50M, 1:110M — fronteras de países, costas, ríos, lugares poblados
- US Census Bureau TIGER: bloques censales, condados, carreteras, masas de agua de EE.UU.
- OpenStreetMap: exportado a shapefile mediante Geofabrik o la API Overpass
- GADM (gadm.org): límites administrativos de cada país a múltiples niveles admin
- USGS: datos topográficos, cobertura del suelo, curvas de nivel
Conversiones relacionadas
Conversiones frecuentes del catálogo: