如果您对二进制文件有所了解,我确信这很简单,但我在这个分数上是新手。
如何从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脚本中使用这些数据,所以如果你不能对任何其他语言使用任何特定于语言的技巧,那就太棒了。
答案 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'