Veri formatı
Veri okuyucuyu nasıl programlayacağınız konusunda biraz alıştırma yapacağım. Belgelere bir göz atın :
SRTM verileri iki düzeyde dağıtılır: enlem ve boylamda bir yay-saniyelik aralıklarla örneklenen verilerle SRTM1 (ABD ve bölgeleri ve mülkleri için) ve üç yay-saniyede örneklenmiş SRTM3 (dünya için).
Veriler, "coğrafi" projeksiyonda bir dereceye kadar enlem ve boylam karolarına bölünür; bu, hiç bir projeksiyonda eşit enlem ve boylam aralıklarına sahip, manipüle edilmesi kolay ve mozaik olan bir raster sunumu anlamına gelir.
Dosya adları, döşemenin sol alt köşesinin enlem ve boylamını belirtir - örneğin N37W105'in sol alt köşesi 37 derece kuzey enleminde ve 105 derece batı boylamındadır. Daha kesin olmak gerekirse, bu koordinatlar, sol alt pikselin SRTM3 verisi durumunda yaklaşık 90 metre olacak şekilde geometrik merkezini ifade eder.
Yükseklik dosyaları .HGT uzantısına sahiptir ve iki bayt tamsayı ile imzalanmıştır. Baytlar Motorola "big-endian" düzenindedir ve en önemli bayt ilk sıradadır, Power PC işlemcileri kullanan Sun SPARC, Silicon Graphics ve Macintosh bilgisayarlar gibi sistemler tarafından doğrudan okunabilir. DEC Alpha, 2006'dan sonra üretilen çoğu PC ve Macintosh bilgisayarında Intel ("little-endian") sırası kullanılır, bu nedenle bazı bayt değiştirme gerekebilir. Yükseklikler, WGS84 / EGM96 geoidine referans olarak metre cinsindendir. Veri boşluklarına -32768 değeri atanır.
Nasıl devam edilir?
Pozisyonunuz için 50 ° 24'58.888 "N 14 ° 55'11.377" E, doğru döşemeyi zaten buldunuz, N50E14.hgt. Hangi pikselle ilgilendiğinizi bulalım. İlk enlem, 50 ° 24'58.888 "N:
24'58.888" = (24 * 60)" + 58.888" = 1498.888"
ark saniye. Üçe bölünür ve en yakın tamsayıya yuvarlanır, 500 ızgara satırı verir. Boylam için aynı hesaplama, ızgara sütunu 1104'te elde edilir.
Hızlı başlangıç belgeleri satır ve sütun dosyasında nasıl düzenlendiği hakkında bilgi bulunmayan, ancak içinde tam dokümantasyon o belirtilmektedir
Veriler sıra ana sırasında depolanır (1. sıra için tüm veriler, ardından 2. sıra için tüm veriler vb.)
Dosyadaki ilk satır en kuzeydeki satırdır, yani alt kenardan 500. sıra ile ilgileniyorsak , aslında sıraya bakmalıyız
1201 - 500 = 701
başından itibaren dosya . Izgara hücremiz sayıdır
(1201 * 700) + 1104 = 841804
dosyanın başlangıcından itibaren (yani, 700 satırı atlayın ve 701. birincisinde örnek 1104'ü alın). Örnek başına iki bayt, dosyadaki ilk 1683606 baytı atlamamız ve ardından ızgara hücremizi almak için iki baytı okumamız gerektiği anlamına gelir. Veriler big-endian, yani Intel platformlarında iki baytı değiştirmeniz gerekiyor.
Örnek program
Doğru verileri almak için basit bir Python programı şöyle görünecektir ( struct modülünün kullanımı için belgelere bakın ):
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)
Verimli veri alımının biraz daha karmaşık görünmesi gerektiğini unutmayın (örneğin, her örnek için dosyayı açmamak).
Alternatifler
.Hgt dosyalarını kutudan çıkarabilen bir program da kullanabilirsiniz. Ama bu sıkıcı.
.hgt
dosya biçimi hakkında bazı notlar vardır , ancak belirli bir adım adım yanıt, elinizde bulunan yazılıma bağlıdır.