Datei Format
Ich nehme es als kleine Übung, wie man einen Datenleser programmiert. Schauen Sie sich die Dokumentation an :
SRTM-Daten werden auf zwei Ebenen verteilt: SRTM1 (für die USA und ihre Gebiete und Besitztümer) mit Daten, die in Intervallen von einer Bogensekunde in Längen- und Breitengraden abgetastet werden, und SRTM3 (für die Welt), die mit drei Bogensekunden abgetastet werden.
Die Daten werden in einer "geografischen" Projektion in Breiten- und Längengrade unterteilt, dh in einer Rasterpräsentation mit gleichen Intervallen von Breiten- und Längengraden in keiner Projektion, die jedoch einfach zu manipulieren und zu mosaikieren ist.
Dateinamen beziehen sich auf den Breiten- und Längengrad der linken unteren Ecke der Kachel - z. B. liegt die linke untere Ecke von N37W105 bei 37 Grad nördlicher Breite und 105 Grad westlicher Länge. Genauer gesagt beziehen sich diese Koordinaten auf das geometrische Zentrum des unteren linken Pixels, das im Fall von SRTM3-Daten eine Ausdehnung von etwa 90 Metern hat.
Höhendateien haben die Erweiterung .HGT und sind mit zwei Byte Ganzzahlen signiert. Die Bytes sind in der "Big-Endian" -Reihenfolge von Motorola angegeben, wobei das höchstwertige Byte zuerst angezeigt wird und von Systemen wie Sun SPARC, Silicon Graphics und Macintosh-Computern mit Power PC-Prozessoren direkt gelesen werden kann. DEC Alpha, die meisten PCs und Macintosh-Computer, die nach 2006 gebaut wurden, verwenden die Intel-Reihenfolge ("Little-Endian"), so dass möglicherweise ein gewisser Byte-Austausch erforderlich ist. Die Höhenangaben in Metern beziehen sich auf das Geoid WGS84 / EGM96. Datenlücken wird der Wert -32768 zugewiesen.
Wie geht es weiter?
Für Ihre Position, 50 ° 24'58.888 "N 14 ° 55'11.377" E, haben Sie bereits die richtige Kachel gefunden, N50E14.hgt. Lassen Sie uns herausfinden, an welchem Pixel Sie interessiert sind. Erster Breitengrad, 50 ° 24'58.888 "N:
24'58.888" = (24 * 60)" + 58.888" = 1498.888"
Bogensekunden. Geteilt durch drei und auf die nächste ganze Zahl gerundet ergibt sich eine Gitterreihe von 500. Dieselbe Berechnung für den Längengrad ergibt die Gitterspalte 1104.
In der Schnellstart-Dokumentation fehlen Informationen darüber, wie Zeilen und Spalten in der Datei organisiert sind. In der vollständigen Dokumentation heißt es jedoch, dass
Die Daten werden in der Hauptreihenfolge der Zeilen gespeichert (alle Daten für Zeile 1, gefolgt von allen Daten für Zeile 2 usw.).
Die erste Zeile in der Datei ist sehr wahrscheinlich die nördlichste, dh wenn wir an Zeile 500 vom unteren Rand interessiert sind , müssen wir uns die Zeile tatsächlich ansehen
1201 - 500 = 701
von anfang an ob die datei . Unsere Gitterzelle ist die Nummer
(1201 * 700) + 1104 = 841804
vom Dateianfang an (dh 700 Zeilen überspringen und im 701. Beispiel 1104 nehmen). Zwei Bytes pro Sample bedeuten, dass wir die ersten 1683606 Bytes in der Datei überspringen und dann zwei Bytes lesen müssen, um unsere Gitterzelle zu erhalten. Die Daten sind Big-Endian, was bedeutet, dass Sie die zwei Bytes auf z. B. Intel-Plattformen austauschen müssen.
Beispielprogramm
Ein einfaches Python-Programm zum Abrufen der richtigen Daten sieht folgendermaßen aus ( Informationen zur Verwendung des struct-Moduls finden Sie in den Dokumenten ):
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)
Beachten Sie, dass ein effizienter Datenabruf etwas ausgefeilter aussehen müsste (z. B. das Öffnen der Datei nicht für jede einzelne Probe).
Alternativen
Sie können auch ein Programm verwenden, mit dem die .hgt-Dateien sofort gelesen werden können. Aber das ist langweilig.
.hgt
Dateiformat in der SRTM-Dokumentation , eine spezifische schrittweise Antwort hängt jedoch von der verfügbaren Software ab.