Seite 1 von 10

SwissMetNet Contourmap Applikation/Karten

BeitragVerfasst: Mo 20. Dez 2004, 12:07
von Bernhard Oker
Die Frage gehört wahrscheinlich eher in ein Programmierer Forum, doch vielleicht weiss ja jemand von euch eine Antwort darauf:

Ich habe über die Schweiz ein Gitter mit einer definierten Maschengrösse gelegt. Damit erhalte ich einen 2-dimensionalen Array mit einer konstanten Grösse. Bestimmten Gitterpunkten sind Messwerte zugeordnet von Messstationen, z.B. die Temperatur. Nun habe ich aber nicht für jeden Gitterpunkt einen Messwert, sondern muss die fehlenden Werte aus den unregelmässig verteilten Werten berechnen, damit ich danach eine Karte zeichnen kann. Wie berechne ich die fehlenden Werte? Kennt jemand eine Funktion dazu? Gibt es für diesen Vorgang eine bestimmte wissenschaftliche Bezeichnung?

Gruss Bernhard

Array mit Werten füllen

BeitragVerfasst: Mo 20. Dez 2004, 12:53
von Alfred
Hoi Bernhard

Vor dem gleichen Problem stehe ich auch und habe es vorläufig auf folgende Weise gelöst.
http://www.sturmforum.ch/forum_up ... 125108.gif
Tabelle (gelb) sind die Werte die ich übernehme und alles andere sind dann berechnete Werte.

Gruss Alfred
[hr]

Array mit Werten füllen

BeitragVerfasst: Mo 20. Dez 2004, 14:06
von Bernhard Oker
Hallo Alfred

Danke für die Antwort. :-)
Wenn die vorhandenen Werte so regelmässig angeordnet sind geht es noch relativ einfach. Bei mir sind sie allerdings wild verteilt im Array, so wie die ANETZ Stationen auf der Schweizerkarte. *grübel grübel*

Gruss Bernhard

Array mit Werten füllen

BeitragVerfasst: Mo 20. Dez 2004, 15:14
von Alfred
Hoi Bernhard

Ich bekomme vom Satellit 170 Werte und da ich auch wegen der veschieden verteilten Stationen
die ich auch mit hineinbringen möchte, etwas anderst verteilt sind als auf einem Raster mit
170 Netzpunkten, habe ich die Schweiz mal in 627 Netzpunkte eingeteilt (ist das was du auf der
Grafik ausschittsweise gesehen hast). Ich habe erst eine Korrektur drin für Zürich um die ab-
weichung der Satellitenwerte mit dem Wert von Zürich anzugleichen. Diese Formel befindet sich
eine Tabelle zuvor.
Da ich aber feststellen musste, dass selbst im Raume Zürich es ganz verschiedene Messwerte auf
einem relativ begrenztem Gebiet gibt habe ich es beinahe aufgegeben, das ganze weiter zu be-
arbeiten, vor allem auch, weil ich nicht an die mir kommoden Daten der Station herankomme.
Ich wünsche dir mehr Erfolg!

Gruss Alfred
[hr]

Array mit Werten füllen

BeitragVerfasst: Mo 20. Dez 2004, 18:20
von Willi
Hallo Bernhard

Ich selbst benutze trigrid in IDL. Das wird dir kaum viel helfen, aber die beiden Begriffe im Google liefern doch recht viel Information. Vielleicht findest du etwas dazu wie das funktioniert.

Etwas besser scheint Krieging zu sein, eine recht bekannte statistische Methode. Kann mir vorstellen, dass du Routinen dazu in deiner Programmiersprache findest.

Gruss Willi

Ehm, ps: versuchs mit kriging statt krieging :-)
- Editiert von Willi am 20.12.2004, 22:42 -

Array mit Werten füllen

BeitragVerfasst: Do 23. Dez 2004, 14:46
von Stephan
Ciao Bernhard

Ich selber brösmele mit Delphi herum und habe ebenfalls schon daran gedacht, mal ein Tool zur Generierung von Karten (v.a. Niederschlag) für die Schweiz zu machen. Nur - Standardausrede - die Zeit fehlt...

Im Prinzip ist das Problem immer das gleiche, egal ob Niederschlag, Temperatur, Wind... Folgende Ausgangslage, wir haben Punktmessungen, z.B. vom Tagesniederschlag:

Bild

Wie verhält sich nun die Grösse zwischen den Messstellen? Für eine schicke Kartendarstellung brauchen wir flächendeckende Informationen und für diese räumliche Interpolation gibts zig Varianten. Nur - welche ist die beste? Hier nur drei Beispiele auf der Basis der obigen Punktdaten:

Bild

