将 exif 输出标准化为十进制
Normalize exif output to decimal degrees
我正在尝试规范化从图像头部获得的 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;
}
该函数按照我正在返回的数字所描述的那样运行和输出,但是这些数字相距很远,因为它们被相对靠近地放在一起而不会产生。
您正在尝试对 "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
我正在尝试规范化从图像头部获得的 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;
}
该函数按照我正在返回的数字所描述的那样运行和输出,但是这些数字相距很远,因为它们被相对靠近地放在一起而不会产生。
您正在尝试对 "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