2016-07-14 21 views
1

我已經下載了一些NASA SRTM標高數據,這些數據來自二進制文件。格式是described as follows:16位在一個簡單的二進制光柵 符號整數數據在Clojure中使用SRTM數據

的DEM提供。文件中沒有嵌入頭文件或尾部字節。數據按行主要順序存儲(第1行的所有數據,第2行的所有數據跟隨 等)。

所有標高以米爲單位,以WGS84/EGM96大地水準面爲參考,詳見http://www.NGA.mil/GandG/wgsegm/。

字節順序是摩托羅拉(「big-endian」) 標準,其中最重要的字節在前。由於它們被簽署,所以整體高程範圍可以從-32767到32767米, 包含地球上可以找到的高程範圍。

這些 數據還包含來自諸如 陰影,相位解包異常或其他雷達特定原因的多個原因的偶爾空洞。 空洞被標記爲值-32768。

我想用clojure解析這些值進行進一步的分析和可視化。我當前的代碼如下所示:

;; Taken from http://stackoverflow.com/a/26372677/2345852 
(defn slurp-bytes 
    "Slurp the bytes from a slurpable thing" 
    [x] 
    (with-open [out (java.io.ByteArrayOutputStream.)] 
    (clojure.java.io/copy (clojure.java.io/input-stream x) out) 
    (.toByteArray out))) 

(defn read-elevation 
    "Reads elevation data stored in .hgt files as provided by the NASA 
    SRTM datasets" 
    [src] 
    (->> (slurp-bytes src) 
     (partition 2) 
     (map #(reduce + %)))) 

(read-elevation ...) 

然而,這似乎輸出錯誤的數據:我在看喜馬拉雅山和陣列持有-126到150,我建議號是因爲錯誤的字節順序(執行(java.nio.ByteOrder/nativeOrder)返回LITTLE_ENDIAN)。如何反轉字節順序以使其與平臺無關?

回答

1

我對nasa提供的海拔數據不太瞭解,但是如果您想要獲得不同的字節順序,只需通讀ByteBuffer即可。如果有一個字節數組,它可以很容易地通過纏繞轉換爲字節緩衝區:

(def bb (ByteBuffer/wrap b-array)) 
(.order bb ByteOrder/BIG_ENDIAN) 

以及訪問,則可以使用任何的ByteBuffer getters(即getLong,getDouble等)。

你也可以直接將文件讀入一個ByteBuffer,看看例如here