Sie sind auf Seite 1von 16

Rumliche und topographische Geodatenanalyse

bung: Angewandte Rasterdatenanalyse

Solarpotenzialanalyse Tarforst

Zusammenfassung

Autor:
Erik Ha
Gutachter:
Dr. M. Herbst

Im Rahmen des Moduls Rumliche und topographische


Geodatenanalyse wurde in einem Blockseminar die Eignung von Dachchen im Stadtteil Trier-Tarforst fr Photovoltaikanlagen und Solarthermie auf Basis von Geodaten bewertet. Als Datengrundlage wurden LiDARMassenpunkte und Vektordaten der Gebudechen im
Untersuchungsgebiet zur Verfgung gestellt. Zustzlich
standen Rasterdaten, welche die Anteile der diffusen und
direkten Globalstrahlung reprsentieren, zur Verfgung.

Inhaltsverzeichnis

Inhaltsverzeichnis

Abbildungsverzeichnis

II

1.

Datengrundlage

1.1. Rohdaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Prozessierte Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
2

Anwendung

2.

2.1.
2.2.
2.3.
2.4.

Verarbeitung der Rohdaten . . . . . . . . . . . . . . . . . . . . . .


Verarbeitung der Ausgaberaster aus der Strahlungsmodellierung
Visualisierung der Ergebnisse . . . . . . . . . . . . . . . . . . . . .
Bewertung der Ergebnisse . . . . . . . . . . . . . . . . . . . . . . .

Literaturverzeichnis

Eidesstattliche Erklrung

A. Anhang

.
.
.
.

.
.
.
.

4
5
6
8
9

10

Abbildungsverzeichnis

II

Abbildungsverzeichnis

1.1. Oberchenmodelle des sdlichen Teils des Untersuchungsgebiets


Trier-Tarforst. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1. Klassikationsergebnis fr den sdstlichen Teil des Untersuchungsbebiets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


2.2. Visualisierungsbeispiel einer koordinatenbasierten Abfrage. . . . . .

7
7

1. Datengrundlage

1. Datengrundlage

1.1. Rohdaten

Als Datengrundlage standen sowohl Rohdaten als auch prozessierte Daten zur
Verfgung. Zu den Rohdaten zhlen vorprozessierte und klassizierte Airborne
Laserscandaten im ASCII-Format. Die .xyz Dateien enthalten Rechts- und Hochwert sowie die Hhe ber NN., gerundet auf zwei Nachkommastellen. Die LiDARMassenpunkte wurden bereits in Bodensignal und Objektsignal klassiziert. Fr
jede Klasse standen vier Dateien zur Verfgung, welche zusammen eine Flche
von 2 2 km abdecken. Insgesamt wurden 21.3106 Boden- und 9.7106 Objektreturns aufgezeichnet.
Die Lage der zu beurteilenden Gebude konnte aus einem Auszug der Automatisierten Liegenschaftskarte (ALK) der Stadt Trier entnommen werden. Als weiterer Vektordatensatz wurde eine modizierte Version der Gebudechen bereitgestellt. Jene wurde ber zustzliche Polygone ergnzt, welche die Dachchen
anhand der Firstlinie separieren. Dieser Datensatz verfgt daher ber eine zustzliche Spalte in der Attributtabelle, welche die Dachidentikationsnummer (DachID)
beinhaltet. Auf Basis der ALK-Daten stehen 1160 Gebude zur Beurteilung zur Verfgung, von denen vier Gebude komplett und ein Gebude teilweise ausserhalb
des Untersuchungsbiets liegen. Dementsprechend knnen ber die modizierte
Version 1614 Dachchen potenziell beurteilt werden.
Darber hinaus standen zwei digitale Orthophotos zur Verfgung, welche ein Groteil des Untersuchungsbiet in einer geometrischen Ausung von 0.1 0.1 m
abdecken. Abbildung 1.1 zeigt den sdlichen Teil des Wohngebiets Trier-Tarforst
in Form eines digitalen Oberchenmodells auf Basis der zur Verfgung gestellt
LiDAR-Daten.

1. Datengrundlage

1.2. Prozessierte Daten

Als prozessierte Daten lagen die Ergebnisse einer Strahlungsmodellierung fr das


