在Clojure中使用SRTM数据

时间:2016-07-14 15:05:36

标签: clojure geospatial binaryfiles

我已经下载了一些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) 。如何反转字节顺序以使其与平台无关?

1 个答案:

答案 0 :(得分:1)

我不太了解nasa提供的高程数据,但是如果你想要一个不同的字节顺序,只需通读ByteBuffer。如果你有一个字节数组,它可以通过包装:

轻松转换为ByteBuffer
(def bb (ByteBuffer/wrap b-array))
(.order bb ByteOrder/BIG_ENDIAN)

要访问,您可以使用ByteBuffer getters中的任何一个(即getLong,getDouble等)。

你也可以直接将文件读入ByteBuffer,看看例如here