2011-08-21 62 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; 
}