Untersuchungsgebiet aus dem Jahr 2009 vor. Die diffuse und direkte Einstrahlung wurde mit dem von Dr. Mader (Universitt Trier) entwickelten Programm
glorad modelliert. Die gelndeabhngige numerische Modellierung basiert vorwiegend auf den vom Verein Deutscher Ingenieure (VDI) aufgestellten Richtlinien
(VDI, 1994), welche zustzlich ber die Berechnung der Gelndevariablen Neigung,
Exposition, Schattenwurf und Sichtfaktor erweitert wurden. Zu den produzierten
Dateien des Modells zhlen Textdateien und Raterdaten. Die Pixelwerte der Rasterdateien reprsentieren in Strahlungskomponenten in der physkalischen Einheit
Jcm2 . Im Modus Daily Global Radiation, Direct, Diffuse Irradiance wird
ein Ausgaberaster mit 3 Bndern erzeugt, welches Tagessummen der Globalstrahlung (Band 1), direkten (Band 2) und diffusen Sonneneinstrahlung (Band 3), auf
Basis der vorgegeben Integrationsschrittbreite beinhaltet. Fr die Bearbeitung standen 36 Raster dieses Typus mit einer geometrischen Ausung von 0.5 0.5 km
aus dem Modellierungsjahr 2009 zur Verfgung.

(a) sdwestliche Beleuchtungsquelle

(b) sdstliche Beleuchtungsquelle

Fig. 1.1.: Oberchenmodelle des sdlichen Teils des Untersuchungsgebiets Trier-Tarforst.

2. Anwendung

2. Anwendung

Die Bearbeitung des Projekts gliederte sich entsprechend der zur Verfgung stehenden Daten in drei Teilabschnitte.
i. Verarbeitung der Rohdaten
ii. Verarbeitung der glorad-Ausgaberaster
iii. Bestimmung des Solarpotenizals
Die persnliche Vorgabe bei der Bearbeitung des Projekts richtete sich nach einem
hohen Automatisierungsgrad und sollte sich vorwiegend auf den Einsatz der Programmiersprache Python1 unter der Verwendung der Module gdal2 und NumPy3
und den Open-Source Geoinformationssystemen System for Automated Geoscientific Analyses (SAGA)4 , sowie Quantum GIS 2.0.1 (QGIS)5 beschrnken. SAGA
wurde aufgrund der zur Verfgung stehenden Algorithmen zur Rasterdatengenerierung aus Punktdaten sowie des erweiterten Optionsumfangs bei der Generierung von Hhenmodellen und deren Derivaten ausgewhlt. Der modulare Aufbau,
basierend auf C++-Klassen, ermglicht eine Automatisierung, da Module auch ber
die Kommandozeile oder ber die Python-API ausgefhrt werden knnen. Gleichzeitig wird die Integration in die weiteren Verabreitungsschritte durch die Untersttzung der Geospatial Data Abstraction Library (GDAL) gewhrleistet. QGIS
sollte vorwiegend zur Visualisierung der Geodaten eingesetzt werden. Die Prozessierung von Rasterdaten sollte mittels Python unter Verwendung von NumPy durchgefhrt werden, da auf diese Weise die Vorzge des ndarray-Objekts genutzt werden knnen. Aufbauend aus den Erfahrungen aus dem Modul GIS-Anwendungsentwicklung wurde ebenso versucht Programmablufe ressourcenschonend und plattformunabhngig zu gestalten.

1 http://www.python.org/
2 http://www.gdal.org/

3 http://www.numpy.org/

4 http://www.saga-gis.org/
5 http://qgis.org/

2. Anwendung

2.1. Verarbeitung der Rohdaten

