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.
Hier das Shapefile.


Dieses habe ich dann in die Worbench geladen.


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.


Kommentare

Kommentar veröffentlichen

Beliebte Posts