我已经下载了一些NASA SRTM高程数据,这些数据来自二进制文件。格式为described as follows:
DEM以简单二进制形式提供为16位有符号整数数据 光栅。文件中没有嵌入标题或尾部字节。该 数据以行主要顺序存储(第1行的所有数据,紧随其后) 第2行的所有数据等。)。
所有高程均以米为单位,以WGS84 / EGM96大地水准面为参考,详见http:// www.NGA.mil/GandG/wgsegm /.
字节顺序是摩托罗拉(“大端”) 首先是最重要字节的标准。因为他们签了名 整数高程范围为-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
) 。如何反转字节顺序以使其与平台无关?
答案 0 :(得分:1)
我不太了解nasa提供的高程数据,但是如果你想要一个不同的字节顺序,只需通读ByteBuffer。如果你有一个字节数组,它可以通过包装:
轻松转换为ByteBuffer(def bb (ByteBuffer/wrap b-array))
(.order bb ByteOrder/BIG_ENDIAN)
要访问,您可以使用ByteBuffer getters中的任何一个(即getLong,getDouble等)。
你也可以直接将文件读入ByteBuffer,看看例如here。