Representacion geospacial de coordenadas de imágenes de drone con Python y Folium - Tutorial

Si tiene un conjunto de imágenes de drones y desea conocer la ubicación de las imágenes, este tutorial puede ser de su interés. Hemos realizado un ejemplo aplicado que recupera los metadatos geoespaciales de la cámara del dron para un grupo de imágenes y realiza una representación geoespacial en un mapa con el nombre de la imagen disponible como ventana emergente. El tutorial se realiza bajo un Jupyter notebook con Python y Folium.

Para este tutorial, necesita un entorno de conda geoespacial. Sigue este otro tutorial:

gidahatari.com/ih-es/como-instalar-libreras-de-python-geospaciales-gdal-pyproj-etc-usando-un-conda-env-en-windows

Tutorial

Código

#!pip install exif
#!pip install folium
import os
import folium
import numpy as np
import pandas as pd
from exif import Image
imageFolder = '../VUELO1/'
imageList = os.listdir(imageFolder)
#filter list to image files
imageList = [i for i in imageList if i[-4:]=='.JPG']
imageList[:5]
['DJI_0591.JPG',
 'DJI_0592.JPG',
 'DJI_0593.JPG',
 'DJI_0594.JPG',
 'DJI_0595.JPG']

For one image

imagePath = os.path.join(imageFolder, imageList[0])
imageRead = open(imagePath,'rb')
imageObject = Image(imageRead)
imageObject.list_all()[:5]
['image_description', 'make', 'model', 'orientation', 'x_resolution']
#show geospatial exif records
print(imageObject.gps_latitude)
print(imageObject.gps_longitude)
print(imageObject.gps_latitude_ref)
print(imageObject.gps_longitude_ref)
(15.0, 27.0, 59.0756)
(74.0, 42.0, 40.3897)
S
W
def getCoords(imageObject):
    latTuple = imageObject.gps_latitude
    lonTuple = imageObject.gps_longitude
    latRef = imageObject.gps_latitude_ref
    lonRef = imageObject.gps_longitude_ref
    latCoord = latTuple[0] + latTuple[1]/60 + latTuple[2]/3600
    lonCoord = lonTuple[0] + lonTuple[1]/60 + lonTuple[2]/3600
    #for negatives lats and lons
    if latRef == 'S':
        latCoord = -latCoord
    if lonRef == 'W':
        lonCoord = -lonCoord
    return latCoord, lonCoord
#get lat and lon for one image
lat, lon = getCoords(imageObject)
print(lat, lon)
-15.466409888888888 -74.71121936111112

Working for all images

#get an pandas dataframe for lats and lons
latLonDf = pd.DataFrame(columns=["Lat","Lon"])
for image in imageList:
    imagePath = os.path.join(imageFolder, image)
    imageRead = open(imagePath,'rb')
    imageObject = Image(imageRead)
    lat, lon = getCoords(imageObject)
    #print(lat, lon)
    latLonDf.loc[image,"Lat"]=lat
    latLonDf.loc[image,"Lon"]=lon
latLonDf.head()
Lat Lon
DJI_0591.JPG -15.46641 -74.711219
DJI_0592.JPG -15.468541 -74.714916
DJI_0593.JPG -15.468456 -74.714952
DJI_0594.JPG -15.468331 -74.714941
DJI_0595.JPG -15.468186 -74.714919
### Plotting images coordinates
meanLat = latLonDf.Lat.mean()
meanLon = latLonDf.Lon.mean()
m = folium.Map(location=[meanLat,meanLon], zoom_start=17, control_scale=True)
for index, row in latLonDf.iterrows():
    folium.CircleMarker(location=[row.Lat,row.Lon], radius=2, popup=index).add_to(m)
m
Make this Notebook Trusted to load map: File -> Trust Notebook
latLonDf.to_csv('imagesLatLon')

Datos de entrada

Puede descargar los datos de entrada desde este enlace.

 

Suscríbete a nuestro boletín electrónico

Suscríbase a nuestro boletín gratuito para recibir noticias, datos interesantes y fechas de nuestros cursos en recursos hídricos.

 

Posted on June 20, 2022 and filed under TutorialPython, TutorialQGIS.