Bestrahlungsstärke (Teil 1)

Potenzialanalyse für Dachflächen-Photovoltaik

Photovoltaik
Solar
Vektordaten
pvlib

Im ersten Teil sollen Dachflächen auf ihr Potenzial für die Installation von PV-Anlagen untersucht werden. Als Bemessungsgrundlage dient dafür die erwartete Sonneneinstrahlung, welche sich aus der Neigung und Ausrichtung der Fachfläche ergibt.

Autor:in
Zugehörigkeit

Sören Sparmann

Universität Paderborn

Veröffentlichungsdatum

9. März 2026

Photovoltaikanlagen (PV-Anlagen) auf Dachflächen leisten einen bedeutenden Beitrag zum Klimaschutz, da sie erneuerbare Solarenergie nutzen, um Strom zu erzeugen. Dadurch wird der Bedarf an fossilen Brennstoffen wie Kohle, Öl und Gas reduziert, die bei der Verbrennung CO2 und andere Treibhausgase freisetzen, welche den Klimawandel beschleunigen.

Da Dachflächen häufig ungenutzt bleiben, bieten sie eine ideale Möglichkeit, um umweltfreundliche Energie zu gewinnen, ohne zusätzlichen Raum zu beanspruchen. Zudem tragen PV-Anlagen zur Dezentralisierung der Energieversorgung bei, was die Netzstabilität erhöht und Energieverluste minimiert.

Wie sieht es in deiner Nachbarschaft aus? Gibt es dort ungenutzte Dachflächen, die sich für PV-Anlagen eignen?

Foto „Photovoltaikanlage 2001“ (Ausschnitt) von erhard.renz unter der Lizenz CC BY 2.0 via Flickr

Foto „Photovoltaikanlage 2001“ (Ausschnitt) von erhard.renz unter der Lizenz CC BY 2.0 via Flickr

1 Daten einlesen

Um die Fragestellung beantworten zu können, wird eine Übersicht über alle Dachflächen in Ihrer Region benötigt.

Zunächst wird ein Standort festgelegt, für den die Dachflächen eingelesen werden sollen. Dazu wird eine Variable adresse mit der entsprechenden Adresse definiert.

from cdec import get_lat_lon_for

# Adresse eingeben (Gesamtschule Salzkotten)
adresse = 'Upsprunger Straße 65-67, 33154 Salzkotten'

# Breiten- und Längengrad bestimmen
latitude, longitude = get_lat_lon_for(adresse)

print(f'Breitengrad: {latitude}, Längengrad: {longitude}')
Breitengrad: 51.667625, Längengrad: 8.6001468
HinweisHinweis

Die Adresse muss im Bezirk Detmold liegen.

Mit Hilfe der Funktion load_roofs() kann nun einen Datensatz eingelesen werden, welcher die Umgebung um den angebgenen Standort abdeckt.

Die Daten stammen von dem Landesamt für Natur, Umwelt und Klima Nordrhein-Westfalen (LANUK).

from cdec import load_roofs

# Dachflächen für die angegebene Adresse  ermitteln
df = load_roofs(
    latitude=latitude,
    longitude=longitude
)

