как читать двоичные файлы NASA .hgt - PullRequest
22 голосов
/ 10 декабря 2008

Я уверен, что это действительно просто, если вы знаете что-нибудь о бинарных файлах, но я новичок на этот счет.

Как мне извлечь данные из файлов NASA .hgt? Вот описание с www2.jpl.nasa.gov/srtm/faq.html:

Файлы данных SRTM имеют такие имена, как "N34W119.hgt". Что делать буквы и цифры относятся к формату ".hgt"?

Каждый файл данных охватывает один градус широты и один градус долготы. блок земной поверхности. Первые семь символов обозначают юго-запад угол блока, где N, S, E и W относятся к северу, югу, востоку, и запад. Таким образом, файл «N34W119.hgt» охватывает 34–35 широт и долготы 118-119 к западу (этот файл включает в себя центр Лос-Анджелеса, Калифорния). Расширение имени файла .hgt просто означает слово «высота» означает высоту. Это НЕ тип формата. Эти файлы в «сыром» формате (без заголовков и без сжатия), 16-разрядные целые числа со знаком, высота, измеренная в метрах над уровнем моря, в «географическом» (широта и массив долготы), с пустостями данных, обозначенными как -32768. Международные файлы с тремя дугами-секундами имеют 1201 столбец и 1201 ряд данных. с общим размером файла 2884802 байта (= 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, поэтому, если вы не можете использовать какие-либо специфичные для языка приемы для других языков, это было бы здорово.

Ответы [ 5 ]

6 голосов
/ 13 июня 2013

проверенный пример numy:

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))
6 голосов
/ 10 декабря 2008

Поскольку записи имеют фиксированную длину (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-разрядное целое число со знаком и обработать его. Поскольку вы уже знаете размер сетки, вы можете читать ее построчно или любым другим способом, который удобен для вашего приложения. Это также означает, что вы можете произвольно искать конкретные координаты внутри файла данных.

4 голосов
/ 31 января 2013

Если вы хотите немного большей скорости, чем вы получаете от миллионов вызовов 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()
0 голосов
/ 06 июня 2009

Если у вас есть фотошоп, вы можете поиграть с необработанным импортом, чтобы заставить его читать эти файлы и сохранять их во что-то более полезное. Я имел некоторый успех в подобных вещах в прошлом.

0 голосов
/ 25 мая 2009

Файлы данных NASA SRTM имеют формат Big-Endian, поэтому в зависимости от платформы, на которой вы читаете данные, вам может потребоваться выполнить преобразование из Big-Endian в Little-Endian.

Существует множество источников, как это сделать, у меня нет опыта работы с Python, поэтому я не могу вам помочь.

Но если вы забудете это, ваши ценности будут испорчены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...