Die einzelnen ASCII-Dateien der Boden- und Oberchensignale wurden mit Hilfe
eines Python-Skripts zur einer Datei zusammengefgt. Dabei wurden die Dateinamen in Form einer Liste ausgelesen und zeilenweise in eine neue Ausgabedatei geschrieben. Die Koordinatenpaare und deren korrespondierender Hhenwert
wurden als Punktobjekt in SAGA importiert und anschlieend als Rater mit einer
Zellgrsse von 0.5 unter Verwendung der Nearest Neighbour-Methode interpoliert.
Auf diese Weise wird gewhrleistet, dass keine interpolierten Werte entstehen, die
im Ursprungsdatensatz nicht vorkommen. In den Bereichen geringer Punktdichte
entstehen Artefakte, welche keine kontinuierlichen bergnge darstellen. Da kein
komplettes Gelndemodell des Untersuchungsgebiets erzeugt werden soll und fr
den Bereich der Gebudechen eine hohe Punktdichte vorliegt, eignet sich die
gewhlte Interpolationsmethode.
Aus der Differenz des interpolierten Hhen- und Oberchemodells wurde ein
normalisiertes Oberchenmodell berechnet. Im nchsten Schritt wurde das Raster auf Grundlage der Vektordatei der Dachchen reduziert. Dazu wurde das
SAGA-Modul Clip Grid with Polygon verwendet. Da einige Gebude ausserhalb
der Flche liegen, welche ber die LiDAR-Massenpunkte abgedeckt werden, wurden diese ebenfalls ber die Clip-Funktion auf Basis des umgebenden Polygons
(Bounding Box) des Rasters entfernt. Um die Neigung der Dachchen zu ermitteln, wurde ber die Verwendung des Moduls zur Reliefanalyse ein Ausgaberaster der Hangneigung erzeugt. Dazu wurde der Least Squares of Best Fitted PlaneAlgorithmus nach Horn (1981) verwendet. Jon (1998) konnte zeigen, dass dieser
Algorithmus geringe Abweichungen zu synthetischen und realen Referenzchen
zeigt. In diesem Algorithmus werden die acht umgebenden Nachbarpixel ausgewertet und in Abhngigkeit zur Entfernung des Zentralpixels gewichtet. Die Auswahl des Algorithmus nimmt einen Einuss auf die Selektion der Dachchen
aufgrund ihrer Neigung. Allerdings werden sich Unterschiede, die aufgrund unterschiedlicher Fenstergren des Algorithmus entstehen knnen, mglicherweise auf kleinere Dachchen auswirken. Da diese in der weiteren Auswahl ausgeschlossen werden, reduziert sich dieser Effekt. Standardmig reprsentieren die
Rasterwerte des Ausgaberasters fr die Neigung, jene in Radiant. Zur Umrechnung
in Grad wurde der Grid Calculator verwendet, um die Rasterwerte mit dem Faktor (180/ ) zu multiplizieren.

2. Anwendung

Um die Pixelwerte den Dachchen zuzuordnen, wurden deskriptive Statistiken


fr jedes Feature der Dachchen-Vektordatei erhoben. SAGA stellt dazu das Modul Grid Statistics for Polygons zur Verfgung. Neben den Standardparametern (Anzahl Pixel, Minimum, Maximum, Spannweite, Summe, arithmetisches Mittel, Varianz, Standardabweichung) knnen auch Quantile als Attributspalte in die
Vektordatei aufgenommen werden. Dachchen kleiner 20 m2 sollten in der Analyse nicht bercksichtigt werden. Daher mussten die Dachchen ber geometrische
Beziehungen eines Dreiecks und unter Verwendung trigonometrischer Funktionen
hergeleitet werden. Als gegebene Gren liegen die Grundchen der Gebude
und der Winkel der Dachschrgen (Neigung aus normalisierten Oberchenmodell) vor. Unter der Annahme, dass den Dachchen rechte Winkel gegenber
liegen, kann ber die cos-Funktion das Verhltnis zwischen Ankathete und Hypotenuse abgeleitet werden. Da die Grundche bekannt ist, kann ber den Quotienten zwischen jener und dem cos des Neigungwinkel die Dachche bestimmt
werden.
A Dach = AGrund / cos( Neigung )
Um Flachdcher auszuschlieen wurden Features mit einer Neigung kleiner 25
aus der Vektordatei ber eine einfache Attributabfrage entfernt. Der ursprngliche
Datensatz hat sich dementsprechend um 193 Dachchen reduziert, da jene als
Flachdcher ausgwiesen wurden.

2.2. Verarbeitung der Ausgaberaster aus der


Strahlungsmodellierung

Fr diesen Bearbeitungsschritt wurde ein Python-Skript erstellt, welches Rasterdatenstze eines vorgegebenen Dateityps aus einer Ordnerstruktur ausliest und
auf Basis eines Dictonaries den Dateinamen der Raster auswertet und dementsprechend mit einem Gewichtungsfaktor in ein neues Ausgaberaster schreibt (A.1).
Wie in 1.1 beschrieben, erzeugt glorad neben den Rasterdaten auch Textdateien. Im Fall des ENVI-Rasterformats benden sich zustzlich Header-Dateien innerhalb der Ordnerstruktur. Das Skript muss daher alle Dateien brigen Dateien ausser die Rasterdateien in der Auswahl ausschlieen. Um das eine Abschtzung des Jahresmittels der Globalstrahlung zu erzeugen, wurden die zur Verfgung stehenden Raster anhand eines vorgegebenen Gewichtungsschlssels summiert. Die Verwendung des Dictonary-Objekts erspart if -Abfrage innerhalb der

