【问题标题】:Working with SRTM data in Clojure在 Clojure 中处理 SRTM 数据
【发布时间】: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


    【解决方案1】:

    我对 nasa 提供的高程数据了解不多,但如果你想要不同的字节顺序,只需通过 ByteBuffer 读取即可。如果你有一个字节数组,它可以很容易地通过包装转换为 ByteBuffer:

    (def bb (ByteBuffer/wrap b-array))
    (.order bb ByteOrder/BIG_ENDIAN)
    

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2020-07-14
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多