Функция PHP требуется для преобразования шестнадцатеричного в лат - PullRequest
2 голосов
/ 21 августа 2011

У меня есть вопрос относительно широты и долготы, ответ на который мой мозг отказывается дать.

Мне нужно написать функцию 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 ]

4 голосов
/ 21 августа 2011

В приведенных вами примерах 1446041F и 447D1100, вероятно, представляют собой 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;
}
2 голосов
/ 21 августа 2011

Вот 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";
...