2011-08-21 99 views
2

我有一个关于纬度和经度编码的问题,我的大脑拒绝产生的答案。我需要编写一个php函数,它需要值'1446041F'和'447D1100'(Lat & Lng)做一些处理(我无法理解的位)并输出'52 .062297'和'0.191030'。PHP函数需要将十六进制转换为纬度和经度

我被告知纬度& Lng从带符号的度数,分钟和小数分钟中编码为4个字节,格式如下:

Latitude: SDDMM.MMMMM where 0≤DD≤90, S = [+|-], 0≤M≤9 
Longitude: SDDDMM.MMMMM where 0≤DDD≤180, S = [+|-], 0≤M≤9 

看到最后一点,我搜索了很多网站,但我仍然不知道这意味着什么。

我知道这是在黑暗中拍摄的巨大照片,它可能非常简单,我可以正确地告诉我坐在戴着dunce帽子的角落里,但我的头发很低,不能拔出!

任何意见是非常感谢。

感谢, 马修

+0

至少你不会在那个角落里独处。 –

回答

2

这里的PHP(详细程度是为了清楚起见):

function llconv($hex) { 
    // Pack hex string: 
    $bin = pack('H*', $hex); 

    // Unpack into integer (returns array): 
    $unpacked = unpack('V', $bin); 

    // Get first (and only) element: 
    $int = array_shift($unpacked); 

    // Decimalize minutes: 
    $degmin = $int/100000; 

    // Get degrees: 
    $deg = (int)($degmin/100); 

    // Get minutes: 
    $min = $degmin - $deg*100; 

    // Return degress: 
    return round($deg + ($min/60), 6); 
} 

$long = '1446041F'; 
$lat = '447D1100'; 

$iLong = llconv($long); 
$iLat = llconv($lat); 

print "Out: $iLong x $iLat\n"; 
+0

我在编辑之前已经回答,我没有看到您的答案。 –

+0

很酷。无论如何,我首先给你一个+1来提到小端的东西。我认为是这样,但是当我看到你的帖子时仍然在检查。 –

+0

感谢您的杰出答案Peter O,但Doug的职责完美地完成了这项工作。我还有一些难题需要解决,我将使用这个代码示例为其他人提供基础。 谢谢你的时间 - 我爱堆栈溢出社区! BTW - Doug;如果你有一个贝宝帐户让我知道,我会给你一些啤酒钱:) –

4

你给我的例子,1446041F447D1100可能是在little-endian字节序的32位有符号整数。 他们要如下:

1446041F -> 0x1F044614 -> 520373780 
447D1100 -> 0x00117D44 -> 001146180 

他们可以在度和分这样解释:

520373780 -> 52 degrees, 03.73780 minutes 
1146480 -> 0 degrees, 11.46480 minutes 

下面的函数将转换指定为度十六进制值。我假设这些值是整数,如0x447D1100等。如果我认为错误并且输入值实际上是字符串,请告诉我。我把这个功能放到了公共领域。

function hextolatlon($hex){ 
    // Assume hex is a value like 0x1446041F or 0x447D1100 
    // Convert to a signed integer 
    $h=$hex&0xFF; 
    $h=($h<<8)|(($hex>>8)&0xFF); 
    $h=($h<<8)|(($hex>>16)&0xFF); 
    $h=($h<<8)|(($hex>>24)&0xFF); 
    $negative=($h>>31)!=0; // Get the sign 
    if($negative){ 
    $h=~$h; 
    $h=$h&0x7FFFFFFF; 
    $h++; 
    } 
    // Convert to degrees and minutes 
    $degrees=floor($h/10000000); 
    $minutes=$h%10000000; 
    // Convert to full degrees 
    $degrees+=($minutes/100000.0)/60.0; 
    if($negative)$degrees=-$degrees; 
    return $degrees; 
}