2. Anwendung

for-Schleife. Zustzlich knnen die Gewichtungsfaktoren ohne Aufwand verndert


werden. Die im Rahmen des Moduls GIS-Anwendungsentwicklung implementierte
Klasse RasterHandler wurde fr das Einlesen und Generieren von Rasterdateien verwendet. Als Vorteil ist hier die blockweise Bearbeitung von Rasterdaten zu
erwhnen. Whrend der Prozessierung wird nur ein geringer Anteil des Primrspeichers verwendet, sodass auch leistungsschwchere Rechner in der Lage sind
umfangreiche Rasterdateien zu verarbeiten. Daneben wird nur das Outputraster
als Array erzeugt, welches whrend der gesamten Prozessierung im Primrspeicher vorhanden ist. Vor der Generierung des Ausgaberasters muss jeder Pixelwert
auf die vorgegebene physikalische Einheit kWh/(m2 a) umgerechnet werden. Da
die jedes Rasterlayers (insgesamt 36) Pixelwerte J/cm2 d betrgt der Umrechnungsfaktor 360 (J/cm2 = Ws/cm2 = 0.001 kW 3600 s/0.0001 m2 100). Als letzten
Schritt wird die Projektion des Ausgaberasters unter Verwendung der ProjektionsKomponente osr aus der GDA-Bibliothek zugewiesen.
Im folgenden Bearbeitungsschritt wurden, wie bereits in Abschnitt 2.1 die zonalen
Statistiken fr die potenziellen Dachchen aus dem Raster der Strahlungsmodellierungsergebnisse berechnet und jenes auf Basis der Vektordatei zugeschnitten.

2.3. Visualisierung der Ergebnisse

Auf Basis des vorgegebenen Klassizierungsschlssels fr potenzielle Photovoltaikoder Solarthermiechen eignen sich 51 % der Dachchen (Abbildung 2.1). Nach
Norden ausgerichtete Dachchen scheiden aufgrund der geringeren Einstrahlung
als geeignete Flchen aus. Die grssten Dachchen im sdwestlichen Bereich
des Untersuchungsgebiets erreichen zwar hohe Einstrahlungswerte, scheiden allerdings aufgrund der geringen Dachneigung aus. Insgesamt konnte eine potenzielle
Flche von 52967 m2 identiziert werden. Davon entfallen 16213 m2 auf sehr gut geeignete, 16213 m2 auf gut geeignete und 11533 m2 auf bedingt geeignte Flchen. Diese
Flchen wurden ber ein Python-Skript ermittelt, welches die Vektor-Komponente
ogr der GDA-Bibliothek verwendet, um auf die Attributtabelle der Vektordatei zuzugreifen. Abbildung zeigt einen Teilausschnitt des Untersuchungsgebietes. Aufgrund der Gre des Untersuchungsgebietes und der Anzahl potentizeller Standorte bietet sich eine Einzelabfrage anhand von Koordinaten oder einer Adresse
an. Als erster Versuch einer individuellen Abfrage wurde die QGIS-Python-API
verwendet. ber die Verwendung der select-Funktion wird dabei eine Feature aus

2. Anwendung

7
334000

334200

334400

5512400

5512200
5512000

900
925
975
1025
1075
1125
>1125

5512400

5512200
5512000

ModelliertejhrlicheGlobalstrahlung
inkWh/m2

334000

334200

Projektion:UTMZone32N
Ellipsoid:WGS84

50 100 150 200 m

334400

Fig. 2.1.: Klassikationsergebnis fr den sdstlichen Teil des Untersuchungsbebiets.

dem Solarkataster ausgewhlt und die Ansicht auf das Feature zentriert. Anschlieend wird eine simple Ausgabedatei erzeugt, welche das zentrierte Feature, eine
Legende, einen Mastab und den mittleren Wert der jhrlichen Globalstrahlung anzeigt (Abbildung 2.2). Der zur Grunde liegende Python-Code liegt ist im Anhang
(A.2) vor. Dieser vereinfachte Ansatz knnte modiziert und unter Verwendung einer GUI intern als Python-Plugin oder extern als Standalone Anwendung auf Basis
der QGIS-API ein einfaches Abfrage Tool darstellen, welches ber Erweiterungen
beispielsweise den monetren Ertrag einer Photovolatik anlage angeben knnte.
Anfrage PV-Potenzial
Potenzielle PV-Leistung: 1197.85 kWh

