如何阅读NASA .hgt二进制文件

时间:2008-12-10 20:05:37

标签: file binary

如果您对二进制文件有所了解,我确信这很简单,但我在这个分数上是新手。

如何从NASA .hgt文件中提取数据?以下是来自www2.jpl.nasa.gov/srtm/faq.html的说明:

  

SRTM数据文件的名称类似于“N34W119.hgt”。做什么的   字母和数字是指,什么是“.hgt”格式?

     

每个数据文件涵盖一度经度的一度经度   地球表面的块。前七个字符表示西南   街区一角,N,S,E,W指北,南,东,   和西。因此,“N34W119.hgt”文件涵盖了北纬34到35的纬度   经度118-119 West(此档案包括洛杉矶市中心,   加州)。文件扩展名“.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)。更多   信息读取文本文件“SRTM_Topo.txt”   http://edcftp.cr.usgs.gov/pub/data/srtm/Readme.html

感谢您的帮助!我将在python脚本中使用这些数据,所以如果你不能对任何其他语言使用任何特定于语言的技巧,那就太棒了。

6 个答案:

答案 0 :(得分:6)

由于记录是固定长度(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位有符号整数并处理它。由于您已经知道网格大小,因此您可以逐行或以适合您的应用程序的任何其他方式读取它。这也意味着您可以随机搜索数据文件中的特定坐标。

答案 1 :(得分:6)

经过测试的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))

答案 2 :(得分:4)

如果你想要从数百万次调用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()

答案 3 :(得分:0)

NASA SRTM数据文件采用Big-Endian格式,因此根据您正在阅读数据的平台,您可能需要进行从Big-Endian到Little-Endian的转换。

关于如何做到这一点有很多来源,我没有使用Python的经验,所以我无法帮助你。

但如果你忘记了这一点,那么你的价值观就会搞砸了。

答案 4 :(得分:0)

如果您有photoshop,您可以使用原始导入来阅读这些文件并将其保存为更有用的内容。我过去做过这样的事情已经取得了一些成功。

答案 5 :(得分:0)

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

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

GDAL可以将栅格文件上的所有可用功能应用于此“栅格”,例如 Functions available with the variable, 'Raster'