Extrahieren von Rasterkacheln aus einem WMS Server oder anderen Datenquellen. Mit Hilfe von FME
Extrahieren bzw. erstellen von georeferenzierten
Rasterkacheln aus einem WMS Server oder anderen Datenquellen. Mit Hilfe von FME
(Feature Manipulation Engine)
Autor: Dennis „Rabkcor“ Amtsfeld
Vorwort
Heute mal ein hoch technischer aber praktisch anzuwendender
Blog. Da ich in dem letzten Jahr viel von dem frei verfügbaren Wissen in meinem
Berufszweig profitiert habe, möchte ich der Community etwas zurückgeben.
Deswegen starte ich heute eine Reihe, in der ich Schritt für Schritt Techniken
aus dem Geoinformationswesen erklären werde.
Ich gebe hier also mein Insider Wissen frei und möchte
somit auch meinen Teil beitragen, sämtliches Fachwissen für jedermann zur
Verfügung zu stellen. Für ein freies Internet ;-)
Ich versuche zwar, diese Anleitung für blutige Anfänger zu
schreiben, trotzdem muss und werde ich grundlegendes Basiswissen im Bereich der
Geographie und Geoinformation voraussetzen. Da es sonst den Umfang dieses Blogs
sprengt.
Fragen/Fehler?
Ist etwas unklar, könnt ihr mich gerne anschreiben. Sobald
ich Zeit finde, bekommt ihr die Antwort.
Danksagung
Ich möchte mich bei Doktor Martin Huber dem Inhaber der
Condesys Consulting GmbH, also meinem (bald ehemaligem) Chef bedanken, das ich
dieses Wissen für jedermann veröffentlichen darf. Immerhin ist dieses Know How
Firmeneigentum!
Also. Danke Martin.
Einleitung (Um was
geht es?)
Sehr oft, hat man eine passende Quelle für sein Projekt
erhalten, stellt aber fest, dass diese viel zu viel Information beinhaltet.
Sprich das Gebiet um mehrere 1000 qkm zu gross ist. Was sehr häufig der Fall
ist, wenn man auf WMS Server zurückgreift. Bzw. das Gebiet passt, aber man muss
es in Kacheln unterteilen, damit der Rechner, Server etc. mit den Daten Massen
umgehen kann. Ich werde hier erklären, wie man solche eigene Kacheln erstellt,
ohne die Georeferenzierung zu verlieren. Voraussetzung ist natürlich, das die
Quelle bereits referenziert ist. Ist dem nicht so, muss Sie vorher referenziert
werden. Wie dies genau geht, erkläre ich in einem anderen Blog in der Zukunft.
Ich arbeite sehr gerne mit der Software FME von Safe
Software (http://www.safe.com/). Mit dieser
Software, kann man sehr schnell grosse Datenmenge bearbeiten. Der Nachteil, es
ist recht kompliziert und keine Open Source Software. Allerdings kann man auf
der Homepage eine 14 Tage Trial Version sich herunterladen. Was für ein
Projekt, durchaus reichen sollte. FME ist unschlagbar, wenn man sehr grosse
Mengen von Daten „erschaffen“ oder bearbeiten möchte. Es ist dabei auch nicht nur auf Geodaten beschränkt. Natürlich,
kann man auch mit einem OpenSource GIS sich Geodaten bauen. Der Nachteil ist,
jedes Bild muss einzeln bearbeitet werden. Was bei mehreren 1000 Bildern aus
denen ein WMS beispielsweise zusammengesetzt ist in extreme bzw. unmenschliche
Arbeit ausarten kann.
Ich stand vor der Aufgabe, einen WMS Server für die
nordwestliche Schweiz aufzusetzen. Drei Massstabsebenen, sollte ich
bereitstellen. 1:1000, 1:5000 und 1:25000. Als (ROH)Datengrundlage, hatte ich
zeitlich befristeten Zugang zu einigen WMS Servern, der kantonalen Verwaltung. Ich
entschied mich also, mir die Daten die benötige selbst zu „erschaffen“. Jeder
der dies mal getan hat wird sehr schnell feststellen, dass das reine
Datenvolumen riesig ist. Es deswegen keine sehr gute Idee ist, sich alle Geodaten
in ein einziges Bild zu packen.
Ich entschied mich also, tausende von Rasterkacheln des
Gebietes anzufertigen, da diese leichter in den Browser geladen werden können.
Das erste Problem war, die Rohdaten, konnten nicht alle
gewünschten Massstäbe projizieren. Das zweite Problem war, ich hatte nur
zeitlich begrenzenden Zugriff auf die Rohdaten und konnte deswegen nicht
einfach die kantonalen WMS als permanente Datenquelle nutzen.
Wichtige Anmerkung:
Bitte beachtet, dass ich mir nicht sicher bin, wie das
Copyright der Daten ist. Auch wenn ich hier von eigenen Geodaten spreche (nach
dem erstellen), dürfte das Copyright immer noch bei der Behörde/Person/Firma
liegen, die die Daten kartiert hat. Also vergewissert Euch, das ihr auf freie
Geodaten zurückgreift!!
Ideale Formate
Für 1:1000 empfiehlt sich: 240*180 Meter auf 800*300 Pixel
Für 1:5000 empfiehlt sich 1200*900 Meter auf 800*600 Pixel
Für 1:25000 empfiehlt sich 6000*4500 Meter auf 1000*750
Pixel
Vorbereiten der Daten
in FME
Jetzt geht es ans Eingemachte. Wir erstellen uns die Daten
mit FME.
-Anmerkung: Mich haben nur Daten links und rechts der
Autobahnen interessiert. Falls ihr durchgehende Daten extrahieren wollt, lasst
den folgenden Abschnitt, der mit: Optional makiert ist weg.
- Anmerkung 2: Ich gehe auf grundlegende Techniken von FME
nicht weiter ein. Auf www.Safe.com, gibt es
ausführliche Tutoriell über die Software. Es lohnt sich, diese Zeit zu
investieren. Dauer ca. 90 Minuten. Es reichen die FME Desktop Tutoriell: http://www.safe.com/learning/training/training-catalog/#desktoptutorial
.
Als erstes behandeln
wir einen Fall, bei dem wir die Kacheln ohne Massstabsprobleme extrahieren
können. Ich verwende hierfür 2 voneinander abhängige WorkBenches.
In der ersten Workbench, erzeuge ich ein Gitter, welches ich
über das zu extrahierende Gebiet lege und dieses Gitter, beinhaltet bereits die
Meterangaben. In der zweiten Workbench, rufe ich den Quell-WMS auf, der die
Rohdaten liefert. Hier werden die Pixelangabe getätigt.
ACHTUNG
Achtet darauf, dass sämtliche
Quelldaten das gleiche Koordinatensystem haben. Zum Beispiel WGS84 oder EPSG
21781. Haben Sie das nicht, transformiert die Daten vorher. Wie das geht, werde
ich auch in einem zukünftigen Blog beschreiben.
Workbench 1: Das
Gitter!
Kacheln sind quadratisch. Soweit so klar. Wenn wir also
viele nebeneinander liegende Kacheln extrahieren möchten, können wir dies mit
Hilfe eines Gitternetzes tun. Wir müssen dann nur, die Koordinate aus
den einzelnen Spalten sowie Zeilen des Gitternetzes extrahieren.
Das heisst, wir bauen uns ein Gitternetz, welches wir über
das Gebiet legen, welches uns interessiert. Jede Gitterzelle, ergibt später
eine Kachel.
Gitternetz:
Erzeugen des Gitters
Das Gitter, wird mit dem 2DGridGenerator erzeugt.
Folgende Angabe müssen zwingend gemacht werden.
-
Lower Left X Coordinate : Hier die untere linke x
Startkoordinate eingeben
-
Lower Left Y Coordinate: Hier die untere linke y
Startkoordinate eingeben
-
Number of Columns: Hier die Zeilenanzahl
eintragen. Achtung ist abhängig von der gewünschten Höhe in Metern der gewünschten
Endkachel!
-
Number of Rows: Hier die Spaltenanzahl
eintragen. Achtung ist abhängig von der gewünschten Breite in Metern der
gewünschten Endkachel!
-
Colum Width: Hier die gewählte Breite in Meter
eingeben. Z.B für 1:5000 Ã
1200
-
Row Heigth: Hier die gewählte Höhe in Meter
eingeben. Z.B für 1:5000 Ã
900
-
Type of Grid to Create: Wir brauchen Polygone.
Also wählen wir Polygone
Extrahieren der Koordinaten
Wir müssen später dem WMS die Koordinaten der einzelnen
Kacheln übergeben, damit die richtigen Ausschnitte extrahiert werden.
Dies geschieht im CoordinateExtractor! Wir brauchen hiervon
zwei Stück. Um die jeweiligen lower left X/Y Koordinaten jeder einzelnen Kachel
zu extrahieren. Die lower left Koordinate, ist die Koordinate, die den
Startpunkt einer jeden Gitterzelle bestimmt.
Hier sind nur recht wenige Angabe zu machen.
-Index: Hier wird angegeben, welche der 5 Koordinaten die
ein Polygon besitzt wir extrahieren wollen. Wir brauchen den Index 0 im ersten CoordinateExtractor und den Index
2 im zweiten CoordinateExtractor. Da wir die 0 und 2 Koordinate
extrahieren wollen. Wem das nicht verständlich ist warum, muss sich noch einmal
mit Polygonen befassen.
- X/Y Attribute (optional): Im ersten CoordinateExtractor
geben wir XMIN bzw. YMIN ein und im zweiten XMAX bzw YMAX ein
Die Namensgebung
Da wir mehrere tausende Kacheln extrahieren werden, ist es wichtig jeder einzelnen Kachel einen spezifischen Namen zu geben.
Es empfiehlt sich die Eckkoordinaten in den Namen
einzubauen. Ich würde empfehlen, die von mir gezeigten Einstellungen eins zu
eins zu übernehmen. Wobei Solothurn optional ist. Dies bezeichnet nur das
Gebiet.
Das übergeben der Daten an die zweite
Workbench
Wir haben jetzt, alles was wir brauchen, um die Kachel zu
extrahieren. Alle anderen Einstellungen, die im ersten Screen zu sehen sind
optional. Ich werde nicht weiter auf diese eingehen. Es steht euch frei, diese
trotzdem einzubauen und etwas zu experimentieren.
Wir übergeben die Daten mit dem WorkspaceRunner.
Vorweg. Bevor ihr die Daten übergeben könnt, müsst ihr
natürlich die zweite Workbench schon erstellt haben!!! Dann gebt ihr unter der
Einstellung FME Workspace den Pfad
ein unter denen die zweite Workbench zu finden ist und füllt die restlichen
erforderlichen Eingaben eins zu eins wie abgebildet ein!
Achtung!! FME ist hier Buggy. Falls ihr einen Fehler macht,
oder mehr Angaben übergeben wollt, müsst ihr den WorkspaceRunner löschen und
alle Angaben nochmal tätigen.
Zur Kontrolle:
Um das Gitternetz zu kontrollieren, könnt ihr wie oben im
ersten Screen gezeigt einen Visualizer einbauen und euch das Gitternetz
ansehen. Das Ergebniss soltte so aussehen:
Ein weiteres Kontrollinstrument, ist der Logger. Diesen
solltet ihr auch einbauen. Wie im ersten Screen gezeigt.
Optional:
Wie gesagt, ich brauchte nur Kacheln links und rechts der
Autobahnen. Deswegen habe ich noch eine Selektion eingebaut.
Grundlage hier war ein von unserer Firma erstelltes
Shapefile, in denen wir nur die Autobahnen digitalisiert haben. Dies lässt sich
recht schnell mit einem GIS in manueller Arbeit erledigen. Wie das Erstellen
von Vectordaten funktioniert, erkläre ich ebenfalls in naher Zukunft.
Als nächstes habe ich um die Autobahnen einen Buffer gelegt.
Damit ich nicht nur die Kacheln direkt um die Autobahnen erwische, sondern auch
die nächste danach. Ihr könnt hier bei der Bufferbreite (Bufferamount) jeden
beliebigen Wert in Metern eingeben, bis er euch breit genug ist und er das
Gebiet abdeckt, welches ihr wünscht. Siehe auch hier:
Als letztes, werden im AttributeCreator noch die Attribute
erzeugt, die ich zum verschneiden benötige. Siehe hier:
Um diese Daten jetzt endgültig mit dem Hauptstrom zu
verschneiden und die Selektion sicher zu stellen, baut ihr wie im ersten Screen
zu sehen, einen Spatialfilter ein und übernehmt meine Angabe eins zu eins.
Siehe hier:
Habt ihr alles richtig gemacht, sieht das Ergebnis so aus:
Worbench Nr. 2
(Beispiel 1)
In dieser Worbench, rufen wir die Quelldaten auf, die als
Grundlage zum Extrahieren dienen. Das erste hier gezeigte Beispiel, geht davon
aus, das die Quelle die benötigten Massstäbe die wir brauchen liefert. Im zweiten
Beispiel, werde ich zeigen, wie man die Quelle so manipuliert, dass wir
Massstäbe erzeugen können, die nicht von den Quell Daten unterstützt werden.
Übergabe der
Parameter aus Worbench 1 an Workbench 2
Als erstes müssen wir sicherstellen, dass die Parameter, die
wir in der Workbench 1 erzeugen, korrekt an die Workbench 2 übergeben werden.
Dafür müssen wir erst einmal in der Workbench 2 (WB2) die Voraussetzungen
erschaffen.
Als ersten Schritt, öffnen wir in der linken Menüleiste die
Published Parameters.
Nun selektieren wir mit der rechten Maustaste die Published
Parameters und wählen Add Parameter aus.
Es erscheint folgendes Fenster:
Jetzt müssen wir eine Reihe von Parametern erzeugen.
Grundsätzlich verwenden wir den Type: Integrer
Unter Name und Prompt, tragen wir immer das gleiche ein. Bei
Prompt allerdings mit Doppel Punkt.
Default Value können wir frei lassen!
Folgende Parameter sind zu erstellen:
MinX, MinY, MaxX, MaxY, KachelName
Das Einbauen der
Quell Daten
Wir gehen auf den Reiter Reader oben in der Menüleiste und
wählen Add Reader.
Bei Format, geben wir das Quellformat ein. In unserem Fall,
zapfen wir einen WMS Server an. Deswegen geben wir hier WMS ein. Wenn wir ein
anderes Datenformat ausser WMS gewählt haben, drücken wir OK. Wir müssen dann,
die Optionen des Readers öffnen und dann den genauen Pfad eingeben. Ich zeige
das hier nicht, dass es bereits Inhalt der FME Tutoriell war.
Wir haben aber und dies wird meistens der Fall sein, einen
WMS als Quelle gewählt. Hier ist es etwas komplizierter. Deswegen gehe ich
genau darauf ein.
Wir klicken nun auf Parameters. Und bekommen folgendes
Konfigurationsmenü:
Da ich davon ausgehe, das wir einen freien WMS Server
anzapfen, können wir Use Http Authentication und Use Proxy Server ignorieren.
Unter URL, tragen wir die URL des benutzten WMS Servers ein.
Als Beispiel, verwende ich nun einmal der freien WMS Server des Kantons
Solothurn. http://www.sogis1.so.ch/cgi-bin/sogis/sogis_grundbuch.wms?
Jetzt wird es tricky. Unter Layer List, tauchen nun alle
Layer auf, die der WMS Server enthält. Ich muss mich also, bereits mit dem WMS
Server intensiv beschäftigt haben und wissen, welchen Layer ich benötige.
In meinem Fall, brauchte ich den Layer : SOGIS Grundbuch. Deswegen
habe ich nur diesen selektiert.
Restliche Einstellungen:
Map Width/Map Height: Hier lege ich die Pixelgrösse des zu
extrahierenden Bildes fest. Die Einstellungen, habe ich am Anfang des BLOGS
gezeigt. Beachtet, das dies zum gewählten Massstab passen muss. Hier ist eine
grosse Fehlerquelle!!!!!
Output Format: Hier könnt ihr das Format wählen, welches ich
als Grundlage verwenden wollt. Aufgrund der hohen Komplexität und der damit
verbundenen Flexibilität, bin ich grosser Fan des Formates .tiff
Map SRS: Sehr wichtig! Hier stellt ihr das Koordinatensystem
der Quelle ein. Ich kann mich nur wiederholen, achtet darauf, das ihr immer das
gleiche System benutzt!
So sollte es am Ende aussehen:
Bestätigt mit OK
Die Quelle wird nun geladen. Ist alles richtig gelaufen,
sieht es so aus. Beachtet auch die Menüleiste links!
Jetzt haben wir es fast.
Jetzt müsst ihr den WorspaceRunner in Worbench 1 einbauen.
Und die Attribute zuweisen. Vergleicht nochmal das Bild, im betreffenden Abschnitt
weiter oben im Text! Speichert dann Worbench 1 und schlisst diese!!!
Wir bauen nun einen ParameterFetcher ein. Dieser stellt
sicher, dass wir später jeder Kachel die wir extrahieren, auch den richtigen
Namen zuweisen.
Als letztes, müsst ihr noch einen Writer einbauen. Der das
gewünschte Format schreibt. Ihr könnt auch mehrere Writer einbauen, der
verschieden Formate schreibt. Ich bevorzuge PNG und TIFF. Je nach Komplexität
der Anwendung, die ich auf diesen Daten aufbaue.
Folgendes, müsse ihr unter den Optionen des Writers noch
einstellen. Macht einen Hacken bei Fanout by Attribute und wählt als Attribut
den Kachelnamen. Das stellt sicher, dass jede Kacheln den richtigen Namen erhalten
und sich die Kacheln nicht gegenseitig überschreiben.
Als letztes noch auf den Reiter Parameters gehen und sicher
stellen, das WorldFile Generation aktiviert ist. Im Worldfile, stehen alle
relevanten Geodaten als Metadaten bereit.
Das war es. Hab ihr alles richtig gemacht, könnt ihr jetzt
das Pogramm starten. Dazu öffnet die Workbench 1und drückt auf Play!
Gratuliere. Du solltest jetzt tausende von Kacheln
produzieren, die in etwa so aussehen könnten:
Das Beste ist, alle Kacheln sind dank FME bereits richtig
georeferenziert!!!!
Workbench Nr 2 (Beispiel 2) Probleme mit dem Massstab
Sehr häufig kommt es vor, dass die Quelle nicht den
benötigten Massstab eins zu eins liefern kann. Das heisst, wir müssen die Daten
aktiv manipulieren, um dies zu erreichen. Dies ist nicht so einfach, wenn man
eine hohe Qualität erreichen möchte. Aber zum Glück für euch, habe ich die
Lösung bereits gefunden!
In Worbench 1, verändert sich nichts. Ihr baut sie genau so
auf wie beschrieben. Auch mit den Meterangaben für das Gitter, ihr gebt genau
die Meter ein, die ihr benötigt. In Worbench 2 ändert sich zwar nicht viel,
aber dafür wichtiges!
In dem von mir gezeigtem Beispiel, konnte ich zum Beispiel
nicht einen Massstab von 1:1000 bzw. 1:5000 zu extrahieren. Da die Quelle dies
nicht hergab. Ich habe es aber natürlich trotzdem geschafft, Kacheln mit dem
gewünschtem Massstab zu bauen. Wie zeige ich Euch!
Vorweg. Das Format, der Quelle muss dringend auf TIFF
gestellt werden. Da nur ein TIFF die hohe Qualität aufweist, die ich brauche um
vernünftig manipulieren zu können.
Wie erledigt man dies.
Ich habe durch Experimente herausgefunden, dass der Server
noch Map Width: 400 und Map Height: 300 liefern kann. Benötigt habe ich aber
800*600.
Soweit so gut. Ich habe also als zu extrahierende Grösse,
bei UNVERÄNDERTER METER Angabe für 1:1000 in Worbench 1 400*300 eingegeben.
Nun, muss das Bild aber resampelt werden. Dies ist ohne Qualitätsverlust
nicht so einfach.
Wir müssen also einen RasterResampler einbauen und genau wie
beschrieben einstellen!
Zwei Dinge sind wichtig: 1 Der Input und ich wiederhole es noch
einmal muss ein TIFF sein. Der Interpolation Type im RasterResampler muss auf
Average 16 gestellt werden. Also übernehmt eins zu eins meine Einstellungen.
Das war das Geheimnis.
ACHTUNG:
Wenn ihr mit den Einstellungen des Servers experimentiert,
achtet zwingend darauf, dass ihr das Verhältnis Meter zu Pixel beachtet.
Beispiele:
Ihr braucht 1:1000, stellt aber fest das die Quelle nur
1:2000 wieder geben kann. Ihr müsst also verkleinern. Ihr dürft nichts wirklich
nichts bei den Meterangaben des Gitters verändern. Stellt also nur die Pixel
um.
Einstellung Beispiele:
1:2000 auf 1:1000
240*180 Meter auf 400*300 Pixel dann auf 800*600 resampeln!
1:2500 auf 1:5000
1200*900 Meter auf 3200*2400
Pixel dann auf 800*600 resampeln
Was ich damit sagen will, behalte das Verhältnis bei.
Verdoppelt/halbiert, vervierfacht/viertelt usw. die Pixelanzahl, aber nie die
Meter, solange bis der Server etwas ausgibt. Dann resampel dieses.
Hab ihr alles richtig gemacht, kann das Ergebniss so
aussehen:
Von 1:2000 direkt auf 1:1000
Oder hier von 1:2500
auf 1:5000
Bei beiden wurde trotz Manipulation der Quelldaten eine
tolle Qualität erreicht.
Viel Spass und Viel erfolg Euch und bis zum nächstem mal.

































Wie sind Befehle miteinander verbunden?
AntwortenLöschen