Globalstrahlung
900 - 925
925 - 975
975 - 1025
1025 - 1075
1075 - 1125
> 1125

5 10 m

Fig. 2.2.: Visualisierungsbeispiel einer koordinatenbasierten Abfrage.

2. Anwendung

2.4. Bewertung der Ergebnisse

Gerade die Verarbeitung der LiDAR-Massenpunkte ist ein kritischer Prozess innerhalb der Prozessierungskette. Bereits bei einer geringen Ausdehnung des Untersuchungsgebiets liegt einen extrem hohe Punktdichte vor. Daher sollte die Prozessierung darauf ausgelegt sein gekachelte Daten zu verarbeiten. Da SAGA auch
ber eine Python-API verfgt knnten die beschriebenen Schritte 13 auch ber
ein generisches Python-Skript ausgefhrt werden, welches Inputparameter fr die
Ein- und Ausgabedateien, sowie die zu verwendenen Methoden als Usereingabe
aufnimmt. Auf diese Weise wird lediglich eine Usereingabe zum Anfang der Prozessierung bentigt.
Bezglich der Visualisierung und Bereitstellung der Daten fr den Endnutzer stehen zahlreiche Alternativen zur Verfgung. Die in 2.3 vorgestellte Methode ist an
die direkte Verfgbarkeit der Daten gebunden. Alternativ knnten die Daten ber
eine Datenbank mit Geodatenerweiterung (z. B.: postgresql6 und postgis7 ) abgefragt und serverseitig prozessiert werden. Die Visualisierung kann beispielsweise
ber die JavaScript-Bibliothek GeoExt8 browserbasiert erfolgen. Die Verwendung
der postgis-Erweiterung erlaubt auch individuelle Abfragen, sodass spezische
Abfragen ber die Geodatenverarbeitungsfunktionen der Datenbank serverseitig
prozessiert werden knnen.

6 http://www.postgresql.org/
7 http://postgis.net/
8 http://geoext.org/

Literaturverzeichnis

Literaturverzeichnis

A comparison of algorithms used to compute hill slope as a property of the DEM.


Computers & Geosciences 24 (1998), Nr. 4, S. 315 323.
Horn, B. K. P.: Hill shading and the reectance map. Proceedings of the IEEE 69
(1981), Nr. 1, S. 1447.
VDI: Umweltmeteorologie. Wechselwirkungen zwischen Atmosphre und Oberchen. Berechnung der kurz- und der langwelligen Strahlung VDI-Richtlinien,
Verein Deutscher Ingenieure (VDI), Dsseldorf (3789, Blatt 2), 1994.

Eidesstattliche Erklrung

10

Eidesstattliche Erklrung

Ich, Erik Ha, Matrikel-Nr. 1044072, versichere hiermit, dass ich mein Portfolio mit
dem Thema
Rumliche und topographische Geodatenanalyse: bung: Angewandte
Rasterdatenanalyse: Solarpotenzialanalyse Tarforst
selbstndig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt habe, wobei ich alle wrtlichen und sinngemen Zitate als solche
gekennzeichnet habe.

Trier, den 26. November 2013

Erik Ha

A. Anhang

A. Anhang

Listing A.1: Python Skript zur Batch-Prozessierung von Rastderdaten.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

from osgeo import gdal


from gdalconst import *
from osgeo import osr
from RasterHandler_base import RasterHandler
import os
import numpy as np
def insert_char(obj,val,ind):
return "".join("%s%s"%(val,obj[ind]))
path = "D:\\tmp\\Ausgangsdaten_Stufe_II\\GLORAD2009\\ENVI\\"
os.chdir(path)
fns = os.listdir(path)
fns = [os.path.splitext(fn)[0] for fn in fns if os.path.splitext(fn)[1] == ""]
cases_dict = {"0221":8,"0421":10,"0621":10,"0921":10,"1121":10,"0121":11,
"0221":11,"0521":11,"0721":11,"0821":11,"1021":11,"1221":11,
"0221":8,"0321":11}
months = range(1,13)
months = [(str(item)+"01",str(item)+"11") for item in months]
months[:9] = [insert_char(i,0,k) for i in months[:9] for k in range(2)]
months[-3:] = [insert_char(i,"",k) for i in months[-3:] for k in range(2)]
for item in months:
cases_dict["%s"%item] = 10
ds = RasterHandler(fns[0],blk_size,1)
X_Size, Y_Size, blk_size = ds._XSize,ds._YSize, 1024
geotr = ds._geotransform
ds.GenerateOutput("solar_weight_blk","GDT_Float32",0,"GTiff",1,)
out = np.zeros((X_Size,Y_Size))
for fn in fns:
fkey = fn[-4:]
tmp = RasterHandler(fn,blk_size,1)
seq = tmp.TileIterator()
ind = tmp._tilelist
for k,item in enumerate(seq):
blk = tmp.GetNextTile(1)
blk = blk*cases_dict[fkey]

