【发布时间】:2016-07-15 00:55:08
【问题描述】:
我已经下载了一些 NASA SRTM 高程数据,这些数据以二进制文件的形式提供。格式为described as follows:
DEM 以简单二进制格式的 16 位有符号整数数据形式提供 光栅。文件中没有嵌入头或尾字节。这 数据按行主要顺序存储(第 1 行的所有数据,其次是 通过第 2 行的所有数据等)。
所有高程均以米为单位,参考 http://www.NGA.mil/GandG/wgsegm/ 中记录的 WGS84/EGM96 大地水准面。
字节顺序是摩托罗拉(“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)。如何反转字节顺序以使其独立于平台?
【问题讨论】:
标签: clojure geospatial binaryfiles