Witam!
Chciałbym dorzucić moje doświadczenia w temacie SRTM.
Skoro jest już ten wątek, wkleję to tutaj...
Jakiś czas temu wzięło mnie na przetwarzanie plików wysokościowych SRTM, do których ktoś podał link (
http://netgis.geo.uw.edu.pl/srtm/Poland).
Ponieważ akurat mieszkam w okolicy 19°E 52°N, ściągnąłem pliki jej dotyczące. Pierwszym etapem przetworzenia było stworzenie pliku BMP, z odcieniami szarości od 0 do 255 w zakresie od minimum do maksimum wysokości na danym obszarze. W moim rozumieniu (bo nie czytałem dokumentacji do tych plików), w plikach jest po 1200 wysokości na stopień, zarówno długości jak i szerokości (co 3 sekundy kąta). Podane są one w metrach npm. Jest ich 1201, a nie 1200, dlatego, że powielone są wysokości z kolejnego południka i równoleżnika. Zszywając 2 takie kwadraty, należałoby usunąć jedną skrajną kolumnę wartości.
Pierwszy problem, jaki napotkałem, to były punkty z wpisaną wysokością 32768, podczas gdy normalnie wysokość jest w przedziale rzędu 90 do 280 (kopalnia Bełchatów: od 1 do 394). Wygląda na to, że wartość 32768 występuje w miejscach zbiorników wodnych. Na skutek drobnej pomyłki zacząłem od kwadratu 19-20°E 51-52°N, gdzie wyraźnie widać wykop kopalni oraz hałdę.
Jasna plama u góry to wzgórze, na którym znajduje się Łódź. Regularne kształty wokół (figury o dobrze zarysowanych brzegach) to lasy. Druga jasna plama poniżej, to okolice Tuszyna. Czarne koryto po prawej, idące w dół, to Wolbórka. Poniżej z białymi punktami (wspomniane 32768) to jezioro Sulejowskie. Jeszcze niżej i bardziej na środku widać hałdę kopalni a obok wykop. (Widać, gdzie w wykopie zbiera się woda.)
Tutaj, na czterokrotnym powiększeniu, widać lasy w okolicy Koluszek (u góry po środku) oraz układ torów przebiegających przez las. W lewo do Łodzi (nad lasem, słabo to widać), skosem w lewy dół do Piotrkowa, w prawo w skos do Radomia. W górę do Warszawy, czego nie nie widać.
Po eksploracji sąsiedniego kwadratu, wziąłem się za swój 18-19°E 51-52°N. Widać na nim doliny Prosny (po lewej) oraz Warty (po prawej). Charakterystyczne jest zakole Warty (na dole). W prawym, górnym rogu jest jeszcze Ner.
Ponieważ interesowała mnie okolica Poddębic, zrobiłem sobie mniejszy obrazek (301×201 pikseli), odpowiadający wojskowej mapie topograficznej M-34-2-B. Znajdujące się w pliku przedział wysokości to 96-172 (77 różnych). Chciałem sobie wygenerować z tych danych scenerię. Przyjąłem, że generowany obszar (15' dł. × 10' sz.) ma 17250×18550 metrów (320km²). Oznacza to, że punkty wysokościowe wypadają co 57.5m w długości (na obrazku w poziomie) oraz 92.75m w szerokości (pionie). Proporcja między nimi to 100:161 oraz 62:100. (Prawie złoty podział...)
Wygenerowałem scenerię - po 2 trójkąty na każde 4 punkty wysokości (120 tysięcy) z teksturą
grass.bmp (jako wektor normalny dałem 0 1 0). Pierwsza próba dała plik 30MB oraz trójkąty widoczne od spodu. W zbliżeniu jedna zielona plama.
Zdecydowałem się nie czekać więcej na generację i wczytanie tak dużego pliku i ograniczyłem teren do 1/3 w długości i 1/2 w szerokości. Wyszło więc 100×100 punktów, 5750×9275 m i plik wielkości 5MB (20 tysięcy trójkątów). Po kilku dalszych próbach i oglądaniu krawędzi uznałem, że potrzebne będą jednak wektory normalne, bo "po wyjściu" na środek wszystko się zlewa, a nierówności terenu są widoczne jedynie z profilu (na brzegu scenerii i krawędzi horyzontu).
Wektory normalne [nx,nz,ny] postanowiłem wygenerować w sposób uproszczony. Dla każdego punktu powierzchni z(x,y) wyliczałem średnią zmiany wysokości (nachylenia) w długości zx=(z(x+1,y)-z(x-1,y))/2 i szerokości zy=(z(x,y+1)-z(x,y-1))/2. Następnie z proporcji wyliczałem współrzędne nx i ny wektora normalnego (zakładając, że wektor normalny długości 1m jest prostopadły do nachylenia X oraz Y - czyli przeciwprostokątnych trójkątów prostokątnych o bokach zx i 57.5m oraz o bokach zy oraz 92.75m). Współrzędna nz została wyliczona tak, aby wektor miał długość 1. Wyglądało to już nieco lepiej, ale nadal było dalekie od sensu.
Kolejny pomysł polegał uzależnieniu tekstury od zawartości mapy wojskowej. Odpowiedni fragment (5'×5') przeskalowałem do kwadratu 100×100 pikseli. Pierwotnie miało to być tylko odróżnienie obszaru lasu (zielone), ale narysowałem też piksele na drogach (żółte), linii kolejowej (czerwone) oraz rzekach i zbiornikach wodnych (niebieskie).
To, co mi wyszło wyglądało już jak jakiś teren, ale nadal nie układało się w większy sens. Po bliższym przyjrzeniu się i nałożeniu obrazka wysokości na obrazek treści okazało się, że są one przesunięte względem siebie o 3 piksele w poziomie i 1 w pionie (porównywałem zarysy lasów).
Przesunięcie pikseli względem siebie (obrazek powyżej) spowodowało, że sceneria zaczęła już przypominać znaną mi okolicę. Ostatnim pomysłem było kilkukrotne zwiększenie różnic wysokości (razy 7 to już przesada, ale 3 do 5 daje całkiem ciekawy efekt).
Moim zdaniem wnioski są następujące:
1. Trzeba uważać na współrzędne geograficzne. Nie ma gwarancji, że mając na myśli 19°E 52°N trafimy za każdym razem na ten sam punkt na każdej mapie (plik wysokości SRTM, wojskowa mapa topograficzna, Google maps, GPS). Różnice mogą być rzędu 200m, przez co nie wiadomo, które uważać za absolutnie właściwe. Być może wynika to z tego, że mapa wojskowa ma "Układ współrzędnych 1942", a około 1992 wprowadzono jakaś zmiany.
2. Bardziej optymalnym układem do celów tworzenia realistycznych scenerii wydaje się być siatka kilometrowa z map wojskowych (widziałem też wytartą siatkę na mapie turystycznej, ale po pozostałościach da się ją odtworzyć). Siatka kilometrowa gwarantuje (przynajmniej teoretycznie) synchronizację obiektów z dokładnością do 25m niezależnie od miejsca. Po ustaleniu położenia danego przecięcia w terenie można z dowolną dokładnością (1mm) ustawić elementy w scenerii. Przy odrobinie staranności można tę siatkę przenieść na inne mapy (plany miast 1:25000, geodezyjne 1:10000). Można też poprawić dokładność poprzez zaznaczenie wielu przecięć na mapie docelowej i pozycjonowanie siatki metodami statystycznymi (np. najmniejszych kwadratów). Wadą siatki kilometrowej jest to, że w niektórych obszarach wymagane jest "szycie" sąsiednich siatek pod kątem zależnym od długości i szerokości geograficznej. (Zawsze będzie jakiś problem z rzutowaniem sfery na płaszczyznę.)
3. Raczej mało realne jest automatyczne tworzenie scenerii z mapy. Należało by stworzyć narzędzie, które wczyta mapę wojskową jako tło i pozwoli zwektoryzować określone linie (tory, koleje, rzeki, linie wysokiego napięcia, krawędzie lasów, warstwice). Układ warstwic można by weryfikować danymi SRTM po wypozycjonowaniu map. Dopiero taka mapa wektorowa nadawała by się do automatycznego generowania scenerii. SRTM by się zdało głównie do kreowania wzgórz znajdujących się w większej odległości (powyżej 2km).
4. Przydała by się opcja upraszania trójkątów miejsc będących w większej odległości od interesujących nas pozycji (np. od torów - nie ma sensu dokładnie odwzorowywać wzgórz, które są 3km od linii kolejowej, ale niemniej są widoczne z daleka). Wydaje mi się, że 120000 trójkątów (plik 30MB) to bardzo dużo, jak na niewielki obszar 320 km² (15' N-S × 10' E-W), a ich rozdzielczość nie jest wystarczająca! Quark ma powierzchnię dwukrotnie większą przy pliku 6MB. Można też sobie darować trójkąty nie widoczne z toru, chociaż wtedy
ghostview straci na uroku.
4. Atrakcyjną alternatywą mogłoby być zdobycie wektorowych map geodezyjnych.