【问题标题】:Reverse Geocoding in Bash using GPS Position from exiftool使用 exiftool 中的 GPS 位置在 Bash 中反向地理编码
【发布时间】:2015-09-30 20:43:16
【问题描述】:

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

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

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

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

我的 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

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

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

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

40.7470444°, -073.9411611°

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)。

【问题讨论】:

  • 一个有趣的任务。有关公式,请参阅此问题:stackoverflow.com/questions/15962939/…。做起来应该不会太难。记得$(( math expressions )) 可以提供帮助。祝你好运。
  • 看起来我会适应这样的事情(thelinuxrain.com/articles/dms-to-dd-to-kml-with-awk-and-sed):location=awk -v FS="[ \t]" '{print $0,substr($1,length($1),1)substr($2,length($2),1)}' $i \ | sed 's/\xc2\xb0\([0-9]\{1,2\}\).\([NEWS]\)/ \1 0 \2/g;s/\xc2\xb0\([NEWS]\)/ 0 0 \1/g;s/[^0-9NEWS]/ /g' \ | awk '{if ($9=="NE") {printf ("%.4f\t%.4f\n",$1+$2/60+$3/3600,$5+$6/60+$7/3600)} 但我遇到了这个错误,有什么想法吗?:sed: RE error: illegal byte sequence
  • xc2 带给你什么?还是输出非ASCII?鉴于您对osx 的需求,建议安装gawk 并在其中完成所有操作。 (也许我错过了为什么你需要 3 个步骤(有时它是一个更简单的解决方案))。如果awk 可以交出xc2(看起来如此),那么为什么不在那里做整件事呢。阅读match() 及其设置的变量。您可以使用它复制大多数 seds \1 捕获缓冲区。今晚很忙,所以帮不上什么忙。但祝你好运 ;-)!
  • 另外,我会重写你的问题只是为了专注于这种转换和你的问题。请务必包括示例输入、所需输出、当前输出、错误消息和代码。你越来越近了。祝你好运。

标签: bash google-maps awk gps reverse-geocoding


【解决方案1】:

迟到总比没有好,对吧。

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

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

转换后的坐标比 Google 建议的稍长,但 API 接受它很好。

干杯。

【讨论】:

  • 如何设置变量值?通过单独调用 exiftool?
【解决方案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
  }'

【讨论】:

    【解决方案3】:

    我最终在 PHP 中完成了它,但感谢 Marco 的提示,我会检查一下!

    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;
    
    }
    

    【讨论】:

      【解决方案4】:

      来自man exiftool(注意最后一行):

         -c FMT (-coordFormat)
              Set the print format for GPS coordinates.  FMT uses the same syntax
              as a "printf" format string.  The specifiers correspond to degrees,
              minutes and seconds in that order, but minutes and seconds are
              optional.  For example, the following table gives the output for
              the same coordinate using various formats:
      
                          FMT                  Output
                  -------------------    ------------------
                  "%d deg %d' %.2f"\"    54 deg 59' 22.80"  (default for reading)
                  "%d %d %.8f"           54 59 22.80000000  (default for copying)
                  "%d deg %.4f min"      54 deg 59.3800 min
                  "%.6f degrees"         54.989667 degrees
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多