将hex转换为lat& amp;所需的PHP函数长

时间:2011-08-21 17:43:21

标签: php binary hex coordinates

我有一个关于纬度和经度编码的问题,这是我的大脑拒绝产生的答案。

我需要编写一个PHP函数,它取值'1446041F'和'447D1100'(Lat& Lng)进行一些处理(我无法理解的位)并输出'52 .062297'和'0.191030'。

我被告知Lat& Lng从签名度,分钟和小数分钟编码为4个字节,格式如下;

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

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

我知道这是在黑暗中的一次大规模拍摄,它可能是如此简单,以至于我理所当然地被告知戴着笨蛋帽子坐在角落里,但是我在低头发上拉扯掉了!

非常感谢任何建议。

谢谢, 马修

2 个答案:

答案 0 :(得分:4)

您给出的示例1446041F447D1100可能是小端字节顺序的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;
}

答案 1 :(得分: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";