Extraire l'élévation du fichier .HGT?


20

Je veux attribuer une position longue / lat spécifique sur une carte à l'élévation à partir des fichiers de données SRTM3, mais je ne sais pas comment trouver la valeur spécifique. Je veux donc un exemple de la façon dont je peux trouver dans N50E14.hgt une élévation à 50 ° 24'58.888 "N, 14 ° 55'11.377" E.


1
Quel logiciel utilises-tu? Il y a quelques notes sur le .hgtformat de fichier dans la documentation SRTM , mais une réponse étape par étape spécifique dépend du logiciel dont vous disposez.
anoved

1
Je n'ai pas de logiciel, je suis programmeur c # et j'écris ma propre application. Je peux attribuer un long / lat à chaque pixel et maintenant je veux rechercher l'élévation à chaque point. Le meilleur format de données devrait être quelque chose comme un fichier CSV. Donc, dans une rangée, je peux trouver la longitude, la latitude et l'altitude. J'ai cherché dans la documentation SRTM, mais je n'arrive toujours pas à imaginer comment puis-je fournir l'exploration de données sur le fichier.
MartinS

Réponses:


30

Format des données

Je vais le prendre comme un petit exercice sur la façon de programmer un lecteur de données. Jetez un œil à la documentation :

Les données SRTM sont réparties sur deux niveaux: SRTM1 (pour les États-Unis et ses territoires et possessions) avec des données échantillonnées à des intervalles d'une seconde d'arc en latitude et longitude, et SRTM3 (pour le monde) échantillonnées à trois secondes d'arc.

Les données sont divisées en tuiles de latitude et de longitude d'un degré en projection "géographique", c'est-à-dire une présentation matricielle avec des intervalles égaux de latitude et de longitude en aucune projection mais facile à manipuler et à mosaïquer.

Les noms de fichiers se réfèrent à la latitude et la longitude du coin inférieur gauche de la tuile - par exemple, N37W105 a son coin inférieur gauche à 37 degrés de latitude nord et 105 degrés de longitude ouest. Pour être plus exact, ces coordonnées se réfèrent au centre géométrique du pixel inférieur gauche, qui dans le cas des données SRTM3 aura une étendue d'environ 90 mètres.

Les fichiers de hauteur ont l'extension .HGT et sont signés de deux octets entiers. Les octets sont dans l'ordre "big-endian" de Motorola, l'octet le plus significatif en premier, directement lisible par des systèmes tels que Sun SPARC, Silicon Graphics et les ordinateurs Macintosh utilisant des processeurs Power PC. DEC Alpha, la plupart des PC et des ordinateurs Macintosh construits après 2006 utilisent l'ordre Intel ("little-endian") donc un échange d'octets peut être nécessaire. Les hauteurs sont en mètres par rapport au géoïde WGS84 / EGM96. Les vides de données reçoivent la valeur -32768.

La façon de procéder

Pour votre position, 50 ° 24'58.888 "N 14 ° 55'11.377" E, vous avez déjà trouvé la bonne tuile, N50E14.hgt. Voyons quel pixel vous intéresse. Première latitude, 50 ° 24'58.888 "N:

24'58.888" = (24 * 60)" + 58.888" = 1498.888"

secondes d'arc. Divisé par trois et arrondi à l'entier le plus proche donne une ligne de grille de 500. Le même calcul pour la longitude donne la colonne de grille 1104.

La documentation de démarrage rapide manque d'informations sur la façon dont les lignes et les colonnes sont organisées dans le fichier, mais dans la documentation complète, il est indiqué que

Les données sont stockées dans l'ordre principal des lignes (toutes les données de la ligne 1, suivies de toutes les données de la ligne 2, etc.)

La première ligne du fichier est très probablement la plus septentrionale, c'est-à-dire si nous sommes intéressés par la ligne 500 à partir du bord inférieur , nous devons en fait regarder la ligne

1201 - 500 = 701

dès le début si le fichier . Notre cellule de grille est nombre

(1201 * 700) + 1104 = 841804

dès le début du fichier (c'est-à-dire ignorer 700 lignes, et dans la 701e, prendre l'échantillon 1104). Deux octets par échantillon signifient que nous devons ignorer les premiers 1683606 octets dans le fichier, puis lire deux octets afin d'obtenir notre cellule de grille. Les données sont big-endian, ce qui signifie que vous devez échanger les deux octets, par exemple sur les plates-formes Intel.

