27

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

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" は単に "height" という単語を表し、高さを意味します。フォーマットタイプではありません。これらのファイルは、「未加工」形式 (ヘッダーなし、圧縮なし)、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 スクリプトで使用するので、言語固有のトリックを他の言語で使用できない場合、それはすばらしいことです。

4

6 に答える 6

12

テストされた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))
于 2013-06-13T19:09:10.240 に答える
8

レコードは固定長 (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 ビットの符号付き整数として解析して処理します。グリッドのサイズは既にわかっているので、行ごとに、またはアプリケーションにとって便利なその他の方法で読み取ることができます。また、データ ファイル内の特定の座標をランダムにシークできることも意味します。

于 2008-12-10T20:21:12.657 に答える
5

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()
于 2013-01-31T11:58:29.360 に答える
1

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

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

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

于 2019-08-08T12:48:50.747 に答える
0

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

これを行う方法については多数の情報源があります。私は Python の経験がないため、そこではお手伝いできません。

しかし、これを忘れてしまうと、価値観がめちゃくちゃになってしまいます。

于 2009-05-25T14:39:23.893 に答える