Como ubicar fotografías en un plano con Nautilus, Nemo o Caja en Ubuntu

Hace unos días tuve que hacer un informe sobre una superficie de unos 3.000 m2. Este trabajo debía estar documentado gráficamente. Como te puedes hacer una idea, para esa superficie, era necesario una gran cantidad de imágenes (al final fueron casi 900). Me planteé inicialmente la posibilidad de identificar las fotografías en un plano. Sin embargo, hacerlo así me hubiera llevado mucho tiempo. Finalmente, decidí hacer las fotografías con el móvil y utilizando el GPS georreferenciarlas. De esta forma solo queda ubicar fotografías.

¿A que me refiero con ubicar fotografías? Pues simplemente a que aparezcan en un plano (o en varios), indicando donde se tomó cada una de ellas.

Al final, pensé que era algo que podía ser de utilidad, y me decidí a crear un complemento para Nautilus (disponible también para Nemo y Caja). Este complemento nos permite seleccionar las imágenes y crear un plano con formato dxf donde figura un círculo y el nombre de la fotografía.

Como ubicar fotografías en un plano con Nautilus, Nemo o Caja en Ubuntu. Portada.

Del mundo real a un plano o como ubicar fotografías

La principal ventaja de los móviles, sobre una cámara convencional, es que siempre lo llevamos encima. En cualquier momento nos puede sacar de un apuro. Pero además nos permite aprovechar todas las posibilidades que nos ofrece el móvil, como es que disponemos de las coordenadas geográficas donde se tomó la fotografía.

De cada fotografía que realizamos se guardan (además de la propia fotografía) una serie de datos (medatadatos). La información contenida en el estándar Exif, es verdaderamente brutal. Nos da información de lo mas diversa,

  • fecha y hora
  • configuración de la cámara
  • apertura, velocidad del obturador, distancia focal, medidor de exposición
  • información sobre localización (que es lo que nos interesa).

Ubicar fotografías con Nautilus (Nemo y Caja)

Llegados a este punto, la operación es sencilla. Tenemos que coger cada una de esas 900 fotografías, y realizar los siguientes pasos,

  • extraer las coordenadas geográficas de la fotografía (latitud y longitud)
  • convertir esas coordenadas geográficas a coordenadas utm para poder dibujarlas sobre un plano
  • en un plano escribir el nombre del archivo en las coordenadas calculadas anteriormente.

Al ver la magnitud del asunto, la solución es sencilla implementar un complemento para Nautilus (Nemo y Caja).

Este complemento, además añade un círculo cuyo centro es exactamente las coordenadas donde se tomaron las fotografías.

Y de ahí nace nautilus-images2dxf

Uso y funcionamiento de nautilus-images2dxf

Para ubicar fotografías con nautilus-images2dxf es tan sencillo como seleccionar todas las imágenes que queremos ubicar en un mismo plano y seleccionar la opción de crear plano.

Como ubicar fotografías en un plano con Nautilus, Nemo o Caja en Ubuntu. Crear.

A continuación, nos aparecerá un cuadro de diálogo donde debemos indicar donde guardaremos nuestro plano y con que nombre.

Como ubicar fotografías en un plano con Nautilus, Nemo o Caja en Ubuntu. Seleccionar.

 

A partir de aquí, veremos un cuadro de diálogo donde se muestra una barra de progreso con el avance de la creación, y una vez terminado ya tenemos nuestro trabajo concluido.

Instalar nautilus-images2dxf

Como te puedes imaginar este complemento no está disponible en los repositorios oficiales de Ubuntu (ya quisiera yo). Así, si quieres instalarlo, y dependiendo del explorador de archivos que utilices, tendrás que ejecutar las siguientes órdenes,

  • Nautilus:
sudo add-apt-repository ppa:atareao/nautilus-extensions
sudo apt update
sudo apt install nautilus-images2dxf
  • Nemo:
sudo add-apt-repository ppa:atareao/nemo-extensions
sudo apt update
sudo apt install nemo-images2dxf
  • Caja:
sudo add-apt-repository ppa:atareao/caja-extensions
sudo apt update
sudo apt install caja-images2dxf

