我已經下載了一些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
)。如何反轉字節順序以使其與平臺無關?