php 通过exif_read_data读取GPS信息后计算出不正常的经纬度
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 通过exif_read_data读取GPS信息后计算出不正常的经纬度相关的知识,希望对你有一定的参考价值。
照片是通过itools导出的,打印GPS数组array(14)
["GPSLatitudeRef"] => string(1) "N"
["GPSLatitude"] => array(3)
[0] => string(18) "637534208/16777216"
[1] => string(14) "922746880/-256"
[2] => string(5) "12/15"
["GPSLongitudeRef"] => string(1) "E"
["GPSLongitude"] => array(3)
[0] => string(19) "2030043136/16777216"
[1] => string(14) "637534208/-256"
[2] => string(5) "12/15"
["GPSAltitudeRef"] => string(1) ""
["GPSAltitude"] => string(9) "43764/565"
["GPSTimeStamp"] => string(3) "3/1"
["GPSSpeedRef"] => string(1) "K"
["GPSSpeed"] => string(3) "0/1"
["GPSImgDirectionRef"] => string(1) "T"
["GPSImgDirection"] => string(9) "58427/235"
["GPSDestBearingRef"] => string(1) "T"
["GPSDestBearing"] => string(9) "58427/235"
["GPSDateStamp"] => string(10) "2018:04:25"
根据这个计算出来的 经纬度是经度:-41385.133111111 ,纬度-60036.666444444
这不是一个正常的经纬度,如何解决
计算方法如下:
function getGps($exifCoord,$banqiu)
$sign = 1;
if(!isset($exifCoord) || $exifCoord=="")
return 0;
$degrees = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
if($degrees<0)
$sign = -1;
$degrees = $degrees * $sign;
$minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
$seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;
$minutes += 60 * ($degrees- floor($degrees));
$degrees = floor($degrees);
$seconds += 60 * ($minutes- floor($minutes));
$minutes = floor($minutes);
if($seconds >= 60)
$minutes += floor($seconds/60.0);
$seconds -= 60*floor($seconds/60.0);
if($minutes >= 60)
$degrees += floor($minutes/60.0);
$minutes -= 60*floor($minutes/60.0);
$lng_lat = $degrees + $minutes/60 + $seconds/60/60;
$lng_lat = $lng_lat * $sign;
if(strtoupper($banqiu)=='W'||strtoupper($banqiu)=='S')
$lng_lat = abs($lng_lat)*-1;
return $lng_lat;
function gps2Num($coordPart)
$parts= explode('/', $coordPart);
if(count($parts) <= 0)
return 0;
if(count($parts) == 1)
return $parts[0];
return floatval($parts[0]) / floatval($parts[1]);
将 exif 输出标准化为十进制度
【中文标题】将 exif 输出标准化为十进制度【英文标题】:Normalize exif output to decimal degrees 【发布时间】: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;
函数运行和输出如我返回数字所述,但是这些数字相距甚远,因为它们被相对靠近而不会产生。
【问题讨论】:
【参考方案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
【讨论】:
以上是关于php 通过exif_read_data读取GPS信息后计算出不正常的经纬度的主要内容,如果未能解决你的问题,请参考以下文章