Satellite Stop Motion es una pequeña aplicación que permite hacer capturas de pantalla de un mapa de satélite de forma automática. Está pensada para hacer un "stop motion" lineal viajando camino determinado por una lista de puntos (longitud, latitud). El resultado de ejecutar la aplicación es una serie de capturas de pantalla que servirán de fotogramas del video.
El resultado es algo del estilo a lo que puede verse en la cabecera.
git clone https://github.com/thegraphicmethod/Satellite-Stop-Motion.git
npm install
node main.js
Para usar la aplicación hay que rellenar los parámetros del archivo de configuración en default.json
{
"dataset": {
"path": "/Users/user1/proyectos/dataset_puntos.json",
"accesor": "features[0].geometry.coordinates"
},
"map":{
"zoom": 10,
"step": 0.0015,
"mapbox":{
"mapboxToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"mapboxStyle": "mapbox://styles/mapbox/satellite-v9"
}
},
"image": {
"jpgQuality": 90,
"width": 1280,
"height":720,
"name": "guadalquivir"
},
"headless": false,
"debug": true,
"runloop":false
}
La mayoría de los parámetros se explican por si solos.
Ahora podemos ver en detalle algunos parámetros:
Las imágenes de satelite están sacadas de Mapbox Para usar mapbox es necesario tener una cuenta y un token de acceso. Lee por aquí para conseguir uno: https://docs.mapbox.com/help/getting-started/access-tokens/
NOTA: Por defecto no se muestra el logo de mapbox en las capturas de pantalla. Esta herramienta está pensada para generar frames de video, es TU RESPONSABILIDAD respetar las condiciones de uso de mapbox y mostrar el logo de mapbox en tus videos, arriba abajo, en un lateral, en el pie de página, etc... No te dicen dónde, sólo que lo hagas.
NOTA 2: Si no quieres usar mapbox, puedes usar otro proveedor de mapas. Pero tendrás que modificar el código para que funcione con otro proveedor. (ver sección de configuración avanzada)
NOTA 3: MAPBOX es un servicio de pago. Tiene un plan de uso gratuito muy generoso, pero si te pasas tendrás que pagar. Tenlo en cuenta.
Preparar el archivo de coordenadas es lo más complejo e importante de todo el proceso. Puedes ayudarte de herramientas como https://geojson.io o https://mapshaper.org
Usando geojson.io puedes crear una línea haciendo click en distintos puntos y exportarla en formato geojson.
El archivo de coordenadas es un archivo de texto JSON con una lista de puntos. Cada punto es una línea con dos números separados por una coma. El primer número es la longitud y el segundo la latitud. Puede tener forma de un array simple o de un objeto tipo geojson LineString como el que se genera con geojson.io
Pero lo importantes que la lista de coordenadas sea un sólo array de puntos:
[
[ -3.70325, 40.4167 ],
[ -3.70325, 40.4167 ],
...
]
Si es un objeto geojson del tipo LineString:
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "LineString",
"coordinates": [
[ -3.70325, 40.4167 ],
[ -3.70325, 40.4167 ],
...
]
}
}
Hay que indicar en el archivo de configuración como se accede al array de coordenadas en el parámetro "accesor". En el ejemplo de arriba sería:
"accesor": "features[0].geometry.coordinates"
Si el archivo de coordenadas es un array simple, el accesor se deja en blanco
Puedes guardar este archivo en la carpeta por defecto paths.
El parámetro "step" indica el tamaño del salto en grados de longitud y latitud entre cada captura de pantalla. A cuantos kilometros se corresponde depende de la posición en la que estemos. Si no necesitas precisión puedes dejarlo en 0.0015. Si necesitas más precisión puedes calcular el tamaño del salto en grados de longitud y latitud con esta herramienta: https://www.movable-type.co.uk/scripts/latlong.html El modo debug te ayudará a ver si el tamaño del salto es el correcto.
Este es un ejemplo de nombre de archivo:
Parte4_poi_0087-0013--16_810771274131348-21_37934406726761
// es decir:
name_poi_XXXX-YYYY-LON-LAT
El nombre del archivo se compone de varias partes:
A la hora de convertirlo en video sólo habría que ordenador los archivos por nombre y convertirlos en video con ffmpeg.
Si pones el parámetro debug a true en el archivo de configuración, se mostrará la ventana del navegador con el mapa y la ruta.
Si sabes programar puedes modificar el código para adaptarlo a tus necesidades. El proyecto está compuesto de una web con un mapa a pantalla completa. Cada frame es una captura de pantalla de ese mapa. El programa se encarga de mover el mapa y hacer capturas de pantalla. Esto se hace con la librería puppeteer
Lo que está en la carpeta frontend es basicamente un mapa a pantalla completa. Es un proyecto vue que se distribuye ya generado en la carpeta /dist y con el codigo fuente disponible. En el archivo frontend/app.vue.
Si quieres modificarlo tendrás que instalar las dependencias y ejecutarlo con npm run build
Es un script en nodejs que controla el frontend y hace las capturas de pantalla. Su principal tarea es interpolar entre los puntos de la ruta y hacer capturas de pantalla de cada punto.
Al final se obtienen una serie de capturas de pantalla que se pueden convertir en un video con ffmpeg, por ejemplo con este comando:
ffmpeg -framerate 30 -i sahara_%04d.jpg -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p sahara.mp4
Esto ya no es parte de la aplicación. Pero puede ser útil para crear el video de las imágenes de forma automática con ffmpeg (https://ffmpeg.org/). Aquí dejo algunos ejemplos de comandos ffmpeg para convertir las imágenes en video:
ffmpeg -f concat -i list.txt -c:v libx264 -pix_fmt yuv420p output.mp4
donde list.txt es un archivo de texto con la lista de imagenes:
file 'sahara_0000.jpg'
file 'sahara_0001.jpg'
file 'sahara_0002.jpg'
....
ffmpeg -framerate 25 -pattern_type glob -i 'nombre_*-*--*.jpg' -c:v libx264 -pix_fmt yuv420p output.mp4
Este parece que funciona mejor por poder controlar el framerate.
Este proyecto surge de la petición del fotógrafo Samuel Nacar paa hacer un video con el que narrar la desconocida frontera entre Marruecos y el Sahara Occidental.
Este proyecto a su vez está inspirado por el documental Best of Luck with the Wall de Josh Begley.
Una vez solucionado el problema de Samuel, se me ocurrió que podía ser útil para otras personas y lo he publicado aquí.
Desarrollo: Sergio Galán | The Graphic Method Studio
Puedes hacer lo que quieras con este código. Es software libre. MIT
Las obras creadas con este software son propiedad de sus autores pero deben mencionar el uso de esta herramienta en los créditos así como un enlace a esta página. Si lo has usado para hacer algun proyecto me encantaría verlo. Puedes escribirme a sergio-at-graphicmethod.studio