Formato de dados
Vou usar isso como um pequeno exercício de como programar um leitor de dados. Dê uma olhada na documentação :
Os dados SRTM são distribuídos em dois níveis: SRTM1 (para os EUA e seus territórios e posses) com dados amostrados em intervalos de um segundo de arco em latitude e longitude, e SRTM3 (para o mundo) amostrados em três segundos de arco.
Os dados são divididos em blocos de latitude e longitude de um por um grau na projeção "geográfica", ou seja, uma apresentação raster com intervalos iguais de latitude e longitude em nenhuma projeção, mas fáceis de manipular e mosaico.
Os nomes de arquivo se referem à latitude e longitude do canto inferior esquerdo do bloco - por exemplo, o N37W105 tem seu canto inferior esquerdo a 37 graus de latitude norte e 105 graus de longitude oeste. Para ser mais exato, essas coordenadas se referem ao centro geométrico do pixel inferior esquerdo, que no caso dos dados do SRTM3 terá cerca de 90 metros de extensão.
Os arquivos de altura têm a extensão .HGT e são assinados com números inteiros de dois bytes. Os bytes estão na ordem "big endian" da Motorola, com o byte mais significativo primeiro, diretamente legível por sistemas como os computadores Sun SPARC, Silicon Graphics e Macintosh usando processadores Power PC. DEC Alpha, a maioria dos computadores PC e Macintosh criados após 2006 usa a ordem Intel ("little-endian"), portanto, pode ser necessária alguma troca de bytes. As alturas estão em metros referenciados ao geóide WGS84 / EGM96. Vazios de dados recebem o valor -32768.
Como proceder
Para sua posição, 50 ° 24'58.888 "N 14 ° 55'11.377" E, você já encontrou o ladrilho correto, N50E14.hgt. Vamos descobrir em qual pixel você está interessado. Primeira latitude, 50 ° 24'58.888 "N:
24'58.888" = (24 * 60)" + 58.888" = 1498.888"
segundos de arco. Dividido por três e arredondado para o número inteiro mais próximo, fornece uma linha de grade de 500. O mesmo cálculo para longitude resulta na coluna de grade 1104.
A documentação de início rápido carece de informações sobre como as linhas e colunas são organizadas no arquivo, mas na documentação completa , afirma-se que
Os dados são armazenados na ordem principal da linha (todos os dados da linha 1, seguidos por todos os dados da linha 2, etc.)
A primeira linha do arquivo é provavelmente a mais setentrional, ou seja, se estivermos interessados na linha 500 a partir da borda inferior , na verdade temos que olhar para a linha
1201 - 500 = 701
desde o início, se o arquivo . Nossa célula da grade é o número
(1201 * 700) + 1104 = 841804
desde o início do arquivo (pule 700 linhas e, na 701ª, pegue a amostra 1104). Dois bytes por amostra significa que precisamos pular os primeiros 1683606 bytes no arquivo e depois ler dois bytes para obter nossa célula da grade. Os dados são big-endian, o que significa que você precisa trocar os dois bytes em, por exemplo, plataformas Intel.
Programa de exemplo
Um programa Python simplista para recuperar os dados corretos seria assim (consulte os documentos para uso do módulo struct):
import struct
def get_sample(filename, n, e):
i = 1201 - int(round(n / 3, 0))
j = int(round(e / 3, 0))
with open(filename, "rb") as f:
f.seek(((i - 1) * 1201 + (j - 1)) * 2) # go to the right spot,
buf = f.read(2) # read two bytes and convert them:
val = struct.unpack('>h', buf) # ">h" is a signed two byte integer
if not val == -32768: # the not-a-valid-sample value
return val
else:
return None
if __name__ == "__main__":
n = 24 * 60 + 58.888
e = 55 * 60 + 11.377
tile = "N50E14.hgt" # Or some magic to figure it out from position
print get_sample(tile, n, e)
Observe que a recuperação eficiente de dados teria que parecer um pouco mais sofisticada (por exemplo, não abrir o arquivo para cada amostra).
Alternativas
Você também pode usar um programa que pode ler os arquivos .hgt imediatamente. Mas isso é chato.
.hgt
formato do arquivo na documentação do SRTM , mas uma resposta passo a passo específica depende do software que você tem disponível.