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]);

参考技术A 你是不是想要给你编写一个获取信息的应用程序啊?还是什么意思哦。那要看你需要哪几个信息啊,如照片的拍摄时间或相机类型还是拍摄光圈等啊

将 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信息后计算出不正常的经纬度的主要内容,如果未能解决你的问题,请参考以下文章

从 php 中的图像读取地理标记数据

php exif_read_data()不在utf-8中

如何从GPS获取数据并发送到服务器以及如何保存到数据库

将 exif 输出标准化为十进制度

如何在 linux 和 windows 上读取 GPS 信息

GPS数据读取与处理