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
我的问题是:
如何将 GPS 位置格式化为纬度/经度值,以便为 Google 地理定位等服务提供可接受的输入?
我如何解析 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 接受得很好。
干杯。
对于#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)