Bei Inverse Distance Weighting wird ein Radius um den (Gitter-)Punkt, für den die Grösse geschätzt werden soll, gelegt. Innerhalb dieses Kreises werden alle Stationen umgekehrt proportional zur Enfernung gewichtet und das gewichtete Mittel sei dann der Schätzwert am betrachteten Punkt. Typisch ist der Bullaugen-Effekt um die Stationen, praktisch ist die einfache Anwendung.

Bild

Beim Kriging wird zuerst in einem Variogramm die räumliche Korrelation der Messdaten bestimmt und anschliessend Flächendaten interpoliert. Tönt einiges komplizierter als Kriging, ist es auch. Da es sich aber um ein sehr genaues Schätzverfahren handelt, ist es weit verbreitet. Eine Einführung gibts unter http://ifgivor.uni-muenster.de/vorlesun ... _Teil.html, ein Beispiel für die nicht ganz triviale Umsetzung gibts hier: http://prdownloads.sourceforge.net/geoblock/Source.zip?download (Delphi-Source-Code)

Bild

Für obige Karte wurden die Stationen trianguliert und entlang der Verbindungslinien linear interpoliert. Für eine komplette Abdeckung des betrachteten Gebietes müssen auch ausserhalb liegende Stationen mit einbezogen werden. Sieht schrecklich aus, ist aber relativ einfach umzusetzen und liefert für Flächenmittel gar nicht mal so schlechte Resultate.

Eine weitere Variante v. a. für Temperaturdaten und bei längeren Zeiträumen auch für den Niederschlag ist die Höhenabhängige Regression: Die Messwerte werden gegen die Stationshöhe aufgetragen, linear oder wie auch immer gefittet (Für Temperaturdaten bei Inversionslagen auch abschnittsweise, bei Niederschlagsdaten können unterschiedliche Regionen unterschiedliche Gradienten haben). Zum Teil werden auch Kombinationen von höhenabhängiger Regression und z.B. IDW verwendet (Bsp. 30% Regression und 70% IDW). Sehr hilfreich für solche Operationen ist das frei erhältliche Digitale Höhenmodell der Schweiz im Rasterformat mit 1000m Seitenlänge pro Zelle: http://www.swisstopo.ch/data/geodata/da ... ch1000.zip