Exemple de programme

Un programme Python simpliste pour récupérer les bonnes données ressemblerait à ceci (voir la documentation pour l'utilisation du module 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)

Notez que la récupération efficace des données devrait être un peu plus sophistiquée (par exemple, ne pas ouvrir le fichier pour chaque échantillon).

Alternatives

Vous pouvez également utiliser un programme qui peut lire les fichiers .hgt hors de la boîte. Mais c'est ennuyeux.


Battez-moi à elle, et avec plus de détails pour démarrer!
anoved

Bien expliqué, je t'aime. Merci de votre aide. Vous tous.
MartinS

1
+1 Oui, les rangées sont ordonnées du nord au sud. Cela est clair dès que vous mappez l'un des fichiers. Envisagez également d'obtenir des hauteurs par interpolation bilinéaire entre les quatre centres cellulaires entourant l'emplacement.
whuber

Merci pour cette information complète! J'ai une question: lorsque nous recherchons des données d'élévation pour 50 ° 24'58.888, pourquoi soustrayez-vous le numéro de ligne 500 du bord inférieur lorsque les lignes sont ordonnées du nord au sud? Merci!
Georg

Si je ne me trompe pas, je crois que (j-1) sera juste j. La valeur j varie de 0 à 1200, il n'est donc pas nécessaire de soustraire 1.
Malipivo

6

GDAL peut lire / écrire ces formats raster avec le pilote SRTMHGT . Cela signifie que vous pouvez afficher le raster avec QGIS, ArcGIS ou utiliser les utilitaires GDAL comme gdallocationinfo pour obtenir des valeurs à partir d'un point, par exemple:

Convertir DMS en DD:

  • Lat: 50 ° 24'58.888 "N = 50 + (24/60) + (58.888 / 3600) = 50.4163577778
  • Long: 14 ° 55'11.377 "E = 14 + (55/60) + (11.377 / 3600) = 14.9198269444

Puis à partir d'un shell, utilisez gdallocationinfo file.hgt -wgs84 long lat:

$ gdallocationinfo N50E14.hgt -wgs84 14.9198269444 50.4163577778
Report:
  Location: (1104P,700L)
  Band 1:
    Value: 216

L'altitude est de 216 m.


1
Que diriez-vous d'emplacements dans les côtés sud ou ouest?
Muhammet Ali Asan

2

Si vous utilisez QGIS, vérifiez si le plugin python "Point Sampling Tool" est installé. Vous le trouverez dans -> Améliorations (Python) -> Analyser.

Sélectionnez votre couche de points des positions requises, puis démarrez le PST, choisissez le hgt (ou tout autre fichier raster / polygone) et choisissez une nouvelle forme de point pour la sortie.

C'est tout :-)

  Chris

0

La réponse de Chris indique qu'il est simple d'échantillonner des points d'une couche dans QGIS.

Cependant, puisque votre réponse à mon commentaire précise que vous écrivez votre propre programme pour lire les valeurs d'élévation des .hgtfichiers, jetez un autre coup d'œil au PDF Quickstart dans les documents SRTM. Il explique comment les données d'élévation sont stockées. Résumer:

  • Les fichiers SRTM3 contiennent une séquence de valeurs entières big-endian.
  • Chaque valeur entière représente une élévation "en mètres par rapport au géoïde WGS84 / EGM96", à l'exception des valeurs de -32768, qui indiquent des pixels sans données.
  • Il y a 1201 lignes de 1201 échantillons, donc il devrait y avoir au total 1442401 valeurs entières.

Vous dites que vous pouvez convertir entre les coordonnées lon / lat et les pixels, donc obtenir l'élévation est une question de lecture de la valeur entière à partir du décalage approprié dans le fichier. Étant donné les coordonnées des pixels xet par yrapport au coin supérieur gauche de la scène, c'est essentiellement offset = (y * 1201) + x. Le pixel 0,0est le premier entier du fichier et le pixel 1200,1200est le dernier entier du fichier.


1
C'est exact, mais il manque quelques détails cruciaux fournis par la réponse de bhell, y compris que les coordonnées sont associées aux centres cellulaires . Ainsi, par exemple, le coin supérieur gauche de N50E014.hgt est en fait situé à 13,99958 E de longitude, 51,00042 de latitude N.
whuber
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.