Dokumentation der Contourmap Wetterkarten

Link zur Webapplikation
http://map.contourmap.ch/

Die Contourmap Wetterkarten werden aus folgenden Daten berechnet:
Für die bodennahe Luftschicht werden die Messwerte der Wetterstationen verwendet. Dabei werden jeweils zusammenpassende Wetterstationen mit verschiedenen Höhen zusammengefasst, um einen Verlauf der Messwerte mit zunehmender Höhe zu ermitteln.

Um die Zuweisung der Stationen vorzunehmen/zu optimieren, wurde eine Windows Applikation programmiert.

Beispiel für Temperatur/Luftfeuchtigkeit:
[BER Bern-Zollikofen 553m]
1=BER Bern-Zollikofen 553m
2=MSK Mühleberg / Stockeren 775m
3=BAN Bantiger 1097m
4=MLS Moleson 1972m
5=JUN Jungfraujoch 3580m
1A=MUB Mühleberg 483m
3A=PLF Plaffeien-Oberschrot 1042m
4A=CHA Chasseral 1599m
5A=DIA Les Diablerets 2964m
RedTop=4
RedBottom=1



Beispiel für Windrichtung/Windgeschwindigkeit:
[BER Bern-Zollikofen 553m]
1 WS=BER Bern-Zollikofen 553m
1 WD=BER Bern-Zollikofen 553m
1 H=BER Bern-Zollikofen 553m
2 WS=MSK Mühleberg / Stockeren 775m
2 WD=MSK Mühleberg / Stockeren 775m
2 H=MSK Mühleberg / Stockeren 775m
3 WS=BAN Bantiger 1097m
3 WD=BAN Bantiger 1097m
3 H=BAN Bantiger 1097m
4 WS=CHA Chasseral 1599m
4 WD=CHA Chasseral 1599m
4 H=CHA Chasseral 1599m
1A WS=MUB Mühleberg 483m
1A WD=MUB Mühleberg 483m
1A H=MUB Mühleberg 483m
4A WS=DOL La Dole 1670m
4A WD=DOL La Dole 1670m
4A H=DOL La Dole 1670m
RedTop=4
RedBottom=1



Durch Anzeigen welchen anderen Stationen eine Station zugewiesen wurde, kann man gleichmässigere Übergänge der Werte in den Karten erzeugen.


Temperatur und Taupunkt Messwerte werden anhand ihres Lifted-Index geprüft ob sie realistisch sind und für die Berechnung der Karten verwendet werden können. Als 500 hPa Temperatur wird die GFS Temperatur verwendet. Weicht der Lifted-Index um mehr als -4.0°C von 98% Percentil aller Lifted-Index Werte ab, dann sind die Messwerte ungültig.


Die Auflösung der Karten beträgt 250m. In Pixel sind dies:
Folgende Schweizer Koordinaten bilden die Ränder:
Das darunterliegende Höhenmodell mit 250m Auflösung.


Die effektive Berechnung erfolgt in einem Raster von 4x4 Pixel, also 1x1 Kilometer. Für jeden Gitterpunkt wird aus den Messwerten und GFS Modelldaten eine Sondierung berechnet. In dieser Berechnung werden für den Gitterpunkt alle benötigten Parameter für die Karten ermittelt. Mit den Messwerten wird der Aufbau der Grundschicht ermittelt, darüber mit den GFS Modelldaten die freie Atmosphäre. Ein zu abrupter Übergang zwischenden beiden Datenquellen wird durch die Verwendung einer speziellen Angleich-Funktion verhindert.

In der Höhe (Atmosphäre) werden folgende Layer verwendet:
Messwerte (in Meter über Meereshöhe):
1=150
2=250
3=350
4=450
5=550
6=700
7=1000
8=1300
9=1600
10=2000
11=2500
12=3000

GFS Modelldaten (in Luftdruck hPa):
1=950
2=925
3=900
4=850
5=800
6=750
7=700
8=650
9=600
10=550
11=500
12=450
13=400
14=350
15=300
16=250
17=200
18=150
19=100

Total werden 372 x 231 = 85'932 Sondierungen berechnet.

Mit darübergelegter Karte:


Die Berechnung ist aus Performance Gründen auf acht Threads aufgeteilt.


Jedem Thread kann eine bestimmte Anzahl Sondierungen bzw. Karten zur Berechnung zugeordnet werden.
Sondierungen Thread 1-8: 0 - 85931
TMySoundingThread1.ArrayFrom=0
TMySoundingThread1.ArrayTo=9250
TMySoundingThread2.ArrayFrom=9251
TMySoundingThread2.ArrayTo=18249
TMySoundingThread3.ArrayFrom=18250
TMySoundingThread3.ArrayTo=27999
TMySoundingThread4.ArrayFrom=28000
TMySoundingThread4.ArrayTo=38499
TMySoundingThread5.ArrayFrom=38500
TMySoundingThread5.ArrayTo=49999
TMySoundingThread6.ArrayFrom=50000
TMySoundingThread6.ArrayTo=62749
TMySoundingThread7.ArrayFrom=62750
TMySoundingThread7.ArrayTo=74499
TMySoundingThread8.ArrayFrom=74500
TMySoundingThread8.ArrayTo=85931