A. Anhang

35
36
37
38
39
40
41

42

out[ind[k][1]:ind[k][3]+ind[k][1],ind[k][0]:ind[k][2]+ind[k][0]] += blk
tmp.Close()
out/=360
ind = ds._tilelist
for k,tile in enumerate(ds.TileIterator()):
blk = out[ind[k][1]:ind[k][3]+ind[k][1],ind[k][0]:ind[k][2]+ind[k][0]]
ds._dst_ds.GetRasterBand(1).WriteArray(blk,xoff=int(ind[k][0]),yoff=int(ind[k
][1]))
ds.Close()

Listing A.2: Python-Skript zur automatisierten Abfrage von Features.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

from PyQt4.QtGui import *


from PyQt4.QtCore import *
def set_label(text,x,y,composer):
cL = QgsComposerLabel(composer)
cL.setText(text)
qf = QFont("Times", 8, QFont.Bold)
cL.setFont(qf)
cL.adjustSizeToText()
cL.setBackgroundEnabled(False)
cL.setItemPosition(x,y)
composer.addItem(cL)
vlayer = QgsVectorLayer("solar.shp","solar", "ogr")
bounds = QgsRectangle(x_min,y_min,x_max,y_max)
vlayer.select(bounds,1)
selection = vlayer.selectedFeatures()[0]
canvas = iface.mapCanvas()
canvas.zoomToSelected(vlayer)
vlayer.removeSelection()
mapRenderer = iface.mapCanvas().mapRenderer()
c = QgsComposition(mapRenderer)
c.setPlotStyle(QgsComposition.Print)
x, y = 0, 0
w, h = c.paperWidth(), c.paperHeight()
composerMap = QgsComposerMap(c, x+12.5,y+20,w/3,h/2-40)
c.addItem(composerMap)
c.update()

27
28
29
30
31
32

ii

set_label("Anfrage PV-Potenzial",
15,5,c)
set_label("Potenzielle PV-Leistung: %.2f kWh"%selection.attributes()[19],
15,8.5,c)

A. Anhang

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

item = QgsComposerScaleBar(c)
item.setStyle('Single Box')
item.setItemPosition(15,85)
item.setHeight(2)
item.setNumSegmentsLeft(0)
item.setNumSegments(2)
item.setNumUnitsPerSegment(5)
qf = QFont("Times", 8, QFont.Bold)
item.setFont(qf)
item.setBoxContentSpace(2)
item.setUnitLabeling("m")
item.setComposerMap(composerMap)
item.adjustBoxSize()
item.setAlignment(1)
item.setBackgroundEnabled(False)
c.addItem(item)

49
50
51
52
53
54
55
56
57
58

legend = QgsComposerLegend (c)


legend.setItemPosition(110,5)
legend.setComposerMap(composerMap)
legend.setBackgroundEnabled(False)
legend.setTitle("Globalstrahlung \n in kWh/sqm a")
legend.setSymbolWidth(5)
legend.setSymbolHeight(3)
legend.updateLegend()
c.addItem(legend)

59
60
61
62
63

64
65
66
67
68
69
70
71
72

printer = QPrinter()
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName("out.pdf")
printer.setPaperSize(QSizeF(c.paperWidth()/1.8, c.paperHeight()/1.8), QPrinter.
Millimeter)
printer.setFullPage(True)
printer.setColorMode(QPrinter.Color)
printer.setResolution(c.printResolution())
pdfPainter = QPainter(printer)
paperRectMM = printer.pageRect(QPrinter.Millimeter)
paperRectPixel = printer.pageRect(QPrinter.DevicePixel)
c.render(pdfPainter, paperRectPixel, paperRectMM)
c.render(pdfPainter, paperRectPixel, paperRectMM)
pdfPainter.end()

iii