将exif输出规范化为十进制度数

时间:2016-12-17 03:44:35

标签: php string gps exif geo

我正在尝试规范化我从图像头部获得的$exifs = exif_read_data($file, 0, true); $raw_lat = $exifs['GPS']['GPSLatitude']; $raw_lon = $exifs['GPS']['GPSLongitude']; 输出。现在,我这样做:。

$raw_lat

并且array(3) { [0]=> string(4) "34/1" [1]=> string(3) "5/1" [2]=> string(11) "231365/9853" } 的var转储如下所示:

$raw_lon

private function normalize($array){ $deg = $array[0]; $min = $array[1]; $sec = $array[2]; $dd = $deg+((($min*60)+($sec))/3600); return $dd; } 具有相同的结构,所以我认为我需要做的是将其标准化为十进制度数是使用以下函数:

<a :href="post.user.profileUrl">@{{ post.user.name }}</a>

该函数运行和输出如我所描述的那样返回数字然而这些数字是相距很远的并且由于它们被相对靠近在一起而不会产生。

1 个答案:

答案 0 :(得分:0)

您正尝试对像"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