Una vez instalado el complemento, tenemos que reiniciar el explorador de archivos. Para ello, de nuevo, dependiendo el explorador de archivos que utilices, deberás ejecutar la siguiente orden

  • Nautilus,
killall nautilus
  • Nemo,
killall nemo
  • Caja,
killall caja

¿Y el informe?

Una vez ya hemos resuelto el problema de ubicar las fotografías, queda hacer un informe donde estén todas las imágenes tomadas. Pero, hacer un documento con casi 900 fotografías no es algo trivial. Esto no se puede gestionar de forma sencilla.

La solución la encontré en latex. En otras ocasiones ya había hecho informes similares utilizando latex, pero hasta el momento no había tenido la ocasión de hacer algo con tantas imágenes.

Así, de nuevo implementé un sencillo script en Python3, que creara el documento que necesito. Este script es el siguiente,

import os
import glob
from PIL import Image
if __name__ == '__main__':
    print(__file__)
    output_filename = 'salida.tex'
    output = open(output_filename, 'w')
    txt_begin = """\\documentclass[a3paper,landscape]{scrartcl}
\\usepackage[utf8]{inputenc}
\\usepackage{graphicx}
\\usepackage[spanish]{babel}
\\usepackage{fancyhdr}
\\usepackage{geometry}
\\geometry{
    a3paper,
    total={420mm,297mm},
    left=10mm,
    top=10mm,
}
\\title{\\vspace{\\fill}\\textbf{Título}}
\\subtitle{\\textbf{Subtítulo}}
\\date{27/02/2017\\vspace{\\fill}}
\\begin{document}
    \\maketitle
    \\newpage
"""
    txt_end = '\\end{document}'
    txt_image = """
    \\clearpage
    \\begin{figure}
        \\centering
        \\includegraphics[width=40cm,height=25cm,angle=0,keepaspectratio]{%s}
        \\caption{%s}
    \\end{figure}
    \\newpage
"""
    txt_image2 = """
    \\clearpage
    \\begin{figure}
        \\centering
        \\includegraphics[width=25cm,height=40cm,angle=270,keepaspectratio]{%s}
        \\caption{%s}
    \\end{figure}
    \\newpage
"""
    output.write(txt_begin)
    files = glob.glob('*_resize.jpg')
    files.sort()
    for afile in files:
        print(afile)
        with Image.open(afile) as img:
            width, height = img.size
        filename = os.path.basename(afile)[:-11].replace('_', '\\_')
        if width > height:
            output.write(txt_image % (afile, filename))
        else:
            output.write(txt_image2 % (afile, filename))
    output.write(txt_end)
    output.close()

Conclusiones

Como ya comenté en otro artículo “Todo el mundo debería saber programar”, y me remito a una cita atribuida a Steve Jobs, “Everybody in this country should learn how to program a computer… becouse it teaches you how to think.” (Todo el mundo en este país debería aprender a programar un odernador…, porque te enseña a pensar).

Lo cierto, es que lo que podía haber sido una labor de varios días, apenas me ha llevado un día de trabajo. Además de que he disfrutado implementando una solución como esta, para luego compartirla.

Lo que sigue siendo una tarea pendiente para mi es la de aprender latex. Me parece una herramienta con un potencial brutal. Lo que ha quedado evidentemente demostrado con el ejemplo que he puesto hoy.

  • Linez Linux

    Joder,cada día te superas!!
    No sé por qué no consigo hacerlo andar,me aparece la ventana donde guardar el dxf y ahí se queda.
    Muchas gracias por compartir.

    • Gracias… 😉
      Es posible que haya olvidado alguna dependencia. ¿Puedes ejecutarlo en un emulador de terminal?

      $ killall nautilus
      $ nautilus

      Ya me dices que es lo que pone…

      Saludos.

      • Linez Linux

        Dependencias no he instalado ninguna,excepto las que se han instalado automáticamente.
        Supongo que te refieres a lo que devuelve el terminal cuando ejecuto la herramienta dxf,me pone esto:

        GObject.__init__() takes exactly 0 arguments (1 given)
        finished

        • He actualizado la aplicación, tenia un error. Prueba de nuevo, y disculpa las molestias.
          Saludos.

          • Linez Linux

            Gracias,pruebo y te comento.