27

如果您对二进制文件有所了解,我敢肯定这真的很简单,但我是这方面的新手。

如何从 NASA .hgt 文件中提取数据?这是来自 www2.jpl.nasa.gov/srtm/faq.html 的描述:

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

每个数据文件覆盖地球表面一个纬度乘一经度的块。前七个字符表示该块的西南角,其中 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 数据文件采用 Big-Endian 格式,因此根据您在哪个平台上读取数据,您可能需要将 Big-Endian 转换为 Little-Endian。

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

但如果你忘记了这一点,你的价值观就会一团糟。

于 2009-05-25T14:39:23.893 回答
-1

如果您有 Photoshop,您可能可以使用原始导入来让它读取这些文件并将它们保存到更有用的东西中。过去,我在做这类事情方面取得了一些成功。

于 2009-06-06T05:46:16.730 回答