scripts script resueltos programas pasar parametros operaciones manejo ejercicios ejemplos cadenas aritmeticas bash google-maps awk gps reverse-geocoding

resueltos - scripts bash ejemplos



Geocodificación inversa en Bash usando la posición del GPS desde exiftool (3)

Mejor después que nunca, correcto.

Entonces, me encontré con el mismo problema y me las arreglé para hacer la conversión usando EXIFTool. Prueba esto:

exiftool -n -p ''$GPSLatitude,$GPSLongitude'' image_name.jpg

Las coordenadas convertidas son ligeramente más largas que las propuestas por Google, pero la API lo acepta bien.

Aclamaciones.

Estoy escribiendo un script bash que cambia el nombre de los archivos JPG en función de sus etiquetas EXIF. Mis archivos originales se llaman así:

IMG_2110.JPG IMG_2112.JPG IMG_2113.JPG IMG_2114.JPG

Necesito cambiarles el nombre así:

2015-06-07_11-21-38_iPhone6Plus_USA-CA-Los_Angeles_IMG_2110.JPG 2015-06-07_11-22-41_iPhone6Plus_USA-CA-Los_Angeles_IMG_2112.JPG 2015-06-13_19-05-10_iPhone6Plus_Morocco-Fez_IMG_2113.JPG 2015-06-13_19-12-55_iPhone6Plus_Morocco-Fez_IMG_2114.JPG

Mi script bash utiliza exiftool para analizar el encabezado EXIF ​​y cambiar el nombre de los archivos. Para aquellos archivos que no contienen una fecha de creación EXIF, estoy usando la hora de modificación del archivo.

#!/bin/bash IFS=$''/n'' for i in *.*; do MOD=`stat -f %Sm -t %Y-%m-%d_%H-%m-%S $i` model=$( exiftool -f -s3 -"Model" "${i}" ) datetime=$( exiftool -f -s3 -"DateTimeOriginal" "${i}" ) stamp=${datetime//:/-}"_"${model// /} echo ${stamp// /_}$i done

Estoy atrapado en la ubicación. Necesito determinar el país y la ciudad utilizando la información del GPS de la etiqueta EXIF. exiftool proporciona un campo llamado "Posición del GPS". De todos los campos, este parece ser el más útil para determinar la ubicación.

GPS Position : 40 deg 44'' 49.36" N, 73 deg 56'' 28.18" W

Google proporciona una API pública para la geolocalización, pero requiere coordenadas de latitud / longitud en este formato:

40.7470444°, -073.9411611°

La API arroja bastante información (haga clic en el enlace para ver los resultados):

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.7470444,-073.9411611

Mi pregunta es:

  1. ¿Cómo formato la posición del GPS a un valor de latitud / longitud que proporcionará una entrada aceptable para un servicio como la geolocalización de Google?

  2. ¿Cómo puedo analizar los resultados de JSON para extraer solo el país y la ciudad, de una manera consistente con muchos tipos diferentes de ubicaciones? Curl, y luego? Idealmente, me gustaría manejar las ubicaciones de EE. UU. De una manera, y las ubicaciones que no sean EE. UU., Otra. Las ubicaciones de EE. UU. Se formatearían en EE. UU.-ESTADO-Ciudad, mientras que las ubicaciones fuera de EE. UU. Se formatearían en PAÍS-Ciudad.

Necesito hacer esto todo en un script bash. He visto pygeocoder y gpsbabel, pero no parecen hacer el truco. Hay algunas herramientas web gratuitas disponibles, pero no proporcionan una API ( http://www.earthpoint.us/Convert.aspx ).


Para # 1, el awk no debería ser tan complicado:

awk ''/GPS Position/{ lat=$4; lat+=strtonum($6)/60; lat+=strtonum($7)/3600; if($8!="N,")lat=-lat; lon=$9; lon+=strtonum($11)/60; lon+=strtonum($12)/3600; if($13!="E")lon=-lon; printf "%.7f %.7f/n",lat,lon }''


Terminé haciéndolo en PHP, pero gracias por el consejo Marco lo verificaré.

function get_gps($gps_pos) { $parts = explode(" ",str_replace(array("deg ",",","''","/""),"",$gps_pos)); $lat_deg = $parts[0]; $lat_min = $parts[1]; $lat_sec = $parts[2]; $lat_dir = $parts[3]; $lon_deg = $parts[4]; $lon_min = $parts[5]; $lon_sec = $parts[6]; $lon_dir = $parts[7]; if ($lat_dir == "N") { $lat_sin = "+"; } else { $lat_sin = "-"; } if ($lon_dir == "E") { $lon_sin = "+"; } else { $lon_sin = "-"; } $latitiude = $lat_sin.($lat_deg+($lat_min/60)+($lat_sec/3600)); $longitude = $lon_sin.($lon_deg+($lon_min/60)+($lon_sec/3600)); return $latitiude.",".$longitude; }