# Daten anzeigen
df
geb_id richtung neigung dachtyp himmel_kat geometry
id
0 Geb80446ln0403_c 342 45 geneigt Nord MULTIPOLYGON (((472756 5724106, 472756 5724105...
1 Geb79564ln0403_c -1 0 flach Flach MULTIPOLYGON (((472026 5724631, 472026 5724631...
2 Geb65277ln0403_c -1 0 flach Flach MULTIPOLYGON (((472035 5724263, 472035 5724263...
3 Geb70556ln0403_c 171 49 geneigt Süd MULTIPOLYGON (((472390.5 5724618, 472391 57246...
4 Geb70759ln0403_c 61 36 geneigt Ost MULTIPOLYGON (((472673.5 5724606.5, 472673 572...
... ... ... ... ... ... ...
3063 Geb75442ln0403_c 352 11 geneigt Nord MULTIPOLYGON (((472131 5724786, 472131 5724789...
3064 Geb78589ln0403_c 84 34 geneigt Ost MULTIPOLYGON (((472399 5724188.5, 472398.5 572...
3065 Geb67289ln0403_c 307 43 geneigt West MULTIPOLYGON (((472820.5 5724379, 472821 57243...
3066 Geb67172ln0403_c 323 17 geneigt Nord MULTIPOLYGON (((472064 5724657.5, 472065.5 572...
3067 Geb67289ln0403_c 42 41 geneigt Nord MULTIPOLYGON (((472816.5 5724396.5, 472816.5 5...

3068 rows × 6 columns

Aufgabe 1

  • Was könnten die Spalten richtung, neigung und himmel_kat bedeuten?
  • Stelle für jede der Spalten eine Vermutung auf! (1 – 2 Sätze)

(5 Minuten)

Richtung:
Die Richtung einer Dachfläche wird in Grad angegeben und orientiert sich an den Himmelsrichtungen. Eine Dachfläche, die nach Norden zeigt, hat eine Richtung von 0 Grad, während eine Fläche, die nach Süden ausgerichtet ist, mit 180 Grad angegeben wird.

Neigung:
Die Neigung einer Dachfläche, ebenfalls in Grad angegeben, beschreibt den Winkel der Dachschräge. Eine Neigung von 0 Grad steht für eine vollständig horizontale Fläche, wie bei einem Flachdach.

Himmel Kat.:
Die Variable himmel_kat gibt die Himmelsrichtung als kategorische Angabe wieder. Beispielsweise steht die Kategorie Flach für ein Flachdach.

2 Daten explorieren

Mit der Methode explore() können die Dachflächen auf einer Karte dargestellt werden.

HinweisHinweis

Die Form (Geometrie) einer Dachfläche ergibt sich dabei aus der Spalte geometry. Diese enthält für jede Dachfläche eine Liste mit den entsprechenden Eckpunkten.

df.explore()
Make this Notebook Trusted to load map: File -> Trust Notebook

Mit Hilfe der Methode loc (locate) kann ein einzelner Eintrag aus dem Datensatz ausgewählt (selektiert) werden. Dazu muss nur die Identifikationsnummer id des entsprechenden Eintrags angeben werden. Diese kann aus der ersten Spalte des Datensatzes oder aus der Kartendarstellung abgelesen werden.

Codefragment 1
# Selektiere das Dach mit der ID 270
dach = df.loc[270]
dach
geb_id                                         Geb67175ln0403_c
richtung                                                     -1
neigung                                                       0
dachtyp                                                   flach
himmel_kat                                                Flach
geometry      MULTIPOLYGON (((472102 5724665.5, 472101.5 572...
Name: 270, dtype: object

Aufgabe 2

  1. Ändere oben die Variable adresse zu einem Ort ihrer Wahl (z.B. ihrem Wohnort oder Schule).
  2. Führe anschließend die nachfolgenden Zellen erneut aus.
  3. Wähle auf der Karte eine beliebige Dachfläche aus (z.B. ihr Wohnort oder Schule) und notiere die dazugehörige ID ìd.
  4. Selektiere die Dachfläche mit Hilfe der Methode loc (siehe nächste Zelle). Verwende dazu die ID.

(5 Minuten)

2.1 Neigung und Ausrichtung der Dachfläche

Mit Hilfe der folgenden Schreibweise kann die Neigung und Ausrichtung der Dachfläche bestimmt werden. Diese beiden Werte werden später noch wichtig sein, für die Berechnung der Bestrahlungsstärke!

# Neigungswinkel der Dachfläche
surface_tilt = dach['neigung']
surface_tilt
np.int16(0)
# Ausrichtung der Dachfläche (Azimutwinkel, -1 = Flachdach)
surface_azimuth = dach['richtung']
surface_azimuth
np.int16(-1)

2.2 Größe der Dachfläche

In gleicher Weise kann auf die Form (geometry) der Dachfläche zugegriffen werden.

geometry = dach['geometry']
geometry

Mit dem Attribut .area kann zudem der Flächeninhalt der Form ermittelt werden. Die Größe der Dachfläche ist ein weiterer wichtiger Faktor für die Eignung einer Dachfläche (in Quadratmeter) für die Nutzung von Photovoltaik.

# Berechnung des Flächeninhalts in Quadratmetern
surface_area = geometry.area
surface_area
11.0
# Berechnung des Flächeninhalts (qm) aller Dachflächen
df['flaecheninhalt'] = df['geometry'].area
df
geb_id richtung neigung dachtyp himmel_kat geometry flaecheninhalt
id
0 Geb80446ln0403_c 342 45 geneigt Nord MULTIPOLYGON (((472756 5724106, 472756 5724105... 35.832447
1 Geb79564ln0403_c -1 0 flach Flach MULTIPOLYGON (((472026 5724631, 472026 5724631... 175.390078
2 Geb65277ln0403_c -1 0 flach Flach MULTIPOLYGON (((472035 5724263, 472035 5724263... 15.500000
3 Geb70556ln0403_c 171 49 geneigt Süd MULTIPOLYGON (((472390.5 5724618, 472391 57246... 20.460276
4 Geb70759ln0403_c 61 36 geneigt Ost MULTIPOLYGON (((472673.5 5724606.5, 472673 572... 23.750000
... ... ... ... ... ... ... ...
3063 Geb75442ln0403_c 352 11 geneigt Nord MULTIPOLYGON (((472131 5724786, 472131 5724789... 1127.626528
3064 Geb78589ln0403_c 84 34 geneigt Ost MULTIPOLYGON (((472399 5724188.5, 472398.5 572... 8.684094
3065 Geb67289ln0403_c 307 43 geneigt West MULTIPOLYGON (((472820.5 5724379, 472821 57243... 55.442013
3066 Geb67172ln0403_c 323 17 geneigt Nord MULTIPOLYGON (((472064 5724657.5, 472065.5 572... 28.903594
3067 Geb67289ln0403_c 42 41 geneigt Nord MULTIPOLYGON (((472816.5 5724396.5, 472816.5 5... 155.073265

3068 rows × 7 columns

3 Bestrahlungsstärke

Die Eignung einer Dachfläche für den Einsatz von Photovoltaik hängt unter anderem von der Ausrichtung und Neigung der Dachfläche ab. Auch der Standort und die zur Verfügung stehende Fläche spielen eine Rolle.

Je besser die Dachfläche zur Sonne ausgerichtet ist, desto höher ist die Sonneneinstrahlung und damit die potenziell nutzbare Energie!

Um das Potenzial der Dachflächen für den Einsatz von Photovoltaik zu ermitteln, wird daher zunächst die Bestrahlungsstärke (engl. irradiance) über einen festgelegten Zeitraum (z.B. ein Jahr) berechnet. Die Bestrahlungsstärke ist ein Maß für die Intensität der Sonneneinstrahlung, die auf die Dachfläche trifft.

Zur Berechnung der Bestrahlungsstärke sind folgende Schritte erforderlich:

  1. Genaue Position und Zeitzone bestimmen (Lokalisierung)
  2. Untersuchungszeitraum festlegen
  3. Stand der Sonne berechnen
  4. Trübung der Atmosphäre ermitteln (Bewölkung)
  5. Bestrahlungsstärke berechnen

Glücklicherweise gibt es eine Programmierbibliothek pvlib, die einen Großteil der Berechnungen übernimmt.

# Bibliothek für den Umgang mit Photovoltaik
import pvlib

3.1 Lokalisierung

Zur Lokalisierung wird neben Längen- und Breitengrad auch die entsprechende Zeitzone benötigt.

from pytz import timezone

# Zeitzone festlegen
tz = timezone('Europe/Berlin')
tz
<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>

Nun kann eine genaue :Lokalisierung vorgenommen werden. Diese wird für die Berechnung des Sonnenstandes und der Bestrahlungsstärke benötigt.

from pvlib.location import Location

# Lokalisierung
location = Location(
    name=adresse,
    latitude=latitude,
    longitude=longitude,
    tz=tz,
)

location
Location: 
  name: Upsprunger Straße 65-67, 33154 Salzkotten
  latitude: 51.667625
  longitude: 8.6001468
  altitude: 110.0
  tz: Europe/Berlin

3.2 Zeitraum festlegen

Als letztes muss der Zeitraum festgelegt werden, für den die Bestrahlungstärke berechnet werden soll.

Die Frequenz wird auf eine Stunde festgelet 1h, sodass die Bestrahlungsstärke stundenweise berechnet wird.

import pandas as pd

# Startzeitpunkt
start = '2024-06-01'

# Endzeitpunkt
end = '2024-06-02'

# Frequenz (stuendlich)
freq = '1h'

# Zeitraum festlegen
date_range = pd.date_range(
    start=start,
    end=end,
    freq=freq,         
    tz=tz,
    inclusive='left'
)

# Zeitpunkte ausgeben
date_range
DatetimeIndex(['2024-06-01 00:00:00+02:00', '2024-06-01 01:00:00+02:00',
               '2024-06-01 02:00:00+02:00', '2024-06-01 03:00:00+02:00',
               '2024-06-01 04:00:00+02:00', '2024-06-01 05:00:00+02:00',
               '2024-06-01 06:00:00+02:00', '2024-06-01 07:00:00+02:00',
               '2024-06-01 08:00:00+02:00', '2024-06-01 09:00:00+02:00',
               '2024-06-01 10:00:00+02:00', '2024-06-01 11:00:00+02:00',
               '2024-06-01 12:00:00+02:00', '2024-06-01 13:00:00+02:00',
               '2024-06-01 14:00:00+02:00', '2024-06-01 15:00:00+02:00',
               '2024-06-01 16:00:00+02:00', '2024-06-01 17:00:00+02:00',
               '2024-06-01 18:00:00+02:00', '2024-06-01 19:00:00+02:00',
               '2024-06-01 20:00:00+02:00', '2024-06-01 21:00:00+02:00',
               '2024-06-01 22:00:00+02:00', '2024-06-01 23:00:00+02:00'],
              dtype='datetime64[ns, Europe/Berlin]', freq='h')

Aufgabe 3

  • Ändere den Startzeitpunkt auf Heute und den Endzeitpunkt auf Morgen
  • Führe anschließend die Zelle erneut aus

(5 Minuten)

Folgende Zeilen müssen entsprechend angepasst werden:

# Startzeitpunkt
start = '2024-06-01'

# Endzeitpunkt
end = '2024-06-02'

3.3 Stand der Sonne

Elevation (Höhenwinkel): Die Elevation gibt den vertikalen Winkel an, unter dem die Sonne am Himmel steht. Ein Höhenwinkel von 0° bedeutet, dass die Sonne direkt über einem Punkt am Horizont steht, während ein Höhenwinkel von 90° darauf hinweist, dass die Sonne im Zenit steht. Ein negativer Höhenwinkel zeigt an, dass die Sonne unterhalb des Horizonts ist.

Azimuth (Azimutwinkel): Der Azimuthwinkel gibt die horizontale Richtung der Sonne an, gemessen im Uhrzeigersinn von Norden aus. Ein Azimut von 0° entspricht dem Norden, 90° dem Osten, 180° dem Süden und 270° dem Westen. Der Azimuthwinkel gibt also an, in welche Himmelsrichtung die Sonne zu einem bestimmten Zeitpunkt zeigt.

# Sonnenstand für den gegebenen Standort ermitteln
solar_position = location.get_solarposition(date_range)
solar_position
apparent_zenith zenith apparent_elevation elevation azimuth equation_of_time
2024-06-01 00:00:00+02:00 104.018358 104.018358 -14.018358 -14.018358 340.120111 2.174048
2024-06-01 01:00:00+02:00 106.069184 106.069184 -16.069184 -16.069184 354.351176 2.167611
2024-06-01 02:00:00+02:00 105.807739 105.807739 -15.807739 -15.807739 8.798614 2.161163
2024-06-01 03:00:00+02:00 103.259806 103.259806 -13.259806 -13.259806 22.909173 2.154702
2024-06-01 04:00:00+02:00 98.661620 98.661620 -8.661620 -8.661620 36.265310 2.148229
2024-06-01 05:00:00+02:00 92.376685 92.376685 -2.376685 -2.376685 48.716562 2.141744
2024-06-01 06:00:00+02:00 84.648520 84.802468 5.351480 5.197532 60.371370 2.135247
2024-06-01 07:00:00+02:00 76.249089 76.314988 13.750911 13.685012 71.528068 2.128738
2024-06-01 08:00:00+02:00 67.219521 67.258688 22.780479 22.741312 82.630450 2.122218
2024-06-01 09:00:00+02:00 57.945353 57.971789 32.054647 32.028211 94.287619 2.115685
2024-06-01 10:00:00+02:00 48.826587 48.845562 41.173413 41.154438 107.372442 2.109141
2024-06-01 11:00:00+02:00 40.421492 40.435642 49.578508 49.564358 123.183850 2.102585
2024-06-01 12:00:00+02:00 33.637242 33.648298 56.362758 56.351702 143.437084 2.096017
2024-06-01 13:00:00+02:00 29.855943 29.865481 60.144057 60.134519 169.018387 2.089437
2024-06-01 14:00:00+02:00 30.334872 30.344595 59.665128 59.655405 196.892880 2.082846
2024-06-01 15:00:00+02:00 34.887094 34.898680 55.112906 55.101320 221.411865 2.076243
2024-06-01 16:00:00+02:00 42.116158 42.131176 47.883842 47.868824 240.572891 2.069628
2024-06-01 17:00:00+02:00 50.730081 50.750371 39.269919 39.249629 255.667077 2.063002
2024-06-01 18:00:00+02:00 59.914469 59.943017 30.085531 30.056983 268.356412 2.056364
2024-06-01 19:00:00+02:00 69.158395 69.201499 20.841605 20.798501 279.835291 2.049714
2024-06-01 20:00:00+02:00 78.077099 78.152780 11.922901 11.847220 290.907315 2.043052
2024-06-01 21:00:00+02:00 86.258802 86.460817 3.741198 3.539183 302.139928 2.036379
2024-06-01 22:00:00+02:00 93.775479 93.775479 -3.775479 -3.775479 313.945278 2.029695
2024-06-01 23:00:00+02:00 99.714368 99.714368 -9.714368 -9.714368 326.584623 2.022999

Höhenwinkel

import plotly.express as px

# Liniendiagramm des Höhenwinkels
fig = px.line(solar_position, y='elevation', title='Höhenwinkel der Sonne im Verlauf eines Tages')

fig.update_xaxes(title="Uhrzeit")
fig.update_yaxes(title="Höhenwinkel")

fig.show()

Aufgabe 4

  • Um wie viel Uhr ist die Sonne heute circa aufgegangen?
  • Um wie viel Uhr wird die die Sonne heute circa untergehen?

(5 Minuten)

Azimutwinkel

Nun wird der Azimuthwinkel, also die Himmelsrichtung aus welcher die Sonne scheint, betrachtet.

px.line(solar_position, y='azimuth')
HinweisHinweis

“Im Osten geht die Sonne auf, im Süden nimmt sie ihren Lauf, im Westen wird sie untergehen, im Norden ist sie nie zu sehen.”

3.4 Sonneneinstrahlung bei klarem Himmel

Neben der Ausrichtung und Neigung der Dachfläche spielt auch das Wetter eine Rolle für die Intensität der Sonneneinstrahlung. Bei starker Bewölkung ist die Sonneneinstrahlung geringer.

Im Rahmen der Analyse wird der Einfachheit halber davon ausgegangen, dass der Himmel klar ist und die Atmosphäre somit nicht durch Wolken getrübt ist (clear sky).

Mit Hilfe der Methode get_clearsky() lässt sich die Sonneneinstrahlung am gegebenen Standort ermitteln. Es werden drei Arten der Sonneneinstrahlung unterschieden: GHI, DNI & DHI (siehe unten).

clear_sky = location.get_clearsky(date_range)
clear_sky
ghi dni dhi
2024-06-01 00:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 01:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 02:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 03:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 04:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 05:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 06:00:00+02:00 18.965593 52.369534 14.081338
2024-06-01 07:00:00+02:00 131.501511 301.631039 59.803413
2024-06-01 08:00:00+02:00 283.657422 492.985336 92.772767
2024-06-01 09:00:00+02:00 439.768745 611.534246 115.210482
2024-06-01 10:00:00+02:00 582.036390 684.956000 131.102290
2024-06-01 11:00:00+02:00 698.108507 730.174236 142.230413
2024-06-01 12:00:00+02:00 778.901166 756.205820 149.313420
2024-06-01 13:00:00+02:00 818.362758 767.624529 152.617513
2024-06-01 14:00:00+02:00 813.595493 766.285763 152.223203
2024-06-01 15:00:00+02:00 764.957723 751.979904 148.123098
2024-06-01 16:00:00+02:00 676.049352 722.361448 140.211208
2024-06-01 17:00:00+02:00 553.589959 672.116024 128.157648
2024-06-01 18:00:00+02:00 407.321783 590.935893 111.090201
2024-06-01 19:00:00+02:00 250.434998 459.706058 86.878163
2024-06-01 20:00:00+02:00 102.721057 250.248797 51.020837
2024-06-01 21:00:00+02:00 7.493347 19.273249 6.235770
2024-06-01 22:00:00+02:00 0.000000 0.000000 0.000000
2024-06-01 23:00:00+02:00 0.000000 0.000000 0.000000

Direct Normal Irradiance (DNI)

Die Direktnormalstrahlung (DNI) ist die Menge der Sonnenstrahlung, die pro Flächeneinheit auf eine senkrecht zur Sonne stehende Fläche auftrifft.

Global Horizontal Irradiance (GHI)

Die globale horizontale Einstrahlung (GHI) ist die Gesamtstrahlung, die von einer horizontalen Fläche auf der Erde absorbiert wird.

Diffuse Horizontal Irradiance (DHI)

Die diffuse horizontale Einstrahlung (DHI) ist die terrestrische Einstrahlung, die von einer flachen Oberfläche gestreut oder diffus von der Atmosphäre zurückgestrahlt wird. DHI ist der Teil der globalen horizontalen Einstrahlung, der nicht von der direkten Sonnenstrahlung stammt.

# Sonneneinstrahlung in Liniendiagramm anzeigen
px.line(clear_sky)

3.5 Bestrahlungsstärke berechnen

Zunächst wird die Neigung tilt und die Ausrichtung azimuth der Dachfläche festgelegt.

# Neigung
surface_tilt = 20
# Ausrichtung (Süd-Süd-Ost)
surface_azimuth = 160

Nun kann die Bestrahlungsstärke für die Dachfläche mit Hilfe der Funktion get_total_irradiance berechnet werden.

from pvlib.irradiance import get_total_irradiance

# Bestrahlungsstärke (irradiance) berechnen
irradiance = get_total_irradiance(
    surface_tilt=surface_tilt,
    surface_azimuth=surface_azimuth,
    dni=clear_sky['dni'],
    ghi=clear_sky['ghi'],
    dhi=clear_sky['dhi'],
    solar_zenith=solar_position['zenith'],
    solar_azimuth=solar_position['azimuth']
)

# Ausgabe (Watt pro Quadratmeter
irradiance
poa_global poa_direct poa_diffuse poa_sky_diffuse poa_ground_diffuse
2024-06-01 00:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 01:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 02:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 03:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 04:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 05:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 06:00:00+02:00 15.274164 1.474459 13.799705 13.656734 0.142971
2024-06-01 07:00:00+02:00 128.721845 69.730412 58.991433 58.000119 0.991314
2024-06-01 08:00:00+02:00 305.197119 213.083464 92.113655 89.975326 2.138329
2024-06-01 09:00:00+02:00 492.746941 377.695318 115.051624 111.736461 3.315163
2024-06-01 10:00:00+02:00 662.183265 530.646557 131.536708 127.149072 4.387636
2024-06-01 11:00:00+02:00 795.120882 651.916604 143.204278 137.941642 5.262637
2024-06-01 12:00:00+02:00 879.588872 728.906117 150.682755 144.811069 5.871686
2024-06-01 13:00:00+02:00 908.841990 754.657295 154.184696 148.015532 6.169164
2024-06-01 14:00:00+02:00 881.083632 727.317294 153.766338 147.633112 6.133226
2024-06-01 15:00:00+02:00 799.387562 649.964348 149.423214 143.656640 5.766574
2024-06-01 16:00:00+02:00 671.629966 530.550297 141.079669 135.983323 5.096346
2024-06-01 17:00:00+02:00 510.490107 382.023690 128.466417 124.293222 4.173195
2024-06-01 18:00:00+02:00 333.846877 223.035891 110.810985 107.740422 3.070564
2024-06-01 19:00:00+02:00 166.410512 80.264162 86.146351 84.258466 1.887885
2024-06-01 20:00:00+02:00 50.256725 0.000000 50.256725 49.482371 0.774355
2024-06-01 21:00:00+02:00 6.104227 0.000000 6.104227 6.047739 0.056488
2024-06-01 22:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000
2024-06-01 23:00:00+02:00 0.000000 0.000000 0.000000 0.000000 0.000000

Alle Angaben sind in \(W / m^2\) (Watt pro Quadratmeter).

Für die weitere Analyse ist primär die globale Bestrahlungsstärke (poa_global) von Bedeutung. Diese setzt sich aus der direkten und indirekten Sonneneinstrahlung zusammen.

\[\mathrm{poa\_global} = \mathrm{poa\_direct} + \mathrm{poa\_diffuse}\]

\[\mathrm{poa\_diffuse} = \mathrm{poa\_sky\_diffuse} + \mathrm{poa\_ground\_diffuse}\]

# Liniendiagramm (mit eingeschlossener Fläche) der globalen Bestrahlungsstärke
fig = px.area(irradiance, y='poa_global', title="Globale Bestrahlungsstärke im Verlauf eines Tages")

fig.update_xaxes(title="Uhrzeit")
fig.update_yaxes(title="Globale Bestrahlungsstärke<br>[W/m<sup>2</sup>]")

fig.show()

Tagesleistung

WichtigHinweis

Zur Erinnerung: Die Bestrahlungsstärke gibt nur die Intensität der Sonneneinstrahlung an und ist nicht von der Größe der Dachfläche abhängig. Sie wird daher in der Einheit \(W/m^2\) angegeben.

Die Summe der Stundenwerte ergibt die Bestrahlungsenergie pro Quadratmeter (\(Wh / m^2\)) energy_per_area an dem entsprechenden Tag.

# Summe der Stundenwerte (in Wattstunden pro Quadratmeter)
energy_per_area = irradiance['poa_global'].sum()
energy_per_area
np.float64(7606.884687431055)

Um die Strahlungsenergie zu bestimmen, die im Laufe eines Tages auf die Dachfläche auftrifft, muss das Ergbnis nun nur noch mit der Größe der Dachfläche multipliziert werden.

# Größe der Dachfläche in Quadratmeter (Beispiel)
surface_area = 10

# Berechnung der Strahlungsenergie (Wattstunden)
total_energy = energy_per_area * surface_area

# Ausgabe (auf zwei Nachkommastellen gerundet)
print('Tagesleistung:', total_energy.round(2), 'Wh')
Tagesleistung: 76068.85 Wh

Die Strahlungsenergie hat die Einheit \(Wh\) (Wattstunden).

Beispiel: Mit 1600 Wh kann eine Mikrowelle mit einem Stromverbrauch von 800 Watt 2 Stunden betrieben werden.

Um die Energie in Kilowattstunden anzugeben, muss der Wert einfach durch 1000 geteilt werden.

# W in kW umrechnen
total_energy = total_energy / 1000

# Ausgabe
print('Tagesleistung:', total_energy.round(2), 'kW')
Tagesleistung: 76.07 kW
HinweisHinweis

Hierbei handelt es sich um die potenziell nutzbare Sonnenenergie, die auf die PV-Anlage trifft. Nur ein Teil davon kann tatsächlich in Strom umgewandelt werden. Zudem kann in der Regel aufgrund der Dachform nicht die gesamte Fläche mit PV-Anlagen versehen werden.

Aufgabe 5

  • Bestimme die optimale Ausrichtung und Neigung einer Dachfläche für den Einsatz von PV unter den oben definierten Bedigungen.
  • Verändere dazu die Schieberegler für die Parameter surface_tilt und surface_area.
  • Ziel ist es, den Wert für die Bestrahlungsenergie zu maximieren.

(5 Minuten)

WichtigHinweis

Um mit der folgenden Abbildung interagieren zu können, muss das Notebook in einer Jupyter Umgebung ausgeführt werden!

from cdec import interactive_irradiance

interactive_irradiance(clear_sky, solar_position)

Optimale Neigung und Ausrichtung der Dachfläche:

Parameter Optimale Belegung
Neigung 18,50 Grad
Ausrichtung 180 Grad
Bestrahlungsenergie 7.655 kWh/qm

Jahresleistung

Nun soll die Bestrahlungsstärke über einen Zeitraum von einem Jahr hinweg betrachtet werden.

Aufgabe 6

  • Kopiere den folgeden Programmcode in die dafür vorgesehene Zelle.
  • Vervollständige den Programmcode so, dass die Bestrahlungsstärke im Laufe eines Jahres berechnet wird:
    • Ändere den Wert der Variablen surface_tilt und surface_azimuth entsprechend den Werten für das von Ihnen ausgewählten Daches (siehe Code 1).
    • Ändere den Start- und Endzeitpunkt so, dass die Zeitspanne genau ein Jahr beträgt.

(15 Minuten)

Größe Einheit Variable Berechnung
Bestrahlungsstärke Watt pro Quadratmeter [\(W / m^2\)] irradiance
Bestrahlungsenergie pro Quadratmeter Wattstunden pro Quadratmeter [\(Wh / m^2\)] total_irradiance irradiance.sum()
Bestrahlungsenergie Wattstunden [\(Wh\)] total_energy total_irradiance * surface_area
# Neigung der Dachfläche eingeben
surface_tilt =
# Ausrichtung der Dachfläche eingeben
surface_azimuth =

# Funktion zu Berechnung der Bestrahlungsstärke über ein Jahr
def get_annual_irradiance(surface_tilt, surface_azimuth):
    
    # Startzeitpunkt eingeben
    start = 
    # Endzeitpunkt eingeben
    end = 
                        
    # Zeitraum festlegen
    date_range = pd.date_range(
        start=start,
        end=end,
        freq='1h',
        tz=tz,
        inclusive='left'
    )
    
    # Stand der Sonne bestimmen
    solar_position = location.get_solarposition(date_range)
    
    # Klarer Himmel
    clear_sky = location.get_clearsky(date_range)
    
    # Bestrahlungsstärke berechnen
    irradiance = get_total_irradiance(
        surface_tilt=surface_tilt,
        surface_azimuth=surface_azimuth,
        dni=clear_sky['dni'],
        ghi=clear_sky['ghi'],
        dhi=clear_sky['dhi'],
        solar_zenith=solar_position['zenith'],
        solar_azimuth=solar_position['azimuth']
    )

    irradiance = irradiance['poa_global']

    return irradiance

irradiance = get_annual_irradiance(surface_tilt, surface_azimuth)

irradiance
# Hier Code einfügen
# Neigung der Dachfläche eingeben
surface_tilt = dach['neigung']
# Ausrichtung der Dachfläche eingeben
surface_azimuth = dach['richtung']

# Funktion zu Berechnung der Bestrahlungsstärke über ein Jahr
def calculate_irradiance_over_one_year(surface_tilt, surface_azimuth):
    
    # Startzeitpunkt eingeben
    start = '2024-01-01'
    # Endzeitpunkt eingeben
    end = '2025-01-01'
                        
    # Zeitraum festlegen
    date_range = pd.date_range(
        start=start,
        end=end,
        freq='1h',
        tz=tz,
        inclusive='left'
    )
    
    # Stand der Sonne bestimmen
    solar_position = location.get_solarposition(date_range)
    
    # Klarer Himmel
    clear_sky = location.get_clearsky(date_range)
    
    # Bestrahlungsstärke berechnen
    irradiance = get_total_irradiance(
        surface_tilt=surface_tilt,
        surface_azimuth=surface_azimuth,
        dni=clear_sky['dni'],
        ghi=clear_sky['ghi'],
        dhi=clear_sky['dhi'],
        solar_zenith=solar_position['zenith'],
        solar_azimuth=solar_position['azimuth']
    )

    irradiance = irradiance['poa_global']

    return irradiance

irradiance = calculate_irradiance_over_one_year(surface_tilt, surface_azimuth)

irradiance
2024-01-01 00:00:00+01:00    0.0
2024-01-01 01:00:00+01:00    0.0
2024-01-01 02:00:00+01:00    0.0
2024-01-01 03:00:00+01:00    0.0
2024-01-01 04:00:00+01:00    0.0
                            ... 
2024-12-31 19:00:00+01:00    0.0
2024-12-31 20:00:00+01:00    0.0
2024-12-31 21:00:00+01:00    0.0
2024-12-31 22:00:00+01:00    0.0
2024-12-31 23:00:00+01:00    0.0
Freq: h, Name: poa_global, Length: 8784, dtype: float64

4 Jahresverlauf

Nun kann die Veränderung der Bestrahlungsstärke im Verlauf eines Jahres betrachtet werden.

# Tagesleistung im Verlauf des Jahres bestimmen
daily = irradiance.resample('1D').sum()

# Liniendiagramm des Jahresverlauf
fig = px.line(daily, title="Bestrahlungsstärke im Verlauf eines Jahres")

fig.update_xaxes(title="Zeitpunkt")
fig.update_yaxes(title="Bestrahlungsstärke<br>[W/m<sup>2</sup>]")

fig.show()

5 Dachlächenpotenzial berechnen

Mit Hilfe der zuvor erstellten Funktion kann nun die Bestrahlungsenergie aller Dachflächen über den Zeitraum eines Jahres bestimmt werden.

# Fortschrittsbalken
from tqdm.auto import tqdm
tqdm.pandas()

# Funktion zur Berechnung der Bestrahlungsenergie pro Quadratmeter pro Jahr für ein Dach
def calculate_total_energy_per_square_metre(dach):
    # Ermittel Neigung und Ausrichtung der Dachfläche
    surface_tilt = dach['neigung']
    surface_azimuth = dach['richtung']

    # Jährliche Bestrahlungsstärke
    irradiance = calculate_irradiance_over_one_year(surface_tilt, surface_azimuth)

    total_energy_per_square_metre = irradiance.sum()

    # Rückgabe der Strahlungsenergie pro Quadratmeter
    return total_energy_per_square_metre

# Wende die Funktion auf alle Dächer aus den Datensatz an
total_energy_per_square_metre = df.progress_apply(calculate_total_energy_per_square_metre, axis=1)

# Füge das Resultat in die Spalte irradiance ein
df['total_energy_per_square_metre'] = total_energy_per_square_metre

# Berechne die Bestrahlungsenergie
df['total_energy'] = df['total_energy_per_square_metre'] * df['flaecheninhalt']

df
geb_id richtung neigung dachtyp himmel_kat geometry flaecheninhalt total_energy_per_square_metre total_energy
id
0 Geb80446ln0403_c 342 45 geneigt Nord MULTIPOLYGON (((472756 5724106, 472756 5724105... 35.832447 6.569500e+05 2.354013e+07
1 Geb79564ln0403_c -1 0 flach Flach MULTIPOLYGON (((472026 5724631, 472026 5724631... 175.390078 1.524493e+06 2.673809e+08
2 Geb65277ln0403_c -1 0 flach Flach MULTIPOLYGON (((472035 5724263, 472035 5724263... 15.500000 1.524493e+06 2.362964e+07
3 Geb70556ln0403_c 171 49 geneigt Süd MULTIPOLYGON (((472390.5 5724618, 472391 57246... 20.460276 2.056613e+06 4.207886e+07
4 Geb70759ln0403_c 61 36 geneigt Ost MULTIPOLYGON (((472673.5 5724606.5, 472673 572... 23.750000 1.089286e+06 2.587054e+07
... ... ... ... ... ... ... ... ... ...
3063 Geb75442ln0403_c 352 11 geneigt Nord MULTIPOLYGON (((472131 5724786, 472131 5724789... 1127.626528 1.271190e+06 1.433427e+09
3064 Geb78589ln0403_c 84 34 geneigt Ost MULTIPOLYGON (((472399 5724188.5, 472398.5 572... 8.684094 1.347335e+06 1.170038e+07
3065 Geb67289ln0403_c 307 43 geneigt West MULTIPOLYGON (((472820.5 5724379, 472821 57243... 55.442013 9.352619e+05 5.185280e+07
3066 Geb67172ln0403_c 323 17 geneigt Nord MULTIPOLYGON (((472064 5724657.5, 472065.5 572... 28.903594 1.201488e+06 3.472731e+07
3067 Geb67289ln0403_c 42 41 geneigt Nord MULTIPOLYGON (((472816.5 5724396.5, 472816.5 5... 155.073265 8.538725e+05 1.324128e+08

3068 rows × 9 columns

Nun kann die Dachflächen wieder auf einer Karte angezeigt werden. Die Einfärbung der Dachflächen ergibt sich nun aus dem Wert der Strahlungsenergie pro Quadratmeter.

df.explore(column='total_energy_per_square_metre', style_kwds=dict(weight=0))
Make this Notebook Trusted to load map: File -> Trust Notebook

6 Eignung bestimmen

Eine geneigte Dachfläche ist dann für den Einsatz von PV geeignet wenn

  • die Strahlungsenergie pro Quadratmeter pro Jahr mindestens 1500 kW beträgt und
  • die Dachfläche mindestens 20 Quadratmeter groß ist.

Bei Flachdächern wird angenommen, dass bei einer Aufständerung nach Süden 40 Prozent der Fläche genutzt werden kann. Flachdächer müssen daher mindestens eine Größe von 50 Quadratmeter aufweisen, um als geeignet eingestuft zu werden.

Aufgabe 7

  • Filtere die Daten ensprechend der oben genannten Kriterien.
  • Berücksichtige dabei auch die Flachdächer!
  • Der Datensatz df soll anschließend nurnoch die geeigneten Dachflächen enthalten.

(15 Minuten)

TippTip

Wie im ersten Arbeitsblatt (Luftqualität) können die Daten mit folgender Notation gefiltert werden:

cond = df['Spaltenname'] >= Wert
df = df[cond]
cond = df['flaecheninhalt'] >= 20  
df = df[cond]  
cond = df['output'] >= 1500  
df = df[cond]
# Hier Code einfügen

7 Zwischenstand speichern

An dieser Stelle wird das Zwischenergebnis gespeichert, um dieses im nächsten Arbeitsblatt (Object Detection) wiederverwenden zu können.

df.to_file('data/solarkataster.json')

8 Zusammenfassung – Bestrahlungsstärke

In diesem Notebook hast du gelernt, wie du:

  • die Potenziale von Dachflächen für Photovoltaik (PV) anhand der erwarteten Sonneneinstrahlung analysierst,
  • die Bedeutung von Neigung und Ausrichtung einer Dachfläche für die Berechnung der Bestrahlungsstärke verstehst,
  • mit geeigneten Tools (z. B. pvlib) die Globalstrahlung berechnest,
  • die gewonnenen Ergebnisse visualisierst, um potenzielle Flächen zu identifizieren,
  • die Rolle von PV-Anlagen für Klimaschutz und Energieversorgung einordnest,
  • Fragen für die praktische Anwendung reflektierst, z. B. „Welche Dächer in der Nachbarschaft wären geeignet?“.

Wiederverwendung

Zitat

Mit BibTeX zitieren:
@online{sparmann2026,
  author = {Sparmann, Sören},
  title = {Bestrahlungsstärke (Teil 1)},
  date = {2026-03-09},
  url = {https://material.cdec.io/modul_2/submodules/03_photovoltaik/01_bestrahlungsstaerke.html},
  langid = {de}
}
Bitte zitieren Sie diese Arbeit als:
Sparmann, Sören. 2026. “Bestrahlungsstärke (Teil 1).” March 9, 2026. https://material.cdec.io/modul_2/submodules/03_photovoltaik/01_bestrahlungsstaerke.html.