2012-05-26 158 views
0

我有以下代码以从图像中提取和显示EXIF信息。GPS坐标转换 - PHP

<? 
    // +++++++++++++++++++++++++ // 
    // +++++++ GPS EXIF +++++++ // 
    // +++++++++++++++++++++++++ // 

    // --- Change the 'image1.jpg' value below to the path of your file. --- // 
    $Image = 'image1.jpg'; 

    // --- The EXIF read command --- // 
    $ReadEXIFData = read_exif_data($Image, 0, true); 


    // +++++++++++++++++ // 
    // +++ FILE INFO +++ // 
    // +++++++++++++++++ // 
    // --- Get the filename --- // 
    $Filename = $ReadEXIFData['FILE']['FileName']; 
    // --- Get the file size --- // 
    $FileSize = $ReadEXIFData['FILE']['FileSize']; 
    // --- Converts to user-friendly kb, mb and gb sizes --- // 
    if ($FileSize >= 1024) { $ImageFileSize = number_format($FileSize/1024, 2).'kb'; } 
    elseif ($FileSize >= 1048576) { $ImageFileSize = number_format($FileSize/1048576, 2).'mb'; } 
    elseif ($FileSize >= 1073741824) { $ImageFileSize = number_format($FileSize/1073741824, 2).'gb'; } 
    // --- Get the file height --- // 
    $FileHeight = $ReadEXIFData['COMPUTED']['Height'].'px'; 
    // --- Get the file height --- // 
    $FileWidth = $ReadEXIFData['COMPUTED']['Width'].'px'; 



    // +++++++++++++++++++++++ // 
    // +++ GPS COORDINATES +++ // 
    // +++++++++++++++++++++++ // 
    // --- Get GPS hemisphire --- // 
    $GPSHemisphire = $ReadEXIFData["GPS"]["GPSLatitudeRef"]; 

    // --- Get GPS degrees latitude --- // 
    $GPSDegreesLat = intval($ReadEXIFData["GPS"]["GPSLatitude"][0]); 
    // --- Get GPS minutes latitude --- // 
    $GPSMinutesLat = intval($ReadEXIFData["GPS"]["GPSLatitude"][1]); 
    // --- Get GPS seconds latitude --- // 
    $GPSSecondsLat = intval($ReadEXIFData["GPS"]["GPSLatitude"][2]); 
    // --- Get GPS Hemisphere latitude --- // 
    $GPSSecondsLat2 = ($ReadEXIFData["GPS"]["GPSLatitudeRef"]); 
    // --- Decimal Latitude goes here --- // 


    // --- Get GPS degrees longitude --- // 
    $GPSDegreesLon = intval($ReadEXIFData["GPS"]["GPSLongitude"][0]); 
    // --- Get GPS minutes longitude --- // 
    $GPSMinutesLon = intval($ReadEXIFData["GPS"]["GPSLongitude"][1]); 
    // --- Get GPS seconds longitude --- // 
    $GPSSecondsLon = intval($ReadEXIFData["GPS"]["GPSLongitude"][2]); 
    // --- Get GPS Hemisphere longitude --- // 
    $GPSSecondsLon2 = ($ReadEXIFData["GPS"]["GPSLongitudeRef"]); 
    // --- Decimal Longitude goes here --- // 


    // --- Get GPS altitude --- // 
    $GPSAltitude = $ReadEXIFData["GPS"]["GPSAltitude"][0]; 


    ?> 

的信息,然后在HTML页面打印成可以在这里http://ukf.com/easyexif/easyexif3.php

看到的问题是,返回的GPS坐标为度/分/秒。

将它们转换为十进制我有此脚本:

function toDecimal($deg, $min, $sec, $hemi) { 
    $d = $deg + $min/60 + $sec/3600; 
    return ($hemi=='S' || $hemi=='W') ? $d*=-1 : $d; 
    } 

    function divide($a) { 
    $e = explode('/', $a); 
    if (!$e[0] || !$e[1]) { 
     return 0; 
    } else { 
     return $e[0]/$e[1]; 
    } 
    } 

    function getGPS() { 
    global $exif; 
    if ($exif) { $lat = $exif['GPS']['GPSLatitude']; 
    $log = $exif['GPS']['GPSLongitude']; 
     if (!$lat || !$log) return null; 
     $lat_degrees = divide($lat[0]); 
     $lat_minutes = divide($lat[1]); 
     $lat_seconds = divide($lat[2]); 
     $lat_hemi = $exif['GPS']['GPSLatitudeRef']; 
     $log_degrees = divide($log[0]); 
     $log_minutes = divide($log[1]); 
     $log_seconds = divide($log[2]); 
     $log_hemi = $exif['GPS']['GPSLongitudeRef']; 
     $lat_decimal = toDecimal($lat_degrees, $lat_minutes, $lat_seconds, $lat_hemi); 
     $log_decimal = toDecimal($log_degrees, $log_minutes, $log_seconds, $log_hemi); 
     return array($lat_decimal, $log_decimal); 
    } else{ 
     return null; 
    } 
    } 

我需要的是十进制Logitude和纬度的形式返回

$GPSDECLON 
    $GPSDECLAT 

,所以我可以包括它们与上述信息在我的HTML页面。

我的PHP知识目前是如此有限我不知道如何去包括转换到我现有的脚本。

任何人都可以帮忙吗?如果是的话,它会大大降低。

+0

如果我来到新的这个剧本我猜想,'$ GPSSecondsLat2'和'$ GPSSecondsLon2'可能是你是什么东西寻找 - 以小数秒为单位的经纬度。顺便说一句,似乎'$ GPSHemisphire'的分配是不正确的。 – SEngstrom

+0

对不起 - 应该提到'Decimal Latitude goes here'和'Decimal Longitude goes here'是添加转换脚本时要计算的新值的标题。 $ GPSSecondsLat2和$ GPSSecondsLon2调用半球值(即N/S和E/W)在网页上看看,你会明白我的意思。 – pewe

回答

0

有什么不妥,用秒呈现在网页上 - 他们必须在范围[0,60 [

这就是说,该转换是它在PHP代码中的第一个函数说你发布:

function toDecimal($deg, $min, $sec, $hemi) { 
$d = $deg + $min/60 + $sec/3600; 
return ($hemi=='S' || $hemi=='W') ? $d*=-1 : $d; 
} 

也就是说,有60分钟到一定程度,60秒到一分钟。如果你在南半球,则翻转纬度,如果你在“西半球”翻转经度值,这些只是两次测量的基本标志。

所以......

$ GPSDECLON = toDecimal($ GPSDegreesLon,$ GPSMinutesLon,$ GPSSecondsLon,$ EWHemisphere)

其中$ EWHemisphere是 “E” 或 “W” 这取决于你如何半球变量编码它。 然后它是一个类似的纬度线,除非你需要知道它是否为符号的“N”或“S”。

希望帮助和我道歉,如果我在这里失去了你的问题......

+0

在原始脚本(intval)中存在一段代码,它剥离了删除其中一部分的值。这就是为什么价值观就像你看到的那样。我已经删除了'intval',现在您将在网页上看到该值作为分数返回。我发布的代码的目的是分离分数并取消分数以返回小数点的值,然后将miutes和seconds转换为度数的小数点 - 例如,纬度的结果应为51.48571236。该代码的作品,我只是不知道如何将其插入原始脚本。 – pewe