使用来自 exiftool 的 GPS 位置在 Bash 中进行反向地理编码

utt*_*t50 5 bash awk gps google-maps reverse-geocoding

我正在编写一个 bash 脚本,它根据 EXIF 标签重命名 JPG 文件。我的原始文件是这样命名的:

IMG_2110.JPG
IMG_2112.JPG
IMG_2113.JPG
IMG_2114.JPG
Run Code Online (Sandbox Code Playgroud)

我需要像这样重命名它们:

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
Run Code Online (Sandbox Code Playgroud)

我的 bash 脚本使用 exiftool 解析 EXIF 标头并重命名文件。对于那些不包含 EXIF 创建日期的文件,我使用的是文件修改时间。

#!/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
Run Code Online (Sandbox Code Playgroud)

我被困在这个位置。我需要使用来自 EXIF 标签的 GPS 信息来确定国家和城市。exiftool 提供了一个名为“GPS 位置”的字段。在所有字段中,这似乎对确定位置最有用。

GPS Position : 40 deg 44' 49.36" N, 73 deg 56' 28.18" W
Run Code Online (Sandbox Code Playgroud)

Google 提供了用于地理定位的公共 API,但它需要采用以下格式的纬度/经度坐标:

40.7470444°, -073.9411611°
Run Code Online (Sandbox Code Playgroud)

API 返回了相当多的信息(点击链接查看结果):

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

我的问题是:

  1. 如何将 GPS 位置格式化为纬度/经度值,以便为 Google 地理定位等服务提供可接受的输入?

  2. 我如何解析 JSON 结果以仅提取国家和城市,以与许多不同类型的位置一致的方式?卷曲,然后呢?理想情况下,我想以一种方式处理美国地点,而以另一种方式处理非美国地点。美国位置将被格式化为 USA-STATE-City,而非美国位置将被格式化为 COUNTRY-City。

我需要在 bash 脚本中完成这一切。我看过 pygeocoder 和 gpsbabel,但它们似乎并没有做到这一点。有一些免费的网络工具可用,但它们不提供 API ( http://www.earthpoint.us/Convert.aspx )。

小智 5

晚点总比没有好,对吧。

所以,我刚刚遇到了同样的问题,并且我已经设法使用 EXIFTool 本身进行转换。尝试这个:

exiftool -n -p '$GPSLatitude,$GPSLongitude' image_name.jpg
Run Code Online (Sandbox Code Playgroud)

转换后的坐标比 Google 提出的稍长,但 API 接受得很好。

干杯。


Jef*_*f Y 2

对于#1,awk 不应该那么复杂:

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
  }'
Run Code Online (Sandbox Code Playgroud)