Format danych
Zajmę się tym jako małe ćwiczenie w programowaniu czytnika danych. Zajrzyj do dokumentacji :
Dane SRTM są podzielone na dwa poziomy: SRTM1 (dla Stanów Zjednoczonych i ich terytoriów oraz posiadłości) z danymi próbkowanymi w odstępach jednosekundowych długości i szerokości geograficznej oraz SRTM3 (dla świata) próbkowanymi z trzema sekundami łukowymi.
Dane są dzielone na kafelki szerokości i długości geograficznej jeden na jeden stopień w projekcji „geograficznej”, co oznacza prezentację rastrową o równych odstępach szerokości i długości geograficznej bez projekcji, ale łatwą do manipulowania i mozaikowania.
Nazwy plików odnoszą się do szerokości i długości geograficznej lewego dolnego rogu płytki - np. N37W105 ma lewy dolny róg na 37 stopniach szerokości geograficznej północnej i 105 stopniach długości geograficznej zachodniej. Mówiąc ściślej, współrzędne te odnoszą się do geometrycznego środka lewego dolnego piksela, który w przypadku danych SRTM3 będzie wynosił około 90 metrów.
Pliki wysokości mają rozszerzenie .HGT i są podpisane dwubajtowymi liczbami całkowitymi. Bajty są w kolejności „big-endian” firmy Motorola, z najważniejszym bajtem jako pierwszym, bezpośrednio odczytywanym przez systemy takie jak Sun SPARC, Silicon Graphics i komputery Macintosh wykorzystujące procesory Power PC. DEC Alpha, większość komputerów PC i Macintosh zbudowanych po 2006 roku korzysta z kolejności Intel („little-endian”), więc może być konieczna zamiana bajtów. Wysokości podano w metrach w odniesieniu do geoidy WGS84 / EGM96. Pustki danych mają przypisaną wartość -32768.
Jak postępować
Dla swojej pozycji, 50 ° 24'58.888 "N 14 ° 55'11.377" E, już znalazłeś prawidłową płytkę, N50E14.hgt. Sprawdźmy, który piksel Cię interesuje. Pierwsza szerokość geograficzna, 50 ° 24'58.888 "N:
24'58.888" = (24 * 60)" + 58.888" = 1498.888"
sekundy łukowe. Podzielony przez trzy i zaokrąglony do najbliższej liczby całkowitej daje wiersz siatki 500. To samo obliczenie długości geograficznej daje kolumnę 1104 siatki.
W dokumentacji szybkiego startu brakuje informacji o tym, jak wiersze i kolumny są zorganizowane w pliku, ale w pełnej dokumentacji jest to zaznaczone
Dane są przechowywane w głównej kolejności wiersza (wszystkie dane dla wiersza 1, a następnie wszystkie dane dla wiersza 2 itd.)
Pierwszy wiersz w pliku jest najprawdopodobniej tym najbardziej wysuniętym na północ, tzn. Jeśli interesuje nas wiersz 500 od dolnej krawędzi , musimy spojrzeć na wiersz
1201 - 500 = 701
od początku, jeśli plik . Nasza komórka siatki to liczba
(1201 * 700) + 1104 = 841804
od początku pliku (tj. pomiń 700 wierszy, a w 701-szym weź próbkę 1104). Dwa bajty na próbkę oznaczają, że musimy pominąć pierwsze 1683606 bajtów w pliku, a następnie odczytać dwa bajty, aby uzyskać komórkę siatki. Dane są typu big-endian, co oznacza, że musisz zamienić dwa bajty np. Na platformach Intela.
Przykładowy program
Uproszczony program Pythona do pobierania odpowiednich danych wyglądałby tak (patrz dokumentacja dotycząca korzystania z modułu 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)
Zauważ, że wydajne pobieranie danych musiałoby wyglądać na bardziej wyrafinowane (np. Nie otwieranie pliku dla każdej próbki).
Alternatywy
Możesz także użyć programu, który może odczytywać pliki .hgt po wyjęciu z pudełka. Ale to jest nudne.
.hgt
formatu pliku , ale szczegółowa odpowiedź zależy od dostępnego oprogramowania.