Bei den Karten dauert die Berechnung je nachdem ob z.B. zusätzlich Windpfeile angezeigt werden unterschiedlich lang. Durch die Zuweisung der Karten an die Threads kann die Gesamtdauer der Berechnung optimiert werden.
Karten Thread 1-8: 1 - 183
TMyContourmapThread1.ArrayFrom=1
TMyContourmapThread1.ArrayTo=23
TMyContourmapThread2.ArrayFrom=24
TMyContourmapThread2.ArrayTo=48
TMyContourmapThread3.ArrayFrom=49
TMyContourmapThread3.ArrayTo=71
TMyContourmapThread4.ArrayFrom=72
TMyContourmapThread4.ArrayTo=94
TMyContourmapThread5.ArrayFrom=95
TMyContourmapThread5.ArrayTo=115
TMyContourmapThread6.ArrayFrom=116
TMyContourmapThread6.ArrayTo=140
TMyContourmapThread7.ArrayFrom=141
TMyContourmapThread7.ArrayTo=164
TMyContourmapThread8.ArrayFrom=165
TMyContourmapThread8.ArrayTo=183


Sind alle Sondierungen berechnet, werden die Karten erstellt.

1. Das 1x1 km Array Grid wird auf volle Kartengrösse (250m Grid) erweitert, indem die fehlenden Werte aus den umliegenden Gitterpunkten berechnet werden. Eine zusätzliche Glättung sorgt für schönere Übergänge.


2. Unschönheiten und kleine Lücken werden beseitigt, sowie die Ränder (Übergang Farbe zu Schwarz) geglättet, mit vier weiteren Filterungen.


3. Die Karte mit Grenzen/Gewässer/Ortschaften wird darüber gelegt. Dabei wird die Farbe von Grenzen und Ortschaften gemäss der Kartenfarbe angepasst.

4. Beschriftungen werden hinzugefügt.

5. Das fertige Ergebnis der Karte mit dem 1x1 km Raster oben gezeigt:


Zusätzlich bestünde noch die Möglichkeit ein geglättetes Relief, des oben gezeigten Höhenmodells, über die Karte zu legen. Doch dies vergrössert die Bildgrösse deutlich und lenkt von den auf der Karte gezeigen Werten ab.


Im Falle von Schneefallgrenze und Nullgradgrenze wird ein Graustufen Höhenmodell verwendet, sofern die Grenze tiefer als die Höhe liegt.


Den Soundings für die Ortschaften ist eine Position im 250x250 m Grid zugeordnet. Für deren Berechnung wird jeweils nächstliegende Position im 1x1 km Grid verwendet.

Durch Optimierung des Programm Codes und die Verwendung von Multi Threading läuft die Berechnung der Karten mit doppelter Auflösung (= 4x mehr Sondierungen) mindestens gleich schnell wie die alte Version und benötigt trotz Multi Threading weniger Arbeitsspeicher.

Auf dem akutell eingesetzten Server (Intel i7 920 2.67 GHz mit 12 GB RAM) beträgt die Rechenzeit rund 2min 15s.
Auf dem Entwicklung PC (Intel i7 6700 3.40 GHz mit 32 GB RAM) beträgt die Rechenzeit rund 1min 40s.


Anzeige im Webbrowser:

Beispiel einer Konfigurationsdatei für die oben gezeigt Karte:
[Map]
Webserver Filename=D:\projekte\ContourMap_V20_2\websrv\swissmetnet_contourmap_li_lcl_sfc.png
Background Map=D:\projekte\ContourMap_V20_2\data\maps\bgmap_anetz_lifted_index_lcl.png
Filter Map=D:\projekte\ContourMap_V20_2\data\maps\filtermap_anetz.png
X Relief Map=D:\projekte\ContourMap_V20_2\data\maps\reliefmap_schweiz.png
Sounding Param ID=6
Map Offset Left=21
Map Offset Top=46
Color Scale Direction=Positive-Negative

[Custom Text]
1 Text=SMN Surface Lifted Index (LCL) [°C] ID:DATE_TIME_BIS UTC
1 Text Orientation=Horizontal
1 Position X=18
1 Position Y=11
1 Font Name=Verdana
1 Font Size=16
1 Font Color=$00FFFFFF

2 Text=© by Bernhard Oker, ID:CURRENT_YEAR SMN Quelle: MeteoSchweiz
2 Text Orientation=Horizontal
2 Position X=17
2 Position Y=982
2 Font Name=Verdana
2 Font Size=8
2 Font Color=$00FFFFFF

[Colors]
// Wenn "Do Auto Colorscale Update=1" wird die Farbskala und das "Background Map" PNG
// mit dem Programm ContourmapColorScale_VX_Y automatisch aktualisiert.
Do Auto Colorscale Update=1

