首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Clojure中的SRTM数据

使用Clojure中的SRTM数据
EN

Stack Overflow用户
提问于 2016-07-14 15:05:35
回答 1查看 117关注 0票数 1

我已经下载了一些NASA SRTM高程数据,这是二进制文件。格式是描述如下

DEM是在一个简单的二进制光栅中作为16位有符号整数数据提供的.文件中没有头或预告片字节。数据按行的主要顺序存储(第1行的所有数据,第2行的所有数据等等)。 所有高程均以米为单位,参考WGS84 84/EGM96 96大地水准面,见http:// www.NGA.mil/GandG/wgsegm/。 字节顺序是摩托罗拉(“大端”)标准中最重要的字节优先。由于它们是有符号整数,所以海拔从-32767米到32767米不等,包括地球上的海拔范围。 这些数据还包含了许多原因产生的空洞,如阴影、相位展开异常或其他特定的雷达原因。空标记值为-32768。

为了进一步分析和可视化,我尝试用clojure解析这些值。我的当前代码如下:

代码语言:javascript
复制
;; 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)。如何逆转字节顺序,使其独立于平台?

EN

回答 1

Stack Overflow用户

发布于 2016-07-14 16:55:08

我不太了解美国宇航局提供的海拔数据,但如果你想要有一个不同的字节顺序,只需阅读ByteBuffer。如果您有一个字节数组,则可以通过包装将其轻松转换为ByteBuffer:

代码语言:javascript
复制
(def bb (ByteBuffer/wrap b-array))
(.order bb ByteOrder/BIG_ENDIAN)

要进行访问,可以使用任何ByteBuffer吸气器 (即getLong、getDouble等)。

您还可以将文件直接读入ByteBuffer,例如这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38377789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档