Falls die Do-it-yourself Variante ausser Rang und Traktanden fällt und Du noch nicht weisst, was Du Dir zu Weihnachten wünschen sollst: Für knappe 1000.- (Import ist sicher günstiger) gibts Surfer, ein ordentliches Programm zur 2D und 2.5D-Darstellung von räumlichen Daten mit Interpolations- und Griddingfunktion und Möglichkeit zur Automatisierung über VB (--> http://www.scientific-solutions.ch/de/prod/index.html). Obige Karten sind übrigens mit Surfer gemacht.

Gruss, Stephan

Array mit Werten füllen

BeitragVerfasst: Do 23. Dez 2004, 22:01
von Bernhard Oker
Hallo Stephan

Vielen Dank für die ausführlichen Erklärungen. Habe nach dem Hinweis von Willi den Kriging Algorithmus etwas näher angeschaut und werde mal versuchen diesen zu implementieren.
Wird aber erst nächstes Jahr der Fall sein, da ich noch andere Projekte in Bearbeitung habe. Wenn was brauchbares rauskommt werde ich es hier posten.

Gruss und schöne Festtage
Bernhard

Array mit Werten füllen

BeitragVerfasst: Do 6. Jan 2005, 12:38
von Stephan
Ciao allerseits

Ein kleiner Nachtrag zur Interpolation von höhenabhängigen Daten am Beispiel der Temperaturen, welche heute Nacht um 1 Uhr gemessen wurden:

Bild

Wendet man eine Methode zur reinen Flächeninterpolation an so ergibt sich mit Kriging folgendes Bild:

Bild

Eine solche Karte ist doch recht unbefriedigend, nimmt doch die Temperatur mit der Höhe ab. Nur ein Beispiel: auf dem Monte Rosa schätzt Kriging eine Temperatur von 3.5°C ab. Stimmt wohl kaum mit der Realität überein...

Was tun? Weiter oben habe ich das DHM1000, das frei verfügbare digitale Höhenmodell der Schweiz erwähnt. Als Karte dargestellt, sieht das so aus:

Bild

Wie können wir die Temperaturkarte mit Einbezug von topographischen Daten verfeinern? Tragen wir Temperaturen und Stationshöhen gegeneinander auf, um die Höhenabhängigkeit zu ermitteln:

Bild

Die Regression ergibt, dass ein Temperaturgradient von -0.37°C/100 m vorliegt. Will man es ganz genau machen, dann werden, wie im Beitrag weiter oben schon erwähnt, solche Gradienten für einzelne Regionen und bei Inversionslagen auch für einzelne Höhenstufen ermittelt. Im Beispiel habe ich das weggelassen, obschon sich die klassischen Kältelöcher im Obergoms, im Engadin sowie im Hinterrhein in den Stationswerten und im einfachen Kriging zeigen.

Mit dem Temperaturgradienten habe ich nun alle Stationswerte auf eine Höhe von 1500m umgerechnet. Warum 1500m? Es hätten auch 1000m oder 500m sein können, eigentlich kommt nicht drauf an, weil der Gradient ja fix gewählt wurde. Nun können diese auf 1500 m umgerechneten Stationswerte gekrigt werden:

Bild

Wir haben nun eine Karte, welche die Temperaturverteilung in der Schweiz auf einer Höhe von 1500m zeigt. Ulrichen ist höhenkorrigiert nun kälter als das Jungfraujoch, das selbe gilt für Glarus im Vergleich mit dem Säntis.

Und jetzt kommt das digitale Höhenmodell der Schweiz ins Spiel: Wir haben flächendeckend die Temperatur auf 1500m und im 1km-Raster die Höhe des Geländes über Meer. Somit sind wir in der Lage, für jeden Rasterpunkt mit Anwendung des Gradienten von -0.37°C/100m die Temperatur zu ermitteln:

Bild

Schaut doch schon sehr viel besser aus, als die Karte mit dem einfachen Kriging der Stationsdaten. Überprüfen wir es am Beispiel vom Anfang mit dem Monte Rosa: Einfaches Kriging schätzt dort (Höhe gemäss DHM 4309 m, für ein 1 km-Raster ein guter Wert) 3.5°C ab, nach der ganzen Prozedur mit Korrektur der Daten auf eine Höhe von 1500 m, Interpolation und Zurückrechnen auf Geländehöhe haben wir dort nun eine Temperatur von -6.4. Meteomedia hat eine Station auf dem kleinen Matterhorn (3883 m), hier das Vorhersagediagramm der Staton, beginnend am 06.01 um Mitternacht:

Bild

Die Stationswerte der Karten (Meteoschweiz) sind von 1 Uhr, also ganz am Anfang des Vorhersagezeitraumens und dürften daher recht nahe an den tatsächlich gemessenen Werten sein. Verglichen mit dem interpolierten Wert ergibt sich ein Fehler von etwa 6°C, was immer noch sehr schlecht, aber doch um einiges besser als der Fehler mit dem einfachen Kriging von etwa 16°C. Was sehr schön zeigt, dass die richtige Interpolationsmethode sehr viel aus den Daten herausholen, aber nicht besser sein kann als Messdaten.

Gruss, Stephan

Array mit Werten füllen

BeitragVerfasst: Do 6. Jan 2005, 13:04
von cyba
Hallo Stephan

Hast Du der Einfachheit halber eine linerare Interpolation verwendet (vielleicht wäre z.B. Lagrange-, Newton- oder Splineinterpolation besser)?


P.S.: Habe keine Erfahrung mit Kriging etc.

Grüsse

Array mit Werten füllen

BeitragVerfasst: Do 6. Jan 2005, 16:53
von Stephan
Ciao cyba

Für die Höhenregression habe ich lineare Interpolation verwendet und zwar habe ich einfach alle Stationen gefittet. Das Diagramm im oberen Beitrag zeigt eine ziemliche Punktwolke. Eine Höhenabhängigkeit ist zwar gegeben, das Bestimmtheitsmass aber nicht exorbitant hoch (hab im Moment grad keinen Zugriff auf meine Daten vom Morgen, drum keine Zahlen).

Dass eine lineare Regression dennoch gerechtfertigt ist, zeigt die Plausibilisierung über den Radiosondenaufstieg von Payerne von 00 UTC:

Bild

Worüber man sich streiten kann, ist der Gradient. Fittet man die Daten bis 5000 m der Sondierung, so ergibt sich eine Temperaturabnahme von 0.5 Grad pro 100m und das mit einem wunderbaren linearen Zusammenhang:

Bild

Natürlich gilt das nur für die Luftsäule über Payerne, näherungsweise mit anderen Beträgen aber wahrscheinlich auf für die Alpen oberhalb der Kaltluftseen. Wie bereits gesagt, mit regional differenzierten Gradienten würde man noch etwas herausholen können, dann wird es aber ganz schnell ziemlich aufwendig und eigentlich war mein Beispiel nur exemplarisch gedacht...

Gruss, Stephan

Nachtrag: Irgendetwas hat mit der Codierung im Firefox nicht gestimmt, drum der Zeichensalat im Text. Hat jemand Tipps für die korrekte Einstellung? Danke und Gruss!
- Editiert von Stephan am 07.01.2005, 08:26 -