Color 1=$00B07000
Value 1=16.0
Color 2=$00A06000
Value 2=15.0
Color 3=$00905000
Value 3=14.0
Color 4=$00804000
Value 4=13.0
Color 5=$00703010
Value 5=12.0
Color 6=$00662228
Value 6=11.0
Color 7=$00631146
Value 7=10.0
Color 8=$00600060
Value 8=9.0
Color 9=$00800080
Value 9=8.0
Color 10=$00A000A0
Value 10=7.0
Color 11=$00C000C0
Value 11=6.0
Color 12=$00E000E0
Value 12=5.0
Color 13=$00FE00FE
Value 13=4.5
Color 14=$00FE00E0
Value 14=4.0
Color 15=$00FE00C0
Value 15=3.5
Color 16=$00FE00A0
Value 16=3.0
Color 17=$00FE0080
Value 17=2.5
Color 18=$00FE0060
Value 18=2.25
Color 19=$00FE0040
Value 19=2.0
Color 20=$00FE0020
Value 20=1.75
Color 21=$00FE0000
Value 21=1.5
Color 22=$00FE2000
Value 22=1.25
Color 23=$00FE4000
Value 23=1.0
Color 24=$00FE6000
Value 24=0.75
Color 25=$00FE8000
Value 25=0.5
Color 26=$00FEA000
Value 26=0.25
Color 27=$00FEC000
Value 27=0.0
Color 28=$00FEE000
Value 28=-0.25
Color 29=$00FEFE00
Value 29=-0.5
Color 30=$00E0F010
Value 30=-0.75
Color 31=$00C4E020
Value 31=-1.0
Color 32=$00A2D030
Value 32=-1.25
Color 33=$0080C040
Value 33=-1.5
Color 34=$0040AA20
Value 34=-1.75
Color 35=$00209D10
Value 35=-2.0
Color 36=$0000A400
Value 36=-2.25
Color 37=$0015AF08
Value 37=-2.5
Color 38=$000EBB21
Value 38=-2.75
Color 39=$000CC440
Value 39=-3.0
Color 40=$000ACE5E
Value 40=-3.25
Color 41=$0008D77D
Value 41=-3.5
Color 42=$0006E19C
Value 42=-3.75
Color 43=$0004EABB
Value 43=-4.0
Color 44=$0002F4DA
Value 44=-4.25
Color 45=$0000F9EC
Value 45=-4.5
Color 46=$0000FEFE
Value 46=-4.75
Color 47=$0000F0FE
Value 47=-5.0
Color 48=$0000E1FE
Value 48=-5.25
Color 49=$0000C8FE
Value 49=-5.5
Color 50=$0000AFFE
Value 50=-5.75
Color 51=$000096FE
Value 51=-6.0
Color 52=$00007DE6
Value 52=-6.25
Color 53=$000064E6
Value 53=-6.5
Color 54=$001E4BDC
Value 54=-6.75
Color 55=$001E32C8
Value 55=-7.0
Color 56=$001E19B4
Value 56=-7.25
Color 57=$001E00AA
Value 57=-7.5
Color 58=$003200B4
Value 58=-7.75
Color 59=$003200CC
Value 59=-8.0
Color 60=$003200E0
Value 60=-8.25
Color 61=$003800F0
Value 61=-8.5
Color 62=$004000FE
Value 62=-8.75
Color 63=$007000FE
Value 63=-9.0
Color 64=$00C000FE
Value 64=-9.25
Color 65=$00FE00FE
Value 65=-9.5
Color 66=$00FE40FE
Value 66=-9.75
Color 67=$00FE60FE
Value 67=-10.0
Color 68=$00FE80FE
Value 68=-10.5
Color 69=$00FEA0FE
Value 69=-11.0
Color 70=$00FEC0FE
Value 70=-11.5
Color 71=$00FEE0FE
Value 71=-12.0
Color 72=$00FEF0FE
Value 72=-9999.0

Durch Implementierung der Kriging 2D Interpolation, als Ersatz für die davor verwendete Inverse Distance Weighting Interpolation, wurde die Qualität der Karten deutlich verbessert.

Die Kriging 2D Interpolation wurde wie folgt implementiert:
1. Die Messwerte bzw. GFS Modelldaten (= Datenpunkte) des entsprechenden Layers werden ermittelt.
2. Es wird ein Grid von 20x20 Einheiten mit Kriging berechnet mit Berücksichtigung aller vorhandener Datenpunkte.
3. Es werden das komplette Grid berechnet mit den maximal 20 am nächsten liegenden Datenpunkten, welche einen maximalen Abstand von 50 Einheiten aufweisen.

Inverse Distance Weighting Interpolation


Kriging 2D Interpolation


Inverse Distance Weighting Interpolation


Kriging 2D Interpolation


© by Bernhard Oker, 2004-2018, Letzte Aktualisierung: 05.01.2018