【问题标题】:Normalize exif output to decimal degrees将 exif 输出标准化为十进制度
【发布时间】:2017-05-02 21:17:06
【问题描述】:

我正在尝试规范化从图像头部获得的exif() 输出。现在,我正在这样做:。

$exifs   = exif_read_data($file, 0, true);
$raw_lat = $exifs['GPS']['GPSLatitude'];
$raw_lon = $exifs['GPS']['GPSLongitude'];

$raw_lat 的 var 转储看起来像这样:

array(3) { [0]=> string(4) "34/1" [1]=> string(3) "5/1" [2]=> string(11) "231365/9853" }

$raw_lon 具有相同的结构,所以我认为将其标准化为十进制度所需要做的是使用以下函数:

private function normalize($array){
    $deg = $array[0];
    $min = $array[1];
    $sec = $array[2];
    $dd  = $deg+((($min*60)+($sec))/3600);
    return $dd;
}

函数运行和输出如我返回数字所述,但是这些数字相距甚远,因为它们被相对靠近而不会产生。

【问题讨论】:

    标签: php string gps exif geo


    【解决方案1】:

    您正尝试对"34/100" 等分数的字符串表示形式执行算术运算。在解释strings in numeric context 时,PHP 将截断值直到/ 字符,特别是。例如,"34/100" + "1/100000" 的结果是 35,但不是 0.34001。所以你必须自己将字符串转换为数字。

    示例

    /**
     * @param string $s Number as a fraction A/B, e.g. 34/100
     * @return float
     */
    function string_to_float($s) {
      $parts = explode('/', $s);
      return (count($parts) >= 2)
        ? ($parts[0] / $parts[1])
        : floatval($parts[0]);
    }
    
    /**
     * @param array $dms Latitude/longitude degrees, minutes, and seconds
     * @return float
     */
    function latlong_normalize(array $dms) {
      $deg = string_to_float($dms[0]);
      $min = string_to_float($dms[1]);
      $sec = string_to_float($dms[2]);
      return $deg + ($min * 60 + $sec) / 3600;
    }
    
    // Latitude = 34 5 231365/9853
    $raw_lat = ['34/1', '5/1', '231365/9853'];
    
    echo latlong_normalize($raw_lat);
    

    输出

    34.089856022418
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 2010-12-01
      • 2015-08-10
      • 2021-09-23
      相关资源
      最近更新 更多