WMS Service über MatPlotLib?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Eberon
User
Beiträge: 3
Registriert: Mittwoch 15. Dezember 2010, 13:11

Hallo zusammen,

seit längerem Arbeite ich nun schon an einer Webanwendung, welche WCS-Server Daten ansprechen und plotten kann. Die Daten werden in netCDF geliefert, welche ich bisher mit PyNGL und PyNIO geöffnet und geplottet habe. Leider stößt man hier doch schnell an die Grenzen des Möglichen und leider gibt es auch einige Bugs in beiden Paketen. Mir schwebt vor die Plotausgabe über einen Kachelserver (WMS Service) zu gewähleisten und ich will weg von dem PyNGL-Zeug. Die MatPlotLib soll hierbei ja recht mächtig sein (z.B. mit dem Basemap Toolkit). Da die Daten jedoch ständig wechseln und unterschiedlichste Plots erstellt werden sollen ist eine Vorberechnung nicht möglich.
Meine Frage ist nun hat hierbei jemand Erfahrung mit WMS-Servern unter Python. Wenn ja womit erzeugt ihr eure Kacheln am elegantesten?

Vielen Dank schon einmal an alle
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Hi,

ich bin mir nicht sicher, ob ich deine Situation richtig verstehe und wie Matplotlib zum WMS-Server passt. Ich habe eine Reihe WMS-Server unter dem UMN-Mapserver laufen. Python spielt dabei nur in der WSGI-Anwendung eine Rolle. Alternativ wäre auch TileCache, eine reine Python-Anwendung, interessant für dich. Allerdings ist afaik die verlinkte Version auf der Homepage nicht mehr die aktuellste.

Für den UMN Mapserver gibt es auch ein Python Modul (SWIG), mit dem man auch auf die WMS Funktionen und Klassen vom Mapserver zugreifen kann.

Hilft dir das irgendwie?

Allerdings sollte ich festhalten, dass WMS-Server nichts mit Kacheln, was immer du genau damit meinst, zu tun haben. WMS-Server bieten nur Zugriff auf Geodaten über HTTP nach einer genauen Spezifikation. Dabei wird das Kartenbild jedes mal neu gerendert und übertragen. Es gibt zwar für die 1.3.0 Spezifikation eine Diskussion über einen "Tiled WMS", die ist allerdings afaik noch nicht in den Standard integriert.
Wenn du sowas wie Google Maps sucht, also eine Kartenanwendung, die lauter kleine, rechteckige Kartenteile ausliefert, bist du mit dem TileCache wohl am besten bedient und du vergisst ganz schnell wieder den WMS Krams. Als Clientseitige Anzeigeanwendung könntest du dann OpenLayers verwenden ...


Frank
Eberon
User
Beiträge: 3
Registriert: Mittwoch 15. Dezember 2010, 13:11

Dank dir Frank für die schnelle Antwort.

TileCache hört sich wirklich interessant an, da ich eigentlich ganz gerne komplett in Python bleiben will.

Clientseitig will ich OpenLayers verwenden. Wobei hier ja einige Serverformate unterstützt werden. Daher dachte ich, das der Server auch als reiner WMS-Server arbeiten könnte, da jeder Nutzer eh auf eigenen Daten arbeitet und eine Vorrenderung nicht möglich ist. OpenLayers fragt den Server über den WMS-Standard dann eigentlich auch nur ausschnittsweise ab. Natürlich ist ggf. ein Caching schon noch zusätzlich nötig wie es TileCache bietet. Ich werde mir das ganze einmal ansehen.

Zum Thema MatPlotLib: Sowie ich das verstehe muss ich ich meine Plotroutine doch selbst implementieren, welche mir die eigentlichen Kacheln bzw. Overlays generiert, oder verstehe ich hier etwas falsch?
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Puh, keine Ahnung :D

