我已经下载了一些NASA SRTM高程数据,这是二进制文件。格式是描述如下
DEM是在一个简单的二进制光栅中作为16位有符号整数数据提供的.文件中没有头或预告片字节。数据按行的主要顺序存储(第1行的所有数据,第2行的所有数据等等)。 所有高程均以米为单位,参考WGS84 84/EGM96 96大地水准面,见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)。如何逆转字节顺序,使其独立于平台?
发布于 2016-07-14 16:55:08
我不太了解美国宇航局提供的海拔数据,但如果你想要有一个不同的字节顺序,只需阅读ByteBuffer。如果您有一个字节数组,则可以通过包装将其轻松转换为ByteBuffer:
(def bb (ByteBuffer/wrap b-array))
(.order bb ByteOrder/BIG_ENDIAN)要进行访问,可以使用任何ByteBuffer吸气器 (即getLong、getDouble等)。
您还可以将文件直接读入ByteBuffer,例如这里。
https://stackoverflow.com/questions/38377789
复制相似问题