Georreferenciación de fotos de DJI Mini 3 con metadatos gps de exif. Es necesario solo las coordenadas del centroide de la foto para generar la georreferenciacion aproximada con un script de Python. Script de procesamiento automatizado para georreferenciar fotografías aéreas, generando GeoTIFFs e índices de vegetación listos para análisis en QGIS.
Archivos de ejemplo en la siguiente carpeta Carpeta ejemplo Se incluye script python fullorthorect.py
Este proyecto automatiza la conversion de archivos DNG a JPG, además la generación de archivos de puntos de control (.points), un resumen de cálculos (resumen_calculos.csv), archivos TIFF georreferenciados y calculos de indices GLI y VARI; a partir de fotografías tomadas con un dron DJI Mini 3 Pro. El objetivo es facilitar la georreferenciación de imágenes para utilizar en cualquier GIS mediante un proceso reproducible y preciso.
• Dron DJI Mini 3 Pro (o similar con GPS integrado). ![]()
• Computadora con Python 3.9+ instalado. 💻
• QGIS 3.22+.
o software GIS de su preferencia (ArcGis-ESRI, MapInfo, GoogleEarth, Global Mapper, etc)
• ExifTool (para copiar metadatos GPS)
Pagina instalacion
• Librerías de Python:
pip install exifread pyproj Pillow rawpy numpy rasterio attrs click cligj| Biblioteca | Función |
|---|---|
exifread |
Lectura de metadatos EXIF/GPS de las imágenes |
pyproj |
Transformación de coordenadas WGS84 → CRTM05 |
Pillow |
Manipulación y conversión de imágenes |
rawpy |
Decodificación de archivos DNG (RAW) |
numpy |
Operaciones matriciales y cálculo de índices |
rasterio |
Generación de GeoTIFFs georreferenciados |
• Activar el registro de coordenadas GPS en la cámara.
• Mantener la cámara en modo nadiral (vertical).
• Configurar la resolución máxima (8064×6048 px). Formato DNG 48MP

• Desactivar filtros automáticos de exposición o HDR.
• Tomar una primera foto en el punto de referencia (suelo). Esta imagen debe tener en su nombre el sufijo 001 (por ejemplo, DJI_001.DNG). Esperar que el dron tenga la mayor cantidad de satélites gps a disposición, no apresurar el despegue de la nave. La precisión vertical con buena señal es +- 0.1 m en mini 3.
• Continuar tomando las demás fotos a diferentes alturas o posiciones. Orientar dron al NORTE con pantallas de navegación. Esto con el fin que la foto quede orientada en georreferenciación, en formato RAW el disparo de la cámara es tardado ⏱️ , tener paciencia. Si la diferencia de altura es muy grande desde el punto de referencia (suelo) y puntos donde se toman el resto de fotos disminuye la precisión de georeferenciación, debe ser menos de 2 metros para obtener resultados aceptables. Por lo tanto en terreno quebrado es poco recomendable aplicar script. Además entre mas alto se vuele el dron el margen de error dismininuye.
• Guardar las imágenes en formato RAW (.DNG) para conservar metadatos completos.

Colocar todos los archivos .DNG y el script fullorthorect.py en una misma carpeta:
📂 Carpeta ejemplo ├── fullorthorect.py ├── DJI_001.DNG ├── DJI_002.DNG ├── DJI_003.DNG └── ...
python fullorthorect.pyPaso 1 — Conversión DNG → JPG
• Conversión de .DNG → .JPG (máxima calidad sin submuestreo) usando rawpy.
• Copia de metadatos GPS/EXIF con exiftool.
Paso 2 — Generación de Puntos de Control (GCPs)
• Lectura de coordenadas GPS (lat, lon, alt) y ángulos de actitud (pitch, roll, yaw) desde metadatos.
La función get_exif_data() retorna 6 valores:
# Antes:
lat, lon, alt = get_exif_data(image)
# Ahora:
lat, lon, alt, pitch, roll, yaw = get_exif_data(image)• Transformación de coordenadas WGS84 (EPSG:4326) a CRTM05 (EPSG:8908).
• Cálculo de altura relativa (usando la foto 001 como referencia).
• Generación de archivos .points (para QGIS) aplicando corrección de actitud si hay inclinación y cálculo de footprint basado en dimensiones del sensor y FOV.
• Creación del archivo resumen_calculos.csv con todos los datos.

