Visualisierung

Hinweis: Um den Code zu testen, ist ein Loop zur Punkterstellung eingebaut. Sobald die Flugdaten geplottet sind, kann man diese durch den Platzhalter einfach ersetzten, indem die Daten z.B. als Pandas DataFrame eingefügt werden (man könnte hier den Umweg über Excel machen, indem man die Daten als Tabelle speichert und diese dann referenziert im Code).

import numpy as np
import cartopy.crs as ccrs # Kartenprogramm
import cartopy.feature as cfeature
import cartopy.io.shapereader as shpreader
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import pandas as pd
 
                                            # Kartenstil
type = ccrs.RotatedPole(pole_longitude=-177.5, pole_latitude=37.5)
world = plt.figure(figsize=(15,15)) # Größe
map = world.add_subplot(projection=type)
map = plt.axes(projection=type)
map.coastlines()
map.gridlines()
                                            # Aussehen Karte
map.add_feature(cfeature.LAND, zorder=0, color='honeydew')
map.add_feature(cfeature.OCEAN, color='pink')
map.add_feature(cfeature.LAKES, color='pink')
map.add_feature(cfeature.BORDERS, color='dimgrey')
# map.stock_img()
map.set_extent([-100, 20, 30, 60], crs=ccrs.PlateCarree()) # Ausschnitt Karte
 
                                            # Koordinaten Frankfurt und New York (mit Punkt und Textzug)
ny_lon, ny_lat = -75, 43 ; fra_lon, fra_lat = 8, 50
map.scatter(ny_lon, ny_lat, color='black', marker='D', transform=ccrs.PlateCarree())
map.scatter(fra_lon, fra_lat, color='black', marker='D', transform=ccrs.PlateCarree())
plt.text(ny_lon + 1, ny_lat - 2, 'New York', horizontalalignment='right', transform=ccrs.PlateCarree())
plt.text(fra_lon, fra_lat + 1, 'Frankfurt', horizontalalignment='left', transform=ccrs.PlateCarree())
 
 
lon, lat = [fra_lat], [fra_lon]             # erster Listeneintrag Frankfurt
speed, height = [0], [80]                   # Startflughafen 80m über NN
 
flugdauer = 400                             # Testgröße, später ersetzen
 
                                            # Funktion zur Punkteerstellung
def longitude(time):
    """Längengrad nach Zeit"""
    return -(7/flugdauer)*time+50
def latitude(time):
    """Breitengrad nach Zeit"""
    return -(83/flugdauer)*time+8
 
 
speed1, height1 = 100, 100                  # Testgrößen, später entfernen
 
 
feinheit = 50
t = 1
 
while t<flugdauer:                          # Punkte in Liste setzen
    x = float(longitude(t))
    lon.append(x)
    y = float(latitude(t))
    lat.append(y)
                                            # Testlisten, später ersetzen!
    speed.append(int(speed1))
    height.append(int(height1))
    speed1=speed1+50
    height1=height1+200
 
    t = t+feinheit                          # NICHT ENTFERNEN mit Testlisten
 
lat.append(float(ny_lon))
lon.append(float(ny_lat))
speed.append(int(1)) # Test
height.append(int(12))
 
 
pos = [lon, lat, speed, height]             # Positionsdaten (als Liste und DataFrame)
df = pd.DataFrame({ 'Längengrad': lon,
                    'Breitengrad': lat,
                    'Geschwindigkeit': speed,
                    'Höhe': height })
                                            # Daten als str mit Maseinheiten an DF angefügt
df['Legende1'] = df['Geschwindigkeit'].astype(str) + ' km/h'
df['Legende2'] = df['Höhe'].astype(str) + ' m'
print(df)
 
                                            # (10) Farben den Höhen zugeordnet
colors =   ['rosybrown', 'lightcoral', 'indianred',
            'brown', 'firebrick', 'maroon',
            'darkred', 'peru', 'saddlebrown', 'black']
color_code =    [500, 1000, 2000,
                4000, 6000, 8000,
                10000, 12000, 14000, 16000]
df_col = pd.DataFrame({'Farbe': colors,
                        'Höhe': color_code})
print(df_col)
 
i=0                                        # Legende (Höhe)
patches1 = []
while i<len(colors):
    patch = mpatches.Patch(color=colors[i], label=color_code[i])
    patches1.append(patch)
    plt.legend(handles=patches1, loc=(0,0), title='Höhe (in m)')
    i=i+1
 
                                            # Loop zur Punkteerstellung (später werden hier die Flugdaten eingesetzt)
n = 1
while n<len(lon) and pos[2][n]>0 and pos[3][n]>0:
    c = 0                                   # Farbe nach Listeneintrag
    while pos[3][n]>color_code[c]:
        c=c+1
                                            # Punkte plotten
    x, y = pos[1][n], pos[0][n]
    scatter = map.scatter (x, y, color = colors[c], s=(pos[2][n]/10), marker='.', transform=ccrs.PlateCarree())
 
    if feinheit > 5:                        # Verbindungslinie für grobe Feineiten
        plt.plot([pos[1][n], pos[1][n-1]], [pos[0][n],pos[0][n-1]], color='gray', linestyle='--', transform=ccrs.PlateCarree())
    else:
        pass
    plt.pause(0.000001)
    n = n+1
                                            # Absturzpunkt (funktioniert nicht)
if n<len(lon) and (pos[2][n]<=0 or pos[3][n]<=0):
    x, y = pos[1][n], pos[0][n]
    scatter = map.scatter (x, y, color = 'red', s=100, marker='x', transform=ccrs.PlateCarree())
    plt.text(x, y, 'Absturz', color='black', transform=ccrs.PlateCarree())
else:
    pass
 
 
map.set_title('Flugroute NY-FRA')
plt.show()