Sind das denn Rasterdaten, die du ausliefern willst oder Vektordaten? Ich kenne leider weder netCDF, noch MatPlotLib, bzw. das Basmap Modul. Problem ist in meinen Augen die Georeferenzierung der Daten, die du ausliefern willst. Eigentlich jede WMS-Server Implementierung benötigt georeferenzierte Daten, also ein Dateiformat, dass seine Position in einem Koordinatensystem kennt (mindestens ein einfaches karthesisches). GeoTIFF für Rasterdaten, Shapefiles für Vektordaten zum Beispiel. Keine Ahnung, das MatPlotLib da generiert. Falls das Rasterdaten sind, kannst du dir auch noch GDAL mal ansehen, insbesondere gdal2tiles.py. Dieses Skript teilt ein einzelnes Rasterbild in Teile für eine bestimmte Anzahl an Zoomstufen.

Zu TileCache: TileCache ist eigentlich nur als Aufsatz vor einem WMS-Server zu sehen, um die Renderlast vom Server zu nehmen. TileCache selber ist _kein_ WMS-Server. In der TileCache Konfiguration kannst du eine Reihe von WMS-Servern als Datenquelle angeben, die TileCache dann nach Definition(Anzahl Zoomstufen & geographische Ausdehnung) abfragt und als Tiles dann auf deiner Festplatte ablegt. Ändern sich deine Daten oft, ist das nur bedingt eine Alternative, denn das Erzeugen eines Caches dauert je nach Ausdehnung und Anzahl der Zoomstufen schon eine Weile.
Eberon
User
Beiträge: 3
Registriert: Mittwoch 15. Dezember 2010, 13:11

NetCDF ist ein binäres Dateiformat, welches bei georeferenzierten Daten Einsatz findet (bei uns Rasterdaten). Dabei beinhaltet das Format eigene Headerinformationen, sodass zum Beispiel nicht nur ein einzelner Datensatz sondern direkt mehrere inkl. ihrer Rasterung gespeichert werden können (die Datei beschreibt sich also selbst). Bisher nutzte ich hierbei PyNIO welches das Format lesen und Numpy Arrays daraus generieren kann.

GDAL kann sogar mit netcdf umgehen wie ich gerade gesehen habe. Leider nur nach dem älteren Standard bis Dateigrößen von 2GB. Leider können die Datein manchmal bis zu 4GB ausfallen. Trotzdem danke schon einmal. Du hast mir viele neue Informationen zum durcharbeiten geliefert.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Willst du denn in deiner Anwendung auch Zoomen? Rasterdaten sind da generell nicht so gut für geeignet, wenn man nur eine Karte in einer Auflösung hat. Will man gute Rasterkarten in mehreren Zoomstufen anbieten, muss man eigentlich für jede Zoomstufe explizit ein Raster rechnen, bei z.B. 5 Zoomstufen müsstest du dann halt 5 Raster berechnen. Einfach rauf- und runterskalieren klappt zwar auch, ist aber nicht schön, bzw.wenn man weit hineinzoomt halt nicht mehr genau, da das Raster gröber wird (Pixelisierung, Generalisierung).

Da Matplotlib wohl mit PIL umgehen kann, kannst du deine berechneten Karten als TIFF ausgeben und dann mittels twf-Datei georeferenzieren. Das klappt bei kartesischen Koordinatensystemen sehr gut, bei geographischen Systemem stösst das leider an seine Grenzen, sobald der Ausschnitt sehr groß ist, da dann die Kanten (Nord/Süd) nicht mehr gleich groß sind. Die tiffs kann eigentlich jedes GIS-System (Mapserver usw.) lesen und ausgeben, so dass du damit am schnellsten an dein Ziel kommst. Wie du sicherlich schon weisst, ist das Arbeiten mit so großen Dateien relativ langsam, dabei bietet das TIFF Format die beste Performance, nimmt aber auch am meisten Platz auf deiner Platte ein. Der Abschnitt Raster-Performance vom Mapserver bietet da noch ein paar Optimierungen an.

Alternativ kannst du dir ansehen, wie TileCache seine Tiles verwaltet. Das Verfahren ist nicht ganz trivial, da es für Karten mit mehreren Hunderttausend Tiles ausgelegt ist und deshalb Dateisystemlimitierungen umgehen muss, aber dafür bräuchtest du keine Tiffs erzeugen sondern könntest deine Tiles als png abspeichern. Du musst es halt "nur" in der richtigen Struktur machen. Das spart dir dann auch den WMS-Server.
Antworten