2016-07-14 6 views
1

バイナリファイルで提供されるNASA SRTM標高データの一部をダウンロードしました。フォーマットはdescribed as followsある:ClojureでSRTMデータを操作する

DEMは、単純なバイナリ ラスタの16ビット符号付き整数データとして提供されます。ファイルに埋め込まれたヘッダーまたはトレーラーバイトはありません。 のデータは、行のメジャー順(1行目のすべてのデータ、次に2行目のすべてのデータで など)に格納されます。

http:// www.NGA.mil/GandG/wgsegm/に記載されているように、すべての標高はWGS84/EGM96ジオイドを基準としたメートル単位です。

バイト順序は、モトローラ( "ビッグエンディアン") 標準で、最上位バイトが最初です。 に符号が付けられているので、整数の標高は-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

nasaが提供する標高データはあまり知られていませんが、別のバイトオーダーを使用する場合は、ByteBufferを読み込むだけです。あなたはバイト配列を持っている場合は、それが簡単にラッピングでのByteBufferに変換することができます

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

とアクセスするには、ByteBuffer getters(すなわちにGetLong、GetDoubleを、など)のいずれかを使用することができます。

また、ファイルを直接ByteBufferに読み込んで、hereの例を見ることもできます。