Verständnis zur Höhenberechnung anhand von SRTM Daten
-
Hallo!
Ich hoffe ich bin hier richtig. Es geht um etwas Mathematik Verständnis.
Ich hab auf Basis von Java Code folgenden Code erstellt:
HgtFile::HgtFile(ifstream *hgt_file) { this->hgt_file = hgt_file; } double HgtFile::GetElevation(double lat, double lon) { double val = 0; double ilat = GetILat(lat); double ilon = GetILon(lon); int rowmin = (int) floor(ilon); int colmin = (int) floor(ilat); double values[4]; values[0] = GetValue(rowmin, colmin); values[1] = GetValue(rowmin + 1, colmin); values[2] = GetValue(rowmin, colmin + 1); values[3] = GetValue(rowmin + 1, colmin + 1); double coefrowmin = rowmin + 1 - ilon; double coefcolmin = colmin + 1 - ilat; double val1 = values[0] * coefrowmin + values[1] * (1 - coefrowmin); double val2 = values[2] * coefrowmin + values[3] * (1 - coefrowmin); val = val1 * coefcolmin + val2 * (1 - coefcolmin); return val; } double HgtFile::GetILat(double lat) { double dlat = lat - floor(lat); double ilat = dlat * 1200; return ilat; } double HgtFile::GetILon(double lon) { double dlon = lon - floor(lon); double ilon = dlon * 1200; return ilon; } short HgtFile::ReadShort() { char buffer[2]; this->hgt_file->read(buffer, 2); return (short) ((buffer[0] << 8) + (buffer[1])); } double HgtFile::GetValue(int rowmin, int colmin) { long starti = ((1200 - colmin) * 2402) + rowmin * 2; this->hgt_file->seekg(starti, ios_base::beg); short readShort = ReadShort(); return readShort; }
Meine Frage bezüglich der Funktion GetElevation ist: Was wird hier gemacht? Findet hier eine Interpolation von zwei Punkten statt?
Mein Ziel war es zu einer Location die genauen Höhendaten zu bekommen. Und diese nicht als reinen Integer sondern als Double... So hab ich dann meinen Code mit Code vom OSM (OpenStreetMap) angepasst.Das ganze funktioniert "richtig". Aber ich würde gerne verstehen, wie das ganze funktioniert!?
Danke und Gruß
Yves
-
Ja, es werden erst zwei Zeilenwerte linear interpoliert und die dann nochmal interpoliert, um den endwert zu erhalten.
-
Danke ... ich bin aber absoluter Newb was diese Art von Mathe angeht.
Kann mir das jemand genauer erklären?
Findet hier die Interpolation statt?
double ilat = GetILat(lat); double ilon = GetILon(lon); int rowmin = (int) floor(ilon); int colmin = (int) floor(ilat);
... warum wir dann die Zahl 1200 verwendet?
double dlat = lat - floor(lat); double ilat = dlat * 1200;
Und was passiert hier?
double coefrowmin = rowmin + 1 - ilon; double coefcolmin = colmin + 1 - ilat;
-
Das hier ist die Interpolation:
double val1 = values[0] * coefrowmin + values[1] * (1 - coefrowmin); double val2 = values[2] * coefrowmin + values[3] * (1 - coefrowmin); val = val1 * coefcolmin + val2 * (1 - coefcolmin);
(Bei dir die Zeilen 20-23)
Weil ich keine Ahnung von SRTM habe (noch nicht einmal gehört), kann ich dir zu deiner zweiten Frage nichts genauer sagen, aber insgesamt sieht der Code irgendwie danach aus, dass man sich die Werte an passenden Gitterpunkten holt (die, in die Längen- bzw. Breitengrad fallen), dann hier
double coefrowmin = rowmin + 1 - ilon; double coefcolmin = colmin + 1 - ilat;
die relative Position des Längen- bzw. Breitengrads vom nächsten Gitterpunkt ausrechnet und das als Koordinate zur linearen Interpolation zwischen den Gitterpunkten nutzt.
Ich hoffe, das hat auch nur ansatzweise mit der Realität zu tun