Dies ist eine alte Version des Dokuments!
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()