Paso 3 — GeoTIFFs e Índices de Vegetación • Calculado GLI y VARI índices para cada imagen.
| Índice | Fórmula | Uso |
|---|---|---|
| GLI (Green Leaf Index) | ((G-R) + (G-B)) / (2G + R + B) |
Detección de vegetación verde |
| VARI (Visible Atmospherically Resistant Index) | (G-R) / (G + R - B) |
Vigor vegetal, resistente a variación atmosférica |
• Guardado el resultados como GeoTIFF mediante transformación afín.
Cámara DJI Mini 3 Pro
SENSOR_WIDTH_MM = 9.6 # Ancho del sensor en mm
SENSOR_HEIGHT_MM = 7.2 # Alto del sensor en mm
FOCAL_LENGTH_MM = 6.7 # Distancia focal en mm
IMAGE_WIDTH_PX = 8064 # Resolución horizontal (48MP)
IMAGE_HEIGHT_PX = 6048 # Resolución vertical (48MP)Corrección de Offset GPS El GPS del DJI Mini 3 Pro tiene una precisión típica de 1–20 metros. Este offset compensa el error sistemático por sesión de vuelo.
OFFSET_X_M = -7.6 # Corrección Este (metros)
OFFSET_Y_M = -27.8 # Corrección Norte (metros)| Archivo | Descripción |
|---|---|
*.jpg |
Imagenes convertidas desde el archivo RAW. |
*.points |
Archivos de puntos de control para QGIS. |
*_georef.tif |
GeoTIFF georreferenciado en CRTM05 (ej. DJI_0001_georef.tif). |
*_georef_GLI.tif |
Índice GLI (Green Leaf Index). |
*_georef_VARI.tif |
Índice VARI (Visible Atmospherically Resistant Index). |
resumen_calculos.csv |
Tabla con coordenadas, alturas y dimensiones calculadas. |
Ejemplo de resumen_calculos.csv:
El archivo resumen_calculos.csv ahora incluye columnas adicionales:
pitch_deg: Ángulo de cabeceoroll_deg: Ángulo de alabeoyaw_deg: Ángulo de guiñada
2. Copie en la misma carpeta el archivo fullorthorect.py y ejecutar con comando python fullorthorect.py en consola de comandos para ejecutar flujo completo de trabajo.
┌─────────────┐ ┌──────────────┐ ┌───────────────┐
│ Fotos DNG │────▶│ Conversión │────▶│ Fotos JPG │
│ del drone │ │ DNG → JPG │ │ con GPS EXIF │
└─────────────┘ └──────────────┘ └───────┬───────┘
│
┌──────────────┐ │
│ Lectura GPS │◀────────────┘
│ + Actitud │
└──────┬───────┘
│
┌────────────▼────────────┐
│ Transformación WGS84 │
│ → CRTM05 + Offset GPS │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ Cálculo de Footprint │
│ + Corrección Actitud │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ Archivos .points │
│ + resumen_calculos.csv │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ GeoTIFF Georreferenciado│
│ (*_georef.tif) │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ Índices de Vegetación │
│ GLI + VARI │
└─────────────────────────┘
El offset cambia con cada sesión de vuelo, por lo que debe recalibrarse para cada lote de fotos:
- Ejecutar el script con
OFFSET_X_M = 0yOFFSET_Y_M = 0 - Cargar el GeoTIFF resultante en QGIS sobre un basemap (preferiblemente ortofotos del SNIT).
- Identificar un punto reconocible (esquina de edificio, intersección de calles)
- Con la herramienta Medir, medir la distancia en X e Y desde la posición en la foto del drone hasta la posición real en el basemap
- Si la foto está desplazada al NE, usar valores negativos; si está al SO, usar valores positivos
- Re-ejecutar el script con los nuevos valores
⚠️ Importante: La corrección de georreferenciación debe realizarse utilizando las ortofotos actualizadas del SNIT Costa Rica como capa base de referencia. No se recomienda utilizar mapas base comerciales (como Google Satellite) ya que suelen presentar desplazamientos espaciales significativos respecto a la cartografía oficial.
4. Abrir los archivos TIFF generados con sotfware QGIS o GIS de preferrencia, para verificar alineación y visualización índices.
• En QGIS o GIS de preferencia, comprobar que las imágenes se alineen correctamente con la base cartográfica.
- FOV: El DJI Mini 3 Pro reporta FOV diagonal de 82.1°. El script calcula los FOV horizontal (71.2°) y vertical (56.5°) a partir de las dimensiones físicas del sensor y la distancia focal, evitando errores de escala en el footprint.
- Actitud: La corrección por pitch/roll/yaw utiliza matrices de rotación 3D con orden ZYX (Yaw → Pitch → Roll), proyectando las esquinas rotadas de vuelta al plano del suelo.
- PROJ_LIB: El script desactiva la variable de entorno
PROJ_LIBal inicio para evitar conflictos con instalaciones de PostgreSQL/PostGIS que puedan tener otra versión de PROJ.
| Problema | Causa | Solución |
|---|---|---|
PermissionError: resumen_calculos.csv |
Archivo abierto en Excel | Cerrar el archivo o dejar que el script cree una nueva versión. |
KeyError: 'GPS GPSLatitude' |
Falta de metadatos GPS | Asegurarse de que el dron tenga GPS activo y que exiftool copie los metadatos. |
| Imágenes desplazadas en QGIS | Altura de referencia incorrecta | Verificar que la foto 001 sea la tomada en el suelo. Además asegurarse de calibrar el offset usando ortofotos del SNIT. |
• Desarrollado por el equipo de ingeniería de Basdonax AI y ABC Geomática Agrícola SRL, especializado en soluciones de georreferenciación y sistemas RAG estructurados. 💵 $ 0.49 en tokens con modelo ![]()
• Desarrollo completado con Antigravity
modelo Gemini 3.0 ![]()
• Autor técnico: Alejandro Soto Barquero Versión: 2.0 — Noviembre 2025.
P.D. En la primera y última imagen del README.md hay un video de VIMEO vinculado a cada imagen

