web-dev-qa-db-ja.com

NASA.hgtバイナリファイルの読み方

バイナリファイルについて何か知っていれば、これは本当に簡単だと思いますが、私はその点で初心者です。

NASAの.hgtファイルからデータを抽出するにはどうすればよいですか? www2.jpl.nasa.gov/srtm/faq.htmlからの説明は次のとおりです。

SRTMデータファイルの名前は「N34W119.hgt」のようになります。文字と数字は何を指し、「。hgt」形式とは何ですか?

各データファイルは、地球の表面の1度の緯度と1度の経度のブロックをカバーしています。最初の7文字はブロックの南西の角を示し、N、S、E、およびWは北、南、東、および西を指します。したがって、「N34W119.hgt」ファイルは、緯度34〜35北、経度118〜119西をカバーします(このファイルには、カリフォルニア州ロサンゼルスのダウンタウンが含まれます)。ファイル名拡張子「.hgt」は、単に「高さ」という単語を表し、標高を意味します。フォーマットタイプではありません。これらのファイルは「生」形式(ヘッダーなし、圧縮なし)、16ビット符号付き整数、海抜メートル単位で測定された標高、「地理的」(緯度と経度の配列)投影であり、データのボイドは-32768で示されます。 。国際的な3秒角のファイルには1201列と1201行のデータがあり、合計ファイルサイズは2,884,802バイト(= 1201 x 1201 x 2)です。米国の1秒角のファイルには3601列と3601行のデータがあり、合計ファイルサイズは25,934,402バイト(= 3601 x 3601 x 2)です。詳細については、http://edcftp.cr.usgs.gov/pub/data/srtm/Readme.htmlにあるテキストファイル「SRTM_Topo.txt」をお読みください。

助けてくれてありがとう!このデータをpythonスクリプトで使用するので、他の言語で言語固有のトリックを使用できない場合は、それは素晴らしいことです。

23
n2kl3kj

テストされたnumpyの例:

import os
import math
import numpy

fn = 'DMV/N51E000.hgt'

siz = os.path.getsize(fn)
dim = int(math.sqrt(siz/2))

assert dim*dim*2 == siz, 'Invalid file size'

data = numpy.fromfile(fn, numpy.dtype('>i2'), dim*dim).reshape((dim, dim))
8
hruske

レコードは固定長(16ビット符号付き整数)であり、グリッドサイズ(1201 x 1201または3601x3601)がわかっているため、Pythonの struct モジュールは理想的に適しているようです(テストされていないコード)。

from struct import unpack,calcsize

# 'row_length' being 1201 or 3601 and 'row' being the raw data for one row
def read_row( row, row_length ):
    format = 'h'  # h stands for signed short

    for i in range(0, row_length):
        offset = i * calcsize(format)
        (height,) = unpack(format, row[offset : offset+calcsize(format))
        # do something with the height

より一般的な用語で説明すると、基本的には、一度に2バイトでファイルを読み取り、読み取ったバイトを16ビットの符号付き整数として解析して処理します。グリッドサイズはすでにわかっているので、行ごとに、またはアプリケーションに便利な他の方法でグリッドサイズを読み取ることができます。また、データファイル内の特定の座標をランダムに探すことができることも意味します。

6
codelogic

Struct.unpackへの何百万もの呼び出しから得られるよりも少し速い速度が必要な場合は、array.arrayを見てください。 「struct-and-for-loop」の実装は、明らかに遅いラップトップでは数秒かかりますが、次のことはほぼ瞬時に行われます。

from array import array

f = open(filename, 'rb')
format = 'h'
row_length = 1201
data = array(format)
data.fromfile(f, row_length*row_length)
data.byteswap()
f.close()
4
user532954

フォトショップをお持ちの場合は、生のインポートを試して、これらのファイルを読み取って、より便利な場所に保存できる可能性があります。私は過去にこの種のことをすることにある程度の成功を収めました。

0
Dolphin

https://gdal.org/drivers/raster/srtmhgt.html

    Input_HGT = 'N30E120.hgt'
    import gdal
    Raster = gdal.Open(Input_HGT) 

ラスターファイルのGDALで使用可能なすべての関数は、次のようにこの「ラスター」に適用できます 変数「ラスター」で使用可能な関数

0

NASA SRTMデータファイルはビッグエンディアン形式であるため、データを読み取るプラットフォームによっては、ビッグエンディアンからリトルエンディアンへの変換が必要になる場合があります。

これを行う方法については多くの情報源がありますが、私はPythonの経験がないので、そこであなたを助けることはできません。

しかし、これを忘れると、あなたの価値観はすべて台無しになってしまいます。

0
boaworm