🎯 ¿Qué es un Spatial Join?
Un Spatial Join (unión espacial) es una operación que combina dos capas GIS basándose en su relación geográfica en lugar de un campo común. Es como un JOIN de SQL, pero usando la ubicación como criterio de unión.
Ejemplo: ¿En qué comuna está cada punto de muestreo?
📍 Puntos
ID: 1, Especie: X
ID: 2, Especie: Y
ID: 3, Especie: Z
🗺️ Comunas
Santiago
Providencia
Las Condes
✅ Resultado
ID: 1, Especie: X, Santiago
ID: 2, Especie: Y, Providencia
ID: 3, Especie: Z, Las Condes
🔗 Tipos de Relaciones Espaciales (Predicados)
| Predicado | Significado | Uso Común |
|---|---|---|
| intersects | Las geometrías se tocan o superponen | El más común y versátil |
| contains | A contiene completamente a B | Puntos dentro de polígonos |
| within | A está completamente dentro de B | Inverso de contains |
| touches | Las geometrías se tocan en el borde | Parcelas adyacentes |
| crosses | Las geometrías se cruzan | Ríos que cruzan comunas |
| overlaps | Superposición parcial | Zonas de conflicto |
💻 Implementación en Python
Spatial Join Básico con GeoPandas
import geopandas as gpd
# Cargar datos
puntos = gpd.read_file("muestreos.shp")
comunas = gpd.read_file("comunas.shp")
# Spatial Join: ¿En qué comuna está cada punto?
resultado = gpd.sjoin(
puntos, # Capa izquierda (la que recibe atributos)
comunas, # Capa derecha (la que aporta atributos)
how="left", # Tipo de join
predicate="intersects" # Relación espacial
)
print(resultado.columns)
# ['id', 'especie', 'geometry', 'NOM_COMUNA', 'REGION', ...]
Tipos de How (Método de Unión)
- left: Mantiene todas las geometrías de la izquierda (como LEFT JOIN)
- right: Mantiene todas las geometrías de la derecha
- inner: Solo geometrías que tienen match (intersección)
💡 Tip: Si un punto cae exactamente en el límite entre dos
polígonos, puede aparecer duplicado. Usa how="left" y luego
drop_duplicates() para manejarlo.
📊 Casos de Uso Reales
🌿 Estudios Ambientales
- Asignar puntos de muestreo a unidades vegetacionales
- Determinar en qué área protegida está cada observación
- Identificar qué especies se encuentran en zonas de proyecto
🏙️ Urbanismo
- Calcular cuántos habitantes hay por zona censal
- Asignar permisos de construcción a barrios
- Analizar cobertura de servicios por sector
📈 Análisis de Negocio
- Asignar clientes a zonas de venta
- Determinar qué tienda está más cerca de cada dirección
- Análisis de mercado por territorio
⚡ Optimización de Rendimiento
Índice Espacial
GeoPandas usa índices R-tree automáticamente, pero para datasets muy grandes puedes optimizar:
# Asegurar que ambos GeoDataFrames tengan el mismo CRS
puntos = puntos.to_crs(comunas.crs)
# El spatial join usará índice automáticamente
resultado = gpd.sjoin(puntos, comunas, predicate="within")
Chunk Processing para Big Data
import pandas as pd
# Procesar en lotes para datasets grandes
chunks = np.array_split(puntos, 10)
results = []
for chunk in chunks:
joined = gpd.sjoin(chunk, comunas, predicate="intersects")
results.append(joined)
resultado_final = pd.concat(results)
🛠️ Spatial Join Nearest (Vecino más Cercano)
Cuando no hay intersección pero quieres asignar al polígono más cercano:
# Disponible en GeoPandas 0.10+
resultado = gpd.sjoin_nearest(
puntos,
comunas,
how="left",
max_distance=1000 # Máximo 1km
)
✅ Spatial Join con Geo Spark Studio
Nuestra herramienta de Cruce Espacial hace todo esto sin código:
- Carga dos archivos: El que recibe y el que aporta datos
- Selecciona el predicado: intersects, contains, within...
- Elige los campos: Qué atributos transferir
- Preview: Verifica el resultado antes de exportar
- Exporta: En cualquier formato
¿Necesitas combinar datasets GIS?
Realiza Spatial Joins profesionales sin escribir código.
Probar Cruce Espacial →📚 Recursos Adicionales
¿Tienes preguntas sobre Spatial Join? Contáctanos