Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Módulo 2: Estructuras de Datos en GeoPandas

Módulo 2: Estructuras de Datos en GeoPandas

Avatar for Abraham Zamudio

Abraham Zamudio

June 21, 2025
Tweet

More Decks by Abraham Zamudio

Other Decks in Education

Transcript

  1. Título: Módulo 2: Estructuras de Datos en GeoPandas Subtítulo: Dominando

    GeoSeries y GeoDataFrames Instructor: Abraham Zamudio Contacto: https://www.linkedin.com/in/abraham-zamudio/
  2. Objetivos del Módulo 1. Diferenciar GeoSeries y GeoDataFrame 2. Crear

    estructuras desde archivos espaciales 3. Convertir DataFrames pandas en geoespaciales 4. Manejar geometrías como objetos de primera clase
  3. Recapitulación Módulo 1 Conceptos clave: • Geometrías (Puntos/Líneas/Polígonos) • CRS

    (EPSG:4326 vs EPSG:3857) • Shapefile vs GeoJSON GeoPandas: gpd.read_file() para carga básica
  4. Anatomía de un GeoDataFrame GeoDataFrame = DataFrame de pandas +

    Columna "geometry" Componentes: • Atributos (columnas tradicionales) • Geometría (objetos espaciales)
  5. GeoSeries: El Corazón Espacial Definición: Columna especializada para geometrías Características:

    • Herencia de pd.Series • Almacena objetos Shapely (Point, LineString, Polygon) • Soporta operaciones espaciales vectorizadas
  6. Creación desde Archivos Espaciales # Cargar Shapefile gdf = gpd.read_file("ruta/capita.shp")

    # Cargar GeoJSON gdf = gpd.read_file("ruta/rios.geojson") Formatos soportados: 20+ (GPKG, KML, GML, etc.)
  7. Inspección de GeoDataFrames Método Descripción gdf.head() Primeras filas + geometría

    gdf.geom_type Tipo de geometría (ej: Polygon) gdf.bounds Extensión espacial (min/max)
  8. Atributos No Espaciales Operaciones pandas tradicionales: # Filtrar hospitales públicos

    hospitales_publicos = gdf[gdf['tipo'] == 'publico'] # Agrupar por provincia gdf.groupby('provincia').size()
  9. Reto: Datos Tabulares → Espaciales Problema común: "Tengo un CSV

    con lat/lon pero no sé cómo convertirlo en mapa" Solución: gpd.points_from_xy() + gpd.GeoDataFrame()
  10. Creación desde DataFrames Pandas Paso 1: DataFrame con coordenadas import

    pandas as pd data = {'nombre': ['Hospital A', 'Clínica B'], 'lon': [-58.4, -60.3], 'lat': [-34.6, -32.9]} df = pd.DataFrame(data) Paso 2: Generar Geometrías from geopandas import points_from_xy # Convertir coordenadas a objetos Point geometry = points_from_xy(df.lon, df.lat) Paso 3: Construir GeoDataFrame gdf = gpd.GeoDataFrame( df, # DataFrame original geometry=geometry, # Columna espacial crs="EPSG:4326" # Asignar CRS )
  11. Caso Real: Estaciones de Metro Dataset: CSV con estaciones (nombre,

    linea, lat, lon) Transformación: estaciones = pd.read_csv("metro.csv") geo_estaciones = gpd.GeoDataFrame( estaciones, geometry=gpd.points_from_xy(estaciones.lon, estaciones.lat), crs="EPSG:4326" ) Visualización Resultante import matplotlib.pyplot as plt geo_estaciones.plot(marker='*', color='blue', markersize=50) plt.title("Red de Metro") plt.show()
  12. Validación de Geometrías Problema: Geometrías inválidas causan errores Validación: from

    shapely import is_valid gdf['valido'] = gdf.geometry.apply(lambda x: is_valid(x)) gdf_invalido = gdf[~gdf.valido] Corrección de Geometrías from shapely import make_valid gdf.geometry = gdf.geometry.buffer(0) # Solución común # O gdf.geometry = gdf.geometry.apply(make_valid)
  13. Operaciones con GeoSeries Ejemplos: # Calcular área (requiere CRS proyectado)

    gdf_proj = gdf.to_crs("EPSG:5347") gdf_proj['area'] = gdf_proj.geometry.area # Crear buffer de 500m gdf['buffer'] = gdf.geometry.buffer(500)
  14. Exportar Resultados # Guardar como Shapefile gdf.to_file("estaciones.shp") # Guardar como

    GeoJSON gdf.to_file("estaciones.geojson", driver='GeoJSON') Advertencia: Shapefile crea múltiples archivos
  15. Comparativa: GeoJSON vs Shapefile Parámetro GeoJSON Shapefile Tamaño + Ligero

    - Pesado Geometrías complejas ✓ Soporta ✗ Limitado CRS Incrustado .prj separado Lectura humana ✓ Alta ✗ Baja
  16. Caso Multidisciplinario: Salud Escenario: Mapear hospitales y zonas de cobertura

    Proceso: i. CSV → GeoDataFrame ii. Crear buffers de 5km iii. Calcular población cubierta
  17. Caso Logística Escenario: Optimizar centros de distribución Proceso: i. Cargar

    clientes (CSV) y municipios (Shapefile) ii. Asignar clientes a municipios (`gpd.sjoin()`) iii. Calcular centroides por densidad
  18. Errores Comunes 1. CRS no asignado: Geometrías sin sistema de

    referencia 2. Orden coordenadas invertido: (lat, lon) vs (lon, lat) 3. Geometrías inválidas: Polígonos autointersectados 4. Datos faltantes: Filas con NaN en coordenadas Buenas Prácticas CRS explícito: Siempre asignar al crear GeoDataFrames Validación: Chequear geometrías con `.is_valid` Metadatos: Documentar fuente y proyección Backup: Exportar a GeoJSON (respaldo legible)
  19. Integración con Pandas Avanzado Ejemplo: # Aplicar función a geometrías

    hospitales_gdf['area_m2'] = hospitales_gdf.to_crs( "EPSG:5347" ).geometry.apply(lambda g: g.buffer(500).area)
  20. Rendimiento con .apply() vs .buffer() Conclusión: Usar métodos vectorizados Método

    Velocidad (10k puntos) .geometry.buffer(100) 0.5 seg .geometry.apply(lambda x: x.buffer(100)) 2.1 seg
  21. Caso Avanzado: Líneas desde GPS Proceso: i. CSV con puntos

    de ruta (timestamp, lat, lon) ii. Agrupar por vehículo/trayecto iii. Crear LineString con shapely.LineString(coords)
  22. Aplicaciones Profesionales Geología: Mapear muestras de suelo (CSV → Puntos)

    Comercio: Territorios de ventas (Shapefile → Polígonos) Emergencias: Registro de incidentes (App → GeoJSON)
  23. Resumen Clave GeoDataFrame = DataFrame + GeoSeries points_from_xy() para conversión

    CSV → Mapas CRS obligatorio en creación Validar y corregir geometrías